From 8dd9cf9cf24b9f5815502a1b1cfe20a498eff12d Mon Sep 17 00:00:00 2001 From: valery Date: Thu, 10 Jul 2025 23:47:05 +0300 Subject: [PATCH] release version 1.11.0 --- .../LICENSE.txt | 0 .../blueprint-generator-service}/LICENSE.txt | 0 .../blueprint-generator-service/pom.xml | 76 + .../core/blueprint/generator/Blueprint.java | 69 + .../generator/BlueprintGenerator.java | 38 + .../generator/BlueprintGeneratorImpl.java | 113 + .../ru/entaxy/templates/bridge-profile.ftl | 39 + .../ru/entaxy/templates/default-route.ftl | 48 + .../ru/entaxy/templates/metadata.json | 23 + .../resources/ru/entaxy/templates/profile.ftl | 75 + .../connector-storage/LICENSE.txt | 175 + .../connector-storage/pom.xml | 18 +- .../storage/ConnectorObjectStorage.java | 2 +- platform-backward-compat/pom.xml | 47 + .../LICENSE.txt | 175 + .../pom.xml | 131 + .../adapters/AccountManagerAdapter.java | 52 + .../adapters/ConnectorManagerAdapter.java | 135 + .../adapters/PermissionManagerAdapter.java | 114 + .../adapters/ProfileManagerAdapter.java | 112 + .../adapters/SystemManagerAdapter.java | 46 + .../profile-storage/LICENSE.txt | 175 + .../profile-storage/pom.xml | 18 +- .../profile/storage/SystemObjectStorage.java | 2 +- .../src/main/features/features.xml | 153 + .../src/main/scripts/entaxy.bc.shell.script | 60 + .../src/main/scripts/generated/fragments.xml | 5 + platform-provided-modules/LICENSE.txt | 175 + platform-provided-modules/pom.xml | 91 + .../src/main/provided/ui.xml | 27 + .../main/support/ui/collect-ui-features.xslt | 54 + .../main/support/ui/process-ui-modules.xslt | 52 + platform/integration/LICENSE.txt | 175 + platform/integration/applications/LICENSE.txt | 175 + .../applications/application-api/LICENSE.txt | 175 + .../applications/application-api/pom.xml | 43 + .../applications/ApplicationContent.java | 48 + .../applications/ApplicationItem.java | 46 + .../applications/ApplicationManager.java | 139 + .../ApplicationProjectContent.java | 70 + .../applications/ApplicationProjectInfo.java | 49 + .../applications/ApplicationProjectItem.java | 55 + .../applications/ApplicationResource.java | 34 + .../applications/ApplicationStorage.java | 93 + .../applications/EntaxyApplication.java | 83 + .../EntaxyApplicationProject.java | 56 + .../EntaxyApplicationProjectVersion.java | 84 + .../EntaxyApplicationRevision.java | 61 + .../EntaxyApplicationVersion.java | 90 + .../descriptor/ApplicationComponent.java | 84 + .../descriptor/ApplicationContentItem.java | 50 + .../descriptor/ApplicationDescriptor.java | 112 + .../descriptor/ApplicationFeatures.java | 43 + .../descriptor/ApplicationRequirement.java | 50 + .../ApplicationCausedException.java | 41 + .../ApplicationDescriptorIsInvalid.java | 40 + .../ApplicationDescriptorNotFound.java | 40 + .../exceptions/ApplicationException.java | 60 + .../ApplicationImportCausedException.java | 42 + .../ApplicationNotFoundException.java | 41 + .../ApplicationVersionAlreadyExists.java | 40 + .../ApplicationVersionCausedException.java | 42 + .../ApplicationVersionException.java | 61 + ...plicationVersionHasInstalledException.java | 36 + .../EntaxyApplicationsException.java | 40 + .../exceptions/ItemException.java | 47 + .../exceptions/ItemIsGhostException.java | 42 + .../exceptions/ItemIsPlatformException.java | 42 + .../exceptions/ItemNotFoundException.java | 40 + .../ProjectAlreadyExistsException.java | 41 + .../exceptions/ProjectException.java | 51 + .../exceptions/ProjectNotFoundException.java | 39 + .../ProjectVersionBuildNotAvailable.java | 41 + .../ProjectVersionCausedException.java | 41 + .../exceptions/ProjectVersionException.java | 61 + .../ProjectVersionIsDirtyException.java | 41 + .../ProjectVersionNotConsistentException.java | 41 + .../ProjectVersionNotFoundException.java | 40 + .../exceptions/RevisionCausedException.java | 41 + .../exceptions/RevisionException.java | 62 + .../exceptions/RevisionIllegalNumber.java | 53 + .../exceptions/RevisionIllegalTransition.java | 50 + .../exceptions/RevisionNotConfigurable.java | 40 + .../exceptions/RevisionNotFound.java | 40 + .../RevisionRequirementsNotSatisfied.java | 53 + .../exceptions/StorageException.java | 38 + .../StorageNotEnabledException.java | 41 + .../exceptions/StorageNotFoundException.java | 41 + .../item/project/EntaxyBundleItem.java | 34 + .../item/project/EntaxyConfigItem.java | 30 + .../item/project/EntaxyObjectItem.java | 34 + .../item/project/EntaxyResourceItem.java | 35 + .../storage/AbstractApplicationStorage.java | 96 + .../storage/ApplicationStorageInfo.java | 42 + .../applications/utils/JarArtifact.java | 30 + .../applications/application-impl/LICENSE.txt | 175 + .../applications/application-impl/pom.xml | 142 + .../impl/ApplicationManagerImpl.java | 175 + ...ApplicationObjectExtendedDataProvider.java | 123 + .../applications/impl/ExportImportHelper.java | 440 + .../applications/impl/ServiceHelper.java | 94 + .../StorageApplicationContentAdapter.java | 41 + .../impl/StorageImportAdapter.java | 42 + .../applications/impl/StorageItemAdapter.java | 36 + .../application/ApplicationContentImpl.java | 70 + .../impl/application/ApplicationItemImpl.java | 95 + .../application/ApplicationResourceImpl.java | 40 + .../impl/application/RevisionHelper.java | 599 + .../impl/build/AbstractDescriptor.java | 56 + .../impl/build/AbstractStorage.java | 74 + .../impl/build/ApplicationBuilder.java | 558 + .../impl/build/BundleDescriptor.java | 101 + .../impl/build/BundleStorage.java | 118 + .../impl/build/ConfigDescriptor.java | 87 + .../impl/build/ConfigStorage.java | 118 + .../impl/build/ResourceDescriptor.java | 54 + .../impl/build/ResourceStorage.java | 188 + .../impl/jar/FolderBasedJarBuilder.java | 61 + .../applications/impl/jar/JarBuilder.java | 186 + .../ApplicationProjectContentImpl.java | 333 + .../project/ApplicationProjectItemImpl.java | 184 + .../DefaultApplicationProjectItem.java | 110 + .../impl/project/item/BundleItemImpl.java | 62 + .../impl/project/item/ColocationGroup.java | 66 + .../impl/project/item/ConfigItemImpl.java | 58 + .../impl/project/item/ItemFactory.java | 168 + .../impl/project/item/ObjectItemImpl.java | 77 + .../impl/project/item/ResourceItemImpl.java | 60 + .../impl/project/model/ContentChecker.java | 49 + .../impl/project/model/ContentModel.java | 248 + .../model/ContentModelItemWrapper.java | 101 + .../impl/project/model/item/BundleItem.java | 51 + .../impl/project/model/item/ConfigItem.java | 30 + .../project/model/item/ContentModelItem.java | 109 + .../impl/project/model/item/ObjectItem.java | 30 + .../impl/project/model/item/ResourceItem.java | 30 + .../applications/builder/features.ftl | 41 + .../application-management/LICENSE.txt | 175 + .../application-management/pom.xml | 67 + .../management/ApplicationsMBean.java | 198 + .../management/ProjectsMBean.java | 206 + .../impl/ApplicationsMBeanImpl.java | 568 + .../management/impl/ProjectsMBeanImpl.java | 505 + .../application-shell/LICENSE.txt | 175 + .../applications/application-shell/pom.xml | 64 + .../ApplicationManagerCommandSupport.java | 41 + .../applications/shell/ApplicationShell.java | 122 + .../shell/FeatureCapabilityHelper.java | 69 + .../shell/StorageAwareCommand.java | 52 + .../shell/StorageDisableCommand.java | 40 + .../shell/StorageEnableCommand.java | 40 + .../shell/StorageListCommand.java | 80 + .../ApplicationCheckBundleCommand.java | 94 + .../ApplicationImportFromFile.java | 53 + .../ApplicationImportFromRepository.java | 53 + .../application/ApplicationListCommand.java | 137 + .../application/ApplicationManageCommand.java | 114 + .../application/ApplicationRemoveCommand.java | 61 + .../ApplicationVersionManageCommand.java | 57 + .../ApplicationVersionRemoveCommand.java | 43 + .../ApplicationVersionSupport.java | 39 + .../application/ConfigCancelCommand.java | 50 + .../application/ConfigCommitCommand.java | 85 + .../shell/application/ConfigEditCommand.java | 122 + .../shell/application/ConfigListCommand.java | 61 + .../shell/application/ConfigPrintCommand.java | 139 + .../application/ConfigSetPropertyCommand.java | 76 + .../application/ConfigStatusCommand.java | 151 + .../ManagedApplicationCommand.java | 48 + .../ManagedApplicationConfigCommand.java | 51 + .../ManagedApplicationRevisionCommand.java | 49 + .../ManagedApplicationVersionCommand.java | 47 + .../application/RevisionConfigureCommand.java | 54 + .../application/RevisionCreateCommand.java | 85 + .../application/RevisionDeployCommand.java | 53 + .../application/RevisionDoneCommand.java | 49 + .../application/RevisionInfoCommand.java | 138 + .../application/RevisionInstallCommand.java | 62 + .../application/RevisionListCommand.java | 73 + .../shell/application/RevisionSupport.java | 66 + .../application/RevisionUninstallCommand.java | 52 + .../completers/ApplicationCompleter.java | 58 + .../ApplicationVersionCompleter.java | 51 + .../shell/completers/ConfigCompleter.java | 57 + .../EntaxyRuntimeObjectCompleter.java | 55 + .../shell/completers/ProjectCompleter.java | 58 + .../completers/ProjectItemCompleter.java | 53 + .../completers/ProjectVersionCompleter.java | 51 + .../completers/RepositoryNameCompleter.java | 52 + .../shell/completers/RevisionCompleter.java | 55 + .../shell/completers/StorageCompleter.java | 52 + .../shell/project/ItemAddCommand.java | 48 + .../shell/project/ItemAwareCommand.java | 67 + .../shell/project/ItemIgnoreCommand.java | 48 + .../shell/project/ItemRemoveCommand.java | 48 + .../shell/project/ManagedProjectCommand.java | 48 + .../shell/project/ManagedVersionCommand.java | 46 + .../shell/project/ProjectCancelCommand.java | 48 + .../shell/project/ProjectCommitCommand.java | 63 + .../shell/project/ProjectCreateCommand.java | 61 + .../shell/project/ProjectCurrentCommand.java | 73 + .../shell/project/ProjectListCommand.java | 90 + .../shell/project/ProjectManageCommand.java | 116 + .../shell/project/ProjectRemoveCommand.java | 61 + .../shell/project/VersionAddObject.java | 61 + .../shell/project/VersionAddResource.java | 64 + .../shell/project/VersionBuildCommand.java | 56 + .../project/VersionBuildInfoCommand.java | 171 + .../shell/project/VersionCancelCommand.java | 44 + .../shell/project/VersionCommitCommand.java | 45 + .../shell/project/VersionCreateCommand.java | 65 + .../project/VersionExportToFileCommand.java | 58 + .../VersionExportToRepositoryCommand.java | 61 + .../shell/project/VersionItemListCommand.java | 86 + .../shell/project/VersionManageCommand.java | 64 + platform/integration/applications/pom.xml | 34 + .../resource-based-storage/LICENSE.txt | 175 + .../resource-based-storage/pom.xml | 54 + .../resource/ResourceBasedStorage.java | 210 + .../impl/AbstractResourceComponent.java | 185 + ...AbstractResourceComponentWithChildren.java | 109 + .../impl/ApplicationStorageComponent.java | 246 + .../resource/impl/ApplicationStorageData.java | 52 + .../storage/resource/impl/ComponentCache.java | 107 + .../impl/ProjectStorageComponent.java | 164 + .../resource/impl/ProjectStorageData.java | 52 + .../resource/impl/ResourceContext.java | 98 + .../resource/impl/StorageComponent.java | 154 + .../storage/resource/impl/StorageData.java | 37 + .../application/ApplicationComponent.java | 173 + .../impl/application/ApplicationData.java | 79 + .../ApplicationVersionComponent.java | 282 + .../application/ApplicationVersionData.java | 94 + .../ResourceApplicationContent.java | 141 + .../application/ResourceApplicationItem.java | 58 + .../ResourceApplicationResource.java | 50 + .../impl/application/RevisionComponent.java | 279 + .../impl/application/RevisionData.java | 45 + .../resource/impl/project/BuildComponent.java | 154 + .../resource/impl/project/BuildData.java | 39 + .../impl/project/ProjectComponent.java | 254 + .../resource/impl/project/ProjectData.java | 73 + .../impl/project/ProjectVersionComponent.java | 332 + .../impl/project/ProjectVersionData.java | 37 + .../internal/DefaultApplicationStorage.java | 61 + .../src/main/features/features.xml | 40 + platform/integration/pom.xml | 16 + platform/pom.xml | 2 +- .../base/base-extensions-support/LICENSE.txt | 175 + .../base/base-extensions-support/pom.xml | 46 + .../base/extensions/api/EntaxyExtendable.java | 42 + .../base/extensions/api/EntaxyExtension.java | 39 + .../api/EntaxyExtensionService.java | 40 + .../extensions/api/EntaxyExtensionsAware.java | 40 + .../api/EntaxyExtensionsProvider.java | 34 + .../base/extensions/api/Extendable.java | 38 + .../extensions/impl/EntaxyExtensionImpl.java | 73 + .../impl/EntaxyExtensionServiceImpl.java | 212 + .../shell/EntaxyExtensionServiceSupport.java | 38 + .../extensions/shell/ExtendablesList.java | 53 + .../base/extensions/shell/ExtensionsList.java | 79 + platform/runtime/base/base-support/pom.xml | 2 +- .../platform/base/support/CommonUtils.java | 2 +- .../base/support/DependencySorter.java | 2 +- .../platform/base/support/FileUtils.java | 2 +- .../base/support/SimpleFileWatcher.java | 211 + .../support/karaf/shell/AnsiColumnExt.java | 96 + .../base/support/karaf/shell/ColExt.java | 381 + .../base/support/karaf/shell/HAlignExt.java | 93 + .../base/support/karaf/shell/RowExt.java | 132 + .../karaf/shell/ShellTableColFixed.java | 90 + .../support/karaf/shell/ShellTableExt.java | 284 + .../support/karaf/shell/ShellTableFixed.java | 48 + .../base/support/karaf/shell/StringUtil.java | 68 + .../base/support/osgi/BundleUtils.java | 2 +- .../platform/base/support/osgi/OSGIUtils.java | 2 +- .../osgi/bundle/BundleCapabilityHelper.java | 2 +- .../osgi/bundle/CapabilityDescriptor.java | 2 +- .../osgi/bundle/CapabilityDescriptorImpl.java | 2 +- .../support/osgi/bundle/CapabilityHelper.java | 2 +- .../osgi/bundle/CapabilityTypeHelper.java | 2 +- .../osgi/feature/FeatureCapabilityHelper.java | 69 + .../support/osgi/feature/FeaturesUtils.java | 164 + .../service/CommonNamedReferenceListener.java | 2 +- .../osgi/service/CommonReferenceListener.java | 2 +- .../osgi/service/NamedReferenceListener.java | 2 +- .../osgi/service/ReferenceListener.java | 2 +- .../osgi/tracker/BundleContextAware.java | 2 +- .../support/osgi/tracker/BundleFilter.java | 2 +- .../BundleTrackerCustomizerListener.java | 2 +- .../osgi/tracker/BundleTrackerUtils.java | 2 +- .../UniformBundleTrackerCustomizer.java | 2 +- .../tracker/filter/AbstractBundleFilter.java | 2 +- .../filter/BundleCapabilityFilter.java | 2 +- .../tracker/filter/BundleHeaderFilter.java | 2 +- .../base/support/xml/CommonXMLUtils.java | 2 +- platform/runtime/base/branding/pom.xml | 2 +- .../branding/src/main/cfg/branding.properties | 2 +- .../base/cellar-extensions/LICENSE.txt | 175 + .../runtime/base/cellar-extensions/pom.xml | 89 + .../cellar/helper/CellarFeaturesHelper.java | 738 + .../runtime/cellar/helper/HelperFactory.java | 91 + .../runtime/cellar/helper/Services.java | 69 + .../cellar/sequence/CellarSequenceEvent.java | 56 + .../sequence/CellarSequenceItemEvent.java | 56 + .../sequence/CellarSequenceManager.java | 38 + .../cellar/sequence/SequenceBuilder.java | 60 + .../cellar/sequence/SequenceEventHandler.java | 65 + .../impl/CellarSequenceManagerImpl.java | 88 + .../sequence/process/ChangeListener.java | 44 + .../process/ChangeListenerFactory.java | 143 + .../cellar/sequence/process/SequenceTask.java | 276 + .../runtime/base/config-extensions/pom.xml | 2 +- .../ConfigLookupConfigurationPlugin.java | 2 +- .../config/DefaultPropertiesProvider.java | 2 +- ...faultPropertiesProviderWithImmutables.java | 2 +- .../platform/base/config/Immutables.java | 2 +- .../base/config/ImmutablesCollector.java | 2 +- .../config/ImmutablesConfigurationPlugin.java | 2 +- .../platform/base/config/ImmutablesImpl.java | 2 +- .../common-templates-collection/pom.xml | 2 +- .../generator/ftl-generator/pom.xml | 2 +- .../generator/ftl/FTLGenerator.java | 2 +- .../generator/generator-api/pom.xml | 2 +- .../generator/template/LegacyTemplate.java | 43 + .../base/generator/template/Template.java | 2 +- .../template/TemplateAwareGenerator.java | 2 +- .../base/generator/template/TemplateImpl.java | 2 +- .../generator/template/TemplateService.java | 2 +- .../template/exception/TemplateNotFound.java | 55 + .../generator/template/impl/Activator.java | 2 +- .../template/impl/LegacyTemplateAdapter.java | 2 +- .../template/impl/ProvidedTemplate.java | 2 +- .../template/impl/TemplateBundleTracker.java | 2 +- .../impl/TemplateBundleTrackerCustomizer.java | 2 +- .../template/impl/TemplateMetadata.java | 2 +- .../template/impl/TemplateProvider.java | 2 +- .../template/impl/TemplateServiceImpl.java | 2 +- .../impl/TemplateServiceURLResolver.java | 2 +- .../AbstractSelfPublishGenerator.java | 2 +- .../base/connecting/generator/Generated.java | 2 +- .../base/connecting/generator/Generator.java | 2 +- .../generator/GeneratorService.java | 2 +- .../generator/impl/GeneratedImpl.java | 2 +- .../generator/generator-factory/pom.xml | 2 +- .../generator/factory/GeneratorFactory.java | 2 +- .../runtime/base/connecting/generator/pom.xml | 2 +- .../generator/template-service-shell/pom.xml | 2 +- .../generator/template/shell/Generate.java | 2 +- .../template/shell/ListTemplates.java | 2 +- .../shell/TemplateServiceSupport.java | 2 +- platform/runtime/base/connecting/pom.xml | 2 +- platform/runtime/base/logging/LICENSE.txt | 175 + .../logging/cef-logger-layout/LICENSE.txt | 175 + .../base/logging/cef-logger-layout/pom.xml | 102 + .../main/java/ru/emdev/cef/AuditEvent.java | 94 + .../main/java/ru/emdev/cef/AuditLayout.java | 410 + .../main/java/ru/emdev/cef/CEFAppender.java | 89 + .../src/main/java/ru/emdev/cef/CEFLayout.java | 153 + .../src/main/java/ru/emdev/cef/CEFRecord.java | 309 + .../main/java/ru/emdev/cef/DnsResolver.java | 45 + .../test/java/ru/emdev/cef/CEFRecordTest.java | 94 + .../java/ru/emdev/cef/ProcessingTest.java | 93 + .../test/resources/examples/almostFull.json | 12 + .../src/test/resources/examples/empty.json | 1 + .../src/test/resources/examples/noinfo.json | 5 + .../wso2/conf/deployment.toml | 275 + .../wso2/conf/log4j2-entaxy.properties | 26 + .../wso2/conf/log4j2.properties | 484 + .../base/logging/entaxy-audit/LICENSE.txt | 175 + .../logging/entaxy-audit/Logging-config.md | 48 + .../base/logging/entaxy-audit/README.md | 10 + .../runtime/base/logging/entaxy-audit/pom.xml | 88 + .../src/main/cfg/generated/fragments.xml | 5 + .../cfg/ru.entaxy.audit.interpreter.jmx.cfg | 27 + .../java/ru/entaxy/audit/data/Actions.java | 31 + .../java/ru/entaxy/audit/data/AuditEvent.java | 147 + .../java/ru/entaxy/audit/data/Outcome.java | 39 + .../java/ru/entaxy/audit/data/Severity.java | 40 + .../ru/entaxy/audit/service/AuditService.java | 53 + .../audit/service/AuditServiceFactory.java | 38 + .../entaxy/audit/service/EventConverter.java | 41 + .../audit/service/EventConverterInfo.java | 40 + .../audit/service/EventInterpreter.java | 34 + .../entaxy/audit/service/EventSubscriber.java | 43 + .../audit/service/InterpretedEvent.java | 56 + .../audit/service/filter/EventRouter.java | 108 + .../service/hawtio/HawtioEventConverter.java | 62 + .../hawtio/HawtioEventInterpreter.java | 50 + .../hawtio/HawtioInterpretedEvent.java | 74 + .../audit/service/impl/AuditServiceImpl.java | 143 + .../audit/service/impl/ConverterService.java | 101 + .../service/impl/InterpreterService.java | 91 + .../audit/service/impl/OSGIEventModule.java | 117 + .../audit/service/impl/WebLoginModule.java | 93 + .../service/jmx/JMXEventInterpreter.java | 140 + .../service/jmx/JMXInterpretedEvent.java | 56 + .../audit/service/jmx/JMXInvokeEvent.java | 104 + .../entaxy/audit/service/osgi/Activator.java | 115 + .../ru/entaxy/audit/utils/AuditHelper.java | 103 + .../ru/entaxy/audit/utils/CommandWeight.java | 57 + .../java/ru/entaxy/audit/utils/Constants.java | 38 + platform/runtime/base/logging/pom.xml | 102 + .../src/main/cfg/generated/fragments.xml | 5 + .../src/main/cfg/org.ops4j.pax.logging.cfg | 69 + platform/runtime/base/management-core/pom.xml | 2 +- .../base/management/core/ManagementCore.java | 2 +- .../base/management/core/Qualifier.java | 2 +- .../management/core/api/AnnotatedMBean.java | 2 +- .../base/management/core/api/Attribute.java | 2 +- .../core/api/EntaxyRuntimeTyped.java | 2 +- .../management/core/api/MBeanAnnotated.java | 2 +- .../core/api/MBeanExportPolicy.java | 2 +- .../base/management/core/api/NotExported.java | 2 +- .../base/management/core/api/Operation.java | 2 +- .../base/management/core/api/Parameter.java | 2 +- .../core/api/RuntimeTypedMBean.java | 2 +- .../core/utils/AttributeChangeTracker.java | 2 +- .../core/utils/BundleAwareMBean.java | 2 +- .../core/utils/BundleAwareMBeanImpl.java | 2 +- .../core/utils/BundleAwareManagedObject.java | 2 +- .../utils/BundleAwareManagedObjectImpl.java | 2 +- .../ExtendedBundleTrackerCustomizer.java | 2 +- .../core/utils/MBeanInfoHelper.java | 2 +- .../core/utils/ManagedObjectDescriptor.java | 2 +- .../core/utils/ManagedObjectsListener.java | 2 +- .../base/objects-base/object-factory/pom.xml | 2 +- .../base/objects/factory/EntaxyFactory.java | 2 +- .../factory/EntaxyFactoryElements.java | 2 +- .../factory/EntaxyFactoryException.java | 2 +- .../factory/EntaxyFactoryRegistry.java | 37 + .../objects/factory/EntaxyFactoryUtils.java | 2 +- .../base/objects/factory/Importer.java | 2 +- .../configuration/AbstractElement.java | 2 +- .../factory/configuration/FactoryElement.java | 2 +- .../factory/configuration/FieldElement.java | 2 +- .../factory/configuration/FieldsElement.java | 2 +- .../factory/configuration/OutputElement.java | 2 +- .../factory/configuration/OutputsElement.java | 2 +- .../configuration/RefFieldElement.java | 2 +- .../exceptions/FactoryNotFoundException.java | 2 +- .../NotSupportedForAbstractFactory.java | 2 +- .../exceptions/OutputNotDefinedException.java | 2 +- .../ScopeNotSupportedException.java | 2 +- .../objects/factory/impl/DefaultFactory.java | 2 +- .../objects/factory/impl/FactoryRegistry.java | 2 +- .../factory/impl/FactorySearchProvider.java | 64 + .../factory/impl/GenerationHelper.java | 2 +- .../TrackedDynamicFactoryCustomizer.java | 2 +- .../factory/tracker/TrackedFactory.java | 2 +- .../tracker/TrackedFactoryContainer.java | 2 +- .../tracker/TrackedFactoryCustomizer.java | 2 +- .../TrackedFactoryCustomizerListener.java | 2 +- .../tracker/TrackedFactoryManager.java | 2 +- .../factory/tracker/TrackerManager.java | 2 +- .../ru/entaxy/factory/base-object.json | 6 +- .../base/objects-base/objects-core/pom.xml | 2 +- .../platform/base/objects/EntaxyObject.java | 2 +- .../base/objects/EntaxyObjectService.java | 2 +- .../objects/EntaxyObjectServiceListener.java | 2 +- .../base/objects/EntaxyObjectStorage.java | 2 +- .../objects/EntaxyObjectStorageService.java | 2 +- .../objects/service/impl/BundleInfoImpl.java | 2 +- .../service/impl/EntaxyObjectServiceImpl.java | 2 +- .../service/impl/TrackedEntaxyObject.java | 2 +- .../TrackedEntaxyObjectCustomizer.java | 2 +- ...TrackedEntaxyObjectCustomizerListener.java | 2 +- .../shell/EntaxyObjectServiceSupport.java | 2 +- .../base/objects/shell/ListObjects.java | 2 +- .../objects/shell/ObjectAwareCommand.java | 2 +- .../objects/shell/ObjectConfiguration.java | 2 +- .../base/objects/shell/ObjectRelations.java | 2 +- .../base/objects/shell/SimpleObjectTree.java | 2 +- .../shell/completers/ObjectCompleter.java | 2 +- .../impl/EntaxyObjectStorageServiceImpl.java | 2 +- platform/runtime/base/objects-base/pom.xml | 2 +- .../platform-manager-core/pom.xml | 2 +- .../manager/EntaxyPlatformManager.java | 2 +- .../impl/EntaxyPlatformManagerImpl.java | 2 +- .../shell/EntaxyPlatformManagerSupport.java | 2 +- .../manager/shell/PlatformHealth.java | 2 +- .../manager/shell/ShellTableColFixed.java | 2 +- .../manager/shell/ShellTableFixed.java | 2 +- .../entaxy/platform/manager/shell/Utils.java | 2 +- .../runtime/base/platform-manager/pom.xml | 2 +- platform/runtime/base/pom.xml | 2 +- platform/runtime/base/resources/pom.xml | 2 +- .../base/resources/resources-api/pom.xml | 2 +- .../entaxy/esb/resources/EntaxyResource.java | 2 +- .../esb/resources/EntaxyResourceMetadata.java | 2 +- .../resources/EntaxyResourceProcessor.java | 2 +- .../esb/resources/EntaxyResourceProvider.java | 2 +- .../EntaxyResourceProviderProxy.java | 2 +- .../esb/resources/EntaxyResourceService.java | 4 +- .../resources/EntaxyResourceURLFactory.java | 96 + .../resources/resources-management/pom.xml | 2 +- .../EntaxyResourceProviderMBean.java | 6 +- .../EntaxyResourceServiceMBean.java | 6 +- .../impl/EntaxyResourceProviderMBeanImpl.java | 29 +- .../impl/EntaxyResourceProviderTracker.java | 2 +- .../impl/EntaxyResourceServiceMBeanImpl.java | 9 +- .../management/impl/ServiceHelper.java | 50 + .../base/resources/resources-service/pom.xml | 2 +- .../esb/resources/impl/AbstractResource.java | 2 +- .../impl/AbstractResourceProvider.java | 2 +- .../impl/AbstractResourceProviderProxy.java | 2 +- .../impl/CommonResourceProviderProxy.java | 2 +- .../esb/resources/impl/ResourceWrapper.java | 2 +- .../service/EntaxyResourceServiceImpl.java | 16 +- .../impl/service/ProvidersController.java | 6 +- .../impl/service/ProxyController.java | 2 +- .../resources/impl/service/ProxyProvider.java | 2 +- .../provider/FileResourceProvider.java | 4 +- .../esb/resources/shell/ResourceList.java | 2 +- .../resources/shell/ResourceOpenByUrl.java | 2 +- .../support/EntaxyResourcesURLHandler.java | 2 +- .../esb/resources/support/XslUrlResolver.java | 2 +- .../resources/tracker/ResourceProvider.java | 13 +- .../tracker/ResourceProviderCustomizer.java | 2 +- .../ResourceProviderCustomizerListener.java | 2 +- .../esb/resources/tracker/TrackerManager.java | 2 +- .../runtime/base/search-service/LICENSE.txt | 175 + platform/runtime/base/search-service/pom.xml | 53 + .../search/AbstractSearchProvider.java | 48 + .../platform/search/SearchProvider.java | 52 + .../platform/search/SearchProviderInfo.java | 42 + .../entaxy/platform/search/SearchService.java | 89 + .../search/impl/SearchServiceImpl.java | 143 + .../platform/search/jmx/SearchMBean.java | 81 + .../search/jmx/impl/SearchMBeanImpl.java | 83 + .../search/provider/OsgiSearchProvider.java | 209 + .../platform/search/shell/ProvidersList.java | 58 + .../entaxy/platform/search/shell/Search.java | 122 + .../search/shell/StandardAttributes.java | 57 + .../shell/support/AbstractSearchCommand.java | 51 + .../shell/support/ObjectTypeAwareCommand.java | 37 + .../shell/support/ObjectTypeCompleter.java | 44 + .../shell/support/SearchServiceSupport.java | 37 + .../base/src/main/features/features.xml | 4 +- .../base/src/main/features/support.xml | 9 +- .../LICENSE.txt | 175 + .../artifact-management-extensions/pom.xml | 61 + .../core/artifact/ext/ArtifactExtended.java | 33 + .../ext/ExtTypedInstallerFactory.java | 67 + .../core/artifact/ext/SequenceSupport.java | 32 + .../ext/binary/AbstractBinaryArtifact.java | 135 + .../core/artifact/ext/binary/JarArtifact.java | 39 + .../ext/binary/UntypedBinaryArtifact.java | 39 + .../ext/binary/UntypedBinaryInstaller.java | 32 + .../UntypedBinaryInstallerHelperCellar.java | 32 + .../UntypedBinaryInstallerHelperConfig.java | 32 + .../UntypedBinaryInstallerHelperLocal.java | 32 + .../impl/UntypedBinaryInstallerImpl.java | 44 + .../ext/features/FeatureInstaller.java | 51 + .../ext/features/FeaturesArtifact.java | 77 + .../ext/features/FeaturesInstaller.java | 39 + .../impl/CellarFeaturesInstallerHelper.java | 121 + .../impl/FeatureInstallerClusterHelper.java | 192 + .../FeatureInstallerConfigurableHelper.java | 36 + .../features/impl/FeatureInstallerImpl.java | 172 + .../impl/FeatureInstallerLocalHelper.java | 46 + .../FeaturesInstallerConfigurableHelper.java | 38 + .../impl/FeaturesInstallerHelperConfig.java | 42 + .../impl/FeaturesInstallerHelperImpl.java | 46 + .../features/impl/FeaturesInstallerImpl.java | 133 + .../impl/LocalFeaturesInstallerHelper.java | 44 + .../impl/ClusterTypedConfigurableHelper.java | 40 + .../ext/impl/ExtendedTypedInstallerImpl.java | 82 + .../ext/impl/InstallerConfigurableHelper.java | 41 + .../impl/LocalTypedConfigurableHelper.java | 40 + .../artifact/ext/internal/Registrator.java | 55 + .../runtime/core/artifact-management/pom.xml | 2 +- .../platform/core/artifact/Artifact.java | 2 +- .../core/artifact/ArtifactCoordinates.java | 2 +- .../core/artifact/ArtifactManifest.java | 2 +- .../platform/core/artifact/Artifacts.java | 2 +- .../platform/core/artifact/Blueprint.java | 2 +- .../core/artifact/BlueprintManifest.java | 2 +- .../core/artifact/DefaultArtifact.java | 2 +- .../core/artifact/DeployedArtifact.java | 2 +- .../platform/core/artifact/Manifested.java | 2 +- .../artifact/annotation/ArtifactSupport.java | 2 +- .../ManifestCapabilityHelper.java | 2 +- .../impl/CapabilityDescriptorImpl.java | 2 +- .../artifact/installer/ArtifactInstaller.java | 2 +- .../installer/builder/ClusterInstaller.java | 2 +- .../installer/builder/CommonInstaller.java | 2 +- .../installer/builder/InstallationResult.java | 2 +- .../artifact/installer/builder/Installer.java | 2 +- .../installer/builder/Installers.java | 2 +- .../builder/InstallersWithDefaults.java | 2 +- .../installer/builder/LocalInstaller.java | 2 +- .../builder/impl/AbstractInstaller.java | 2 +- .../builder/impl/InstallationResultImpl.java | 2 +- .../builder/impl/InstallersImpl.java | 2 +- .../impl/InstallersWithDefaultsImpl.java | 2 +- .../ClusterCommonBundleInstallerHelper.java | 2 +- .../cluster/ClusterInstallerWrapperImpl.java | 2 +- .../cluster/ClusterTypedInstallerHelper.java | 2 +- .../impl/cluster/DefaultCellarInstaller.java | 2 +- .../impl/local/DefaultLocalInstaller.java | 2 +- .../LocalCommonBundleInstallerHelper.java | 2 +- .../impl/local/LocalTypedInstallerHelper.java | 2 +- .../typed/AbstractTypedInstallerFactory.java | 74 + .../builder/typed/BlueprintInstaller.java | 2 +- .../builder/typed/BundleInstaller.java | 2 +- .../builder/typed/CommonBundleInstaller.java | 2 +- .../builder/typed/ConfigInstaller.java | 2 +- .../typed/DefaultTypedInstallerFactory.java | 98 + .../builder/typed/FeaturesInstaller.java | 2 +- .../installer/builder/typed/JarInstaller.java | 2 +- .../installer/builder/typed/StartAware.java | 2 +- .../installer/builder/typed/StopAware.java | 2 +- .../builder/typed/TypedInstaller.java | 2 +- .../builder/typed/TypedInstallerFactory.java | 40 + .../TypedInstallerFactoryDescriptor.java | 42 + .../builder/typed/TypedInstallerManager.java | 192 + .../typed/impl/BlueprintInstallerImpl.java | 2 +- .../typed/impl/BundleInstallerImpl.java | 2 +- .../impl/CommonBundleInstallerHelper.java | 2 +- .../CommonBundleInstallerHelperConfig.java | 2 +- .../typed/impl/CommonBundleInstallerImpl.java | 2 +- .../builder/typed/impl/HelperCreator.java | 32 + .../builder/typed/impl/JarInstallerImpl.java | 2 +- .../typed/impl/TypedInstallerHelperAware.java | 34 + .../typed/impl/TypedInstallerHelperImpl.java | 30 + .../typed/impl/TypedInstallerImpl.java | 2 +- .../impl/AbstractArtifactInstaller.java | 2 +- .../impl/ArtifactInstallerCollector.java | 2 +- .../impl/DefaultClusterArtifactInstaller.java | 2 +- .../impl/DefaultLocalArtifactInstaller.java | 2 +- .../artifact/legacy/BundleController.java | 2 +- .../repository/ArtifactRepository.java | 4 +- .../ArtifactRepositoryInitializer.java | 2 +- .../repository/RepositoryDescriptor.java | 62 + .../RepositoryDescriptorCollector.java | 35 + .../impl/ArtifactRepositoryImpl.java | 9 +- .../repository/impl/DeployedArtifactImpl.java | 2 +- .../impl/RepositoryConfigurableHelper.java | 2 +- .../impl/RepositoryDescriptorImpl.java | 188 + .../impl/RepositoryRegistrator.java | 158 + .../impl/remote/AbstractRemoteRepository.java | 2 +- .../impl/remote/NexusRepository.java | 2 +- .../impl/remote/RemoteRepository.java | 2 +- .../remote/RemoteRepositoryDescriptor.java | 2 +- .../impl/remote/RemoteRepositoryFactory.java | 2 +- .../artifact/service/ArtifactService.java | 2 +- .../service/impl/ArtifactServiceImpl.java | 12 +- .../ru.entaxy.esb.artifact.repositories.cfg | 2 +- .../OSGI-INF/blueprint/blueprint.xml | 2 +- .../cluster-persistence-service/pom.xml | 2 +- .../core/cluster/persistence/Helper.java | 2 +- .../persistence/PersistenceManager.java | 17 +- .../core/cluster/persistence/Serializer.java | 2 +- .../cluster/persistence/ServiceProvider.java | 2 +- .../persistence/activator/Activator.java | 8 +- .../handler/LocalBundleEventHandler.java | 2 +- .../LocalConfigurationEventHandler.java | 169 + .../handler/LocalEventDispatchTask.java | 2 +- .../LocalEventHandlerRegistryDispatcher.java | 2 +- .../handler/LocalFeaturesEventHandler.java | 174 + .../handler/LocalHandlerRegistry.java | 2 +- .../handler/LocalRepositoryEventHandler.java | 135 + .../handler/LocalTopicConsumer.java | 2 +- platform/runtime/core/cluster/pom.xml | 2 +- .../runtime/core/core-support/cfg/ignite.cfg | 9 + .../core/core-support/cfg/jgroups.locking.xml | 81 + .../core-support/core-support-design/pom.xml | 2 +- .../design/classgen/Cu2JaConverter.java | 2 +- .../openapi/EntaxyOpenApiGenerator.java | 2 +- .../EntaxyOpenApiGeneratorDeprecated.java | 658 + .../design/openapi/utils/CompilationUnit.java | 121 + .../openapi/utils/CompilerRequestor.java | 115 + .../openapi/utils/INameEnvironmentImpl.java | 155 + .../core-support-runtime-legacy/LICENSE.txt | 175 + .../core-support-runtime-legacy/pom.xml | 166 + .../HeaderMergeAggregatorImpl.java | 53 + .../common/aggregation/JdbcCamelCodec.java | 122 + .../TimeoutAwareAggregationStrategyImpl.java | 61 + .../DisconnectedMembershipListener.java | 74 + .../repo/IgniteAggregationRepository.java | 380 + .../repo/JdbcAggregationRepository.java | 655 + .../repo/PostgresAggregationRepository.java | 103 + .../common/exception/BundleNotFound.java | 50 + .../common/exception/ConnectorNotFound.java | 50 + .../system/common/exception/EsbNotFound.java | 50 + .../common/exception/ProfileNotFound.java | 52 + .../common/exception/TemplateNotFound.java | 50 + .../interceptor/SoapHeaderInterceptor.java | 76 + .../esb/system/common/util/CustomHeader.java | 66 + .../system/common/util/HeadersConverter.java | 189 + .../system/common/util/PropertiesHelper.java | 157 + .../util/SimpleOutHeaderFilterStrategy.java | 56 + .../common/util/SystemHeadersConstants.java | 38 + .../common/validator/ValidateInterceptor.java | 126 + .../system/common/validator/XmlParser.java | 56 + .../core-support/core-support-runtime/pom.xml | 2 +- .../EntaxyResourceURLCachingClassLoader.java | 6 +- .../runtime/EntaxyResourceURLClassLoader.java | 2 +- .../support/runtime/EntaxyResourceUtils.java | 2 +- .../camel/CmPropertiesAccessorFunction.java | 2 +- .../JmsCamelAggregateExtension.java | 59 + .../aggregation/MapAggregationStrategy.java | 207 + .../cluster/ClusterBundleDataProvider.java | 109 + .../cluster/HazelcastLockClusterService.java | 169 + .../HazelcastValueLockClusterView.java | 271 + .../cluster/JGroupsLockClusterService.java | 84 + .../cluster/JGroupsLockClusterView.java | 159 + .../cxf/BasicAuthenticationInterceptor.java | 73 + .../runtime/cxf/EntaxyClassResolver.java | 212 + .../cxf/EntaxyCxfClassFolderUnwrapper.java | 2 +- .../runtime/cxf/EntaxyCxfClassHelper.java | 2 +- .../cxf/EntaxyCxfClassResourceUnwrapper.java | 2 +- .../runtime/cxf/EntaxyCxfClassUnwrapper.java | 2 +- .../EntaxyCxfDelegatingClassUnwrapper.java | 2 +- .../cxf/EntaxyCxfServiceBeanProxy.java | 2 +- .../cxf/EntaxyCxfServiceClassProxy.java | 2 +- .../cxf/EntaxyCxfServiceClassProxyBean.java | 2 +- .../cxf/EntaxyCxfSpringClassUnwrapper.java | 2 +- .../cxf/ExtJwtTokenSecurityContext.java | 110 + .../cxf/jose/ExtJwtAuthenticationFilter.java | 108 + .../security/AnonymousSecurityContext.java | 50 + .../DisplaySchemaOAuthRequestFilter.java | 60 + ...HazelcastCallbackEntryExpiredListener.java | 60 + .../runtime/hazelcast/HazelcastHelper.java | 136 + .../support/runtime/helper/ServiceHelper.java | 2 +- .../runtime/ignite/IgniteInstanceIgniter.java | 214 + .../runtime/jackson/EntaxyObjectMapper.java | 55 + .../jackson/JacksonJsonProviderFactory.java | 71 + .../jgroups/JGroupsLockServiceIgniter.java | 108 + .../AbstractConsumerAwareMetadataStorage.java | 2 +- .../runtime/metadata/ExchangeEnricher.java | 2 +- .../runtime/metadata/MetadataStorage.java | 2 +- .../metadata/MetadataStorageConsumer.java | 2 +- .../metadata/MetadataStorageEmpty.java | 2 +- .../runtime/metadata/MetadataStorageImpl.java | 2 +- .../metadata/MetadataStorageWrapper.java | 2 +- .../resources/ObjectResourcesProvider.java | 2 +- .../runtime/service/ServiceHolder.java | 34 + .../runtime/service/ServiceHolderHelper.java | 49 + .../OSGI-INF/blueprint/blueprint.xml | 10 +- platform/runtime/core/core-support/pom.xml | 2 +- .../runtime/core/error-handling/LICENSE.txt | 175 + .../error-handling/error-handler/LICENSE.txt | 175 + .../error-handling/error-handler/README.md | 116 + .../core/error-handling/error-handler/pom.xml | 48 + .../src/main/cfg/generated/fragments.xml | 13 + .../src/main/cfg/ru.entaxy.esb.error.cfg | 49 + .../src/main/cfg/ru.entaxy.esb.error.code.cfg | 48 + .../src/main/cfg/ru.entaxy.esb.error.text.cfg | 39 + .../EntaxyCxfFaultInterceptor.java | 214 + .../HandleOutFaultInterceptor.java | 155 + .../handler/processor/ErrorProcessor.java | 45 + .../common/error/handler/util/Timestamp.java | 36 + .../common-error-handler-context.xml | 489 + .../main/resources/ftl/DefaultResponse.ftl | 48 + .../main/resources/xslt/DefaultResponse.xsl | 54 + .../resources/xslt/UniversalErrorPacket.xsl | 110 + .../main/resources/xslt/WrapSoapEnvelope.xsl | 37 + .../xslt/operation/ConfirmGettingPackets.xsl | 36 + .../resources/xslt/operation/GetPackets.xsl | 36 + .../resources/xslt/operation/PutPackets.xsl | 36 + .../xslt/operation/sendAcknowledge.xsl | 30 + .../resources/xslt/operation/sendToJMS.xsl | 30 + .../xslt/operation/type/response.xsl | 51 + .../src/main/resources/xslt/soapWrap.xsl | 41 + platform/runtime/core/error-handling/pom.xml | 18 + .../infrastructure/file-upload/LICENSE.txt | 175 + .../core/infrastructure/file-upload/pom.xml | 50 + .../file/upload/FileUploadProcessor.java | 79 + .../file/upload/FileUploadService.java | 52 + .../file/upload/FileUploadServiceImpl.java | 44 + .../OSGI-INF/blueprint/camel-context.xml | 56 + platform/runtime/core/infrastructure/pom.xml | 2 +- .../core/infrastructure/schema/pom.xml | 2 +- .../infrastructure/schema/schema-api/pom.xml | 2 +- .../schema/api/ResourceService.java | 2 +- .../schema/api/entity/Resource.java | 2 +- .../schema/api/entity/ResourceInfo.java | 2 +- .../schema/schema-component/pom.xml | 2 +- .../schema/component/ValidatingProcessor.java | 2 +- .../ValidatorWithDBStorageComponent.java | 2 +- .../ValidatorWithDBStorageEndpoint.java | 2 +- .../ValidatorWithDBStorageProducer.java | 2 +- .../exception/SchemaNotFoundException.java | 2 +- .../component/util/SchemaReaderFromDB.java | 2 +- .../src/main/resources/log4j2.properties | 2 +- .../infrastructure/schema/schema-impl/pom.xml | 2 +- .../exception/ResourceInfoNotFound.java | 2 +- .../schema/exception/ResourceNotFound.java | 2 +- .../schema/impl/OpenApiResourceMetadata.java | 2 +- .../schema/impl/OpenApiResourceProcessor.java | 44 +- .../schema/impl/ResourceServiceImpl.java | 2 +- .../schema/impl/ServiceHelper.java | 2 +- .../schema/impl/WSDLResourceMetadata.java | 2 +- .../schema/impl/WSDLResourceProcessor.java | 4 +- .../resource/CxfDBResourceResolver.java | 2 +- .../resolver/resource/DBResolverSettings.java | 2 +- .../resolver/resource/DBResourceResolver.java | 2 +- .../resolver/resource/ResourceLoader.java | 2 +- .../resource/ResourceRegistryURLResolver.java | 2 +- .../resource/SchemaRegistryHelper.java | 2 +- .../OSGI-INF/blueprint/blueprint.xml | 2 +- .../src/main/resources/hibernate.cfg.xml | 2 +- .../infrastructure/schema/schema-soap/pom.xml | 2 +- .../soap/RegistrySchemaServiceImpl.java | 2 +- .../soap/cxf/EditedResourceInfoFullType.java | 2 +- .../schema/soap/cxf/FullResourceType.java | 2 +- .../schema/soap/cxf/GetResourceInfoList.java | 2 +- .../GetResourceInfoListByFullNameRequest.java | 2 +- .../GetResourceInfoListByFullPathRequest.java | 2 +- .../cxf/GetResourceInfoListByNameRequest.java | 2 +- ...GetResourceInfoListByNamespaceRequest.java | 2 +- .../cxf/GetResourceInfoListByPathRequest.java | 2 +- .../soap/cxf/GetResourceInfoListRequest.java | 2 +- .../schema/soap/cxf/LoadResourceType.java | 2 +- .../schema/soap/cxf/ObjectFactory.java | 2 +- .../soap/cxf/RegistrySchemaService.java | 2 +- .../cxf/RegistrySchemaService_Service.java | 2 +- .../schema/soap/cxf/ResourceInfoFullType.java | 2 +- .../schema/soap/cxf/ResourceInfoType.java | 2 +- .../schema/soap/cxf/ResourceType.java | 2 +- .../schema/soap/cxf/package-info.java | 2 +- .../schema/soap/mapper/ResourceMapper.java | 2 +- ...orm.runtime.core.infrastructure.schema.cfg | 2 +- .../OSGI-INF/blueprint/blueprint.xml | 2 +- .../initializer/artifact-loader/LICENSE.txt | 175 + .../core/initializer/artifact-loader/pom.xml | 35 + .../artifactloader/ArtifactDeployer.java | 255 + .../artifactloader/ArtifactInstaller.java | 381 + .../artifactloader/ArtifactLoader.java | 58 + .../connection-initializer/pom.xml | 2 +- .../connection/ConnectionInitializer.java | 2 +- .../etc/init/broker-connections.json | 14 + .../etc/init/db-connections.json | 20 + .../core/initializer/core-initializer/pom.xml | 2 +- .../initializer/core/CoreInitializer.java | 2 +- .../datasources-initializer/pom.xml | 2 +- .../src/main/assembly/datasources.xml | 2 +- .../datasources/DataSourcesCollector.java | 2 +- .../datasources/DataSourcesInitializer.java | 2 +- .../DataSourcesStandaloneInitializer.java | 59 + ...g.ops4j.datasource-entaxy.esb.cache.cfg.h2 | 2 +- ...g.ops4j.datasource-entaxy.esb.cache.cfg.pg | 2 +- ...ops4j.datasource-entaxy.esb.storage.cfg.h2 | 2 +- ...ops4j.datasource-entaxy.esb.storage.cfg.pg | 2 +- .../OSGI-INF/blueprint/blueprint.xml | 2 +- .../core/initializer/init-manager/pom.xml | 2 +- .../runtime/core/initializer/Activator.java | 2 +- .../runtime/core/initializer/InitManager.java | 2 +- .../core/initializer/InitializerTracker.java | 2 +- .../initializer/api/AbstractInitializer.java | 2 +- .../api/AbstractStandaloneInitializer.java | 85 + .../core/initializer/api/Initialized.java | 38 + .../core/initializer/api/Initializer.java | 2 +- .../initializer/api/InitializerException.java | 2 +- .../api/StandaloneInitializer.java | 40 + platform/runtime/core/initializer/pom.xml | 2 +- .../storage-initializer/cache/pom.xml | 2 +- .../OSGI-INF/blueprint/camel-contex.xml | 2 +- .../cache/src/main/resources/db/changelog.xml | 2 +- .../001-aggregation-table-create.xml | 2 +- .../resources/db/changeset/002-quartz.xml | 2 +- .../storage-initializer/esb_entaxy/pom.xml | 2 +- .../OSGI-INF/blueprint/camel-contex.xml | 2 +- .../src/main/resources/db/changelog.xml | 2 +- .../db/changeset/001-storage-table-create.xml | 2 +- .../002-service_registry-table-create.xml | 2 +- .../db/changeset/003-bundle-table-create.xml | 2 +- .../db/changeset/004-system-table-create.xml | 2 +- .../005-basic_auth_accounts-table-create.xml | 2 +- .../006-event_topic-table-create.xml | 2 +- ...tem_subscription_registry-table-create.xml | 2 +- .../changeset/008-connector-table-create.xml | 2 +- .../009-export-allowed-create-table.xml | 2 +- .../changeset/010-permission-table-create.xml | 2 +- .../db/changeset/011-admin-account.xml | 2 +- .../changeset/012-alter-version-on-string.xml | 2 +- .../changeset/013-admin-topic-permission.xml | 2 +- .../014-alter-tables-topic-subscription.xml | 2 +- .../db/changeset/015-schema-table-create.xml | 2 +- .../016-temp-add-permission-to-universal.xml | 2 +- .../liquibase-updater/pom.xml | 2 +- .../liquibase/updater/LiquibaseUpdater.java | 2 +- .../initializer/storage-initializer/pom.xml | 2 +- .../cluster-node-management/pom.xml | 2 +- .../management/cluster/node/Attributes.java | 2 +- .../management/cluster/node/ClusterUtils.java | 2 +- .../cluster/node/impl/Activator.java | 2 +- .../ClusterLocalNodeDataProviderImpl.java | 2 +- .../node/impl/ClusterNodeMBeanImpl.java | 2 +- .../node/impl/MemberAwareDataProvider.java | 2 +- .../cluster/node/impl/MemberMBeanManager.java | 2 +- .../cluster/node/impl/ServiceHelper.java | 2 +- .../management/config-management/LICENSE.txt | 175 + .../core/management/config-management/pom.xml | 38 + .../config/management/ConfigMBean.java | 43 + .../config/management/ConfigsMBean.java | 44 + .../config/management/ObjectConfigMBean.java | 40 + .../management/impl/ConfigMBeanFactory.java | 72 + .../management/impl/ConfigMBeanImpl.java | 63 + .../management/impl/ConfigsMBeanImpl.java | 56 + .../impl/ObjectConfigMBeanImpl.java | 44 + .../management/connection-management/pom.xml | 2 +- .../connection/to_remove/ConnectionMBean.java | 76 + .../to_remove/ConnectionsMBean.java | 46 + .../to_remove/impl/ConnectionMBeanImpl.java | 105 + .../to_remove/impl/ConnectionsMBeanImpl.java | 145 + .../to_remove/impl/ManagedConnection.java | 116 + .../to_remove/impl/ManagedConnections.java | 35 + .../impl/ManagedConnectionsListener.java | 33 + .../tracker/DeployedConnectionCustomizer.java | 102 + .../tracker/DeployedConnectionTracker.java | 43 + .../connection/ConnectionMBean.java | 85 + .../connection/ConnectionsMBean.java | 59 + .../impl/ConnectionMBeanFactory.java | 75 + .../connection/impl/ConnectionMBeanImpl.java | 76 + .../connection/impl/ConnectionsMBeanImpl.java | 108 + .../DeployedLegacyConnectionCustomizer.java | 105 + .../DeployedLegacyConnectionTracker.java | 39 + .../support/legacy/LegacyConnectionMBean.java | 76 + .../legacy/LegacyConnectionMBeanImpl.java | 106 + .../legacy/LegacyConnectionsManager.java | 125 + .../legacy/ManagedLegacyConnection.java | 116 + .../legacy/ManagedLegacyConnections.java | 35 + .../ManagedLegacyConnectionsListener.java | 34 + .../management/connector-management/pom.xml | 2 +- .../management/connector/ConnectorsMBean.java | 2 +- .../connector/impl/ConnectorsMBeanImpl.java | 2 +- .../core/management/node-management/pom.xml | 2 +- .../node/ClusterLocalNodeDataProvider.java | 2 +- .../management/node/ClusterNodeMBean.java | 2 +- .../core/management/node/LocalNodeMBean.java | 2 +- .../management/node/NodeDataProvider.java | 2 +- .../node/NodeDataProviderAware.java | 2 +- .../core/management/node/NodeMBean.java | 2 +- .../node/impl/LocalNodeMBeanImpl.java | 2 +- .../management/object-management/LICENSE.txt | 175 + .../core/management/object-management/pom.xml | 39 + .../management/object/ContainerMBean.java | 46 + .../object/EntaxyRuntimeItemMBean.java | 162 + .../EntaxyRuntimeObjectContainerMBean.java | 38 + .../object/EntaxyRuntimeObjectMBean.java | 99 + .../EntaxyRuntimeObjectMBeanCustomizer.java | 45 + .../EntaxyRuntimeObjectMBeanFactory.java | 56 + .../core/management/object/MBeanFactory.java | 43 + .../core/management/object/ObjectMBean.java | 40 + .../object/factory/AbstractMBeanFactory.java | 62 + .../factory/AbstractObjectContainerMBean.java | 54 + .../factory/AbstractObjectItemMBean.java | 134 + .../object/factory/AbstractObjectMBean.java | 215 + .../object/factory/ObjectsContainerMBean.java | 65 + .../impl/EntaxyObjectMBeanFactory.java | 88 + .../impl/EntaxyRuntimeObjectMBeanImpl.java | 41 + .../impl/ObjectsContainerMBeanImpl.java | 150 + .../object/factory/impl/ServiceHelper.java | 81 + .../impl/EntaxyRuntimeItemMBeanInfo.java | 133 + ...EntaxyRuntimeObjectContainerMBeanInfo.java | 33 + ...axyRuntimeObjectMBeanCustomizerHolder.java | 43 + .../impl/EntaxyRuntimeObjectMBeanInfo.java | 119 + .../impl/EntaxyRuntimeObjectMBeanManager.java | 734 + .../management/object/impl/MBeanHolder.java | 150 + .../management/object/impl/MBeanUtils.java | 101 + ...ntaxyRuntimeObjectMBeanManagerSupport.java | 39 + .../object/shell/ListMBeanFactories.java | 59 + .../management/object/shell/ListMBeans.java | 77 + platform/runtime/core/management/pom.xml | 2 +- .../management/profile-management/pom.xml | 2 +- .../profile/helper/AccountHelper.java | 32 + .../profile/helper/AccountHelperImpl.java | 95 + .../profile/helper/ConnectorHelper.java | 32 + .../profile/helper/ConnectorHelperImpl.java | 122 + .../management/profile/helper/Helpers.java | 68 + .../profile/helper/PermissionHelper.java | 32 + .../profile/helper/PermissionHelperImpl.java | 108 + .../profile/helper/ProfileHelper.java | 32 + .../profile/helper/ProfileHelperImpl.java | 133 + .../profile/helper/SystemHelper.java | 32 + .../profile/helper/SystemHelperImpl.java | 81 + .../management/profile/ConnectorMBean.java | 75 + .../management/profile/DefaultRouteMBean.java | 62 + .../NotBackwardCompatibleException.java | 41 + .../core/management/profile/ProfileMBean.java | 135 + .../management/profile/ProfilesMBean.java | 48 + .../core/management/profile/RoutesMBean.java | 44 + .../profile/impl/ConnectorMBeanFactory.java | 79 + .../profile/impl/ConnectorMBeanImpl.java | 99 + .../impl/DefaultRouteMBeanFactory.java | 76 + .../profile/impl/DefaultRouteMBeanImpl.java | 95 + .../profile/impl/ProfileMBeanFactory.java | 81 + .../profile/impl/ProfileMBeanImpl.java | 188 + .../profile/impl/ProfilesMBeanImpl.java | 106 + .../support/legacy/AccountManager.java | 35 + .../support/legacy/ConnectorMBean.java | 83 + .../support/legacy/ConnectorManager.java | 40 + .../support/legacy/ConnectorsMBean.java | 44 + .../DeployedLegacyConnectorCustomizer.java | 113 + .../legacy/LegacyConnectorMBeanImpl.java | 94 + .../legacy/LegacyConnectorManager.java | 72 + .../legacy/ManagedLegacyConnector.java | 136 + .../ManagedLegacyConnectorsListener.java | 77 + .../support/legacy/PermissionManager.java | 38 + .../support/legacy/ProfileManager.java | 57 + .../profile/support/legacy/SystemManager.java | 32 + .../repository-management/LICENSE.txt | 175 + .../management/repository-management/pom.xml | 46 + .../repository/RepositoriesMBean.java | 48 + .../repository/RepositoryMBean.java | 41 + .../impl/RepositoriesMBeanImpl.java | 75 + .../impl/RepositoryMBeanFactory.java | 73 + .../repository/impl/RepositoryMBeanImpl.java | 44 + .../management/route-management/LICENSE.txt | 175 + .../core/management/route-management/pom.xml | 32 + .../route/RouteComponentLibrariesMBean.java | 45 + .../management/route/RouteLibrariesMBean.java | 45 + .../management/route/RouteLibraryMBean.java | 48 + .../core/management/route/RouteMBean.java | 79 + .../core/management/route/RoutesMBean.java | 82 + .../RouteComponentLibrariesMBeanImpl.java | 71 + .../route/impl/RouteLibrariesMBeanImpl.java | 48 + .../route/impl/RouteLibraryMBeanImpl.java | 46 + .../management/route/impl/RouteMBeanImpl.java | 43 + .../route/impl/RouteMbeanFactory.java | 142 + .../route/impl/RoutesMBeanImpl.java | 65 + .../management/service-management/pom.xml | 2 +- .../core/management/service/ServiceMBean.java | 53 + .../management/service/ServicesMBean.java | 65 + .../service/impl/ServiceMBeanFactory.java | 101 + .../service/impl/ServiceMBeanImpl.java | 61 + .../service/impl/ServicesMBeanImpl.java | 141 + .../object-producer-api/pom.xml | 2 +- .../api/EntaxyFactoryDataProcessor.java | 2 +- .../core/producer/api/EntaxyProducer.java | 2 +- .../producer/api/EntaxyProducerService.java | 2 +- .../producer/api/EntaxyProducerUtils.java | 2 +- .../producer/api/EntaxyWrappedFactory.java | 2 +- .../core/producer/api/ExecutionPlan.java | 2 +- .../core/producer/api/ExecutionTask.java | 2 +- .../core/producer/api/ProducerResult.java | 2 +- .../api/ProducingCommandExecutor.java | 2 +- .../object-producer-core/pom.xml | 2 +- .../audit/ObjectProducerEventConverter.java | 84 + .../executor/AbstractCommandExecutor.java | 2 +- .../producer/executor/CommandExecutor.java | 2 +- .../executor/CommandInstructions.java | 2 +- .../producer/executor/ProducingExecutor.java | 4 +- .../executor/builder/BuiltObject.java | 2 +- .../executor/builder/BuiltObjectList.java | 2 +- .../executor/builder/DefaultBuiltObject.java | 2 +- .../executor/builder/ObjectBuilder.java | 2 +- .../producer/executor/commands/Analyze.java | 2 +- .../producer/executor/commands/Build.java | 2 +- .../producer/executor/commands/Deploy.java | 2 +- .../producer/executor/commands/Enrich.java | 2 +- .../producer/executor/commands/Generate.java | 2 +- .../producer/executor/commands/Install.java | 2 +- .../producer/executor/commands/Layout.java | 2 +- .../executor/commands/PrepareGenerate.java | 2 +- .../producer/executor/commands/Store.java | 2 +- .../producer/executor/commands/Validate.java | 2 +- .../deployer/DefaultDeployedObject.java | 2 +- .../executor/deployer/DeployedObject.java | 2 +- .../executor/deployer/DeployedObjectList.java | 2 +- .../executor/deployer/ObjectDeployer.java | 2 +- .../generationmodel/AbstractObjectTask.java | 2 +- .../generationmodel/AbstractRefTask.java | 2 +- .../generationmodel/AbstractTask.java | 2 +- .../generationmodel/CalculateTask.java | 2 +- .../DefaultObjectDataResolver.java | 2 +- .../generationmodel/GenerateRefTask.java | 2 +- .../generationmodel/GenerateTask.java | 2 +- .../generationmodel/GeneratedHeaders.java | 2 +- .../generationmodel/GeneratedList.java | 2 +- .../GeneratedObjectsPublishDataStorage.java | 174 + .../generationmodel/GenerationModel.java | 2 +- .../executor/generationmodel/MergeTask.java | 2 +- .../generationmodel/ObjectDataResolver.java | 2 +- .../generationmodel/ObjectResolveHelper.java | 2 +- .../generationmodel/ResolveObjectTask.java | 2 +- .../generationmodel/ResolveRefTask.java | 2 +- .../merge/AbstractMergeProcessor.java | 2 +- .../merge/BlueprintMergeProcessor.java | 13 +- .../generationmodel/merge/MergeHelper.java | 2 +- .../generationmodel/merge/MergeProcessor.java | 2 +- .../generationmodel/merge/MergingMap.java | 2 +- .../installer/DefaultInstalledObject.java | 2 +- .../executor/installer/InstalledObject.java | 2 +- .../installer/InstalledObjectList.java | 2 +- .../executor/installer/ObjectInstaller.java | 2 +- .../objectmodel/AbstractFactored.java | 2 +- .../executor/objectmodel/AbstractItem.java | 2 +- .../executor/objectmodel/Calculation.java | 2 +- .../executor/objectmodel/FactoredObject.java | 2 +- .../objectmodel/FactoredObjectProxy.java | 2 +- .../objectmodel/FactoredObjectRef.java | 2 +- .../executor/objectmodel/FactoryChecker.java | 2 +- .../executor/objectmodel/ObjectModel.java | 2 +- .../support/AbstractPrintOutputSupport.java | 2 +- .../executor/support/ArtifactSupport.java | 2 +- .../support/EntaxyObjectPropertiesHelper.java | 2 +- .../executor/support/LocalPrintOutput.java | 2 +- .../support/ObjectSupportRegistry.java | 2 +- .../executor/support/PrintOutputSupport.java | 2 +- .../producer/impl/CommonObjectProducer.java | 15 +- .../core/producer/impl/DefaultProducer.java | 2 +- .../EntaxyFactoryDataProcessorService.java | 2 +- .../producer/impl/EntaxyProducerInfo.java | 2 +- .../impl/EntaxyProducerServiceImpl.java | 2 +- .../core/producer/impl/FieldInfoImpl.java | 2 +- .../producer/impl/InstructionsHelper.java | 2 +- .../core/producer/impl/RefFieldInfoImpl.java | 2 +- .../impl/UniformExtendableProducer.java | 186 + .../AbstractConsumerAwareMetadataStorage.java | 2 +- .../producer/support/ExchangeEnricher.java | 2 +- .../producer/support/MetadataStorage.java | 2 +- .../support/MetadataStorageConsumer.java | 2 +- .../support/MetadataStorageEmpty.java | 2 +- .../producer/support/MetadataStorageImpl.java | 2 +- .../support/MetadataStorageWrapper.java | 2 +- .../core/producer/support/package-info.java | 2 +- .../wrapper/AbstractFactoryWrapper.java | 2 +- .../wrapper/DefaultFactoryWrapper.java | 2 +- .../core/producer/wrapper/FieldWrapper.java | 2 +- .../wrapper/GenerationProcessorService.java | 2 +- .../producer/wrapper/RefFieldWrapper.java | 2 +- .../config/BlueprintMergeProcessor.json | 1 + .../object-producing-config-support/pom.xml | 2 +- .../producer/config/AddConfigCommand.java | 2 +- .../producer/config/AddConfigCommand2.java | 290 + .../config/ConfigObjectDataResolver.java | 2 +- .../core/producer/config/ConfigProcessor.java | 9 +- .../core/producer/config/ConfigProducer.java | 13 +- .../core/producer/config/ConfigProducer2.java | 194 + .../config/support/ConfigObjectSupport.java | 114 + .../config/support/DeployableConfig.java | 95 + .../merge/config/BlueprintMergeProcessor.json | 8 + .../ru/entaxy/factory/object-config.json | 103 + .../object-config/config-defaults-field.ftl | 29 + .../object-config/config-defaults.ftl | 44 + .../object-config/config-link-field.ftl | 23 + .../entaxy/templates/object-config/init.ftl | 2 + .../ru/entaxy/templates/object-config/ref.ftl | 22 + .../object-producing-management/pom.xml | 2 +- .../producer/management/FactoriesMBean.java | 2 +- .../producer/management/FactoryMBean.java | 2 +- .../producer/management/ProducerMBean.java | 2 +- .../management/impl/FactoriesMBeanImpl.java | 2 +- .../management/impl/FactoryMBeanImpl.java | 2 +- .../impl/FactoryMBeanPublisher.java | 2 +- .../management/impl/ManagedProducer.java | 2 +- .../management/impl/ManagedTypedProducer.java | 2 +- .../impl/ManagedTypedProducers.java | 2 +- .../management/impl/ProducerMBeanImpl.java | 2 +- .../impl/ProducerServiceHelper.java | 2 +- .../impl/TypedProducerListener.java | 2 +- .../pom.xml | 2 +- .../resources/DeployableResource.java | 2 +- .../EntaxyResourceProducingProcessor.java | 37 + ...taxyResourceProducingProcessorService.java | 34 + .../EntaxyResourceStringFormatter.java | 2 +- .../resources/ProcessResourcesCommand.java | 2 +- .../resources/ResourceDataProcessor.java | 2 +- .../resources/ResourceDescriptor.java | 2 +- .../resources/ResourceObjectSupport.java | 2 +- .../producer/resources/ResourceProducer.java | 2 +- .../resources/StringFormatterService.java | 2 +- .../resources/formatters/Base64Formatter.java | 2 +- .../generator/GeneratedResourceWrapper.java | 2 +- .../generator/ResourceWrapGenerator.java | 2 +- ...ResourceProducingProcessorServiceImpl.java | 90 + .../impl/ResourceDataProcessorImpl.java | 2 +- .../impl/StringFormatterServiceImpl.java | 2 +- .../processors/MergeResourceProcessor.java | 2 +- .../processors/XSLTResourceProcessor.java | 2 +- .../XSLTSaxonResourceProcessor.java | 2 +- .../object-producing-shell/pom.xml | 2 +- .../shell/EntaxyProducerServiceSupport.java | 2 +- .../producer/shell/FactoryAwareCommand.java | 2 +- .../producer/shell/FactoryConfiguration.java | 2 +- .../core/producer/shell/FactoryEssence.java | 62 + .../core/producer/shell/FactoryFields.java | 2 +- .../core/producer/shell/FactoryGenerate.java | 2 +- .../producer/shell/FactoryManagerStatus.java | 2 +- .../core/producer/shell/FactoryOutputs.java | 2 +- .../core/producer/shell/FactoryTypeInfo.java | 2 +- .../core/producer/shell/FindFactories.java | 91 + .../core/producer/shell/ListFactories.java | 2 +- .../core/producer/shell/ListProducers.java | 2 +- .../platform/core/producer/shell/Produce.java | 2 +- .../shell/completers/FactoryIdCompleter.java | 2 +- .../runtime/core/object-producing/pom.xml | 6 +- .../object-runtime-core/pom.xml | 2 +- .../runtime/EntaxyObjectCustomizer.java | 38 + .../objects/runtime/EntaxyRuntimeObject.java | 2 +- .../runtime/EntaxyRuntimeObjectContainer.java | 2 +- ...taxyRuntimeObjectExtendedDataProvider.java | 36 + .../runtime/EntaxyRuntimeObjectManager.java | 5 +- .../runtime/EntaxyRuntimeObjectResource.java | 2 +- .../runtime/EntaxyRuntimeObjectService.java | 2 +- .../runtime/EntaxyRuntimeRelation.java | 2 +- .../healthcheck/GhostObjectsHealthCheck.java | 2 +- .../impl/ClusterExtendedDataProvider.java | 99 + .../EntaxyRuntimeObjectContainerBundle.java | 2 +- .../EntaxyRuntimeObjectContainerImpl.java | 2 +- .../runtime/impl/EntaxyRuntimeObjectImpl.java | 2 +- .../impl/EntaxyRuntimeObjectResourceImpl.java | 2 +- .../impl/EntaxyRuntimeObjectServiceImpl.java | 2 +- .../impl/EntaxyRuntimeRelationImpl.java | 2 +- .../runtime/impl/ObjectRuntimeStorage.java | 2 +- .../impl/RuntimeObjectSearchProvider.java | 171 + .../EntaxyRuntimeObjectManagerImpl.java | 9 +- .../impl/manager/OperationConfigImpl.java | 17 +- .../impl/manager/OperationExecutor.java | 25 +- .../impl/manager/OperationExecutorStart.java | 13 +- .../impl/manager/OperationExecutorStop.java | 2 +- .../manager/OperationExecutorUninstall.java | 11 +- .../impl/manager/OperationResultImpl.java | 2 +- .../internal/ObjectResourcesProvider.java | 48 + .../object-runtime-shell/pom.xml | 2 +- .../runtime/shell/ContainerAwareCommand.java | 2 +- .../objects/runtime/shell/ContainerInfo.java | 2 +- .../objects/runtime/shell/ContainerList.java | 2 +- .../EntaxyRuntimeObjectServiceSupport.java | 2 +- .../objects/runtime/shell/ObjectFind.java | 63 + .../objects/runtime/shell/ObjectInfo.java | 2 +- .../runtime/shell/ObjectOperationCommand.java | 2 +- .../runtime/shell/ObjectResources.java | 2 +- .../objects/runtime/shell/ObjectStart.java | 2 +- .../objects/runtime/shell/ObjectStop.java | 2 +- .../runtime/shell/ObjectUninstall.java | 2 +- .../objects/runtime/shell/ObjectVersions.java | 76 + .../shell/RuntimeObjectAwareCommand.java | 2 +- .../shell/RuntimeObjectShellUtils.java | 2 +- .../shell/completers/ContainerCompleter.java | 2 +- .../completers/RuntimeObjectCompleter.java | 2 +- platform/runtime/core/object-runtime/pom.xml | 2 +- .../config-implementation/LICENSE.txt | 175 + .../config-runtime/LICENSE.txt | 175 + .../config-runtime/pom.xml | 49 + .../config/runtime/ConfigEntaxyObject.java | 163 + .../runtime/ConfigEntaxyObjectWrapped.java | 32 + .../platform/config/runtime/ObjectConfig.java | 588 + .../runtime/ObjectConfigCustomizer.java | 55 + .../config/runtime/ObjectConfigEditor.java | 209 + .../config/runtime/ObjectConfigHelper.java | 100 + .../config-implementation/pom.xml | 16 + .../connection-producing/pom.xml | 2 +- .../producing/ConnectionProducer.java | 2 +- .../adapters/AdapterWrapManager.java | 2 +- .../AdapterWrapperDefaultFactory.java | 2 +- .../adapters/AdapterWrapperEntaxyFactory.java | 2 +- .../AdapterWrapperGenerationProcessor.java | 2 +- .../producing/adapters/ConfigConverter.java | 2 +- .../producing/adapters/TrackedAdapter.java | 2 +- .../adapters/TrackedAdapterCustomizer.java | 2 +- .../TrackedAdapterCustomizerListener.java | 2 +- .../connection-implementation/pom.xml | 2 +- .../standard-connections-pack/pom.xml | 2 +- .../file/FileConnectionComponent.java | 2 +- .../ftp/FtpConnectionComponent.java | 2 +- .../ftps/FtpsConnectionComponent.java | 130 + .../sftp/SftpConnectionComponent.java | 2 +- .../ru/entaxy/factory/ftps-connection.json | 2442 +++ .../remote-file-abstract-connection.json | 5 +- .../templates/ftps-connection/init.body.ftl | 9 + .../entaxy/templates/ftps-connection/init.ftl | 19 + .../ftps-connection/init.private.ftl | 3 + .../connector-producing/pom.xml | 2 +- .../producing/ConnectorProducer.java | 2 +- .../ru/entaxy/factory/abstract-connector.json | 6 +- .../abstract-connector-in/pre-route.bak.xml | 7 + .../abstract-connector-out/pre-output.bak.xml | 7 + .../abstract-connector/response-route.bak.xml | 5 + .../exclusiveSupport.ftl | 2 +- .../abstract-connector/__errorHandler.ftl | 31 + .../abstract-connector/globalOptions.ftl | 2 + .../connector-implementation/pom.xml | 2 +- .../standard-connectors-pack/pom.xml | 2 +- .../entaxy/factory/artemis-connector-out.json | 32 +- .../ru/entaxy/factory/ftps-connector-in.json | 83 + .../ru/entaxy/factory/ftps-connector-out.json | 71 + .../ru/entaxy/factory/http-connector-out.json | 2708 +++ .../custom-connector-in/input-route.bak.xml | 5 + .../customObjectReferences.ftl | 8 + .../templates/artemis-connector-out/init.ftl | 20 +- .../templates/ftps-connector-in/init.ftl | 17 + .../templates/ftps-connector-out/init.ftl | 16 + .../customObjectReferences.ftl | 53 + .../http-connector-out/customObjects.ftl | 7 + .../templates/http-connector-out/init.ftl | 21 + .../core/objects-implementations/pom.xml | 2 +- .../profile-implementation/pom.xml | 2 +- .../profile-producing/pom.xml | 2 +- .../profile/producing/ProfileProducer.java | 2 +- .../entaxy/factory/common-system-profile.json | 16 +- .../ru/entaxy/factory/default-route-2.json | 4 +- .../in-flow-pre-route.bak.xml | 7 + .../in-flow-response.bak.xml | 7 + .../out-flow-connector-selector.bak.xml | 23 + .../out-flow-pre-route.bak.xml | 7 + .../out-flow-response.bak.xml | 7 + .../default-route-2/default-route.bak.xml | 5 + .../LICENSE.txt | 175 + .../profile-runtime-camel-components/pom.xml | 41 + .../esb/system/component/SystemComponent.java | 44 + .../esb/system/component/SystemConsumer.java | 71 + .../esb/system/component/SystemEndpoint.java | 115 + .../esb/system/component/SystemProducer.java | 130 + .../component/util/SystemConstants.java | 34 + .../component/SystemGroupComponent.java | 44 + .../groups/component/SystemGroupConsumer.java | 71 + .../groups/component/SystemGroupEndpoint.java | 86 + .../groups/component/SystemGroupProducer.java | 88 + .../component/util/SystemGroupConstants.java | 34 + .../org/apache/camel/component/system | 1 + .../org/apache/camel/component/system-group | 1 + .../LICENSE.txt | 175 + .../profile-runtime-legacy-support/pom.xml | 43 + .../profile/SystemGroupCollectorListener.java | 31 + .../groups/profile/SystemGroupProfile.java | 36 + .../SystemGroupProfileNamedListener.java | 39 + .../defaults/DefaultSystemGroupProfile.java | 104 + .../system/profile/commons/CommonProfile.java | 90 + .../profile/commons/ConnectorRegistry.java | 60 + .../profile/commons/InConnectorCollector.java | 37 + .../esb/system/profile/commons/Profile.java | 39 + .../commons/connectors/CommonConnector.java | 79 + .../profile/commons/connectors/Connector.java | 53 + .../in/DirectVMInConnectorImpl.java | 48 + .../commons/connectors/in/InConnector.java | 33 + .../out/DirectVMOutConnectorImpl.java | 45 + .../commons/connectors/out/OutConnector.java | 33 + .../commons/profile_output/ProfileOutput.java | 48 + .../profile_output/ProfileOutputImpl.java | 148 + .../profile/SystemCollectorListener.java | 32 + .../systems/profile/SystemProfile.java | 32 + .../collector/SystemProfileNamedListener.java | 49 + .../impl/defaults/DefaultSystemProfile.java | 45 + .../OSGI-INF/blueprint/blueprint.xml | 65 + .../profile-runtime/pom.xml | 2 +- .../platform/profiles/runtime/Connector.java | 2 +- .../profiles/runtime/InConnector.java | 2 +- .../profiles/runtime/OutConnector.java | 2 +- .../platform/profiles/runtime/Profile.java | 2 +- .../profiles/runtime/SystemProfile.java | 2 +- .../runtime/impl/AbstractConnector.java | 2 +- .../runtime/impl/AbstractProfile.java | 2 +- .../runtime/impl/InConnectorImpl.java | 2 +- .../runtime/impl/OutConnectorImpl.java | 2 +- .../runtime/impl/SystemProfileImpl.java | 2 +- .../runtime/support/ConnectorSelector.java | 24 +- .../repository-implementation/LICENSE.txt | 175 + .../repository-implementation/pom.xml | 16 + .../repository-producing/LICENSE.txt | 175 + .../repository-producing/pom.xml | 30 + .../objectproducer/producer/config.json | 3 + .../entaxy/factory/artifact-repository.json | 135 + .../templates/artifact-repository/init.ftl | 24 + .../route-implementation/pom.xml | 2 +- .../route-producing/pom.xml | 20 +- .../redeliveryPolicy-originalFromCamel.json | 41 + .../design/library/ComponentLibrary.java | 95 + .../library/ComponentLibraryManager.java | 49 + .../ComponentLibraryResourceProcessor.java | 108 + .../impl/ComponentLibraryManagerImpl.java | 326 + .../library/shell/CommandLibraryList.java | 65 + .../shell/ComponentLibraryCommandSupport.java | 39 + .../ComponentLibraryResourceProvider.java | 55 + .../storage/ComponentLibraryStorage.java | 392 + .../storage/ProvidedLibraryDescriptor.java | 107 + .../tracker/ComponentLibraryTracker.java | 223 + .../entaxy-main/blueprint-entaxy.xsd | 993 ++ .../entaxy-main/blueprint.xsd | 991 ++ .../entaxy-main/camel-entaxy.xsd | 13755 ++++++++++++++++ .../component-library/entaxy-main/camel.xsd | 13730 +++++++++++++++ .../entaxy-main/connector-selector.json | 38 + .../entaxy-main/connector-selector.xsd | 38 + .../entaxy-main/connector-selector.xslt | 148 + .../entaxy-main/entaxy-connectors.xslt | 194 + .../entaxy-main/entaxy-mediators.json | 1113 ++ .../entaxy-main/entaxy-mediators.xsd | 1253 ++ .../entaxy-main/entaxy-mediators.xslt | 1781 ++ .../entaxy-main/entaxy-profiles.xslt | 161 + .../entaxy-main/entaxy-routes.xslt | 300 + .../entaxy-main/entaxy-services.xslt | 83 + .../entaxy-main/entaxy-struct.xslt | 51 + .../entaxy-main/entaxy-test-2.xml | 36 + .../entaxy-main/entaxy-test.xml | 42 + .../component-library/entaxy-main/entaxy.xsd | 466 + .../entaxy-main/library.json | 101 + .../entaxy-main/rest-service-components.json | 183 + .../entaxy-main/rest-service-components.xsd | 106 + .../entaxy-main/rest-service-components.xslt | 104 + .../entaxy-main/soap-service-components.json | 183 + .../entaxy-main/soap-service-components.xsd | 106 + .../entaxy-main/soap-service-components.xslt | 104 + .../entaxy-main/xml-to-string.xsl | 434 + .../merge/config/BlueprintMergeProcessor.json | 46 + .../objectproducer/producer/config.json | 9 + .../camel/abstract-camel-component.json | 14 + .../factory/camel/abstract-camel-item.json | 14 + .../factory/camel/abstract-camel-model.json | 14 + .../camel/components/camel-quartz.json | 1299 ++ .../factory/camel/components/camel-timer.json | 804 + .../factory/camel/model/model-aggregate.json | 1312 ++ .../factory/camel/model/model-quartz.json | 88 + .../factory/camel/model/model-timer.json | 854 + .../ru/entaxy/factory/cookie-handler.json | 97 + .../ru/entaxy/factory/ftp-client-config.json | 34 + .../factory/header-filter-strategy.json | 130 + .../ru/entaxy/factory/hostname-verifier.json | 97 + .../resources/ru/entaxy/factory/oauth.json | 596 + .../ru/entaxy/factory/redelivery-policy.json | 867 + .../routes/abstract-route-component.json | 25 + .../abstract-route-container-object.json | 26 + .../routes/abstract-route-container.json | 390 + .../entaxy/factory/routes/abstract-route.json | 181 + .../abstract-aggregation-repository.json | 61 + ...act-aggregation-strategy-camel-simple.json | 64 + .../abstract-aggregation-strategy.json | 28 + .../aggregation-repository-camel-memory.json | 20 + .../aggregation-repository-entaxy-ignite.json | 40 + .../aggregation-repository-entaxy-jdbc.json | 73 + ...aggregation-repository-entaxy-postgre.json | 19 + ...gregation-strategy-camel-grouped-body.json | 20 + ...ation-strategy-camel-grouped-exchange.json | 20 + ...gation-strategy-camel-grouped-message.json | 20 + .../aggregation-strategy-camel-string.json | 31 + ...aggregation-strategy-camel-use-latest.json | 20 + ...gregation-strategy-camel-use-original.json | 20 + .../aggregation-strategy-entaxy-map.json | 48 + .../expression/abstract-expression.json | 26 + .../expression/common-expression.json | 53 + .../routes/components/route-timer.json | 38 + .../routes/route-aggregator-in-object.json | 37 + .../factory/routes/route-aggregator.json | 78 + .../routes/route-callable-in-object.json | 37 + .../entaxy/factory/routes/route-callable.json | 79 + .../entaxy/factory/routes/route-library.json | 28 + .../route-listener-queue-jms-artemis.json | 83 + .../routes/route-listener-queue-jms.json | 17 + .../factory/routes/route-listener-queue.json | 17 + .../entaxy/factory/routes/route-listener.json | 17 + .../entaxy/factory/routes/route-quartz.json | 41 + .../factory/routes/route-scheduled.json | 16 + .../factory/routes/route-self-started.json | 17 + .../route-subscription-topic-jms-artemis.json | 83 + .../routes/route-subscription-topic-jms.json | 18 + .../routes/route-subscription-topic.json | 17 + .../ru/entaxy/factory/routes/route-timer.json | 79 + .../factory/ssl-context-parameters.json | 271 + .../factories/abstract-route/routeContent.xml | 5 + .../parse-token-response.xml | 10 + .../pre-refresh-token.xml | 12 + .../oauth_client_credentials/pre-token.xml | 13 + .../oauth_password/parse-token-response.xml | 13 + .../oauth_password/pre-refresh-token.xml | 12 + .../base-object/oauth_password/pre-token.xml | 13 + .../base-object/parse-token-response.xml | 13 + .../base-object/pre-refresh-token.xml | 12 + .../factories/base-object/pre-token.xml | 13 + .../init.ftl | 3 + .../generate-logging-key.ftl | 16 + .../abstract-route-container/errorHandler.ftl | 31 + .../globalOptions.ftl | 2 + .../abstract-route-container/init.ftl | 30 + .../entaxy/templates/abstract-route/init.ftl | 8 + .../init.ftl | 2 + .../init.ftl | 8 + .../init.ftl | 15 + .../init.ftl | 2 + .../init.ftl | 4 + .../aggregation-strategy-entaxy-map/init.ftl | 5 + .../templates/base-object/cookie-handler.ftl | 2 + .../base-object/header-filter-strategy.ftl | 8 + .../base-object/hostname-verifier.ftl | 2 + .../templates/base-object/oauth-module.ftl | 283 + .../base-object/simple-custom-object.ftl | 4 + .../base-object/ssl-context-parameters.ftl | 57 + .../templates/common-expression/init.ftl | 2 + .../entaxy/templates/model-aggregate/init.ftl | 34 + .../ru/entaxy/templates/model-quartz/init.ftl | 2 + .../ru/entaxy/templates/model-timer/init.ftl | 7 + .../templates/route-aggregator/init.ftl | 9 + .../templates/route-callable/__init.ftl | 30 + .../entaxy/templates/route-library/init.ftl | 10 + .../route-listener-queue-jms-artemis/init.ftl | 11 + .../ru/entaxy/templates/route-quartz/init.ftl | 58 + .../init.ftl | 11 + .../ru/entaxy/templates/route-timer/init.ftl | 18 + .../route-runtime/LICENSE.txt | 175 + .../route-runtime/pom.xml | 30 + .../OSGI-INF/blueprint/log-context.xml | 114 + .../service-implementation/pom.xml | 2 +- .../service-producing/pom.xml | 14 +- .../service/producing/ServiceProducer.java | 2 +- .../factory/services/abstract-service.json | 10 + .../factory/services/rest/camel/cxf-rs.json | 1439 ++ .../abstract-service-rest-connector-out.json | 26 + .../client/openapi-based-rest-client.json | 459 + .../factory/services/service-components.json | 30 +- .../services/service-resources-abstract.json | 64 +- .../abstract-service-soap-connector-out.json | 26 + .../soap/client/wsdl-based-soap-client.json | 400 + .../services/soap/service-resources-soap.json | 13 +- .../soap/wsdl-based-soap-service.json | 14 +- .../routes-common/rest-operation-router.xslt | 6 + .../routes-common/soap-operation-router.xslt | 6 + .../resource/schemas/examples/pets.json | 1231 ++ .../resource/schemas/examples/pets.yaml | 806 + .../resource/schemas/examples/simpleApi.json | 88 + .../resource/schemas/examples/simpleApi.yaml | 51 + .../1.0.11/operationRouterClient.xml | 219 + .../1.0.11/operationRouterConnector.xml | 83 + .../1.0.11/operationRouterConnectorOut.xml | 112 + .../1.0.11/operationRouterProtected.xml | 103 + .../1.0.11/operationRouterPublic.xml | 84 + .../1.0.11/operationRouterClient.xml | 219 + .../1.0.11/operationRouterConnector.xml | 83 + .../1.0.11/operationRouterConnectorOut.xml | 112 + .../1.0.11/operationRouterProtected.xml | 103 + .../1.0.11/operationRouterPublic.xml | 84 + .../template/1.0.0/operationRouterClient.xml | 54 + .../1.0.0/operationRouterConnector.xml | 23 + .../1.0.0/operationRouterConnectorOut.xml | 25 + .../1.0.0/operationRouterProtected.xml | 28 + .../template/1.0.0/operationRouterPublic.xml | 24 + .../template/1.0.0/operationRouterClient.xml | 54 + .../1.0.0/operationRouterConnector.xml | 23 + .../1.0.0/operationRouterConnectorOut.xml | 25 + .../1.0.0/operationRouterProtected.xml | 28 + .../template/1.0.0/operationRouterPublic.xml | 24 + .../init.ftl | 17 + .../init.ftl | 17 + .../connectorOutFactory.ftl | 82 + .../customObjectReferences.ftl | 16 + .../openapi-based-rest-client/init.ftl | 143 + .../specificProtectedComponents.ftl | 15 + .../init.ftl | 64 +- .../service-components/generateLoggingKey.ftl | 19 + .../operationRouterClient.ftl | 38 + .../operationRouterConnector.bak.ftl | 21 + .../operationRouterConnectorOut.ftl | 30 + .../operationRouterProtected.bak.ftl | 23 + .../operationRouterPublic.bak.ftl | 22 + .../operationRouterClient.ftl | 10 + .../operationRouterConnector.bak.ftl | 18 + .../operationRouterConnectorOut.ftl | 18 + .../operationRouterProtected.bak.ftl | 20 + .../operationRouterPublic.bak.ftl | 19 + .../connectorOutFactory.ftl | 70 + .../customObjectReferences.ftl | 16 + .../templates/wsdl-based-soap-client/init.ftl | 67 + .../wsdl-based-soap-service-public/init.ftl | 7 +- .../service-runtime/pom.xml | 9 +- .../runtime/EntaxyServiceConnectorInfo.java | 2 +- .../runtime/exceptions/ConnectorNotFound.java | 2 +- .../impl/EntaxyServiceConnectorInfoImpl.java | 2 +- .../impl/EntaxyServiceConnectorRegistry.java | 2 +- .../DisableWSDLGetInterceptor.java | 63 + .../IsSchemaDisplayInterceptor.java | 2 +- .../PostAuthWSDLGetInterceptor.java | 162 + .../PublicOpenApiSchemaInterceptor.java | 107 + .../interceptor/ResolveLoginInterceptor.java | 60 + .../ResolveProfileNameInterceptor.java | 92 + .../interceptor/SOAPValidateInterceptor.java | 130 + .../interceptor/SystemHeadersConstants.java | 41 + .../runtime/interceptor/jwt/GetterToken.java | 62 + ...esolveProfileNameFromTokenInterceptor.java | 96 + ...SimpleAuthorizingFromTokenInterceptor.java | 66 + .../HibernateValidationProviderResolver.java | 39 + .../services/runtime/utils/XmlParser.java | 56 + .../OSGI-INF/blueprint/blueprint.xml | 2 +- platform/runtime/core/pom.xml | 2 +- .../core/src/main/features/features.xml | 7 +- .../main/healthcheck/generated/fragments.xml | 4 +- ...lchecks.HttpRequestsCheck-repositories.cfg | 2 +- ...eneralchecks.ServicesCheck-connections.cfg | 2 +- platform/runtime/modules/atlasmap/LICENSE.txt | 175 + .../modules/atlasmap/atlasmap-camel3/pom.xml | 310 + .../component/atlasmap/AtlasComponent.java | 75 + .../component/atlasmap/AtlasConstants.java | 32 + .../component/atlasmap/AtlasEndpoint.java | 471 + .../atlasmap/CamelAtlasPropertyStrategy.java | 93 + .../src/main/resources/META-INF/NOTICE.txt | 11 + .../services/org/apache/camel/component/atlas | 18 + .../component/atlasmap/AtlasEndpointTest.java | 175 + .../AtlasMapComponentJavaToJsonTest.java | 70 + .../atlasmap/AtlasMapComponentJsonTest.java | 52 + .../AtlasMapComponentJsonToJavaTest.java | 61 + .../atlasmap/AtlasMapComponentTest.java | 78 + ...tlasMapComponentXmlToXmlDefaultNsTest.java | 71 + .../AtlasMapComponentXmlToXmlTest.java | 71 + .../atlasmap/AtlasMapExtractMappingsTest.java | 68 + .../atlasmap/AtlasMapJsonToXmlSchemaTest.java | 70 + .../atlasmap/AtlasMapMultiDocsTest.java | 201 + .../atlasmap/AtlasMapMultiNSTest.java | 68 + .../CamelAtlasPropertyStrategyTest.java | 75 + .../apache/camel/component/atlasmap/Pojo.java | 30 + .../apache/camel/component/atlasmap/Util.java | 21 + .../atlasmap/issue/AtlasMapIssue2552Test.java | 95 + .../atlasmap/issue/AtlasMapIssue729Test.java | 54 + .../src/test/resources/atlasmap-mapping-n.adm | Bin 0 -> 5416 bytes .../src/test/resources/atlasmap-mapping.adm | Bin 0 -> 5235 bytes .../resources/atlasmapping-java-to-json.json | 56 + .../resources/atlasmapping-json-to-java.json | 56 + .../resources/atlasmapping-multidocs.json | 289 + .../test/resources/atlasmapping-multins.json | 52 + .../resources/atlasmapping-xml-to-xml.json | 66 + .../src/test/resources/atlasmapping.json | 95 + ...son-schema-source-to-xml-schema-target.adm | Bin 0 -> 2237 bytes .../src/test/resources/json-source.json | 47 + .../src/test/resources/log4j2.xml | 19 + ...tlasMapComponentJavaToJsonTest-context.xml | 16 + .../AtlasMapComponentJsonTest-context.xml | 16 + ...tlasMapComponentJsonToJavaTest-context.xml | 16 + .../AtlasMapComponentTest-context.xml | 16 + .../AtlasMapComponentXmlToXmlTest-context.xml | 16 + .../AtlasMapExtractMappingsTest-context.xml | 21 + .../AtlasMapJsonToXmlSchemaTest-context.xml | 16 + .../AtlasMapMultiDocsTest-context.xml | 31 + .../atlasmap/AtlasMapMultiNSTest-context.xml | 16 + .../component/atlasmap/issue/2552-input.json | 17 + .../issue/AtlasMapIssue2552Test-context.xml | 21 + .../issue/AtlasMapIssue729Test-context.xml | 16 + .../atlasmap/issue/atlasmapping-2552-new.json | 83 + .../atlasmap/issue/atlasmapping-2552-old.json | 83 + .../issue/atlasmapping-issue-729.json | 65 + .../test/resources/xml-target-schemaset.xml | 59 + .../atlasmap/atlasmap-entaxy-libs/LICENSE.txt | 175 + .../atlasmap/atlasmap-entaxy-libs/README.md | 42 + .../atlasmap/atlasmap-entaxy-libs/pom.xml | 115 + .../atlasmap/actions/CollectionActions.java | 57 + .../io/atlasmap/actions/DateFieldActions.java | 115 + .../io/atlasmap/actions/EntaxyActions.java | 118 + .../actions/ExpressionFieldAction.java | 74 + .../atlasmap/actions/NumberFieldActions.java | 477 + .../atlasmap/actions/ObjectFieldActions.java | 129 + .../actions/StringComplexFieldActions.java | 335 + .../actions/StringSimpleFieldActions.java | 188 + .../java/io/atlasmap/api/AtlasConstants.java | 52 + .../java/io/atlasmap/api/AtlasContext.java | 70 + .../io/atlasmap/api/AtlasContextFactory.java | 97 + .../api/AtlasConversionException.java | 62 + .../java/io/atlasmap/api/AtlasConverter.java | 50 + .../java/io/atlasmap/api/AtlasException.java | 61 + .../io/atlasmap/api/AtlasFieldAction.java | 49 + .../io/atlasmap/api/AtlasMappingBuilder.java | 63 + .../atlasmap/api/AtlasNotFoundException.java | 62 + .../io/atlasmap/api/AtlasPreviewContext.java | 50 + .../java/io/atlasmap/api/AtlasSession.java | 108 + .../api/AtlasUnsupportedException.java | 62 + .../api/AtlasValidationException.java | 62 + .../atlasmap/api/AtlasValidationService.java | 52 + .../java/io/atlasmap/builder/AtlasField.java | 169 + .../builder/DefaultAtlasMappingBuilder.java | 134 + .../converters/BigDecimalConverter.java | 287 + .../converters/BigIntegerConverter.java | 287 + .../atlasmap/converters/BooleanConverter.java | 151 + .../io/atlasmap/converters/ByteConverter.java | 177 + .../converters/CalendarConverter.java | 62 + .../converters/CharBufferConverter.java | 176 + .../converters/CharSequenceConverter.java | 387 + .../converters/CharacterConverter.java | 184 + .../io/atlasmap/converters/DateConverter.java | 209 + .../atlasmap/converters/DateTimeHelper.java | 118 + .../atlasmap/converters/DoubleConverter.java | 262 + .../atlasmap/converters/FloatConverter.java | 264 + .../GregorianCalendarConverter.java | 104 + .../atlasmap/converters/IntegerConverter.java | 197 + .../converters/LocalDateConverter.java | 208 + .../converters/LocalDateTimeConverter.java | 217 + .../converters/LocalTimeConverter.java | 209 + .../io/atlasmap/converters/LongConverter.java | 213 + .../atlasmap/converters/NumberConverter.java | 239 + .../atlasmap/converters/ShortConverter.java | 199 + .../atlasmap/converters/SqlDateConverter.java | 93 + .../atlasmap/converters/SqlTimeConverter.java | 96 + .../converters/SqlTimestampConverter.java | 104 + .../converters/StringBufferConverter.java | 176 + .../converters/StringBuilderConverter.java | 176 + .../atlasmap/converters/StringConverter.java | 176 + .../converters/ZonedDateTimeConverter.java | 220 + .../io/atlasmap/core/ADMArchiveHandler.java | 516 + .../main/java/io/atlasmap/core/AtlasPath.java | 559 + .../main/java/io/atlasmap/core/AtlasUtil.java | 565 + .../io/atlasmap/core/BaseAtlasModule.java | 432 + .../io/atlasmap/core/BaseFunctionFactory.java | 51 + .../io/atlasmap/core/CompoundClassLoader.java | 47 + .../java/io/atlasmap/core/ConstantModule.java | 263 + .../core/DefaultAtlasCollectionHelper.java | 199 + .../core/DefaultAtlasCombineStrategy.java | 175 + .../core/DefaultAtlasCompoundClassLoader.java | 115 + .../io/atlasmap/core/DefaultAtlasContext.java | 1064 ++ .../core/DefaultAtlasContextFactory.java | 546 + .../core/DefaultAtlasConversionService.java | 622 + .../DefaultAtlasCustomMappingProcessor.java | 87 + .../core/DefaultAtlasExpressionProcessor.java | 135 + .../core/DefaultAtlasFieldActionService.java | 1063 ++ .../core/DefaultAtlasFunctionResolver.java | 135 + .../atlasmap/core/DefaultAtlasModuleInfo.java | 144 + .../core/DefaultAtlasModuleInfoRegistry.java | 129 + .../core/DefaultAtlasPreviewContext.java | 443 + .../core/DefaultAtlasPropertyStrategy.java | 339 + .../core/DefaultAtlasSeparateStrategy.java | 99 + .../io/atlasmap/core/DefaultAtlasSession.java | 517 + .../core/DefaultAtlasValidationService.java | 382 + .../java/io/atlasmap/core/PropertyModule.java | 155 + .../core/TemplateCombineStrategy.java | 93 + .../io/atlasmap/core/ValidationConstants.java | 46 + .../validate/BaseModuleValidationService.java | 432 + .../validate/MappingFieldPairValidator.java | 213 + .../MultipleFieldSelectionValidator.java | 82 + .../io/atlasmap/entaxy/DataMapperLookup.java | 59 + .../java/io/atlasmap/entaxy/OsgiHelper.java | 50 + .../java/io/atlasmap/entaxy/ValuesLookup.java | 37 + .../atlasmap/entaxy/ValuesLookupService.java | 55 + .../io/atlasmap/expression/Expression.java | 102 + .../expression/ExpressionContext.java | 63 + .../expression/ExpressionException.java | 63 + .../atlasmap/expression/FunctionResolver.java | 51 + .../internal/ArithmeticExpression.java | 246 + .../expression/internal/BinaryExpression.java | 118 + .../internal/BooleanExpression.java | 73 + .../internal/ComparisonExpression.java | 560 + .../internal/ConstantExpression.java | 192 + .../expression/internal/LRUCache.java | 115 + .../expression/internal/LogicExpression.java | 117 + .../atlasmap/expression/internal/Strings.java | 73 + .../expression/internal/UnaryExpression.java | 277 + .../internal/VariableExpression.java | 95 + .../atlasmap/expression/internal/package.html | 52 + .../expression/parser/ParseException.java | 229 + .../io/atlasmap/expression/parser/Parser.java | 1026 ++ .../expression/parser/ParserConstants.java | 132 + .../expression/parser/ParserTokenManager.java | 912 + .../expression/parser/SimpleCharStream.java | 513 + .../io/atlasmap/expression/parser/Token.java | 173 + .../expression/parser/TokenMgrError.java | 189 + .../java/io/atlasmap/functions/FILTER.java | 105 + .../main/java/io/atlasmap/functions/IF.java | 69 + .../java/io/atlasmap/functions/ISEMPTY.java | 79 + .../main/java/io/atlasmap/functions/LT.java | 60 + .../java/io/atlasmap/functions/SELECT.java | 88 + .../java/io/atlasmap/functions/TOLOWER.java | 64 + .../json/core/JsonComplexTypeFactory.java | 53 + .../atlasmap/json/core/JsonFieldReader.java | 394 + .../atlasmap/json/core/JsonFieldWriter.java | 379 + .../json/inspect/JsonInspectionException.java | 118 + .../json/inspect/JsonInspectionService.java | 75 + .../atlasmap/json/inspect/JsonInspector.java | 49 + .../json/inspect/JsonInstanceInspector.java | 250 + .../json/inspect/JsonSchemaInspector.java | 351 + .../io/atlasmap/json/module/JsonModule.java | 284 + .../json/module/JsonValidationService.java | 114 + .../io/atlasmap/json/service/JsonService.java | 165 + .../json/v2/AtlasJsonModelFactory.java | 109 + .../io/atlasmap/json/v2/InspectionType.java | 73 + .../io/atlasmap/json/v2/JsonComplexType.java | 227 + .../io/atlasmap/json/v2/JsonDataSource.java | 125 + .../io/atlasmap/json/v2/JsonDocument.java | 75 + .../io/atlasmap/json/v2/JsonEnumField.java | 177 + .../io/atlasmap/json/v2/JsonEnumFields.java | 125 + .../java/io/atlasmap/json/v2/JsonField.java | 260 + .../java/io/atlasmap/json/v2/JsonFields.java | 125 + .../json/v2/JsonInspectionRequest.java | 390 + .../json/v2/JsonInspectionResponse.java | 229 + .../mxbean/AtlasContextFactoryMXBean.java | 53 + .../atlasmap/mxbean/AtlasContextMXBean.java | 57 + .../mxbean/AtlasModuleInfoMXBean.java | 61 + .../io/atlasmap/mxbean/AtlasModuleMXBean.java | 96 + .../atlasmap/service/AtlasLibraryLoader.java | 320 + .../io/atlasmap/service/AtlasService.java | 764 + .../java/io/atlasmap/spi/ActionProcessor.java | 53 + .../io/atlasmap/spi/AtlasActionProcessor.java | 53 + .../atlasmap/spi/AtlasCollectionHelper.java | 72 + .../io/atlasmap/spi/AtlasCombineStrategy.java | 70 + .../atlasmap/spi/AtlasConversionConcern.java | 78 + .../io/atlasmap/spi/AtlasConversionInfo.java | 57 + .../atlasmap/spi/AtlasConversionService.java | 123 + .../java/io/atlasmap/spi/AtlasConverter.java | 45 + .../io/atlasmap/spi/AtlasFieldAction.java | 45 + .../io/atlasmap/spi/AtlasFieldActionInfo.java | 65 + .../atlasmap/spi/AtlasFieldActionService.java | 58 + .../io/atlasmap/spi/AtlasFieldReader.java | 50 + .../io/atlasmap/spi/AtlasFieldWriter.java | 49 + .../io/atlasmap/spi/AtlasInternalSession.java | 102 + .../java/io/atlasmap/spi/AtlasModule.java | 147 + .../io/atlasmap/spi/AtlasModuleDetail.java | 58 + .../java/io/atlasmap/spi/AtlasModuleInfo.java | 59 + .../atlasmap/spi/AtlasModuleInfoRegistry.java | 57 + .../java/io/atlasmap/spi/AtlasModuleMode.java | 64 + .../atlasmap/spi/AtlasPropertyStrategy.java | 72 + .../io/atlasmap/spi/AtlasPropertyType.java | 79 + .../atlasmap/spi/AtlasSeparateStrategy.java | 68 + .../java/io/atlasmap/spi/AtlasValidator.java | 55 + .../java/io/atlasmap/spi/FieldDirection.java | 56 + .../java/io/atlasmap/spi/FunctionFactory.java | 54 + .../java/io/atlasmap/spi/StringDelimiter.java | 124 + .../io/atlasmap/spi/entaxy/EntaxyAction.java | 38 + .../io/atlasmap/spi/entaxy/LookupValues.java | 40 + .../main/java/io/atlasmap/v2/ADMDigest.java | 78 + .../java/io/atlasmap/v2/AbsoluteValue.java | 50 + .../src/main/java/io/atlasmap/v2/Action.java | 64 + .../java/io/atlasmap/v2/ActionDetail.java | 336 + .../java/io/atlasmap/v2/ActionDetails.java | 86 + .../v2/ActionListUpgradeDeserializer.java | 122 + .../java/io/atlasmap/v2/ActionParameter.java | 185 + .../java/io/atlasmap/v2/ActionParameters.java | 81 + .../java/io/atlasmap/v2/ActionResolver.java | 127 + .../src/main/java/io/atlasmap/v2/Add.java | 49 + .../src/main/java/io/atlasmap/v2/AddDays.java | 79 + .../main/java/io/atlasmap/v2/AddSeconds.java | 79 + .../src/main/java/io/atlasmap/v2/Append.java | 78 + .../java/io/atlasmap/v2/AreaUnitType.java | 73 + .../io/atlasmap/v2/AtlasActionProperty.java | 51 + .../atlasmap/v2/AtlasHandlerInstantiator.java | 98 + .../java/io/atlasmap/v2/AtlasJsonModule.java | 56 + .../java/io/atlasmap/v2/AtlasMapping.java | 243 + .../io/atlasmap/v2/AtlasMappingResult.java | 111 + .../io/atlasmap/v2/AtlasModelFactory.java | 347 + .../v2/AtlasSchemaFactoryWrapper.java | 139 + .../src/main/java/io/atlasmap/v2/Audit.java | 205 + .../main/java/io/atlasmap/v2/AuditStatus.java | 70 + .../src/main/java/io/atlasmap/v2/Audits.java | 82 + .../src/main/java/io/atlasmap/v2/Average.java | 48 + .../main/java/io/atlasmap/v2/BaseMapping.java | 130 + .../main/java/io/atlasmap/v2/Camelize.java | 50 + .../main/java/io/atlasmap/v2/Capitalize.java | 49 + .../src/main/java/io/atlasmap/v2/Ceiling.java | 49 + .../main/java/io/atlasmap/v2/Collection.java | 135 + .../java/io/atlasmap/v2/CollectionType.java | 70 + .../main/java/io/atlasmap/v2/Concatenate.java | 100 + .../main/java/io/atlasmap/v2/Constant.java | 127 + .../java/io/atlasmap/v2/ConstantField.java | 52 + .../main/java/io/atlasmap/v2/Constants.java | 82 + .../main/java/io/atlasmap/v2/Contains.java | 79 + .../java/io/atlasmap/v2/ConvertAreaUnit.java | 107 + .../io/atlasmap/v2/ConvertDistanceUnit.java | 107 + .../java/io/atlasmap/v2/ConvertMassUnit.java | 107 + .../io/atlasmap/v2/ConvertVolumeUnit.java | 107 + .../src/main/java/io/atlasmap/v2/CopyTo.java | 91 + .../src/main/java/io/atlasmap/v2/Count.java | 49 + .../main/java/io/atlasmap/v2/CurrentDate.java | 49 + .../java/io/atlasmap/v2/CurrentDateTime.java | 49 + .../main/java/io/atlasmap/v2/CurrentTime.java | 49 + .../java/io/atlasmap/v2/CustomAction.java | 179 + .../java/io/atlasmap/v2/CustomMapping.java | 60 + .../main/java/io/atlasmap/v2/DataSource.java | 222 + .../io/atlasmap/v2/DataSourceCatalog.java | 64 + .../java/io/atlasmap/v2/DataSourceKey.java | 71 + .../io/atlasmap/v2/DataSourceMetadata.java | 132 + .../java/io/atlasmap/v2/DataSourceType.java | 67 + .../main/java/io/atlasmap/v2/DayOfMonth.java | 49 + .../main/java/io/atlasmap/v2/DayOfWeek.java | 49 + .../main/java/io/atlasmap/v2/DayOfYear.java | 49 + .../java/io/atlasmap/v2/DistanceUnitType.java | 75 + .../src/main/java/io/atlasmap/v2/Divide.java | 49 + .../main/java/io/atlasmap/v2/Document.java | 82 + .../main/java/io/atlasmap/v2/EndsWith.java | 78 + .../src/main/java/io/atlasmap/v2/Equals.java | 78 + .../main/java/io/atlasmap/v2/Expression.java | 82 + .../src/main/java/io/atlasmap/v2/Field.java | 465 + .../main/java/io/atlasmap/v2/FieldAction.java | 52 + .../main/java/io/atlasmap/v2/FieldGroup.java | 83 + .../main/java/io/atlasmap/v2/FieldStatus.java | 70 + .../main/java/io/atlasmap/v2/FieldType.java | 93 + .../src/main/java/io/atlasmap/v2/Fields.java | 82 + .../java/io/atlasmap/v2/FileExtension.java | 49 + .../src/main/java/io/atlasmap/v2/Floor.java | 48 + .../src/main/java/io/atlasmap/v2/Format.java | 78 + .../java/io/atlasmap/v2/GenerateUUID.java | 49 + .../src/main/java/io/atlasmap/v2/IndexOf.java | 78 + .../java/io/atlasmap/v2/InspectionType.java | 58 + .../src/main/java/io/atlasmap/v2/IsNull.java | 49 + .../src/main/java/io/atlasmap/v2/ItemAt.java | 79 + .../src/main/java/io/atlasmap/v2/Json.java | 75 + .../main/java/io/atlasmap/v2/LastIndexOf.java | 79 + .../src/main/java/io/atlasmap/v2/Length.java | 49 + .../main/java/io/atlasmap/v2/LookupEntry.java | 153 + .../main/java/io/atlasmap/v2/LookupTable.java | 133 + .../java/io/atlasmap/v2/LookupTables.java | 81 + .../main/java/io/atlasmap/v2/Lowercase.java | 49 + .../java/io/atlasmap/v2/LowercaseChar.java | 49 + .../src/main/java/io/atlasmap/v2/Mapping.java | 332 + .../java/io/atlasmap/v2/MappingFileType.java | 59 + .../main/java/io/atlasmap/v2/MappingType.java | 73 + .../main/java/io/atlasmap/v2/Mappings.java | 82 + .../java/io/atlasmap/v2/MassUnitType.java | 72 + .../src/main/java/io/atlasmap/v2/Maximum.java | 49 + .../src/main/java/io/atlasmap/v2/Minimum.java | 49 + .../java/io/atlasmap/v2/MockDocument.java | 52 + .../main/java/io/atlasmap/v2/MockField.java | 104 + .../java/io/atlasmap/v2/Multiplicity.java | 74 + .../main/java/io/atlasmap/v2/Multiply.java | 49 + .../main/java/io/atlasmap/v2/Normalize.java | 49 + .../main/java/io/atlasmap/v2/NumberType.java | 73 + .../java/io/atlasmap/v2/PadStringLeft.java | 108 + .../java/io/atlasmap/v2/PadStringRight.java | 106 + .../src/main/java/io/atlasmap/v2/Prepend.java | 79 + .../io/atlasmap/v2/ProcessMappingRequest.java | 106 + .../atlasmap/v2/ProcessMappingResponse.java | 132 + .../main/java/io/atlasmap/v2/Properties.java | 82 + .../main/java/io/atlasmap/v2/Property.java | 179 + .../java/io/atlasmap/v2/PropertyField.java | 78 + .../io/atlasmap/v2/RemoveFileExtension.java | 49 + .../src/main/java/io/atlasmap/v2/Repeat.java | 63 + .../main/java/io/atlasmap/v2/ReplaceAll.java | 106 + .../java/io/atlasmap/v2/ReplaceFirst.java | 107 + .../src/main/java/io/atlasmap/v2/Round.java | 49 + .../java/io/atlasmap/v2/SeparateByDash.java | 49 + .../io/atlasmap/v2/SeparateByUnderscore.java | 49 + .../main/java/io/atlasmap/v2/SimpleField.java | 50 + .../java/io/atlasmap/v2/SimpleResolver.java | 147 + .../src/main/java/io/atlasmap/v2/Split.java | 90 + .../main/java/io/atlasmap/v2/StartsWith.java | 79 + .../main/java/io/atlasmap/v2/StringList.java | 85 + .../main/java/io/atlasmap/v2/StringMap.java | 85 + .../java/io/atlasmap/v2/StringMapEntry.java | 101 + .../main/java/io/atlasmap/v2/SubString.java | 107 + .../java/io/atlasmap/v2/SubStringAfter.java | 135 + .../java/io/atlasmap/v2/SubStringBefore.java | 135 + .../main/java/io/atlasmap/v2/Subtract.java | 49 + .../java/io/atlasmap/v2/TargetDocument.java | 104 + .../src/main/java/io/atlasmap/v2/Trim.java | 49 + .../main/java/io/atlasmap/v2/TrimLeft.java | 49 + .../main/java/io/atlasmap/v2/TrimRight.java | 49 + .../main/java/io/atlasmap/v2/Uppercase.java | 49 + .../java/io/atlasmap/v2/UppercaseChar.java | 49 + .../main/java/io/atlasmap/v2/Validation.java | 214 + .../java/io/atlasmap/v2/ValidationScope.java | 71 + .../java/io/atlasmap/v2/ValidationStatus.java | 70 + .../main/java/io/atlasmap/v2/Validations.java | 85 + .../java/io/atlasmap/v2/ValueContainer.java | 55 + .../java/io/atlasmap/v2/VolumeUnitType.java | 74 + .../java/io/atlasmap/v2/entaxy/MapData.java | 120 + .../validators/AtlasValidationHelper.java | 59 + .../validators/CompositeValidator.java | 85 + .../DefaultAtlasValidationsHelper.java | 129 + .../validators/LookupTableNameValidator.java | 114 + .../atlasmap/validators/NonNullValidator.java | 93 + .../validators/NotEmptyValidator.java | 95 + .../validators/PositiveIntegerValidator.java | 82 + .../validators/StringLengthValidator.java | 86 + .../validators/StringPatternValidator.java | 108 + .../atlasmap/xml/core/AtlasXmlConstants.java | 49 + .../xml/core/AtlasXmlNamespaceContext.java | 106 + .../xml/core/XmlCollectionHelper.java | 58 + .../xml/core/XmlComplexTypeFactory.java | 55 + .../io/atlasmap/xml/core/XmlFieldReader.java | 382 + .../xml/core/XmlFieldTransformer.java | 95 + .../io/atlasmap/xml/core/XmlFieldWriter.java | 414 + .../io/atlasmap/xml/core/XmlIOHelper.java | 137 + .../java/io/atlasmap/xml/core/XmlPath.java | 210 + .../core/schema/AtlasRewritingXSVisitor.java | 251 + .../core/schema/AtlasXmlSchemaSetParser.java | 323 + .../schema/XSOMClasspathEntityResolver.java | 85 + .../xml/core/schema/XSOMErrorHandler.java | 67 + .../xml/inspect/SimpleTypeRestriction.java | 102 + .../xml/inspect/XmlInspectionException.java | 116 + .../xml/inspect/XmlInspectionService.java | 122 + .../xml/inspect/XmlInstanceInspector.java | 313 + .../xml/inspect/XmlSchemaInspector.java | 488 + .../io/atlasmap/xml/module/XmlModule.java | 427 + .../xml/module/XmlValidationService.java | 138 + .../io/atlasmap/xml/service/XmlService.java | 150 + .../atlasmap/xml/v2/AtlasXmlModelFactory.java | 102 + .../io/atlasmap/xml/v2/InspectionType.java | 73 + .../java/io/atlasmap/xml/v2/NodeType.java | 69 + .../java/io/atlasmap/xml/v2/Restriction.java | 171 + .../io/atlasmap/xml/v2/RestrictionType.java | 79 + .../java/io/atlasmap/xml/v2/Restrictions.java | 125 + .../io/atlasmap/xml/v2/XmlComplexType.java | 390 + .../io/atlasmap/xml/v2/XmlDataSource.java | 180 + .../java/io/atlasmap/xml/v2/XmlDocument.java | 130 + .../java/io/atlasmap/xml/v2/XmlEnumField.java | 259 + .../io/atlasmap/xml/v2/XmlEnumFields.java | 125 + .../java/io/atlasmap/xml/v2/XmlField.java | 470 + .../java/io/atlasmap/xml/v2/XmlFields.java | 125 + .../atlasmap/xml/v2/XmlInspectionRequest.java | 390 + .../xml/v2/XmlInspectionResponse.java | 229 + .../java/io/atlasmap/xml/v2/XmlNamespace.java | 277 + .../io/atlasmap/xml/v2/XmlNamespaces.java | 125 + .../services/atlas/module/atlas.module | 1 + .../services/io.atlasmap.spi.AtlasConverter | 26 + .../services/io.atlasmap.spi.AtlasFieldAction | 8 + .../services/io.atlasmap.spi.FunctionFactory | 7 + .../META-INF/services/io.atlasmap.v2.Action | 65 + .../src/main/resources/atlasmap.properties | 42 + .../atlasmap-entaxy-management/LICENSE.txt | 175 + .../atlasmap-entaxy-management/pom.xml | 35 + .../esb/atlasmap/management/MainMBean.java | 49 + .../management/impl/MainMBeanImpl.java | 53 + .../atlasmap/atlasmap-entaxy-rest/LICENSE.txt | 175 + .../atlasmap/atlasmap-entaxy-rest/pom.xml | 53 + .../rest/AtlasAdminJaxrsApplication.java | 1051 ++ .../rest/AtlasServiceJaxrsApplication.java | 409 + .../esb/atlasmap/rest/HtpasswdService.java | 49 + .../blueprint/atlasmap-service-context.xml | 69 + .../atlasmap/atlasmap-entaxy-ui/LICENSE.txt | 175 + .../atlasmap/atlasmap-entaxy-ui/pom.xml | 146 + .../src/main/webapp/WEB-INF/web.xml | 29 + .../src/main/webapp/asset-manifest.json | 28 + .../src/main/webapp/favicon.ico | Bin 0 -> 120518 bytes .../src/main/webapp/index.html | 106 + .../src/main/webapp/index.jsp | 32 + .../src/main/webapp/logo256.png | Bin 0 -> 8598 bytes .../src/main/webapp/logo512.png | Bin 0 -> 22920 bytes .../src/main/webapp/manifest.json | 25 + ...nifest.0fc79823a6f38ea0a130d3ef7ca8012a.js | 287 + .../src/main/webapp/robots.txt | 2 + .../src/main/webapp/service-worker.js | 64 + .../webapp/static/css/2.e19c2f02.chunk.css | 27 + .../static/css/2.e19c2f02.chunk.css.map | 1 + .../webapp/static/css/main.e814765b.chunk.css | 27 + .../static/css/main.e814765b.chunk.css.map | 1 + .../main/webapp/static/js/2.389c5931.chunk.js | 28 + .../static/js/2.389c5931.chunk.js.LICENSE.txt | 105 + .../webapp/static/js/2.389c5931.chunk.js.map | 1 + .../webapp/static/js/main.ad5ba31c.chunk.js | 27 + .../static/js/main.ad5ba31c.chunk.js.map | 1 + .../webapp/static/js/runtime-main.bb639b7e.js | 27 + .../static/js/runtime-main.bb639b7e.js.map | 1 + .../media/RedHatDisplay-Bold.e4b18666.woff2 | Bin 0 -> 29045 bytes .../media/RedHatDisplay-Bold.ef99e280.woff | Bin 0 -> 36920 bytes .../media/RedHatDisplay-Medium.17a79d9d.woff2 | Bin 0 -> 28661 bytes .../media/RedHatDisplay-Medium.f656301e.woff | Bin 0 -> 36532 bytes .../media/RedHatDisplay-Regular.3c2eb037.woff | Bin 0 -> 36432 bytes .../RedHatDisplay-Regular.ed055874.woff2 | Bin 0 -> 28745 bytes .../media/RedHatText-Medium.13359326.woff2 | Bin 0 -> 29049 bytes .../media/RedHatText-Medium.ed5d521b.woff | Bin 0 -> 37096 bytes .../media/RedHatText-Regular.4202115c.woff | Bin 0 -> 35980 bytes .../media/RedHatText-Regular.75752e72.woff2 | Bin 0 -> 28169 bytes .../media/overpass-bold-italic.a3014aca.woff2 | Bin 0 -> 37252 bytes .../media/overpass-bold-italic.c0b5bb3c.woff | Bin 0 -> 45068 bytes .../static/media/overpass-bold.c6179bc8.woff | Bin 0 -> 42104 bytes .../static/media/overpass-bold.d031db25.woff2 | Bin 0 -> 34752 bytes .../overpass-extrabold-italic.83caef4a.woff | Bin 0 -> 44392 bytes .../overpass-extrabold-italic.cd4ba352.woff2 | Bin 0 -> 36660 bytes .../media/overpass-extrabold.1168ce1e.woff | Bin 0 -> 41368 bytes .../media/overpass-extrabold.6e768ba3.woff2 | Bin 0 -> 33808 bytes .../overpass-extralight-italic.85914371.woff2 | Bin 0 -> 36800 bytes .../overpass-extralight-italic.b4ac9dd8.woff | Bin 0 -> 44668 bytes .../media/overpass-extralight.86fd9ea3.woff | Bin 0 -> 42532 bytes .../media/overpass-extralight.c5791995.woff2 | Bin 0 -> 35056 bytes .../overpass-heavy-italic.77a29c6c.woff2 | Bin 0 -> 37972 bytes .../media/overpass-heavy-italic.9a846a97.woff | Bin 0 -> 45720 bytes .../media/overpass-heavy.33b983b6.woff2 | Bin 0 -> 35640 bytes .../static/media/overpass-heavy.42aa590b.woff | Bin 0 -> 43316 bytes .../media/overpass-italic.0010a44b.woff | Bin 0 -> 45240 bytes .../media/overpass-italic.f45ba39e.woff2 | Bin 0 -> 37368 bytes .../media/overpass-light-italic.5b90b726.woff | Bin 0 -> 44372 bytes .../overpass-light-italic.6715ec5e.woff2 | Bin 0 -> 36580 bytes .../static/media/overpass-light.3875601d.woff | Bin 0 -> 41936 bytes .../media/overpass-light.c97e1959.woff2 | Bin 0 -> 34472 bytes .../media/overpass-mono-bold.6cb4a77b.woff2 | Bin 0 -> 51572 bytes .../media/overpass-mono-bold.75f6145e.woff | Bin 0 -> 65060 bytes .../media/overpass-mono-light.773ec666.woff | Bin 0 -> 63324 bytes .../media/overpass-mono-light.d34d136b.woff2 | Bin 0 -> 50112 bytes .../overpass-mono-regular.052fe015.woff2 | Bin 0 -> 51524 bytes .../media/overpass-mono-regular.cf00f67f.woff | Bin 0 -> 65036 bytes .../overpass-mono-semibold.404c69d4.woff | Bin 0 -> 64944 bytes .../overpass-mono-semibold.b199b8f9.woff2 | Bin 0 -> 51308 bytes .../media/overpass-regular.02d9e0ef.woff2 | Bin 0 -> 35128 bytes .../media/overpass-regular.7b93997b.woff | Bin 0 -> 42584 bytes .../overpass-semibold-italic.d91e16a1.woff2 | Bin 0 -> 36904 bytes .../overpass-semibold-italic.e244fb96.woff | Bin 0 -> 44728 bytes .../media/overpass-semibold.ca834120.woff2 | Bin 0 -> 33416 bytes .../media/overpass-semibold.ec228a39.woff | Bin 0 -> 40620 bytes .../media/overpass-thin-italic.16380cc4.woff2 | Bin 0 -> 35900 bytes .../media/overpass-thin-italic.849bc426.woff | Bin 0 -> 43504 bytes .../static/media/overpass-thin.8c022f6d.woff2 | Bin 0 -> 33696 bytes .../static/media/overpass-thin.94f49172.woff | Bin 0 -> 40860 bytes .../static/media/pfbg_2000.4f598944.jpg | Bin 0 -> 276435 bytes .../webapp/static/media/pfbg_576.85341a9c.jpg | Bin 0 -> 67491 bytes .../static/media/pfbg_576@2x.b48e77bc.jpg | Bin 0 -> 195594 bytes .../webapp/static/media/pfbg_768.c9839717.jpg | Bin 0 -> 116699 bytes .../static/media/pfbg_768@2x.0099dea3.jpg | Bin 0 -> 362032 bytes .../static/media/pfbg_992@2x.1423e11e.jpg | Bin 0 -> 588571 bytes .../webapp/static/media/pficon.328e1e14.woff | Bin 0 -> 20064 bytes .../webapp/static/media/pficon.b9bb4abc.woff2 | Bin 0 -> 16840 bytes .../entaxy-atlasmap-plugin/LICENSE.txt | 175 + .../atlasmap/entaxy-atlasmap-plugin/pom.xml | 523 + .../atlasmap/PluginContextListener.java | 78 + .../src/main/resources/WEB-INF/web.xml | 74 + .../src/main/webapp/index.html | 37 + .../plugin/js/components/atlasmapConsole.js | 156 + .../js/components/atlasmapConsoleModal.js | 136 + .../webapp/plugin/js/entaxyAtlasmapPlugin.js | 83 + platform/runtime/modules/atlasmap/pom.xml | 24 + .../runtime/modules/atlasmap/xsom/LICENSE.txt | 175 + platform/runtime/modules/atlasmap/xsom/SCD.jj | 289 + .../runtime/modules/atlasmap/xsom/XSOM.ipr | 450 + .../modules/atlasmap/xsom/copyright-exclude | 42 + .../modules/atlasmap/xsom/copyright.txt | 55 + .../modules/atlasmap/xsom/doc/CHANGELOG.txt | 68 + .../atlasmap/xsom/doc/architecture.png | Bin 0 -> 2773 bytes .../atlasmap/xsom/doc/collaboration.png | Bin 0 -> 4144 bytes .../atlasmap/xsom/doc/implementation.html | 186 + .../modules/atlasmap/xsom/doc/limitations.txt | 58 + .../modules/atlasmap/xsom/doc/readme.html | 108 + .../xsom/doc/retroweaver-license.html | 127 + .../modules/atlasmap/xsom/doc/userguide.html | 194 + .../atlasmap/xsom/examples/dumper/Dumper.java | 73 + .../xsom/examples/dumper/ErrorReporter.java | 57 + .../xsom/examples/dumper/TreeDumper.java | 88 + .../atlasmap/xsom/examples/dumper/readme.txt | 64 + .../xsom/lib/copying-relaxngDatatype.txt | 46 + .../xsom/lib/copying-thaiOpensource.txt | 47 + .../modules/atlasmap/xsom/licenceheader.txt | 55 + .../runtime/modules/atlasmap/xsom/license.txt | 290 + .../runtime/modules/atlasmap/xsom/pom.xml | 265 + .../schemas/EAN-UCC/AllowanceOrCharge.xsd | 123 + .../atlasmap/xsom/schemas/EAN-UCC/Command.xsd | 58 + .../atlasmap/xsom/schemas/EAN-UCC/Common.xsd | 43 + .../xsom/schemas/EAN-UCC/Components.xsd | 141 + .../atlasmap/xsom/schemas/EAN-UCC/Core.xsd | 72 + .../xsom/schemas/EAN-UCC/DespatchAdvice.xsd | 93 + .../xsom/schemas/EAN-UCC/Document.xsd | 41 + .../xsom/schemas/EAN-UCC/DocumentCommand.xsd | 73 + .../EAN-UCC/DocumentIdentificationCommand.xsd | 51 + .../xsom/schemas/EAN-UCC/Envelope.xml | 867 + .../xsom/schemas/EAN-UCC/Envelope.xsd | 61 + .../atlasmap/xsom/schemas/EAN-UCC/Fmcg.xsd | 51 + .../schemas/EAN-UCC/FmcgDespatchAdvice.xsd | 95 + .../xsom/schemas/EAN-UCC/FmcgIdentifiers.xsd | 72 + .../xsom/schemas/EAN-UCC/FmcgItem.xsd | 153 + .../xsom/schemas/EAN-UCC/FmcgOrder.xsd | 58 + .../schemas/EAN-UCC/FmcgSimpleInvoice.xsd | 58 + .../xsom/schemas/EAN-UCC/Identifiers.xsd | 109 + .../atlasmap/xsom/schemas/EAN-UCC/Item.xsd | 231 + .../xsom/schemas/EAN-UCC/LinkCommand.xsd | 89 + .../atlasmap/xsom/schemas/EAN-UCC/Message.xsd | 77 + .../atlasmap/xsom/schemas/EAN-UCC/Order.xsd | 85 + .../atlasmap/xsom/schemas/EAN-UCC/Party.xsd | 158 + .../xsom/schemas/EAN-UCC/PaymentTerms.xsd | 126 + .../schemas/EAN-UCC/RequestForPayment.xsd | 62 + .../xsom/schemas/EAN-UCC/Simpl-eb.xsd | 43 + .../xsom/schemas/EAN-UCC/Simpl-ebParty.xsd | 75 + .../xsom/schemas/EAN-UCC/SimpleInvoice.xsd | 61 + .../atlasmap/xsom/schemas/EAN-UCC/Types.xsd | 218 + .../modules/atlasmap/xsom/src/attribute.rng | 256 + .../com/sun/xml/xsom/ForeignAttributes.java | 76 + .../xsom/src/com/sun/xml/xsom/SCD.java | 192 + .../src/com/sun/xml/xsom/XSAnnotation.java | 79 + .../src/com/sun/xml/xsom/XSAttContainer.java | 114 + .../src/com/sun/xml/xsom/XSAttGroupDecl.java | 51 + .../src/com/sun/xml/xsom/XSAttributeDecl.java | 55 + .../src/com/sun/xml/xsom/XSAttributeUse.java | 69 + .../src/com/sun/xml/xsom/XSComplexType.java | 134 + .../src/com/sun/xml/xsom/XSComponent.java | 187 + .../src/com/sun/xml/xsom/XSContentType.java | 70 + .../src/com/sun/xml/xsom/XSDeclaration.java | 83 + .../src/com/sun/xml/xsom/XSElementDecl.java | 170 + .../xsom/src/com/sun/xml/xsom/XSFacet.java | 74 + .../sun/xml/xsom/XSIdentityConstraint.java | 117 + .../com/sun/xml/xsom/XSListSimpleType.java | 52 + .../src/com/sun/xml/xsom/XSModelGroup.java | 101 + .../com/sun/xml/xsom/XSModelGroupDecl.java | 56 + .../xsom/src/com/sun/xml/xsom/XSNotation.java | 52 + .../xsom/src/com/sun/xml/xsom/XSParticle.java | 71 + .../sun/xml/xsom/XSRestrictionSimpleType.java | 95 + .../xsom/src/com/sun/xml/xsom/XSSchema.java | 154 + .../src/com/sun/xml/xsom/XSSchemaSet.java | 131 + .../src/com/sun/xml/xsom/XSSimpleType.java | 177 + .../xsom/src/com/sun/xml/xsom/XSTerm.java | 85 + .../xsom/src/com/sun/xml/xsom/XSType.java | 111 + .../com/sun/xml/xsom/XSUnionSimpleType.java | 53 + .../xsom/src/com/sun/xml/xsom/XSVariety.java | 58 + .../xsom/src/com/sun/xml/xsom/XSWildcard.java | 110 + .../xsom/src/com/sun/xml/xsom/XSXPath.java | 66 + .../xsom/src/com/sun/xml/xsom/XmlString.java | 132 + .../com/sun/xml/xsom/impl/AnnotationImpl.java | 95 + .../sun/xml/xsom/impl/AttGroupDeclImpl.java | 101 + .../sun/xml/xsom/impl/AttributeDeclImpl.java | 89 + .../sun/xml/xsom/impl/AttributeUseImpl.java | 89 + .../sun/xml/xsom/impl/AttributesHolder.java | 144 + .../sun/xml/xsom/impl/ComplexTypeImpl.java | 315 + .../com/sun/xml/xsom/impl/ComponentImpl.java | 160 + .../xsom/src/com/sun/xml/xsom/impl/Const.java | 47 + .../sun/xml/xsom/impl/ContentTypeImpl.java | 54 + .../sun/xml/xsom/impl/DeclarationImpl.java | 72 + .../com/sun/xml/xsom/impl/ElementDecl.java | 251 + .../src/com/sun/xml/xsom/impl/EmptyImpl.java | 77 + .../src/com/sun/xml/xsom/impl/FacetImpl.java | 78 + .../xml/xsom/impl/ForeignAttributesImpl.java | 75 + .../xml/xsom/impl/IdentityConstraintImpl.java | 132 + .../sun/xml/xsom/impl/ListSimpleTypeImpl.java | 92 + .../sun/xml/xsom/impl/ModelGroupDeclImpl.java | 115 + .../com/sun/xml/xsom/impl/ModelGroupImpl.java | 130 + .../com/sun/xml/xsom/impl/NotationImpl.java | 80 + .../com/sun/xml/xsom/impl/ParticleImpl.java | 135 + .../xsom/src/com/sun/xml/xsom/impl/Ref.java | 114 + .../xsom/impl/RestrictionSimpleTypeImpl.java | 136 + .../src/com/sun/xml/xsom/impl/SchemaImpl.java | 327 + .../com/sun/xml/xsom/impl/SchemaSetImpl.java | 411 + .../com/sun/xml/xsom/impl/SimpleTypeImpl.java | 181 + .../xsom/src/com/sun/xml/xsom/impl/UName.java | 120 + .../xml/xsom/impl/UnionSimpleTypeImpl.java | 113 + .../xsom/src/com/sun/xml/xsom/impl/Util.java | 115 + .../com/sun/xml/xsom/impl/WildcardImpl.java | 215 + .../src/com/sun/xml/xsom/impl/XPathImpl.java | 83 + .../src/com/sun/xml/xsom/impl/package.html | 70 + .../xml/xsom/impl/parser/BaseContentRef.java | 82 + .../impl/parser/DefaultAnnotationParser.java | 77 + .../sun/xml/xsom/impl/parser/DelayedRef.java | 273 + .../sun/xml/xsom/impl/parser/Messages.java | 101 + .../xml/xsom/impl/parser/Messages.properties | 96 + .../xsom/impl/parser/Messages_ja.properties | 86 + .../xml/xsom/impl/parser/NGCCRuntimeEx.java | 534 + .../xml/xsom/impl/parser/ParserContext.java | 228 + .../com/sun/xml/xsom/impl/parser/Patch.java | 54 + .../xml/xsom/impl/parser/PatcherManager.java | 67 + .../impl/parser/SAXParserFactoryAdaptor.java | 128 + .../xsom/impl/parser/SchemaDocumentImpl.java | 146 + .../impl/parser/SubstGroupBaseTypeRef.java | 62 + .../sun/xml/xsom/impl/parser/datatypes.xsd | 356 + .../com/sun/xml/xsom/impl/parser/package.html | 70 + .../impl/parser/state/AttributesImpl.java | 642 + .../impl/parser/state/NGCCEventReceiver.java | 57 + .../impl/parser/state/NGCCEventSource.java | 65 + .../xsom/impl/parser/state/NGCCHandler.java | 206 + .../parser/state/NGCCInterleaveFilter.java | 365 + .../xsom/impl/parser/state/NGCCRuntime.java | 571 + .../xml/xsom/impl/parser/state/Schema.java | 1332 ++ .../impl/parser/state/SimpleType_List.java | 407 + .../parser/state/SimpleType_Restriction.java | 509 + .../impl/parser/state/SimpleType_Union.java | 481 + .../xsom/impl/parser/state/annotation.java | 222 + .../impl/parser/state/attributeDeclBody.java | 557 + .../impl/parser/state/attributeGroupDecl.java | 470 + .../xsom/impl/parser/state/attributeUses.java | 979 ++ .../xsom/impl/parser/state/complexType.java | 2032 +++ .../complexType_complexContent_body.java | 265 + .../impl/parser/state/elementDeclBody.java | 1200 ++ .../sun/xml/xsom/impl/parser/state/erSet.java | 191 + .../xml/xsom/impl/parser/state/ersSet.java | 193 + .../sun/xml/xsom/impl/parser/state/facet.java | 412 + .../impl/parser/state/foreignAttributes.java | 176 + .../sun/xml/xsom/impl/parser/state/group.java | 463 + .../impl/parser/state/identityConstraint.java | 611 + .../xsom/impl/parser/state/importDecl.java | 381 + .../xsom/impl/parser/state/includeDecl.java | 295 + .../impl/parser/state/modelGroupBody.java | 384 + .../xml/xsom/impl/parser/state/notation.java | 495 + .../xml/xsom/impl/parser/state/occurs.java | 332 + .../xml/xsom/impl/parser/state/particle.java | 1028 ++ .../sun/xml/xsom/impl/parser/state/qname.java | 176 + .../xsom/impl/parser/state/qualification.java | 184 + .../xml/xsom/impl/parser/state/redefine.java | 468 + .../xsom/impl/parser/state/simpleType.java | 524 + .../xsom/impl/parser/state/wildcardBody.java | 458 + .../sun/xml/xsom/impl/parser/state/xpath.java | 326 + .../xml/xsom/impl/scd/AbstractAxisImpl.java | 202 + .../src/com/sun/xml/xsom/impl/scd/Axis.java | 594 + .../com/sun/xml/xsom/impl/scd/Iterators.java | 230 + .../sun/xml/xsom/impl/scd/ParseException.java | 234 + .../com/sun/xml/xsom/impl/scd/SCDImpl.java | 99 + .../com/sun/xml/xsom/impl/scd/SCDParser.java | 580 + .../xml/xsom/impl/scd/SCDParserConstants.java | 113 + .../xsom/impl/scd/SCDParserTokenManager.java | 2469 +++ .../xml/xsom/impl/scd/SimpleCharStream.java | 479 + .../src/com/sun/xml/xsom/impl/scd/Step.java | 202 + .../src/com/sun/xml/xsom/impl/scd/Token.java | 121 + .../sun/xml/xsom/impl/scd/TokenMgrError.java | 173 + .../xsom/impl/util/DraconianErrorHandler.java | 58 + .../impl/util/ResourceEntityResolver.java | 56 + .../xsom/impl/util/SchemaTreeTraverser.java | 1024 ++ .../sun/xml/xsom/impl/util/SchemaWriter.java | 622 + .../src/com/sun/xml/xsom/impl/util/Uri.java | 227 + .../xsom/src/com/sun/xml/xsom/package.html | 70 + .../xml/xsom/parser/AnnotationContext.java | 91 + .../sun/xml/xsom/parser/AnnotationParser.java | 97 + .../xsom/parser/AnnotationParserFactory.java | 51 + .../com/sun/xml/xsom/parser/JAXPParser.java | 205 + .../sun/xml/xsom/parser/SchemaDocument.java | 157 + .../com/sun/xml/xsom/parser/XMLParser.java | 82 + .../com/sun/xml/xsom/parser/XSOMParser.java | 286 + .../src/com/sun/xml/xsom/parser/package.html | 70 + .../xml/xsom/util/ComponentNameFunction.java | 206 + .../xsom/util/ContextClassloaderLocal.java | 101 + .../util/ContextClassloaderLocal.properties | 43 + .../sun/xml/xsom/util/DeferedCollection.java | 173 + .../xsom/util/DomAnnotationParserFactory.java | 149 + .../src/com/sun/xml/xsom/util/NameGetter.java | 179 + .../sun/xml/xsom/util/NameGetter.properties | 59 + .../com/sun/xml/xsom/util/SimpleTypeSet.java | 70 + .../com/sun/xml/xsom/util/TypeClosure.java | 81 + .../src/com/sun/xml/xsom/util/TypeSet.java | 94 + .../src/com/sun/xml/xsom/util/XSFinder.java | 196 + .../sun/xml/xsom/util/XSFunctionFilter.java | 151 + .../xsom/visitor/XSContentTypeFunction.java | 58 + .../xsom/visitor/XSContentTypeVisitor.java | 57 + .../com/sun/xml/xsom/visitor/XSFunction.java | 73 + .../xsom/visitor/XSSimpleTypeFunction.java | 59 + .../xml/xsom/visitor/XSSimpleTypeVisitor.java | 58 + .../sun/xml/xsom/visitor/XSTermFunction.java | 61 + .../xsom/visitor/XSTermFunctionWithParam.java | 60 + .../sun/xml/xsom/visitor/XSTermVisitor.java | 59 + .../com/sun/xml/xsom/visitor/XSVisitor.java | 69 + .../xml/xsom/visitor/XSWildcardFunction.java | 55 + .../xml/xsom/visitor/XSWildcardVisitor.java | 55 + .../src/com/sun/xml/xsom/visitor/package.html | 70 + .../modules/atlasmap/xsom/src/complexType.rng | 376 + .../modules/atlasmap/xsom/src/element.rng | 352 + .../modules/atlasmap/xsom/src/include.rng | 172 + .../modules/atlasmap/xsom/src/modelGroup.rng | 262 + .../modules/atlasmap/xsom/src/simpleType.rng | 346 + .../modules/atlasmap/xsom/src/xmlschema.rng | 497 + .../com/sun/xml/xsom/AbstractXSOMTest.java | 77 + .../xsom/test/com/sun/xml/xsom/ERDriver.java | 94 + .../com/sun/xml/xsom/MapNamespaceContext.java | 86 + .../xsom/test/com/sun/xml/xsom/SCDDriver.java | 108 + .../xsom/test/com/sun/xml/xsom/SCDTest.java | 85 + .../test/com/sun/xml/xsom/XSOMParserTest.java | 147 + .../modules/atlasmap/xsom/test/scdtest.xsd | 42 + .../runtime/modules/data-modules/LICENSE.txt | 175 + .../data-modules/data-management/LICENSE.txt | 175 + .../data-modules/data-management/pom.xml | 31 + .../data/management/DataManagementMBean.java | 40 + .../data-modules/data-mapper/LICENSE.txt | 175 + .../data-mapper-management/LICENSE.txt | 175 + .../data-mapper-management/pom.xml | 46 + .../management/AbstractDataMapperMBean.java | 83 + .../management/DataMappersMBean.java | 44 + .../management/EmbeddedDataMapperMBean.java | 40 + .../impl/DataMapperMBeanFactory.java | 147 + .../impl/EmbeddedDataMapperMBeanImpl.java | 107 + .../data-mapper-runtime/LICENSE.txt | 175 + .../data-mapper/data-mapper-runtime/pom.xml | 36 + .../datamapper/AbstractDataMapper.java | 43 + .../modules/datamapper/DataMapper.java | 45 + .../modules/datamapper/DataMapperService.java | 124 + .../camel/DataMapperCamelProcessor.java | 118 + .../exceptions/DataMapperException.java | 58 + .../DataMapperNotFoundException.java | 39 + .../exceptions/KeyNotFoundException.java | 43 + .../exceptions/MapNotFoundException.java | 41 + .../impl/DataMapperServiceImpl.java | 72 + .../resource/DefaultEntaxyDataMapper.java | 70 + .../resource/ResourceBasedDataMapper.java | 296 + .../data-mapper/data-mapper-shell/LICENSE.txt | 175 + .../data-mapper/data-mapper-shell/pom.xml | 32 + .../shell/AbstractDataMapperAwareCommand.java | 54 + .../shell/AbstractDataMapperCommand.java | 40 + .../datamapper/shell/AddValueCommand.java | 95 + .../shell/DataMapperListCommand.java | 45 + .../shell/DataMapperMapListCommand.java | 45 + .../shell/DataMapperMapsCommand.java | 43 + .../datamapper/shell/RemoveValueCommand.java | 49 + .../datamapper/shell/ResolveValueCommand.java | 59 + .../modules/datamapper/shell/ValueTypes.java | 36 + .../shell/completers/DataMapperCompleter.java | 57 + .../shell/completers/ValueTypeCompleter.java | 57 + .../modules/data-modules/data-mapper/pom.xml | 17 + platform/runtime/modules/data-modules/pom.xml | 34 + platform/runtime/modules/onec/LICENSE.txt | 175 + platform/runtime/modules/onec/pom.xml | 30 + .../1C_Enterprise8/xslt/attrbute2tagName.xsl | 21 + .../1C_Enterprise8/xslt/tagName2attribute.xsl | 31 + platform/runtime/modules/pom.xml | 4 +- .../modules/src/main/features/features.xml | 17 +- .../modules/uniform-service/connector/pom.xml | 2 +- .../uniform-active-exchange-connector-in.json | 51 + ...uniform-active-exchange-connector-out.json | 39 + ...uniform-passive-exchange-connector-in.json | 25 + ...niform-passive-exchange-connector-out.json | 24 + .../init.ftl | 423 + .../init.ftl | 103 + .../init.ftl | 265 + .../init.ftl | 189 + .../runtime/modules/uniform-service/pom.xml | 2 +- .../uniform-service/service/LICENSE.txt | 175 + .../modules/uniform-service/service/pom.xml | 90 + .../service/UniformServiceInitializer.java | 166 + .../uniform-based-soap-service-protected.json | 154 + .../operationRouter.xml | 85 + .../connectorDispatchingBeans.ftl | 30 + .../init.ftl | 108 + .../src/main/cfg/generated/fragments.xml | 5 + .../src/main/cfg/uniform.service.support.cfg | 49 + .../src/main/features/features.xml | 2 +- .../main/healthcheck/generated/fragments.xml | 2 +- ...ecks.HttpRequestsCheck-uniform_service.cfg | 2 +- .../uniform-passive-service-blueprint.xml | 256 + .../init/install/uniform-service.properties | 26 + .../modules/uniform-service/support/pom.xml | 2 +- .../OSGI-INF/blueprint/camel-context.xml | 2 +- .../xslt/ConfirmGettingPacketRequest.xsl | 2 +- .../xslt/ConfirmGettingPacketResponse.xsl | 2 +- .../uniform-service/xslt/GetPacketRequest.xsl | 2 +- .../xslt/GetPacketResponse.xsl | 2 +- .../xslt/GetPacketResponseTest.xsl | 2 +- .../uniform-service/xslt/PutPacketRequest.xsl | 2 +- .../xslt/PutPacketResponse.xsl | 2 +- .../uniform-service/xslt/type/address.xsl | 2 +- .../xslt/type/bigPacketInfos.xsl | 2 +- .../xslt/type/bigPacketPart.xsl | 2 +- .../uniform-service/xslt/type/packet.xsl | 2 +- .../uniform-service/xslt/type/packets.xsl | 2 +- .../uniform-service/xslt/type/request.xsl | 2 +- .../uniform-service/xslt/type/response.xsl | 2 +- .../uniform-service/xslt/type/uuids.xsl | 2 +- .../uniform-service/exchangeTypes_1_0.xsd | 2 + .../operationRouterProtected.xml | 85 + platform/runtime/pom.xml | 2 +- platform/runtime/security/LICENSE.txt | 175 + platform/runtime/security/jaas/LICENSE.txt | 175 + .../jaas/entaxy-legacy-auth-api/LICENSE.txt | 175 + .../jaas/entaxy-legacy-auth-api/pom.xml | 96 + .../auth/basic/jpa/api/BasicAuthService.java | 59 + .../jpa/api/entity/BasicAuthAccount.java | 191 + .../api/entity/field/EncryptionAlgorithm.java | 65 + ...EncryptionAlgorithmAttributeConverter.java | 44 + .../api/exception/BadPasswordException.java | 52 + .../jaas/entaxy-legacy-auth/LICENSE.txt | 175 + .../security/jaas/entaxy-legacy-auth/pom.xml | 157 + .../AuthenticationInterceptor.java | 144 + .../basic/interceptor/SystemInterceptor.java | 119 + .../basic/jpa/impl/BasicAuthServiceImpl.java | 274 + .../listener/BasicAuthPostEventListener.java | 124 + .../listener/EntityEventListenerRegistry.java | 93 + .../auth/basic/jpa/util/EncryptionHelper.java | 71 + .../common/util/SystemHeadersConstants.java | 38 + .../EntaxyLegacyBackingEngine.java | 183 + .../EntaxyLegacyBackingEngineFactory.java | 45 + .../entaxylegacy/EntaxyLegacyLoginModule.java | 120 + .../modules/entaxylegacy/ServiceHolder.java | 59 + .../OSGI-INF/blueprint/camel-context.xml | 105 + .../src/main/resources/hibernate.cfg.xml | 44 + .../src/main/resources/log4j2.properties | 36 + .../entaxy-legacy-jaas-login-module.json | 26 + .../security/jaas/jaas-management/LICENSE.txt | 175 + .../security/jaas/jaas-management/pom.xml | 59 + .../management/jaas/JaasLoginModuleMBean.java | 39 + ...JaasLoginModuleWithBackingEngineMBean.java | 193 + .../core/management/jaas/JaasMBean.java | 59 + .../core/management/jaas/JaasRealmMBean.java | 41 + .../jaas/impl/JaasLoginModuleMBeanImpl.java | 52 + ...LoginModuleWithBackingEngineMBeanImpl.java | 247 + .../jaas/impl/JaasMBeanFactory.java | 110 + .../management/jaas/impl/JaasMbeanImpl.java | 82 + .../jaas/impl/JaasRealmMBeanImpl.java | 57 + .../security/jaas/jaas-producing/LICENSE.txt | 175 + .../security/jaas/jaas-producing/pom.xml | 46 + .../jaas/producing/JaasComponentProducer.java | 65 + .../merge/config/BlueprintMergeProcessor.json | 8 + .../objectproducer/producer/config.json | 3 + .../factory/abstract-jaas-component.json | 14 + .../factory/abstract-jaas-login-module.json | 133 + .../factory/abstract-security-component.json | 14 + .../abstract-audit-jaas-login-module.json | 28 + .../eventadmin-audit-jaas-login-module.json | 30 + .../audit/file-audit-jaas-login-module.json | 30 + .../audit/log-audit-jaas-login-module.json | 48 + .../factory/jaas-login-module-empty.json | 21 + .../ru/entaxy/factory/jaas-realm.json | 57 + ...t-real-jaas-login-module-with-backend.json | 102 + .../real/abstract-real-jaas-login-module.json | 39 + .../real/jaas-login-module-components.json | 139 + .../factory/real/jdbc-jaas-login-module.json | 14 + .../real/kerberos-jaas-login-module.json | 21 + .../factory/real/ldap-jaas-login-module.json | 217 + .../factory/real/osgi-jaas-login-module.json | 13 + .../real/properties-jaas-login-module.json | 31 + .../real/publickey-jaas-login-module.json | 31 + .../real/resource-jaas-login-module.json | 31 + .../real/syncope-jaas-login-module.json | 21 + .../abstract-jaas-login-module/init.ftl | 37 + .../backendFactory.ftl | 9 + .../jaas-login-module-empty/init.ftl | 42 + .../ru/entaxy/templates/jaas-realm/init.ftl | 39 + .../security/jaas/jaas-runtime/LICENSE.txt | 175 + .../security/jaas/jaas-runtime/pom.xml | 44 + .../runtime/security/jaas/JaasHelper.java | 146 + .../security/jaas/JaasInitializer.java | 166 + .../resources/ResourceBackingEngine.java | 315 + .../ResourceBackingEngineFactory.java | 86 + .../resources/ResourceLoginModule.java | 176 + .../jaas/modules/resources/ServiceHelper.java | 84 + .../jaas/utils/PropertiesWithCallback.java | 64 + .../security/jaas/utils/ResourceCallback.java | 80 + platform/runtime/security/jaas/pom.xml | 71 + .../jaas/src/main/features/features.xml | 111 + .../etc/init/artifacts/shared/karaf-realm.xml | 103 + .../etc/init/install/jaas.properties | 26 + .../jaas/src/main/support/karaf_realm.json | 56 + .../security/legacy-permissions/LICENSE.txt | 175 + .../permission-api/LICENSE.txt | 175 + .../legacy-permissions/permission-api/pom.xml | 52 + .../permission/jpa/PermissionService.java | 95 + .../permission/jpa/entity/Permission.java | 132 + .../permission-common/LICENSE.txt | 175 + .../permission-common/pom.xml | 25 + .../common/PermissionConstants.java | 51 + .../OSGI-INF/blueprint/blueprint.xml | 36 + .../permission-component/LICENSE.txt | 175 + .../permission-component/README.md | 78 + .../permission-component/pom.xml | 65 + .../component/PermissionComponent.java | 45 + .../component/PermissionEndpoint.java | 138 + .../component/PermissionProducer.java | 53 + .../exception/UnknownOperationException.java | 53 + .../component/operation/BaseOperation.java | 80 + .../component/operation/BulkCreate.java | 39 + .../permission/component/operation/Check.java | 47 + .../operation/CheckSystemAccess.java | 80 + .../CheckSystemAccessWithException.java | 48 + .../operation/CheckWithException.java | 40 + .../component/operation/Create.java | 41 + .../component/operation/Delete.java | 46 + .../permission/component/operation/Get.java | 39 + .../component/operation/GetByAllParams.java | 41 + .../component/operation/Operation.java | 35 + .../component/operation/OperationFactory.java | 58 + .../component/operation/Update.java | 41 + .../util/PermissionComponentConstants.java | 42 + .../org/apache/camel/component/permission | 1 + .../src/main/resources/log4j2.properties | 36 + .../permission-handler/LICENSE.txt | 175 + .../permission-handler/pom.xml | 54 + .../permission/handler/PermissionChecker.java | 33 + .../handler/PermissionCheckerImpl.java | 49 + .../OSGI-INF/blueprint/blueprint.xml | 180 + .../permission-impl/LICENSE.txt | 175 + .../permission-impl/pom.xml | 94 + .../interceptor/ServiceInterceptor.java | 121 + .../jpa/impl/PermissionServiceImpl.java | 436 + .../OSGI-INF/blueprint/blueprint.xml | 56 + .../src/main/resources/hibernate.cfg.xml | 46 + .../permission-soap/LICENSE.txt | 175 + .../permission-soap/pom.xml | 71 + .../OSGI-INF/blueprint/camel-context.xml | 260 + .../core/permission/template/permission.xsl | 61 + .../src/main/resources/types/permission.ftl | 47 + .../resources/wsdl/permission-service.wsdl | 185 + .../security/legacy-permissions/pom.xml | 23 + platform/runtime/security/pom.xml | 20 + .../runtime/security/secure-vault/LICENSE.txt | 175 + .../runtime/security/secure-vault/pom.xml | 69 + .../secure-vault-design/LICENSE.txt | 175 + .../secure-vault/secure-vault-design/pom.xml | 57 + .../design/lookup/AddVaultsLookupCommand.java | 180 + .../objectproducer/producer/config.json | 3 + .../entaxy/factory/secure-vault-abstract.json | 35 + .../factory/secure-vault-resources.json | 45 + .../secure-vault-abstract/lookup.ftl | 15 + .../secure-vault-abstract/vaultsField.ftl | 12 + .../templates/secure-vault-resources/init.ftl | 25 + .../secure-vault-management/LICENSE.txt | 175 + .../secure-vault-management/pom.xml | 41 + .../vault/management/SecureVaultMBean.java | 57 + .../vault/management/SecureVaultsMBean.java | 45 + .../impl/SecureVaultMBeanFactory.java | 69 + .../management/impl/SecureVaultMBeanImpl.java | 139 + .../impl/SecureVaultsMBeanImpl.java | 56 + .../secure-vault-runtime/LICENSE.txt | 175 + .../secure-vault/secure-vault-runtime/pom.xml | 91 + .../security/vault/runtime/EntaxyVault.java | 42 + .../camel/EntaxyVaultAccessorFunction.java | 44 + .../runtime/camel/EntaxyVaultHelperBean.java | 48 + .../lookup/CmPropertiesDefaultsLookup.java | 140 + .../SecretsLookupConfigurationPlugin.java | 70 + .../runtime/lookup/SecretsLookupProvider.java | 104 + .../resourcevault/ResourceBasedVault.java | 180 + .../resourcevault/internal/ServiceHelper.java | 57 + .../internal/VaultInitializer.java | 170 + .../src/main/features/features.xml | 98 + .../init/artifacts/shared/vault-default.xml | 61 + .../etc/init/install/vault.properties | 26 + .../src/main/support/vault-default.json | 4 + .../security/security-integration/LICENSE.txt | 175 + .../security-integration/htpasswd/LICENSE.txt | 175 + .../security-integration/htpasswd/README.md | 79 + .../security-integration/htpasswd/pom.xml | 60 + .../basic/htpasswd/HtpasswdGenerator.java | 99 + .../auth/basic/htpasswd/entity/Htpasswd.java | 104 + .../basic/htpasswd/entity/HtpasswdEntry.java | 92 + .../basic/htpasswd/rest/HtpasswdService.java | 49 + .../OSGI-INF/blueprint/htpasswd-context.xml | 104 + .../main/resources/script/htpasswd-checker.sh | 73 + .../security/security-integration/pom.xml | 18 + .../security/security-keystore/LICENSE.txt | 175 + .../keystore-design/LICENSE.txt | 175 + .../security-keystore/keystore-design/pom.xml | 30 + .../objectproducer/producer/config.json | 3 + .../ru/entaxy/factory/abstract-keystore.json | 167 + .../ru/entaxy/factory/jks-keystore.json | 73 + .../ru/entaxy/factory/jwk-keystore.json | 39 + .../templates/abstract-keystore/init.ftl | 6 + .../keystorePropertiesFile.ftl | 4 + .../entaxy/templates/jwk-keystore/init0.ftl | 30 + .../keystore-management/LICENSE.txt | 175 + .../keystore-management/pom.xml | 37 + .../keystore/management/JWKKeystoreMBean.java | 33 + .../keystore/management/KeystoreMBean.java | 63 + .../keystore/management/KeystoresMBean.java | 45 + .../management/impl/JWKKeystoreMBeanImpl.java | 60 + .../management/impl/KeystoreMBeanFactory.java | 80 + .../management/impl/KeystoreMBeanImpl.java | 97 + .../management/impl/KeystoresMBeanImpl.java | 55 + .../keystore-runtime/LICENSE.txt | 175 + .../keystore-runtime/pom.xml | 42 + .../keystore/runtime/EntaxyKeystore.java | 45 + .../EntaxyKeystoreCausedException.java | 42 + .../runtime/EntaxyKeystoreException.java | 61 + .../EntaxyKeystoreNotFoundException.java | 39 + .../EntaxyKeystoreUrlNotDefinedException.java | 41 + .../keystore/runtime/KeystoreManager.java | 43 + .../UnsupportedKeyFormatException.java | 41 + .../runtime/impl/JWKKeystoreHelper.java | 131 + .../keystore/runtime/impl/KeystoreHelper.java | 48 + .../runtime/impl/KeystoreManagerImpl.java | 160 + .../runtime/impl/KeystoreResource.java | 106 + .../internal/JKSResourceProcessor.java | 114 + .../internal/JWKResourceProcessor.java | 119 + .../internal/KeyStoreResourceProvider.java | 56 + .../internal/KeystoreProcessorHelper.java | 193 + .../keystore-shell/LICENSE.txt | 175 + .../security-keystore/keystore-shell/pom.xml | 40 + .../shell/KeystoreAliasesCommand.java | 53 + .../keystore/shell/KeystoreAwareCommand.java | 39 + .../keystore/shell/KeystoreKeyAddCommand.java | 99 + .../shell/KeystoreKeyRemoveCommand.java | 57 + .../keystore/shell/KeystoreListCommand.java | 47 + .../shell/KeystoreManagerSupport.java | 37 + .../keystore/shell/KeystoreShell.java | 32 + .../keystore/shell/KeystoreUpdateCommand.java | 64 + .../shell/completer/KeystoreIdCompleter.java | 50 + .../security/security-keystore/pom.xml | 19 + .../security/src/main/features/features.xml | 97 + platform/src/main/features/basics.xml | 4 +- platform/src/main/features/features.xml | 2 +- platform/src/main/features/legacy.xml | 2 +- .../main/healthcheck/generated/fragments.xml | 2 +- ...ralchecks.BundlesStartedCheck-platform.cfg | 2 +- .../src/main/scripts/entaxy-platform.install | 2 +- .../src/main/scripts/generated/fragments.xml | 2 +- platform/src/update/descriptor/descriptor.xml | 2 +- platform/src/update/features/update.xml | 2 +- .../update/scripts/generated/fragments.xml | 46 + pom.xml | 5 +- system/commons/pom.xml | 2 +- .../common/osgi/BundleMarkerService.java | 2 +- .../common/osgi/NamedReferenceListener.java | 2 +- .../esb/system/common/osgi/OSGIUtils.java | 2 +- .../system/common/osgi/ReferenceListener.java | 2 +- .../common/osgi/UniformBundleTracker.java | 2 +- .../osgi/impl/BundleMarkerServiceImpl.java | 2 +- .../impl/CommonNamedReferenceListener.java | 2 +- .../osgi/impl/CommonReferenceListener.java | 2 +- .../OSGI-INF/blueprint/blueprint.xml | 2 +- .../src/main/resources/config/bus.commons.cfg | 2 +- system/core/dispatcher/pom.xml | 2 +- .../system/core/dispatcher/Addressable.java | 2 +- system/core/events/events-api/pom.xml | 2 +- system/core/events/events-common/pom.xml | 2 +- system/core/events/events-handler/pom.xml | 2 +- system/core/events/events-impl/pom.xml | 2 +- system/core/events/events-rest/pom.xml | 2 +- system/core/events/pom.xml | 2 +- system/core/pom.xml | 2 +- system/core/template/pom.xml | 2 +- .../esb/system/core/template/Template.java | 2 +- .../core/template/TemplateCollector.java | 2 +- .../system/core/template/TemplateImpl.java | 2 +- system/pom.xml | 2 +- .../registry/connectors/connector-api/pom.xml | 2 +- .../system/connector/entity/Connector.java | 2 +- .../connector/entity/ConnectorParam.java | 2 +- .../connectors/connector-impl/pom.xml | 2 +- .../connector/impl/ConnectorService.java | 2 +- .../connector/impl/ConnectorServiceImpl.java | 2 +- .../OSGI-INF/blueprint/camel-context.xml | 2 +- .../src/main/resources/hibernate.cfg.xml | 2 +- system/registry/connectors/pom.xml | 2 +- system/registry/pom.xml | 2 +- system/registry/system-groups/pom.xml | 2 +- .../system-groups/system-group-api/pom.xml | 2 +- .../jpa/SystemGroupRegistryService.java | 2 +- .../jpa/entity/SystemGroupMethodRegistry.java | 2 +- .../jpa/entity/SystemGroupRegistry.java | 2 +- .../system-groups/system-group-impl/pom.xml | 2 +- .../impl/SystemGroupRegistryServiceImpl.java | 2 +- .../OSGI-INF/blueprint/blueprint.xml | 2 +- .../src/main/resources/hibernate.cfg.xml | 2 +- system/registry/systems/pom.xml | 2 +- system/registry/systems/system-api/pom.xml | 2 +- .../entaxy/esb/system/jpa/SystemService.java | 2 +- .../esb/system/jpa/entity/ExportAllowed.java | 2 +- .../entaxy/esb/system/jpa/entity/System.java | 2 +- system/registry/systems/system-impl/pom.xml | 2 +- .../system/jpa/impl/SystemServiceImpl.java | 2 +- .../OSGI-INF/blueprint/blueprint.xml | 2 +- .../src/main/resources/hibernate.cfg.xml | 2 +- system/src/main/cfg/generated/fragments.xml | 49 + system/src/main/cfg/ru.entaxy.esb.cfg | 2 +- .../cfg/ru.entaxy.esb.deployer.cellar.cfg | 2 +- .../ru.entaxy.esb.deployer.file.system.cfg | 2 +- .../main/cfg/ru.entaxy.esb.deployer.nexus.cfg | 2 +- system/src/main/cfg/ru.entaxy.esb.error.cfg | 2 +- .../src/main/cfg/ru.entaxy.esb.error.code.cfg | 2 +- .../src/main/cfg/ru.entaxy.esb.error.text.cfg | 2 +- .../cfg/ru.entaxy.esb.system.basic_auth.cfg | 2 +- ....entaxy.esb.system.basic_auth.htpasswd.cfg | 2 +- .../ru.entaxy.esb.system.event.handler.cfg | 2 +- .../cfg/ru.entaxy.esb.system.event.rest.cfg | 2 +- .../cfg/ru.entaxy.esb.system.management.cfg | 2 +- system/src/main/features/basics.xml | 2 +- system/src/main/features/features.xml | 2 +- .../main/healthcheck/generated/fragments.xml | 2 +- ...neralchecks.BundlesStartedCheck-system.cfg | 2 +- .../bridge-profile-manager/pom.xml | 2 +- .../profile/manager/BridgeProfileManager.java | 2 +- .../manager/BridgeProfileManagerImpl.java | 2 +- .../profile/manager/dto/BridgeProfileDto.java | 2 +- .../manager/mapper/BridgeProfileMapper.java | 2 +- .../BridgeProfileRecipientManager.java | 2 +- .../BridgeProfileRecipientManagerImpl.java | 2 +- .../manager/sender/BridgeProfileSender.java | 2 +- .../sender/BridgeProfileSenderImpl.java | 2 +- .../manager/sender/BridgeProfileType.java | 2 +- .../manager/service/BridgeService.java | 2 +- .../OSGI-INF/blueprint/camel-context.xml | 2 +- .../system-management/bundle-manager/pom.xml | 2 +- .../bundle/manager/BundleManager.java | 2 +- .../bundle/manager/BundleManagerImpl.java | 2 +- .../OSGI-INF/blueprint/camel-context.xml | 2 +- .../system-management/bundle-service/pom.xml | 2 +- .../management/bundle/jpa/BundleService.java | 2 +- .../bundle/jpa/BundleServiceImpl.java | 2 +- .../management/bundle/jpa/dto/BundleDto.java | 2 +- .../bundle/jpa/dto/BundleStatus.java | 2 +- .../bundle/jpa/entity/BundleEntity.java | 2 +- .../bundle/jpa/entity/BundleType.java | 2 +- .../OSGI-INF/blueprint/blueprint.xml | 2 +- .../src/main/resources/hibernate.cfg.xml | 2 +- .../connector-manager/pom.xml | 2 +- .../connector/manager/ConnectorManager.java | 2 +- .../manager/ConnectorManagerImpl.java | 2 +- .../connector/manager/dto/ConnectorDto.java | 2 +- .../manager/mapper/ConnectorMapper.java | 2 +- .../OSGI-INF/blueprint/camel-context.xml | 2 +- .../permission-manager/pom.xml | 2 +- .../permission/manager/PermissionManager.java | 2 +- .../manager/PermissionManagerImpl.java | 2 +- .../permission/manager/dto/PermissionDto.java | 2 +- .../manager/mapper/PermissionMapper.java | 2 +- .../OSGI-INF/blueprint/blueprint.xml | 2 +- system/system-management/pom.xml | 2 +- .../system-management/profile-manager/pom.xml | 2 +- .../profile/manager/ProfileManager.java | 2 +- .../profile/manager/ProfileManagerImpl.java | 2 +- .../profile/manager/dto/ProfileDto.java | 2 +- .../profile/manager/mapper/ProfileMapper.java | 2 +- .../OSGI-INF/blueprint/camel-context.xml | 2 +- .../system-management/route-manager/pom.xml | 2 +- .../route/manager/RouteManager.java | 2 +- .../route/manager/RouteManagerImpl.java | 2 +- .../OSGI-INF/blueprint/camel-context.xml | 2 +- .../system-management-api/pom.xml | 2 +- .../SystemManagementServiceImpl.java | 2 +- .../esb/system/management/mapper/Mapper.java | 2 +- .../management/soap/BridgeProfileType.java | 2 +- .../system/management/soap/ConnectorType.java | 2 +- .../management/soap/CreateConnectorType.java | 2 +- .../management/soap/CreateProfileType.java | 2 +- .../management/soap/ExportAllowedType.java | 2 +- .../soap/FullBridgeProfileType.java | 2 +- .../management/soap/FullProfileType.java | 2 +- .../soap/GetBridgeProfilesRequest.java | 2 +- .../management/soap/GetConnectorType.java | 2 +- .../system/management/soap/GetTemplate.java | 2 +- .../soap/ListBridgeProfileType.java | 2 +- .../management/soap/ListConnectorRequest.java | 2 +- .../management/soap/ListConnectorType.java | 2 +- .../management/soap/ListEsbRequest.java | 2 +- .../system/management/soap/ListEsbType.java | 2 +- .../management/soap/ListFullProfileType.java | 2 +- .../management/soap/ListProfileRequest.java | 2 +- .../management/soap/ListProfileType.java | 2 +- .../management/soap/ListTemplateRequest.java | 2 +- .../management/soap/ListTemplateType.java | 2 +- .../system/management/soap/ObjectFactory.java | 2 +- .../system/management/soap/ParamListType.java | 2 +- .../esb/system/management/soap/ParamType.java | 2 +- .../soap/PermissionForObjectType.java | 2 +- .../soap/PermissionForSubjectType.java | 2 +- .../management/soap/PermissionType.java | 2 +- .../system/management/soap/ProfileType.java | 2 +- .../soap/SystemManagementService.java | 2 +- .../soap/SystemManagementService_Service.java | 2 +- .../system/management/soap/TemplateType.java | 2 +- .../system/management/soap/package-info.java | 2 +- .../OSGI-INF/blueprint/camel-context.xml | 2 +- .../src/main/resources/log4j2.properties | 2 +- .../1c-communication-demo/management/pom.xml | 2 +- .../demo/management/MainMBean.java | 2 +- .../demo/management/impl/MainMBeanImpl.java | 2 +- .../1c-communication-demo/plugin/pom.xml | 2 +- .../demo/PluginContextListener.java | 2 +- .../plugin/src/main/resources/WEB-INF/web.xml | 2 +- .../plugin/src/main/webapp/index.html | 2 +- .../js/components/1cCommunicationDemo.js | 2 +- .../plugin/js/components/settingsModal.js | 2 +- .../js/entaxy1CCommunicationDemoPlugin.js | 2 +- .../webapp/plugin/js/services/soapService.js | 2 +- .../plugin/js/services/xml2JsonService.js | 2 +- test-suites/1c-communication-demo/pom.xml | 2 +- .../src/main/features/features.xml | 2 +- test-suites/cxf-echo/pom.xml | 2 +- .../runtime/modules/echo/CxfEchoServer.java | 2 +- .../OSGI-INF/blueprint/camel-context.xml | 2 +- .../src/main/resources/ftl/example.ftl | 4 +- .../src/main/resources/xslt/example.xsl | 2 +- test-suites/pom.xml | 2 +- .../artemis-plugin-entaxy/pom.xml | 2 +- .../hawtio/plugin/PluginContextListener.java | 2 +- .../src/main/resources/WEB-INF/web.xml | 2 +- .../src/main/resources/log4j.properties | 2 +- .../src/main/webapp/index.html | 2 +- .../main/webapp/plugin/html/preferences.html | 2 +- .../main/webapp/plugin/html/tree/content.html | 2 +- .../main/webapp/plugin/html/tree/header.html | 2 +- .../main/webapp/plugin/js/artemisHelpers.js | 2 +- .../main/webapp/plugin/js/artemisPlugin.js | 2 +- .../js/components/addressSendMessage.js | 2 +- .../webapp/plugin/js/components/addresses.js | 2 +- .../webapp/plugin/js/components/browse.js | 2 +- .../plugin/js/components/connections.js | 2 +- .../webapp/plugin/js/components/consumers.js | 2 +- .../plugin/js/components/createAddress.js | 2 +- .../plugin/js/components/createQueue.js | 2 +- .../plugin/js/components/deleteAddress.js | 2 +- .../plugin/js/components/deleteQueue.js | 2 +- .../webapp/plugin/js/components/diagram.js | 2 +- .../main/webapp/plugin/js/components/help.js | 2 +- .../webapp/plugin/js/components/navigation.js | 2 +- .../plugin/js/components/preferences.js | 2 +- .../webapp/plugin/js/components/producers.js | 2 +- .../webapp/plugin/js/components/queues.js | 2 +- .../plugin/js/components/sendMessage.js | 2 +- .../webapp/plugin/js/components/sessions.js | 2 +- .../webapp/plugin/js/components/status.js | 2 +- .../main/webapp/plugin/js/components/tree.js | 2 +- .../webapp/plugin/js/services/pagination.js | 2 +- .../webapp/plugin/js/services/resource.js | 2 +- .../plugin/js/services/sendMessageService.js | 2 +- .../main/webapp/plugin/js/services/toolbar.js | 2 +- .../entaxy-branding-plugin/pom.xml | 2 +- .../branding/PluginContextListener.java | 2 +- .../src/main/resources/WEB-INF/web.xml | 2 +- .../src/main/webapp/index.html | 2 +- .../src/main/webapp/plugin/css/entaxy.css | 234 +- .../src/main/webapp/plugin/img/camel.svg | 2 +- .../src/main/webapp/plugin/img/entaxy.svg | 2 +- .../cicd/entaxy-cicd-applications-icon.png | Bin 0 -> 800 bytes .../cicd/entaxy-cicd-build-info-icon.png | Bin 0 -> 864 bytes .../icons/cicd/entaxy-cicd-projects-icon.png | Bin 0 -> 923 bytes .../icons/cicd/entaxy-cicd-revisions-icon.png | Bin 0 -> 892 bytes .../icons/cicd/entaxy-cicd-storages-icon.png | Bin 0 -> 758 bytes .../icons/cicd/entaxy-cicd-versions-icon.png | Bin 0 -> 811 bytes .../plugin/img/icons/connector-selector.png | Bin 0 -> 392 bytes .../cranberry-red/entaxy-adapters-icon.png | Bin 0 -> 745 bytes .../cranberry-red/entaxy-configs-icon.png | Bin 0 -> 646 bytes .../entaxy-data-management-icon.png | Bin 0 -> 939 bytes .../cranberry-red/entaxy-objects-icon.png | Bin 0 -> 645 bytes .../entaxy-repositories-icon.png | Bin 0 -> 758 bytes .../entaxy-route-libraries-icon.png | Bin 0 -> 636 bytes .../entaxy-routes-aggregator-icon.png | Bin 0 -> 576 bytes .../cranberry-red/entaxy-search-icon.png | Bin 0 -> 609 bytes .../cranberry-red/entaxy-security-icon.png | Bin 0 -> 739 bytes .../main/webapp/plugin/js/brandingPlugin.js | 2 +- .../entaxy-cicd-plugin/LICENSE.txt | 175 + ui/entaxy-hawtio/entaxy-cicd-plugin/pom.xml | 253 + .../ui/hawtio/cicd/PluginContextListener.java | 80 + .../src/main/resources/WEB-INF/web.xml | 73 + .../js/components/applications/application.js | 193 + .../applicationManagementButtons.js | 108 + .../components/applications/applications.js | 143 + .../components/applications/configuration.js | 297 + .../components/applications/configurations.js | 189 + .../js/components/applications/items.js | 151 + .../js/components/applications/revision.js | 95 + .../applications/versionsRevisionsInfo.js | 181 + .../plugin/js/components/applicationsTable.js | 280 + .../webapp/plugin/js/components/contents.js | 51 + .../webapp/plugin/js/components/navigation.js | 237 + .../js/components/projects/addObjectsModal.js | 110 + .../js/components/projects/buildInfo.js | 171 + .../js/components/projects/components.js | 126 + .../plugin/js/components/projects/items.js | 126 + .../plugin/js/components/projects/objects.js | 489 + .../js/components/projects/objectsSelect.js | 127 + .../plugin/js/components/projects/project.js | 192 + .../plugin/js/components/projects/projects.js | 146 + .../plugin/js/components/projects/versions.js | 246 + .../plugin/js/components/requirements.js | 153 + .../plugin/js/components/simpleFieldsModal.js | 147 + .../main/webapp/plugin/js/components/tree.js | 263 + .../webapp/plugin/js/entaxyCICDHelpers.js | 155 + .../main/webapp/plugin/js/entaxyCICDPlugin.js | 93 + .../plugin/js/services/entaxyCICDService.js | 125 + ui/entaxy-hawtio/entaxy-h2-plugin/pom.xml | 2 +- .../ui/hawtio/h2/PluginContextListener.java | 2 +- .../src/main/resources/WEB-INF/web.xml | 2 +- .../src/main/webapp/index.html | 2 +- .../main/webapp/plugin/html/preferences.html | 2 +- .../main/webapp/plugin/html/tree/content.html | 2 +- .../main/webapp/plugin/html/tree/header.html | 2 +- .../webapp/plugin/js/components/h2Console.js | 2 +- .../webapp/plugin/js/components/navigation.js | 2 +- .../main/webapp/plugin/js/components/tree.js | 2 +- .../main/webapp/plugin/js/entaxyH2Plugin.js | 2 +- .../entaxy-management-plugin/pom.xml | 2 +- .../management/PluginContextListener.java | 2 +- .../src/main/resources/WEB-INF/web.xml | 2 +- .../webapp/codemirror/addon/hint/show-hint.js | 2 +- .../webapp/codemirror/addon/hint/xml-hint.js | 2 +- .../codemirror/mode/freemarker/freemarker.js | 314 + .../mode/freemarkermixed/freemarkermixed.js | 229 + .../src/main/webapp/hotkeys/hotkeys.js | 1686 ++ .../src/main/webapp/index.html | 2 +- .../webapp/json-formatter/json-formatter.js | 2 +- .../webapp/json-formatter/recursion-helper.js | 2 +- .../webapp/leader-line/leader-line.min.js | 2 +- .../main/webapp/ng-sortable/ng-sortable.js | 1093 ++ .../main/webapp/plugin/html/preferences.html | 2 +- .../main/webapp/plugin/html/tree/content.html | 2 +- .../main/webapp/plugin/html/tree/header.html | 2 +- .../plugin/js/camelBlueprintTagsHelper.js | 27 +- .../js/components/copyToClipboardButton.js | 58 + .../webapp/plugin/js/components/crumbs.js | 2 +- .../directives/contextMenuDirective.js | 163 + .../draggableDroppableDirectives.js | 85 + .../directives/draggableModalDirective.js | 54 + .../directives/fileDropDirective.js | 109 + .../directives/setFileModelDirective.js | 46 + .../directives/setFocusedDirective.js | 39 + .../webapp/plugin/js/components/editor.js | 62 + .../plugin/js/components/expandableList.js | 201 + .../plugin/js/components/extendedData.js | 163 + .../webapp/plugin/js/components/filePanel.js | 40 +- .../js/components/formFieldExtraInfo.js | 61 + .../webapp/plugin/js/components/formFields.js | 229 + .../webapp/plugin/js/components/header.js | 107 + .../innerObjectInput/innerObjectInput.js | 146 + .../innerObjectInput/innerObjectInputModal.js | 204 + .../components/inputs/inputWithExtension.js | 61 + .../components/inputs/listInput/listInput.js | 251 + .../inputs/listInput/listItemContent.js | 81 + .../plugin/js/components/inputs/mapInput.js | 207 + .../js/components/inputs/passwordInput.js | 111 + .../js/components/inputs/resourceInput.js | 72 + .../plugin/js/components/inputs/select.js | 236 + .../js/components/inputs/selectFromEnum.js | 119 + .../plugin/js/components/inputs/urlInput.js | 93 + .../webapp/plugin/js/components/inputs/xml.js | 81 + .../plugin/js/components/modalGroupFields.js | 105 +- .../webapp/plugin/js/components/modalList.js | 2 +- .../js/components/modalListWithDescription.js | 2 +- .../js/components/modals/addConnectorModal.js | 214 + .../js/components/modals/confirmationModal.js | 77 + .../components/modals/createResourceModal.js | 156 + .../js/components/modals/editorModal.js | 188 + .../plugin/js/components/modals/modal.js | 395 + .../modals/operationTableRequestModal.js | 86 + .../components/modals/resourceViewerModal.js | 395 + .../modals/simpleResourceNameInputModal.js | 137 + .../plugin/js/components/modals/xmlModal.js | 103 + .../webapp/plugin/js/components/navigation.js | 11 +- .../profileDiagram/connectorBlock.js | 57 + .../profileDiagram/connectorsWithFlow.js | 148 + .../profileDiagram/customConnectorBlock.js | 74 + .../profileDiagram/externalSystemPoints.js | 49 + .../js/components/profileDiagram/flowBlock.js | 46 + .../components/profileDiagram/inFlowBlock.js | 58 + .../profileDiagram/normalConnectorBlock.js | 62 + .../components/profileDiagram/outFlowBlock.js | 73 + .../profileDiagram/profileDiagram.js | 713 + .../profileDiagram/profileDiagramPalette.js | 156 + .../webapp/plugin/js/components/properties.js | 60 +- .../webapp/plugin/js/components/resources.js | 425 +- .../webapp/plugin/js/components/source.js | 33 +- .../plugin/js/components/tables/aliases.js | 185 + .../components/tables/allConnectorsTable.js | 364 + .../js/components/tables/configProperties.js | 130 + .../js/components/tables/connections.js | 49 + .../plugin/js/components/tables/connectors.js | 99 + .../plugin/js/components/tables/keyStores.js | 49 + .../tables/operationAffectedTable.js | 61 + .../plugin/js/components/tables/profiles.js | 51 + .../plugin/js/components/tables/realms.js | 49 + .../js/components/tables/repositories.js | 51 + .../js/components/tables/routeLibraries.js | 50 + .../plugin/js/components/tables/routes.js | 43 + .../js/components/tables/routesTable.js | 366 + .../plugin/js/components/tables/services.js | 51 + .../plugin/js/components/tables/table.js | 311 + .../plugin/js/components/tables/vaults.js | 49 + .../main/webapp/plugin/js/components/tree.js | 2 +- .../userManagement/associatedProfileSelect.js | 110 + .../userManagement/groupsAndRolesList.js | 211 + .../components/userManagement/groupsTable.js | 228 + .../userManagement/userManagement.js | 68 + .../userManagement/userManagementModal.js | 149 + .../js/components/userManagement/users.js | 62 + .../components/userManagement/usersTable.js | 179 + .../webapp/plugin/js/components/xmlEditor.js | 2 +- .../main/webapp/plugin/js/entaxyHelpers.js | 41 +- .../webapp/plugin/js/entaxyHotkeysHelper.js | 106 + .../webapp/plugin/js/entaxyJsonHelpers.js | 2 +- .../src/main/webapp/plugin/js/entaxyPlugin.js | 16 +- .../src/main/webapp/plugin/js/healthChecks.js | 2 +- .../services/entaxyAttributesCacheService.js | 73 + .../js/services/entaxyHotkeysService.js | 89 + .../services/entaxyLegacyConnectorService.js | 2 +- .../entaxyPrivateObjectsCacheService.js | 233 + .../services/entaxyProfileDiagramService.js | 157 + .../js/services/entaxyResourcesService.js | 287 + .../plugin/js/services/entaxyService.js | 671 +- .../webapp/plugin/js/services/restService.js | 56 + .../plugin/js/toDeletion/connectorsService.js | 2 +- .../js/toDeletion/firstStepModalTest.js | 2 +- .../js/toDeletion/secondStepModalTest.js | 2 +- .../main/webapp/plugin/js/toDeletion/test.js | 2 +- .../webapp/plugin/js/toDeletion/testModal.js | 2 +- .../webapp/plugin/js/toDeletion/testModal2.js | 2 +- .../plugin/js/xmlEditorOptionsHelper.js | 2 +- ui/entaxy-hawtio/pom.xml | 2 +- .../src/main/cfg/generated/fragments.xml | 5 + .../src/main/cfg/ru.entaxy.esb.ui.hawtio.cfg | 12 + .../src/main/features/features.xml | 2 +- .../src/main/scripts/entaxy-hawtio.install | 2 +- .../src/main/scripts/generated/fragments.xml | 2 +- ui/generate-provided | 1 + ui/generated-resources/provided/ui.xml | 7 + ui/h2-console/pom.xml | 2 +- .../src/main/resources/WEB-INF/web.xml | 2 +- ui/h2-console/src/main/resources/console.html | 2 +- ui/pom.xml | 538 +- ui/src/main/features/features.xml | 2 +- .../main/healthcheck/generated/fragments.xml | 2 +- ...c.generalchecks.BundlesStartedCheck-ui.cfg | 2 +- ui/src/main/scripts/entaxy-ui.install | 2 +- ui/src/main/scripts/generated/fragments.xml | 2 +- ui/support/xslt/generate-provided-repo.xslt | 26 + .../entaxy-underlying-configuration/pom.xml | 2 +- .../etc/config.properties | 2 +- .../non-packaged-resources/etc/jre.properties | 2 +- ...mpl.servlet.HealthCheckExecutorServlet.cfg | 2 +- .../etc/org.apache.karaf.cellar.groups.cfg | 2 +- .../etc/org.apache.karaf.cellar.node.cfg | 2 +- .../etc/org.apache.karaf.management.cfg | 2 +- .../etc/org.apache.karaf.shell.cfg | 2 +- .../etc/org.ops4j.pax.logging.cfg | 7 +- .../etc/org.ops4j.pax.url.mvn.cfg | 2 +- .../etc/org.ops4j.pax.web.cfg | 2 +- .../etc/system.properties | 2 +- .../src/main/resources/etc/entaxy.properties | 2 +- .../etc/org.apache.karaf.features.repos.cfg | 2 +- .../etc/org.apache.karaf.features.xml | 8 +- .../src/main/resources/etc/quartz.properties | 2 +- underlying/entaxy-underlying-features/pom.xml | 2 +- .../src/main/features/features.xml | 9 +- .../main/support/generate_replacements.xslt | 2 +- underlying/pom.xml | 2 +- update-management/pom.xml | 2 +- .../update-management-components/pom.xml | 2 +- .../src/main/features/features.xml | 2 +- .../src/main/scripts/generated/fragments.xml | 20 +- .../update-management-support/pom.xml | 2 +- .../src/main/xslt/component-config.xslt | 2 +- .../src/main/xslt/component-descriptor.xslt | 2 +- .../src/main/xslt/component-name.xslt | 2 +- .../src/main/xslt/components-list.xslt | 2 +- .../src/main/xslt/install-plan.xslt | 2 +- .../src/main/xslt/repositories-list.xslt | 2 +- .../src/main/xslt/version-list.xslt | 2 +- update/pom.xml | 2 +- update/src/update/descriptor/descriptor.xml | 2 +- update/src/update/features/update.xml | 2 +- 3082 files changed, 278464 insertions(+), 1833 deletions(-) rename {platform/runtime/core/objects-implementations/connector-implementation/connector-storage => platform-backward-compat}/LICENSE.txt (100%) rename {platform/runtime/core/objects-implementations/profile-implementation/profile-storage => platform-backward-compat/blueprint-generator-service}/LICENSE.txt (100%) create mode 100644 platform-backward-compat/blueprint-generator-service/pom.xml create mode 100644 platform-backward-compat/blueprint-generator-service/src/main/java/ru/entaxy/platform/core/blueprint/generator/Blueprint.java create mode 100644 platform-backward-compat/blueprint-generator-service/src/main/java/ru/entaxy/platform/core/blueprint/generator/BlueprintGenerator.java create mode 100644 platform-backward-compat/blueprint-generator-service/src/main/java/ru/entaxy/platform/core/blueprint/generator/BlueprintGeneratorImpl.java create mode 100644 platform-backward-compat/blueprint-generator-service/src/main/resources/ru/entaxy/templates/bridge-profile.ftl create mode 100644 platform-backward-compat/blueprint-generator-service/src/main/resources/ru/entaxy/templates/default-route.ftl create mode 100644 platform-backward-compat/blueprint-generator-service/src/main/resources/ru/entaxy/templates/metadata.json create mode 100644 platform-backward-compat/blueprint-generator-service/src/main/resources/ru/entaxy/templates/profile.ftl create mode 100644 platform-backward-compat/connector-storage/LICENSE.txt rename {platform/runtime/core/objects-implementations/connector-implementation => platform-backward-compat}/connector-storage/pom.xml (59%) rename {platform/runtime/core/objects-implementations/connector-implementation => platform-backward-compat}/connector-storage/src/main/java/ru/entaxy/platform/base/objects/connector/storage/ConnectorObjectStorage.java (99%) create mode 100644 platform-backward-compat/pom.xml create mode 100644 platform-backward-compat/profile-management-service-adapters/LICENSE.txt create mode 100644 platform-backward-compat/profile-management-service-adapters/pom.xml create mode 100644 platform-backward-compat/profile-management-service-adapters/src/main/java/ru/entaxy/esb/platform/core/management/profile/adapters/AccountManagerAdapter.java create mode 100644 platform-backward-compat/profile-management-service-adapters/src/main/java/ru/entaxy/esb/platform/core/management/profile/adapters/ConnectorManagerAdapter.java create mode 100644 platform-backward-compat/profile-management-service-adapters/src/main/java/ru/entaxy/esb/platform/core/management/profile/adapters/PermissionManagerAdapter.java create mode 100644 platform-backward-compat/profile-management-service-adapters/src/main/java/ru/entaxy/esb/platform/core/management/profile/adapters/ProfileManagerAdapter.java create mode 100644 platform-backward-compat/profile-management-service-adapters/src/main/java/ru/entaxy/esb/platform/core/management/profile/adapters/SystemManagerAdapter.java create mode 100644 platform-backward-compat/profile-storage/LICENSE.txt rename {platform/runtime/core/objects-implementations/profile-implementation => platform-backward-compat}/profile-storage/pom.xml (58%) rename {platform/runtime/core/objects-implementations/profile-implementation => platform-backward-compat}/profile-storage/src/main/java/ru/entaxy/platform/base/objects/profile/storage/SystemObjectStorage.java (99%) create mode 100644 platform-backward-compat/src/main/features/features.xml create mode 100644 platform-backward-compat/src/main/scripts/entaxy.bc.shell.script create mode 100644 platform-backward-compat/src/main/scripts/generated/fragments.xml create mode 100644 platform-provided-modules/LICENSE.txt create mode 100644 platform-provided-modules/pom.xml create mode 100644 platform-provided-modules/src/main/provided/ui.xml create mode 100644 platform-provided-modules/src/main/support/ui/collect-ui-features.xslt create mode 100644 platform-provided-modules/src/main/support/ui/process-ui-modules.xslt create mode 100644 platform/integration/LICENSE.txt create mode 100644 platform/integration/applications/LICENSE.txt create mode 100644 platform/integration/applications/application-api/LICENSE.txt create mode 100644 platform/integration/applications/application-api/pom.xml create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationContent.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationItem.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationManager.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationProjectContent.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationProjectInfo.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationProjectItem.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationResource.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationStorage.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/EntaxyApplication.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/EntaxyApplicationProject.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/EntaxyApplicationProjectVersion.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/EntaxyApplicationRevision.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/EntaxyApplicationVersion.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/descriptor/ApplicationComponent.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/descriptor/ApplicationContentItem.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/descriptor/ApplicationDescriptor.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/descriptor/ApplicationFeatures.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/descriptor/ApplicationRequirement.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationCausedException.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationDescriptorIsInvalid.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationDescriptorNotFound.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationException.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationImportCausedException.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationNotFoundException.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationVersionAlreadyExists.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationVersionCausedException.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationVersionException.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationVersionHasInstalledException.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/EntaxyApplicationsException.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ItemException.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ItemIsGhostException.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ItemIsPlatformException.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ItemNotFoundException.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectAlreadyExistsException.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectException.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectNotFoundException.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectVersionBuildNotAvailable.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectVersionCausedException.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectVersionException.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectVersionIsDirtyException.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectVersionNotConsistentException.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectVersionNotFoundException.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/RevisionCausedException.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/RevisionException.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/RevisionIllegalNumber.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/RevisionIllegalTransition.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/RevisionNotConfigurable.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/RevisionNotFound.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/RevisionRequirementsNotSatisfied.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/StorageException.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/StorageNotEnabledException.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/StorageNotFoundException.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/item/project/EntaxyBundleItem.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/item/project/EntaxyConfigItem.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/item/project/EntaxyObjectItem.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/item/project/EntaxyResourceItem.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/storage/AbstractApplicationStorage.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/storage/ApplicationStorageInfo.java create mode 100644 platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/utils/JarArtifact.java create mode 100644 platform/integration/applications/application-impl/LICENSE.txt create mode 100644 platform/integration/applications/application-impl/pom.xml create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/ApplicationManagerImpl.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/ApplicationObjectExtendedDataProvider.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/ExportImportHelper.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/ServiceHelper.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/StorageApplicationContentAdapter.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/StorageImportAdapter.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/StorageItemAdapter.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/application/ApplicationContentImpl.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/application/ApplicationItemImpl.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/application/ApplicationResourceImpl.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/application/RevisionHelper.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/AbstractDescriptor.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/AbstractStorage.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/ApplicationBuilder.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/BundleDescriptor.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/BundleStorage.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/ConfigDescriptor.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/ConfigStorage.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/ResourceDescriptor.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/ResourceStorage.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/jar/FolderBasedJarBuilder.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/jar/JarBuilder.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/ApplicationProjectContentImpl.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/ApplicationProjectItemImpl.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/DefaultApplicationProjectItem.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/item/BundleItemImpl.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/item/ColocationGroup.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/item/ConfigItemImpl.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/item/ItemFactory.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/item/ObjectItemImpl.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/item/ResourceItemImpl.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/ContentChecker.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/ContentModel.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/ContentModelItemWrapper.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/item/BundleItem.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/item/ConfigItem.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/item/ContentModelItem.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/item/ObjectItem.java create mode 100644 platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/item/ResourceItem.java create mode 100644 platform/integration/applications/application-impl/src/main/resources/ru/entaxy/templates/applications/builder/features.ftl create mode 100644 platform/integration/applications/application-management/LICENSE.txt create mode 100644 platform/integration/applications/application-management/pom.xml create mode 100644 platform/integration/applications/application-management/src/main/java/ru/entaxy/platform/integration/applications/management/ApplicationsMBean.java create mode 100644 platform/integration/applications/application-management/src/main/java/ru/entaxy/platform/integration/applications/management/ProjectsMBean.java create mode 100644 platform/integration/applications/application-management/src/main/java/ru/entaxy/platform/integration/applications/management/impl/ApplicationsMBeanImpl.java create mode 100644 platform/integration/applications/application-management/src/main/java/ru/entaxy/platform/integration/applications/management/impl/ProjectsMBeanImpl.java create mode 100644 platform/integration/applications/application-shell/LICENSE.txt create mode 100644 platform/integration/applications/application-shell/pom.xml create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/ApplicationManagerCommandSupport.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/ApplicationShell.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/FeatureCapabilityHelper.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/StorageAwareCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/StorageDisableCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/StorageEnableCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/StorageListCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationCheckBundleCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationImportFromFile.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationImportFromRepository.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationListCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationManageCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationRemoveCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationVersionManageCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationVersionRemoveCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationVersionSupport.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ConfigCancelCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ConfigCommitCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ConfigEditCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ConfigListCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ConfigPrintCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ConfigSetPropertyCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ConfigStatusCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ManagedApplicationCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ManagedApplicationConfigCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ManagedApplicationRevisionCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ManagedApplicationVersionCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionConfigureCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionCreateCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionDeployCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionDoneCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionInfoCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionInstallCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionListCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionSupport.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionUninstallCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/ApplicationCompleter.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/ApplicationVersionCompleter.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/ConfigCompleter.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/EntaxyRuntimeObjectCompleter.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/ProjectCompleter.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/ProjectItemCompleter.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/ProjectVersionCompleter.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/RepositoryNameCompleter.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/RevisionCompleter.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/StorageCompleter.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ItemAddCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ItemAwareCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ItemIgnoreCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ItemRemoveCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ManagedProjectCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ManagedVersionCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ProjectCancelCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ProjectCommitCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ProjectCreateCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ProjectCurrentCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ProjectListCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ProjectManageCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ProjectRemoveCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionAddObject.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionAddResource.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionBuildCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionBuildInfoCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionCancelCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionCommitCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionCreateCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionExportToFileCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionExportToRepositoryCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionItemListCommand.java create mode 100644 platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionManageCommand.java create mode 100644 platform/integration/applications/pom.xml create mode 100644 platform/integration/applications/resource-based-storage/LICENSE.txt create mode 100644 platform/integration/applications/resource-based-storage/pom.xml create mode 100644 platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/ResourceBasedStorage.java create mode 100644 platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/AbstractResourceComponent.java create mode 100644 platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/AbstractResourceComponentWithChildren.java create mode 100644 platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/ApplicationStorageComponent.java create mode 100644 platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/ApplicationStorageData.java create mode 100644 platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/ComponentCache.java create mode 100644 platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/ProjectStorageComponent.java create mode 100644 platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/ProjectStorageData.java create mode 100644 platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/ResourceContext.java create mode 100644 platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/StorageComponent.java create mode 100644 platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/StorageData.java create mode 100644 platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/ApplicationComponent.java create mode 100644 platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/ApplicationData.java create mode 100644 platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/ApplicationVersionComponent.java create mode 100644 platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/ApplicationVersionData.java create mode 100644 platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/ResourceApplicationContent.java create mode 100644 platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/ResourceApplicationItem.java create mode 100644 platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/ResourceApplicationResource.java create mode 100644 platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/RevisionComponent.java create mode 100644 platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/RevisionData.java create mode 100644 platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/project/BuildComponent.java create mode 100644 platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/project/BuildData.java create mode 100644 platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/project/ProjectComponent.java create mode 100644 platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/project/ProjectData.java create mode 100644 platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/project/ProjectVersionComponent.java create mode 100644 platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/project/ProjectVersionData.java create mode 100644 platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/internal/DefaultApplicationStorage.java create mode 100644 platform/integration/applications/src/main/features/features.xml create mode 100644 platform/integration/pom.xml create mode 100644 platform/runtime/base/base-extensions-support/LICENSE.txt create mode 100644 platform/runtime/base/base-extensions-support/pom.xml create mode 100644 platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/api/EntaxyExtendable.java create mode 100644 platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/api/EntaxyExtension.java create mode 100644 platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/api/EntaxyExtensionService.java create mode 100644 platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/api/EntaxyExtensionsAware.java create mode 100644 platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/api/EntaxyExtensionsProvider.java create mode 100644 platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/api/Extendable.java create mode 100644 platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/impl/EntaxyExtensionImpl.java create mode 100644 platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/impl/EntaxyExtensionServiceImpl.java create mode 100644 platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/shell/EntaxyExtensionServiceSupport.java create mode 100644 platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/shell/ExtendablesList.java create mode 100644 platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/shell/ExtensionsList.java create mode 100644 platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/SimpleFileWatcher.java create mode 100644 platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/karaf/shell/AnsiColumnExt.java create mode 100644 platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/karaf/shell/ColExt.java create mode 100644 platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/karaf/shell/HAlignExt.java create mode 100644 platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/karaf/shell/RowExt.java create mode 100644 platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/karaf/shell/ShellTableColFixed.java create mode 100644 platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/karaf/shell/ShellTableExt.java create mode 100644 platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/karaf/shell/ShellTableFixed.java create mode 100644 platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/karaf/shell/StringUtil.java create mode 100644 platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/feature/FeatureCapabilityHelper.java create mode 100644 platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/feature/FeaturesUtils.java create mode 100644 platform/runtime/base/cellar-extensions/LICENSE.txt create mode 100644 platform/runtime/base/cellar-extensions/pom.xml create mode 100644 platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/helper/CellarFeaturesHelper.java create mode 100644 platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/helper/HelperFactory.java create mode 100644 platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/helper/Services.java create mode 100644 platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/CellarSequenceEvent.java create mode 100644 platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/CellarSequenceItemEvent.java create mode 100644 platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/CellarSequenceManager.java create mode 100644 platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/SequenceBuilder.java create mode 100644 platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/SequenceEventHandler.java create mode 100644 platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/impl/CellarSequenceManagerImpl.java create mode 100644 platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/process/ChangeListener.java create mode 100644 platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/process/ChangeListenerFactory.java create mode 100644 platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/process/SequenceTask.java create mode 100644 platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/LegacyTemplate.java create mode 100644 platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/exception/TemplateNotFound.java create mode 100644 platform/runtime/base/logging/LICENSE.txt create mode 100644 platform/runtime/base/logging/cef-logger-layout/LICENSE.txt create mode 100644 platform/runtime/base/logging/cef-logger-layout/pom.xml create mode 100644 platform/runtime/base/logging/cef-logger-layout/src/main/java/ru/emdev/cef/AuditEvent.java create mode 100644 platform/runtime/base/logging/cef-logger-layout/src/main/java/ru/emdev/cef/AuditLayout.java create mode 100644 platform/runtime/base/logging/cef-logger-layout/src/main/java/ru/emdev/cef/CEFAppender.java create mode 100644 platform/runtime/base/logging/cef-logger-layout/src/main/java/ru/emdev/cef/CEFLayout.java create mode 100644 platform/runtime/base/logging/cef-logger-layout/src/main/java/ru/emdev/cef/CEFRecord.java create mode 100644 platform/runtime/base/logging/cef-logger-layout/src/main/java/ru/emdev/cef/DnsResolver.java create mode 100644 platform/runtime/base/logging/cef-logger-layout/src/test/java/ru/emdev/cef/CEFRecordTest.java create mode 100644 platform/runtime/base/logging/cef-logger-layout/src/test/java/ru/emdev/cef/ProcessingTest.java create mode 100644 platform/runtime/base/logging/cef-logger-layout/src/test/resources/examples/almostFull.json create mode 100644 platform/runtime/base/logging/cef-logger-layout/src/test/resources/examples/empty.json create mode 100644 platform/runtime/base/logging/cef-logger-layout/src/test/resources/examples/noinfo.json create mode 100644 platform/runtime/base/logging/cef-logger-layout/wso2/conf/deployment.toml create mode 100644 platform/runtime/base/logging/cef-logger-layout/wso2/conf/log4j2-entaxy.properties create mode 100644 platform/runtime/base/logging/cef-logger-layout/wso2/conf/log4j2.properties create mode 100644 platform/runtime/base/logging/entaxy-audit/LICENSE.txt create mode 100644 platform/runtime/base/logging/entaxy-audit/Logging-config.md create mode 100644 platform/runtime/base/logging/entaxy-audit/README.md create mode 100644 platform/runtime/base/logging/entaxy-audit/pom.xml create mode 100644 platform/runtime/base/logging/entaxy-audit/src/main/cfg/generated/fragments.xml create mode 100644 platform/runtime/base/logging/entaxy-audit/src/main/cfg/ru.entaxy.audit.interpreter.jmx.cfg create mode 100644 platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/data/Actions.java create mode 100644 platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/data/AuditEvent.java create mode 100644 platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/data/Outcome.java create mode 100644 platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/data/Severity.java create mode 100644 platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/AuditService.java create mode 100644 platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/AuditServiceFactory.java create mode 100644 platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/EventConverter.java create mode 100644 platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/EventConverterInfo.java create mode 100644 platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/EventInterpreter.java create mode 100644 platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/EventSubscriber.java create mode 100644 platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/InterpretedEvent.java create mode 100644 platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/filter/EventRouter.java create mode 100644 platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/hawtio/HawtioEventConverter.java create mode 100644 platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/hawtio/HawtioEventInterpreter.java create mode 100644 platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/hawtio/HawtioInterpretedEvent.java create mode 100644 platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/impl/AuditServiceImpl.java create mode 100644 platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/impl/ConverterService.java create mode 100644 platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/impl/InterpreterService.java create mode 100644 platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/impl/OSGIEventModule.java create mode 100644 platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/impl/WebLoginModule.java create mode 100644 platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/jmx/JMXEventInterpreter.java create mode 100644 platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/jmx/JMXInterpretedEvent.java create mode 100644 platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/jmx/JMXInvokeEvent.java create mode 100644 platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/osgi/Activator.java create mode 100644 platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/utils/AuditHelper.java create mode 100644 platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/utils/CommandWeight.java create mode 100644 platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/utils/Constants.java create mode 100644 platform/runtime/base/logging/pom.xml create mode 100644 platform/runtime/base/logging/src/main/cfg/generated/fragments.xml create mode 100644 platform/runtime/base/logging/src/main/cfg/org.ops4j.pax.logging.cfg create mode 100644 platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/EntaxyFactoryRegistry.java create mode 100644 platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/impl/FactorySearchProvider.java create mode 100644 platform/runtime/base/resources/resources-api/src/main/java/ru/entaxy/esb/resources/EntaxyResourceURLFactory.java create mode 100644 platform/runtime/base/resources/resources-management/src/main/java/ru/entaxy/esb/resources/management/impl/ServiceHelper.java create mode 100644 platform/runtime/base/search-service/LICENSE.txt create mode 100644 platform/runtime/base/search-service/pom.xml create mode 100644 platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/AbstractSearchProvider.java create mode 100644 platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/SearchProvider.java create mode 100644 platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/SearchProviderInfo.java create mode 100644 platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/SearchService.java create mode 100644 platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/impl/SearchServiceImpl.java create mode 100644 platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/jmx/SearchMBean.java create mode 100644 platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/jmx/impl/SearchMBeanImpl.java create mode 100644 platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/provider/OsgiSearchProvider.java create mode 100644 platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/shell/ProvidersList.java create mode 100644 platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/shell/Search.java create mode 100644 platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/shell/StandardAttributes.java create mode 100644 platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/shell/support/AbstractSearchCommand.java create mode 100644 platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/shell/support/ObjectTypeAwareCommand.java create mode 100644 platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/shell/support/ObjectTypeCompleter.java create mode 100644 platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/shell/support/SearchServiceSupport.java create mode 100644 platform/runtime/core/artifact-management-extensions/LICENSE.txt create mode 100644 platform/runtime/core/artifact-management-extensions/pom.xml create mode 100644 platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/ArtifactExtended.java create mode 100644 platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/ExtTypedInstallerFactory.java create mode 100644 platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/SequenceSupport.java create mode 100644 platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/AbstractBinaryArtifact.java create mode 100644 platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/JarArtifact.java create mode 100644 platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/UntypedBinaryArtifact.java create mode 100644 platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/UntypedBinaryInstaller.java create mode 100644 platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/impl/UntypedBinaryInstallerHelperCellar.java create mode 100644 platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/impl/UntypedBinaryInstallerHelperConfig.java create mode 100644 platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/impl/UntypedBinaryInstallerHelperLocal.java create mode 100644 platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/impl/UntypedBinaryInstallerImpl.java create mode 100644 platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/FeatureInstaller.java create mode 100644 platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/FeaturesArtifact.java create mode 100644 platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/FeaturesInstaller.java create mode 100644 platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/CellarFeaturesInstallerHelper.java create mode 100644 platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeatureInstallerClusterHelper.java create mode 100644 platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeatureInstallerConfigurableHelper.java create mode 100644 platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeatureInstallerImpl.java create mode 100644 platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeatureInstallerLocalHelper.java create mode 100644 platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeaturesInstallerConfigurableHelper.java create mode 100644 platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeaturesInstallerHelperConfig.java create mode 100644 platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeaturesInstallerHelperImpl.java create mode 100644 platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeaturesInstallerImpl.java create mode 100644 platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/LocalFeaturesInstallerHelper.java create mode 100644 platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/impl/ClusterTypedConfigurableHelper.java create mode 100644 platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/impl/ExtendedTypedInstallerImpl.java create mode 100644 platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/impl/InstallerConfigurableHelper.java create mode 100644 platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/impl/LocalTypedConfigurableHelper.java create mode 100644 platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/internal/Registrator.java create mode 100644 platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/AbstractTypedInstallerFactory.java create mode 100644 platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/DefaultTypedInstallerFactory.java create mode 100644 platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/TypedInstallerFactory.java create mode 100644 platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/TypedInstallerFactoryDescriptor.java create mode 100644 platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/TypedInstallerManager.java create mode 100644 platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/HelperCreator.java create mode 100644 platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/TypedInstallerHelperAware.java create mode 100644 platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/TypedInstallerHelperImpl.java create mode 100644 platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/RepositoryDescriptor.java create mode 100644 platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/RepositoryDescriptorCollector.java create mode 100644 platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/RepositoryDescriptorImpl.java create mode 100644 platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/RepositoryRegistrator.java create mode 100644 platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalConfigurationEventHandler.java create mode 100644 platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalFeaturesEventHandler.java create mode 100644 platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalRepositoryEventHandler.java create mode 100644 platform/runtime/core/core-support/cfg/ignite.cfg create mode 100644 platform/runtime/core/core-support/cfg/jgroups.locking.xml create mode 100644 platform/runtime/core/core-support/core-support-design/src/main/java/ru/entaxy/platform/core/support/design/openapi/EntaxyOpenApiGeneratorDeprecated.java create mode 100644 platform/runtime/core/core-support/core-support-design/src/main/java/ru/entaxy/platform/core/support/design/openapi/utils/CompilationUnit.java create mode 100644 platform/runtime/core/core-support/core-support-design/src/main/java/ru/entaxy/platform/core/support/design/openapi/utils/CompilerRequestor.java create mode 100644 platform/runtime/core/core-support/core-support-design/src/main/java/ru/entaxy/platform/core/support/design/openapi/utils/INameEnvironmentImpl.java create mode 100644 platform/runtime/core/core-support/core-support-runtime-legacy/LICENSE.txt create mode 100644 platform/runtime/core/core-support/core-support-runtime-legacy/pom.xml create mode 100644 platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/aggregation/HeaderMergeAggregatorImpl.java create mode 100644 platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/aggregation/JdbcCamelCodec.java create mode 100644 platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/aggregation/TimeoutAwareAggregationStrategyImpl.java create mode 100644 platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/aggregation/hazelcast/DisconnectedMembershipListener.java create mode 100644 platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/aggregation/repo/IgniteAggregationRepository.java create mode 100644 platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/aggregation/repo/JdbcAggregationRepository.java create mode 100644 platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/aggregation/repo/PostgresAggregationRepository.java create mode 100644 platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/exception/BundleNotFound.java create mode 100644 platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/exception/ConnectorNotFound.java create mode 100644 platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/exception/EsbNotFound.java create mode 100644 platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/exception/ProfileNotFound.java create mode 100644 platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/exception/TemplateNotFound.java create mode 100644 platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/interceptor/SoapHeaderInterceptor.java create mode 100644 platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/util/CustomHeader.java create mode 100644 platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/util/HeadersConverter.java create mode 100644 platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/util/PropertiesHelper.java create mode 100644 platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/util/SimpleOutHeaderFilterStrategy.java create mode 100644 platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/util/SystemHeadersConstants.java create mode 100644 platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/validator/ValidateInterceptor.java create mode 100644 platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/validator/XmlParser.java create mode 100644 platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/camel/aggregation/JmsCamelAggregateExtension.java create mode 100644 platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/camel/aggregation/MapAggregationStrategy.java create mode 100644 platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cluster/ClusterBundleDataProvider.java create mode 100644 platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cluster/HazelcastLockClusterService.java create mode 100644 platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cluster/HazelcastValueLockClusterView.java create mode 100644 platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cluster/JGroupsLockClusterService.java create mode 100644 platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cluster/JGroupsLockClusterView.java create mode 100644 platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/BasicAuthenticationInterceptor.java create mode 100644 platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyClassResolver.java create mode 100644 platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/ExtJwtTokenSecurityContext.java create mode 100644 platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/jose/ExtJwtAuthenticationFilter.java create mode 100644 platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/security/AnonymousSecurityContext.java create mode 100644 platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/security/oauth2/filters/DisplaySchemaOAuthRequestFilter.java create mode 100644 platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/hazelcast/HazelcastCallbackEntryExpiredListener.java create mode 100644 platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/hazelcast/HazelcastHelper.java create mode 100644 platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/ignite/IgniteInstanceIgniter.java create mode 100644 platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/jackson/EntaxyObjectMapper.java create mode 100644 platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/jackson/JacksonJsonProviderFactory.java create mode 100644 platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/jgroups/JGroupsLockServiceIgniter.java create mode 100644 platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/service/ServiceHolder.java create mode 100644 platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/service/ServiceHolderHelper.java create mode 100644 platform/runtime/core/error-handling/LICENSE.txt create mode 100644 platform/runtime/core/error-handling/error-handler/LICENSE.txt create mode 100644 platform/runtime/core/error-handling/error-handler/README.md create mode 100644 platform/runtime/core/error-handling/error-handler/pom.xml create mode 100644 platform/runtime/core/error-handling/error-handler/src/main/cfg/generated/fragments.xml create mode 100644 platform/runtime/core/error-handling/error-handler/src/main/cfg/ru.entaxy.esb.error.cfg create mode 100644 platform/runtime/core/error-handling/error-handler/src/main/cfg/ru.entaxy.esb.error.code.cfg create mode 100644 platform/runtime/core/error-handling/error-handler/src/main/cfg/ru.entaxy.esb.error.text.cfg create mode 100644 platform/runtime/core/error-handling/error-handler/src/main/java/ru/entaxy/esb/system/core/common/error/handler/interceptor/EntaxyCxfFaultInterceptor.java create mode 100644 platform/runtime/core/error-handling/error-handler/src/main/java/ru/entaxy/esb/system/core/common/error/handler/interceptor/HandleOutFaultInterceptor.java create mode 100644 platform/runtime/core/error-handling/error-handler/src/main/java/ru/entaxy/esb/system/core/common/error/handler/processor/ErrorProcessor.java create mode 100644 platform/runtime/core/error-handling/error-handler/src/main/java/ru/entaxy/esb/system/core/common/error/handler/util/Timestamp.java create mode 100644 platform/runtime/core/error-handling/error-handler/src/main/resources/OSGI-INF/blueprint/common-error-handler-context.xml create mode 100644 platform/runtime/core/error-handling/error-handler/src/main/resources/ftl/DefaultResponse.ftl create mode 100644 platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/DefaultResponse.xsl create mode 100644 platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/UniversalErrorPacket.xsl create mode 100644 platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/WrapSoapEnvelope.xsl create mode 100644 platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/operation/ConfirmGettingPackets.xsl create mode 100644 platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/operation/GetPackets.xsl create mode 100644 platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/operation/PutPackets.xsl create mode 100644 platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/operation/sendAcknowledge.xsl create mode 100644 platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/operation/sendToJMS.xsl create mode 100644 platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/operation/type/response.xsl create mode 100644 platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/soapWrap.xsl create mode 100644 platform/runtime/core/error-handling/pom.xml create mode 100644 platform/runtime/core/infrastructure/file-upload/LICENSE.txt create mode 100644 platform/runtime/core/infrastructure/file-upload/pom.xml create mode 100644 platform/runtime/core/infrastructure/file-upload/src/main/java/ru/entaxy/esb/system/management/file/upload/FileUploadProcessor.java create mode 100644 platform/runtime/core/infrastructure/file-upload/src/main/java/ru/entaxy/esb/system/management/file/upload/FileUploadService.java create mode 100644 platform/runtime/core/infrastructure/file-upload/src/main/java/ru/entaxy/esb/system/management/file/upload/FileUploadServiceImpl.java create mode 100644 platform/runtime/core/infrastructure/file-upload/src/main/resources/OSGI-INF/blueprint/camel-context.xml create mode 100644 platform/runtime/core/initializer/artifact-loader/LICENSE.txt create mode 100644 platform/runtime/core/initializer/artifact-loader/pom.xml create mode 100644 platform/runtime/core/initializer/artifact-loader/src/main/java/ru/entaxy/platform/initializer/artifactloader/ArtifactDeployer.java create mode 100644 platform/runtime/core/initializer/artifact-loader/src/main/java/ru/entaxy/platform/initializer/artifactloader/ArtifactInstaller.java create mode 100644 platform/runtime/core/initializer/artifact-loader/src/main/java/ru/entaxy/platform/initializer/artifactloader/ArtifactLoader.java create mode 100644 platform/runtime/core/initializer/connection-initializer/src/main/non-packaged-resources/etc/init/broker-connections.json create mode 100644 platform/runtime/core/initializer/connection-initializer/src/main/non-packaged-resources/etc/init/db-connections.json create mode 100644 platform/runtime/core/initializer/datasources-initializer/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/datasources/DataSourcesStandaloneInitializer.java create mode 100644 platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/api/AbstractStandaloneInitializer.java create mode 100644 platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/api/Initialized.java create mode 100644 platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/api/StandaloneInitializer.java create mode 100644 platform/runtime/core/management/config-management/LICENSE.txt create mode 100644 platform/runtime/core/management/config-management/pom.xml create mode 100644 platform/runtime/core/management/config-management/src/main/java/ru/entaxy/platform/config/management/ConfigMBean.java create mode 100644 platform/runtime/core/management/config-management/src/main/java/ru/entaxy/platform/config/management/ConfigsMBean.java create mode 100644 platform/runtime/core/management/config-management/src/main/java/ru/entaxy/platform/config/management/ObjectConfigMBean.java create mode 100644 platform/runtime/core/management/config-management/src/main/java/ru/entaxy/platform/config/management/impl/ConfigMBeanFactory.java create mode 100644 platform/runtime/core/management/config-management/src/main/java/ru/entaxy/platform/config/management/impl/ConfigMBeanImpl.java create mode 100644 platform/runtime/core/management/config-management/src/main/java/ru/entaxy/platform/config/management/impl/ConfigsMBeanImpl.java create mode 100644 platform/runtime/core/management/config-management/src/main/java/ru/entaxy/platform/config/management/impl/ObjectConfigMBeanImpl.java create mode 100644 platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/ConnectionMBean.java create mode 100644 platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/ConnectionsMBean.java create mode 100644 platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/impl/ConnectionMBeanImpl.java create mode 100644 platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/impl/ConnectionsMBeanImpl.java create mode 100644 platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/impl/ManagedConnection.java create mode 100644 platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/impl/ManagedConnections.java create mode 100644 platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/impl/ManagedConnectionsListener.java create mode 100644 platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/tracker/DeployedConnectionCustomizer.java create mode 100644 platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/tracker/DeployedConnectionTracker.java create mode 100644 platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/ConnectionMBean.java create mode 100644 platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/ConnectionsMBean.java create mode 100644 platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/impl/ConnectionMBeanFactory.java create mode 100644 platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/impl/ConnectionMBeanImpl.java create mode 100644 platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/impl/ConnectionsMBeanImpl.java create mode 100644 platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/DeployedLegacyConnectionCustomizer.java create mode 100644 platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/DeployedLegacyConnectionTracker.java create mode 100644 platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/LegacyConnectionMBean.java create mode 100644 platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/LegacyConnectionMBeanImpl.java create mode 100644 platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/LegacyConnectionsManager.java create mode 100644 platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/ManagedLegacyConnection.java create mode 100644 platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/ManagedLegacyConnections.java create mode 100644 platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/ManagedLegacyConnectionsListener.java create mode 100644 platform/runtime/core/management/object-management/LICENSE.txt create mode 100644 platform/runtime/core/management/object-management/pom.xml create mode 100644 platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/ContainerMBean.java create mode 100644 platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/EntaxyRuntimeItemMBean.java create mode 100644 platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/EntaxyRuntimeObjectContainerMBean.java create mode 100644 platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/EntaxyRuntimeObjectMBean.java create mode 100644 platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/EntaxyRuntimeObjectMBeanCustomizer.java create mode 100644 platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/EntaxyRuntimeObjectMBeanFactory.java create mode 100644 platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/MBeanFactory.java create mode 100644 platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/ObjectMBean.java create mode 100644 platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/AbstractMBeanFactory.java create mode 100644 platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/AbstractObjectContainerMBean.java create mode 100644 platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/AbstractObjectItemMBean.java create mode 100644 platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/AbstractObjectMBean.java create mode 100644 platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/ObjectsContainerMBean.java create mode 100644 platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/impl/EntaxyObjectMBeanFactory.java create mode 100644 platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/impl/EntaxyRuntimeObjectMBeanImpl.java create mode 100644 platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/impl/ObjectsContainerMBeanImpl.java create mode 100644 platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/impl/ServiceHelper.java create mode 100644 platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/impl/EntaxyRuntimeItemMBeanInfo.java create mode 100644 platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/impl/EntaxyRuntimeObjectContainerMBeanInfo.java create mode 100644 platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/impl/EntaxyRuntimeObjectMBeanCustomizerHolder.java create mode 100644 platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/impl/EntaxyRuntimeObjectMBeanInfo.java create mode 100644 platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/impl/EntaxyRuntimeObjectMBeanManager.java create mode 100644 platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/impl/MBeanHolder.java create mode 100644 platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/impl/MBeanUtils.java create mode 100644 platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/shell/EntaxyRuntimeObjectMBeanManagerSupport.java create mode 100644 platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/shell/ListMBeanFactories.java create mode 100644 platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/shell/ListMBeans.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/AccountHelper.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/AccountHelperImpl.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/ConnectorHelper.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/ConnectorHelperImpl.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/Helpers.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/PermissionHelper.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/PermissionHelperImpl.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/ProfileHelper.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/ProfileHelperImpl.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/SystemHelper.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/SystemHelperImpl.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/ConnectorMBean.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/DefaultRouteMBean.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/NotBackwardCompatibleException.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/ProfileMBean.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/ProfilesMBean.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/RoutesMBean.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/impl/ConnectorMBeanFactory.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/impl/ConnectorMBeanImpl.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/impl/DefaultRouteMBeanFactory.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/impl/DefaultRouteMBeanImpl.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/impl/ProfileMBeanFactory.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/impl/ProfileMBeanImpl.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/impl/ProfilesMBeanImpl.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/AccountManager.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/ConnectorMBean.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/ConnectorManager.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/ConnectorsMBean.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/DeployedLegacyConnectorCustomizer.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/LegacyConnectorMBeanImpl.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/LegacyConnectorManager.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/ManagedLegacyConnector.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/ManagedLegacyConnectorsListener.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/PermissionManager.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/ProfileManager.java create mode 100644 platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/SystemManager.java create mode 100644 platform/runtime/core/management/repository-management/LICENSE.txt create mode 100644 platform/runtime/core/management/repository-management/pom.xml create mode 100644 platform/runtime/core/management/repository-management/src/main/java/ru/entaxy/platform/core/management/repository/RepositoriesMBean.java create mode 100644 platform/runtime/core/management/repository-management/src/main/java/ru/entaxy/platform/core/management/repository/RepositoryMBean.java create mode 100644 platform/runtime/core/management/repository-management/src/main/java/ru/entaxy/platform/core/management/repository/impl/RepositoriesMBeanImpl.java create mode 100644 platform/runtime/core/management/repository-management/src/main/java/ru/entaxy/platform/core/management/repository/impl/RepositoryMBeanFactory.java create mode 100644 platform/runtime/core/management/repository-management/src/main/java/ru/entaxy/platform/core/management/repository/impl/RepositoryMBeanImpl.java create mode 100644 platform/runtime/core/management/route-management/LICENSE.txt create mode 100644 platform/runtime/core/management/route-management/pom.xml create mode 100644 platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/RouteComponentLibrariesMBean.java create mode 100644 platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/RouteLibrariesMBean.java create mode 100644 platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/RouteLibraryMBean.java create mode 100644 platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/RouteMBean.java create mode 100644 platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/RoutesMBean.java create mode 100644 platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/impl/RouteComponentLibrariesMBeanImpl.java create mode 100644 platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/impl/RouteLibrariesMBeanImpl.java create mode 100644 platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/impl/RouteLibraryMBeanImpl.java create mode 100644 platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/impl/RouteMBeanImpl.java create mode 100644 platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/impl/RouteMbeanFactory.java create mode 100644 platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/impl/RoutesMBeanImpl.java create mode 100644 platform/runtime/core/management/service-management/src/main/java/ru/entaxy/platform/core/management/service/ServiceMBean.java create mode 100644 platform/runtime/core/management/service-management/src/main/java/ru/entaxy/platform/core/management/service/ServicesMBean.java create mode 100644 platform/runtime/core/management/service-management/src/main/java/ru/entaxy/platform/core/management/service/impl/ServiceMBeanFactory.java create mode 100644 platform/runtime/core/management/service-management/src/main/java/ru/entaxy/platform/core/management/service/impl/ServiceMBeanImpl.java create mode 100644 platform/runtime/core/management/service-management/src/main/java/ru/entaxy/platform/core/management/service/impl/ServicesMBeanImpl.java create mode 100644 platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/audit/ObjectProducerEventConverter.java create mode 100644 platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/GeneratedObjectsPublishDataStorage.java create mode 100644 platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/UniformExtendableProducer.java create mode 100644 platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/AddConfigCommand2.java create mode 100644 platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/ConfigProducer2.java create mode 100644 platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/support/ConfigObjectSupport.java create mode 100644 platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/support/DeployableConfig.java create mode 100644 platform/runtime/core/object-producing/object-producing-config-support/src/main/resources/ru/entaxy/extensions/objectproducer/merge/config/BlueprintMergeProcessor.json create mode 100644 platform/runtime/core/object-producing/object-producing-config-support/src/main/resources/ru/entaxy/factory/object-config.json create mode 100644 platform/runtime/core/object-producing/object-producing-config-support/src/main/resources/ru/entaxy/templates/object-config/config-defaults-field.ftl create mode 100644 platform/runtime/core/object-producing/object-producing-config-support/src/main/resources/ru/entaxy/templates/object-config/config-defaults.ftl create mode 100644 platform/runtime/core/object-producing/object-producing-config-support/src/main/resources/ru/entaxy/templates/object-config/config-link-field.ftl create mode 100644 platform/runtime/core/object-producing/object-producing-config-support/src/main/resources/ru/entaxy/templates/object-config/init.ftl create mode 100644 platform/runtime/core/object-producing/object-producing-config-support/src/main/resources/ru/entaxy/templates/object-config/ref.ftl create mode 100644 platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/EntaxyResourceProducingProcessor.java create mode 100644 platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/EntaxyResourceProducingProcessorService.java create mode 100644 platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/impl/EntaxyResourceProducingProcessorServiceImpl.java create mode 100644 platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryEssence.java create mode 100644 platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FindFactories.java create mode 100644 platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyObjectCustomizer.java create mode 100644 platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyRuntimeObjectExtendedDataProvider.java create mode 100644 platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/ClusterExtendedDataProvider.java create mode 100644 platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/RuntimeObjectSearchProvider.java create mode 100644 platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/internal/ObjectResourcesProvider.java create mode 100644 platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectFind.java create mode 100644 platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectVersions.java create mode 100644 platform/runtime/core/objects-implementations/config-implementation/LICENSE.txt create mode 100644 platform/runtime/core/objects-implementations/config-implementation/config-runtime/LICENSE.txt create mode 100644 platform/runtime/core/objects-implementations/config-implementation/config-runtime/pom.xml create mode 100644 platform/runtime/core/objects-implementations/config-implementation/config-runtime/src/main/java/ru/entaxy/platform/config/runtime/ConfigEntaxyObject.java create mode 100644 platform/runtime/core/objects-implementations/config-implementation/config-runtime/src/main/java/ru/entaxy/platform/config/runtime/ConfigEntaxyObjectWrapped.java create mode 100644 platform/runtime/core/objects-implementations/config-implementation/config-runtime/src/main/java/ru/entaxy/platform/config/runtime/ObjectConfig.java create mode 100644 platform/runtime/core/objects-implementations/config-implementation/config-runtime/src/main/java/ru/entaxy/platform/config/runtime/ObjectConfigCustomizer.java create mode 100644 platform/runtime/core/objects-implementations/config-implementation/config-runtime/src/main/java/ru/entaxy/platform/config/runtime/ObjectConfigEditor.java create mode 100644 platform/runtime/core/objects-implementations/config-implementation/config-runtime/src/main/java/ru/entaxy/platform/config/runtime/ObjectConfigHelper.java create mode 100644 platform/runtime/core/objects-implementations/config-implementation/pom.xml create mode 100644 platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/java/ru/entaxy/platform/runtime/connections/ftps/FtpsConnectionComponent.java create mode 100644 platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/resources/ru/entaxy/factory/ftps-connection.json create mode 100644 platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/resources/ru/entaxy/templates/ftps-connection/init.body.ftl create mode 100644 platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/resources/ru/entaxy/templates/ftps-connection/init.ftl create mode 100644 platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/resources/ru/entaxy/templates/ftps-connection/init.private.ftl create mode 100644 platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/abstract-connector-in/pre-route.bak.xml create mode 100644 platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/abstract-connector-out/pre-output.bak.xml create mode 100644 platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/abstract-connector/response-route.bak.xml create mode 100644 platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/resources/ru/entaxy/templates/abstract-connector/__errorHandler.ftl create mode 100644 platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/resources/ru/entaxy/templates/abstract-connector/globalOptions.ftl create mode 100644 platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/factory/ftps-connector-in.json create mode 100644 platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/factory/ftps-connector-out.json create mode 100644 platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/factory/http-connector-out.json create mode 100644 platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/custom-connector-in/input-route.bak.xml create mode 100644 platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/templates/artemis-connector-out/customObjectReferences.ftl create mode 100644 platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/templates/ftps-connector-in/init.ftl create mode 100644 platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/templates/ftps-connector-out/init.ftl create mode 100644 platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/templates/http-connector-out/customObjectReferences.ftl create mode 100644 platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/templates/http-connector-out/customObjects.ftl create mode 100644 platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/templates/http-connector-out/init.ftl create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/common-system-profile/in-flow-pre-route.bak.xml create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/common-system-profile/in-flow-response.bak.xml create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/common-system-profile/out-flow-connector-selector.bak.xml create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/common-system-profile/out-flow-pre-route.bak.xml create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/common-system-profile/out-flow-response.bak.xml create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/default-route-2/default-route.bak.xml create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/LICENSE.txt create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/pom.xml create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/component/SystemComponent.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/component/SystemConsumer.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/component/SystemEndpoint.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/component/SystemProducer.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/component/util/SystemConstants.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/groups/component/SystemGroupComponent.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/groups/component/SystemGroupConsumer.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/groups/component/SystemGroupEndpoint.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/groups/component/SystemGroupProducer.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/groups/component/util/SystemGroupConstants.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/resources/META-INF/services/org/apache/camel/component/system create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/resources/META-INF/services/org/apache/camel/component/system-group create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/LICENSE.txt create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/pom.xml create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/groups/registry/system/groups/profile/SystemGroupCollectorListener.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/groups/registry/system/groups/profile/SystemGroupProfile.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/groups/registry/system/groups/profile/collector/SystemGroupProfileNamedListener.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/groups/registry/system/groups/profile/impl/defaults/DefaultSystemGroupProfile.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/CommonProfile.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/ConnectorRegistry.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/InConnectorCollector.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/Profile.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/connectors/CommonConnector.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/connectors/Connector.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/connectors/in/DirectVMInConnectorImpl.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/connectors/in/InConnector.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/connectors/out/DirectVMOutConnectorImpl.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/connectors/out/OutConnector.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/profile_output/ProfileOutput.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/profile_output/ProfileOutputImpl.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/registry/systems/profile/SystemCollectorListener.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/registry/systems/profile/SystemProfile.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/registry/systems/profile/collector/SystemProfileNamedListener.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/registry/systems/profile/impl/defaults/DefaultSystemProfile.java create mode 100644 platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 platform/runtime/core/objects-implementations/repository-implementation/LICENSE.txt create mode 100644 platform/runtime/core/objects-implementations/repository-implementation/pom.xml create mode 100644 platform/runtime/core/objects-implementations/repository-implementation/repository-producing/LICENSE.txt create mode 100644 platform/runtime/core/objects-implementations/repository-implementation/repository-producing/pom.xml create mode 100644 platform/runtime/core/objects-implementations/repository-implementation/repository-producing/src/main/resources/ru/entaxy/extensions/objectproducer/producer/config.json create mode 100644 platform/runtime/core/objects-implementations/repository-implementation/repository-producing/src/main/resources/ru/entaxy/factory/artifact-repository.json create mode 100644 platform/runtime/core/objects-implementations/repository-implementation/repository-producing/src/main/resources/ru/entaxy/templates/artifact-repository/init.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/redeliveryPolicy-originalFromCamel.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/ComponentLibrary.java create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/ComponentLibraryManager.java create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/ComponentLibraryResourceProcessor.java create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/impl/ComponentLibraryManagerImpl.java create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/shell/CommandLibraryList.java create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/shell/ComponentLibraryCommandSupport.java create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/storage/ComponentLibraryResourceProvider.java create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/storage/ComponentLibraryStorage.java create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/storage/ProvidedLibraryDescriptor.java create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/tracker/ComponentLibraryTracker.java create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/blueprint-entaxy.xsd create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/blueprint.xsd create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/camel-entaxy.xsd create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/camel.xsd create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/connector-selector.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/connector-selector.xsd create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/connector-selector.xslt create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/entaxy-connectors.xslt create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/entaxy-mediators.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/entaxy-mediators.xsd create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/entaxy-mediators.xslt create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/entaxy-profiles.xslt create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/entaxy-routes.xslt create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/entaxy-services.xslt create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/entaxy-struct.xslt create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/entaxy-test-2.xml create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/entaxy-test.xml create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/entaxy.xsd create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/library.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/rest-service-components.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/rest-service-components.xsd create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/rest-service-components.xslt create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/soap-service-components.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/soap-service-components.xsd create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/soap-service-components.xslt create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/xml-to-string.xsl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/extensions/objectproducer/merge/config/BlueprintMergeProcessor.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/extensions/objectproducer/producer/config.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/camel/abstract-camel-component.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/camel/abstract-camel-item.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/camel/abstract-camel-model.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/camel/components/camel-quartz.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/camel/components/camel-timer.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/camel/model/model-aggregate.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/camel/model/model-quartz.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/camel/model/model-timer.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/cookie-handler.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/ftp-client-config.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/header-filter-strategy.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/hostname-verifier.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/oauth.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/redelivery-policy.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/abstract-route-component.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/abstract-route-container-object.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/abstract-route-container.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/abstract-route.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/components/aggregate/abstract-aggregation-repository.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/components/aggregate/abstract-aggregation-strategy-camel-simple.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/components/aggregate/abstract-aggregation-strategy.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/components/aggregate/aggregation-repository-camel-memory.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/components/aggregate/aggregation-repository-entaxy-ignite.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/components/aggregate/aggregation-repository-entaxy-jdbc.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/components/aggregate/aggregation-repository-entaxy-postgre.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/components/aggregate/aggregation-strategy-camel-grouped-body.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/components/aggregate/aggregation-strategy-camel-grouped-exchange.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/components/aggregate/aggregation-strategy-camel-grouped-message.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/components/aggregate/aggregation-strategy-camel-string.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/components/aggregate/aggregation-strategy-camel-use-latest.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/components/aggregate/aggregation-strategy-camel-use-original.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/components/aggregate/aggregation-strategy-entaxy-map.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/components/expression/abstract-expression.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/components/expression/common-expression.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/components/route-timer.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/route-aggregator-in-object.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/route-aggregator.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/route-callable-in-object.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/route-callable.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/route-library.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/route-listener-queue-jms-artemis.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/route-listener-queue-jms.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/route-listener-queue.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/route-listener.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/route-quartz.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/route-scheduled.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/route-self-started.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/route-subscription-topic-jms-artemis.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/route-subscription-topic-jms.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/route-subscription-topic.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/routes/route-timer.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/factory/ssl-context-parameters.json create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/abstract-route/routeContent.xml create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/base-object/oauth_client_credentials/parse-token-response.xml create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/base-object/oauth_client_credentials/pre-refresh-token.xml create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/base-object/oauth_client_credentials/pre-token.xml create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/base-object/oauth_password/parse-token-response.xml create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/base-object/oauth_password/pre-refresh-token.xml create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/base-object/oauth_password/pre-token.xml create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/base-object/parse-token-response.xml create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/base-object/pre-refresh-token.xml create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/base-object/pre-token.xml create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/templates/abstract-aggregation-strategy-camel-simple/init.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/templates/abstract-connector/generate-logging-key.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/templates/abstract-route-container/errorHandler.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/templates/abstract-route-container/globalOptions.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/templates/abstract-route-container/init.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/templates/abstract-route/init.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/templates/aggregation-repository-camel-memory/init.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/templates/aggregation-repository-entaxy-ignite/init.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/templates/aggregation-repository-entaxy-jdbc/init.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/templates/aggregation-repository-entaxy-postgre/init.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/templates/aggregation-strategy-camel-string/init.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/templates/aggregation-strategy-entaxy-map/init.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/templates/base-object/cookie-handler.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/templates/base-object/header-filter-strategy.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/templates/base-object/hostname-verifier.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/templates/base-object/oauth-module.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/templates/base-object/simple-custom-object.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/templates/base-object/ssl-context-parameters.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/templates/common-expression/init.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/templates/model-aggregate/init.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/templates/model-quartz/init.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/templates/model-timer/init.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/templates/route-aggregator/init.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/templates/route-callable/__init.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/templates/route-library/init.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/templates/route-listener-queue-jms-artemis/init.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/templates/route-quartz/init.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/templates/route-subscription-topic-jms-artemis/init.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/templates/route-timer/init.ftl create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-runtime/LICENSE.txt create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-runtime/pom.xml create mode 100644 platform/runtime/core/objects-implementations/route-implementation/route-runtime/src/main/resources/OSGI-INF/blueprint/log-context.xml create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/factory/services/rest/camel/cxf-rs.json create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/factory/services/rest/client/abstract-service-rest-connector-out.json create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/factory/services/rest/client/openapi-based-rest-client.json create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/factory/services/soap/client/abstract-service-soap-connector-out.json create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/factory/services/soap/client/wsdl-based-soap-client.json create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/resource/schemas/examples/pets.json create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/resource/schemas/examples/pets.yaml create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/resource/schemas/examples/simpleApi.json create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/resource/schemas/examples/simpleApi.yaml create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/resource/service-resources/schemas/examples/pets.json/Swagger_Petstore_-_OpenAPI_3.0/1.0.11/operationRouterClient.xml create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/resource/service-resources/schemas/examples/pets.json/Swagger_Petstore_-_OpenAPI_3.0/1.0.11/operationRouterConnector.xml create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/resource/service-resources/schemas/examples/pets.json/Swagger_Petstore_-_OpenAPI_3.0/1.0.11/operationRouterConnectorOut.xml create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/resource/service-resources/schemas/examples/pets.json/Swagger_Petstore_-_OpenAPI_3.0/1.0.11/operationRouterProtected.xml create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/resource/service-resources/schemas/examples/pets.json/Swagger_Petstore_-_OpenAPI_3.0/1.0.11/operationRouterPublic.xml create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/resource/service-resources/schemas/examples/pets.yaml/Swagger_Petstore_-_OpenAPI_3.0/1.0.11/operationRouterClient.xml create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/resource/service-resources/schemas/examples/pets.yaml/Swagger_Petstore_-_OpenAPI_3.0/1.0.11/operationRouterConnector.xml create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/resource/service-resources/schemas/examples/pets.yaml/Swagger_Petstore_-_OpenAPI_3.0/1.0.11/operationRouterConnectorOut.xml create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/resource/service-resources/schemas/examples/pets.yaml/Swagger_Petstore_-_OpenAPI_3.0/1.0.11/operationRouterProtected.xml create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/resource/service-resources/schemas/examples/pets.yaml/Swagger_Petstore_-_OpenAPI_3.0/1.0.11/operationRouterPublic.xml create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/resource/service-resources/schemas/examples/simpleApi.json/template/1.0.0/operationRouterClient.xml create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/resource/service-resources/schemas/examples/simpleApi.json/template/1.0.0/operationRouterConnector.xml create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/resource/service-resources/schemas/examples/simpleApi.json/template/1.0.0/operationRouterConnectorOut.xml create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/resource/service-resources/schemas/examples/simpleApi.json/template/1.0.0/operationRouterProtected.xml create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/resource/service-resources/schemas/examples/simpleApi.json/template/1.0.0/operationRouterPublic.xml create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/resource/service-resources/schemas/examples/simpleApi.yaml/template/1.0.0/operationRouterClient.xml create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/resource/service-resources/schemas/examples/simpleApi.yaml/template/1.0.0/operationRouterConnector.xml create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/resource/service-resources/schemas/examples/simpleApi.yaml/template/1.0.0/operationRouterConnectorOut.xml create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/resource/service-resources/schemas/examples/simpleApi.yaml/template/1.0.0/operationRouterProtected.xml create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/resource/service-resources/schemas/examples/simpleApi.yaml/template/1.0.0/operationRouterPublic.xml create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/templates/abstract-service-rest-connector-out/init.ftl create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/templates/abstract-service-soap-connector-out/init.ftl create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/templates/openapi-based-rest-client/connectorOutFactory.ftl create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/templates/openapi-based-rest-client/customObjectReferences.ftl create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/templates/openapi-based-rest-client/init.ftl create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/templates/openapi-based-rest-client/specificProtectedComponents.ftl create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/templates/service-components/generateLoggingKey.ftl create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/templates/service-resources-openapi/operationRouterClient.ftl create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/templates/service-resources-openapi/operationRouterConnector.bak.ftl create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/templates/service-resources-openapi/operationRouterConnectorOut.ftl create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/templates/service-resources-openapi/operationRouterProtected.bak.ftl create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/templates/service-resources-openapi/operationRouterPublic.bak.ftl create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/templates/service-resources-soap/operationRouterClient.ftl create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/templates/service-resources-soap/operationRouterConnector.bak.ftl create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/templates/service-resources-soap/operationRouterConnectorOut.ftl create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/templates/service-resources-soap/operationRouterProtected.bak.ftl create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/templates/service-resources-soap/operationRouterPublic.bak.ftl create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/templates/wsdl-based-soap-client/connectorOutFactory.ftl create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/templates/wsdl-based-soap-client/customObjectReferences.ftl create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-producing/src/main/resources/ru/entaxy/templates/wsdl-based-soap-client/init.ftl create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-runtime/src/main/java/ru/entaxy/platform/services/runtime/interceptor/DisableWSDLGetInterceptor.java create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-runtime/src/main/java/ru/entaxy/platform/services/runtime/interceptor/PostAuthWSDLGetInterceptor.java create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-runtime/src/main/java/ru/entaxy/platform/services/runtime/interceptor/PublicOpenApiSchemaInterceptor.java create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-runtime/src/main/java/ru/entaxy/platform/services/runtime/interceptor/ResolveLoginInterceptor.java create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-runtime/src/main/java/ru/entaxy/platform/services/runtime/interceptor/ResolveProfileNameInterceptor.java create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-runtime/src/main/java/ru/entaxy/platform/services/runtime/interceptor/SOAPValidateInterceptor.java create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-runtime/src/main/java/ru/entaxy/platform/services/runtime/interceptor/SystemHeadersConstants.java create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-runtime/src/main/java/ru/entaxy/platform/services/runtime/interceptor/jwt/GetterToken.java create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-runtime/src/main/java/ru/entaxy/platform/services/runtime/interceptor/jwt/ResolveProfileNameFromTokenInterceptor.java create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-runtime/src/main/java/ru/entaxy/platform/services/runtime/interceptor/jwt/SimpleAuthorizingFromTokenInterceptor.java create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-runtime/src/main/java/ru/entaxy/platform/services/runtime/resolver/HibernateValidationProviderResolver.java create mode 100644 platform/runtime/core/objects-implementations/service-implementation/service-runtime/src/main/java/ru/entaxy/platform/services/runtime/utils/XmlParser.java create mode 100644 platform/runtime/modules/atlasmap/LICENSE.txt create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/pom.xml create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/main/java/org/apache/camel/component/atlasmap/AtlasComponent.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/main/java/org/apache/camel/component/atlasmap/AtlasConstants.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/main/java/org/apache/camel/component/atlasmap/AtlasEndpoint.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/main/java/org/apache/camel/component/atlasmap/CamelAtlasPropertyStrategy.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/main/resources/META-INF/NOTICE.txt create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/main/resources/META-INF/services/org/apache/camel/component/atlas create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/java/org/apache/camel/component/atlasmap/AtlasEndpointTest.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/java/org/apache/camel/component/atlasmap/AtlasMapComponentJavaToJsonTest.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/java/org/apache/camel/component/atlasmap/AtlasMapComponentJsonTest.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/java/org/apache/camel/component/atlasmap/AtlasMapComponentJsonToJavaTest.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/java/org/apache/camel/component/atlasmap/AtlasMapComponentTest.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/java/org/apache/camel/component/atlasmap/AtlasMapComponentXmlToXmlDefaultNsTest.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/java/org/apache/camel/component/atlasmap/AtlasMapComponentXmlToXmlTest.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/java/org/apache/camel/component/atlasmap/AtlasMapExtractMappingsTest.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/java/org/apache/camel/component/atlasmap/AtlasMapJsonToXmlSchemaTest.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/java/org/apache/camel/component/atlasmap/AtlasMapMultiDocsTest.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/java/org/apache/camel/component/atlasmap/AtlasMapMultiNSTest.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/java/org/apache/camel/component/atlasmap/CamelAtlasPropertyStrategyTest.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/java/org/apache/camel/component/atlasmap/Pojo.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/java/org/apache/camel/component/atlasmap/Util.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/java/org/apache/camel/component/atlasmap/issue/AtlasMapIssue2552Test.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/java/org/apache/camel/component/atlasmap/issue/AtlasMapIssue729Test.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/resources/atlasmap-mapping-n.adm create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/resources/atlasmap-mapping.adm create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/resources/atlasmapping-java-to-json.json create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/resources/atlasmapping-json-to-java.json create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/resources/atlasmapping-multidocs.json create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/resources/atlasmapping-multins.json create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/resources/atlasmapping-xml-to-xml.json create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/resources/atlasmapping.json create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/resources/json-schema-source-to-xml-schema-target.adm create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/resources/json-source.json create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/resources/log4j2.xml create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/resources/org/apache/camel/component/atlasmap/AtlasMapComponentJavaToJsonTest-context.xml create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/resources/org/apache/camel/component/atlasmap/AtlasMapComponentJsonTest-context.xml create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/resources/org/apache/camel/component/atlasmap/AtlasMapComponentJsonToJavaTest-context.xml create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/resources/org/apache/camel/component/atlasmap/AtlasMapComponentTest-context.xml create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/resources/org/apache/camel/component/atlasmap/AtlasMapComponentXmlToXmlTest-context.xml create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/resources/org/apache/camel/component/atlasmap/AtlasMapExtractMappingsTest-context.xml create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/resources/org/apache/camel/component/atlasmap/AtlasMapJsonToXmlSchemaTest-context.xml create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/resources/org/apache/camel/component/atlasmap/AtlasMapMultiDocsTest-context.xml create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/resources/org/apache/camel/component/atlasmap/AtlasMapMultiNSTest-context.xml create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/resources/org/apache/camel/component/atlasmap/issue/2552-input.json create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/resources/org/apache/camel/component/atlasmap/issue/AtlasMapIssue2552Test-context.xml create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/resources/org/apache/camel/component/atlasmap/issue/AtlasMapIssue729Test-context.xml create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/resources/org/apache/camel/component/atlasmap/issue/atlasmapping-2552-new.json create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/resources/org/apache/camel/component/atlasmap/issue/atlasmapping-2552-old.json create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/resources/org/apache/camel/component/atlasmap/issue/atlasmapping-issue-729.json create mode 100644 platform/runtime/modules/atlasmap/atlasmap-camel3/src/test/resources/xml-target-schemaset.xml create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/LICENSE.txt create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/README.md create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/pom.xml create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/actions/CollectionActions.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/actions/DateFieldActions.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/actions/EntaxyActions.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/actions/ExpressionFieldAction.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/actions/NumberFieldActions.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/actions/ObjectFieldActions.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/actions/StringComplexFieldActions.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/actions/StringSimpleFieldActions.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/api/AtlasConstants.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/api/AtlasContext.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/api/AtlasContextFactory.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/api/AtlasConversionException.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/api/AtlasConverter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/api/AtlasException.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/api/AtlasFieldAction.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/api/AtlasMappingBuilder.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/api/AtlasNotFoundException.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/api/AtlasPreviewContext.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/api/AtlasSession.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/api/AtlasUnsupportedException.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/api/AtlasValidationException.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/api/AtlasValidationService.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/builder/AtlasField.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/builder/DefaultAtlasMappingBuilder.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/converters/BigDecimalConverter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/converters/BigIntegerConverter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/converters/BooleanConverter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/converters/ByteConverter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/converters/CalendarConverter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/converters/CharBufferConverter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/converters/CharSequenceConverter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/converters/CharacterConverter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/converters/DateConverter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/converters/DateTimeHelper.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/converters/DoubleConverter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/converters/FloatConverter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/converters/GregorianCalendarConverter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/converters/IntegerConverter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/converters/LocalDateConverter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/converters/LocalDateTimeConverter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/converters/LocalTimeConverter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/converters/LongConverter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/converters/NumberConverter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/converters/ShortConverter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/converters/SqlDateConverter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/converters/SqlTimeConverter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/converters/SqlTimestampConverter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/converters/StringBufferConverter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/converters/StringBuilderConverter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/converters/StringConverter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/converters/ZonedDateTimeConverter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/ADMArchiveHandler.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/AtlasPath.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/AtlasUtil.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/BaseAtlasModule.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/BaseFunctionFactory.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/CompoundClassLoader.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/ConstantModule.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/DefaultAtlasCollectionHelper.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/DefaultAtlasCombineStrategy.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/DefaultAtlasCompoundClassLoader.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/DefaultAtlasContext.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/DefaultAtlasContextFactory.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/DefaultAtlasConversionService.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/DefaultAtlasCustomMappingProcessor.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/DefaultAtlasExpressionProcessor.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/DefaultAtlasFieldActionService.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/DefaultAtlasFunctionResolver.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/DefaultAtlasModuleInfo.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/DefaultAtlasModuleInfoRegistry.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/DefaultAtlasPreviewContext.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/DefaultAtlasPropertyStrategy.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/DefaultAtlasSeparateStrategy.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/DefaultAtlasSession.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/DefaultAtlasValidationService.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/PropertyModule.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/TemplateCombineStrategy.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/ValidationConstants.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/validate/BaseModuleValidationService.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/validate/MappingFieldPairValidator.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/core/validate/MultipleFieldSelectionValidator.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/entaxy/DataMapperLookup.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/entaxy/OsgiHelper.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/entaxy/ValuesLookup.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/entaxy/ValuesLookupService.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/expression/Expression.java create mode 100755 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/expression/ExpressionContext.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/expression/ExpressionException.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/expression/FunctionResolver.java create mode 100755 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/expression/internal/ArithmeticExpression.java create mode 100755 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/expression/internal/BinaryExpression.java create mode 100755 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/expression/internal/BooleanExpression.java create mode 100755 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/expression/internal/ComparisonExpression.java create mode 100755 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/expression/internal/ConstantExpression.java create mode 100755 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/expression/internal/LRUCache.java create mode 100755 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/expression/internal/LogicExpression.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/expression/internal/Strings.java create mode 100755 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/expression/internal/UnaryExpression.java create mode 100755 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/expression/internal/VariableExpression.java create mode 100755 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/expression/internal/package.html create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/expression/parser/ParseException.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/expression/parser/Parser.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/expression/parser/ParserConstants.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/expression/parser/ParserTokenManager.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/expression/parser/SimpleCharStream.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/expression/parser/Token.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/expression/parser/TokenMgrError.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/functions/FILTER.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/functions/IF.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/functions/ISEMPTY.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/functions/LT.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/functions/SELECT.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/functions/TOLOWER.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/json/core/JsonComplexTypeFactory.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/json/core/JsonFieldReader.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/json/core/JsonFieldWriter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/json/inspect/JsonInspectionException.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/json/inspect/JsonInspectionService.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/json/inspect/JsonInspector.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/json/inspect/JsonInstanceInspector.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/json/inspect/JsonSchemaInspector.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/json/module/JsonModule.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/json/module/JsonValidationService.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/json/service/JsonService.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/json/v2/AtlasJsonModelFactory.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/json/v2/InspectionType.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/json/v2/JsonComplexType.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/json/v2/JsonDataSource.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/json/v2/JsonDocument.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/json/v2/JsonEnumField.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/json/v2/JsonEnumFields.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/json/v2/JsonField.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/json/v2/JsonFields.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/json/v2/JsonInspectionRequest.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/json/v2/JsonInspectionResponse.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/mxbean/AtlasContextFactoryMXBean.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/mxbean/AtlasContextMXBean.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/mxbean/AtlasModuleInfoMXBean.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/mxbean/AtlasModuleMXBean.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/service/AtlasLibraryLoader.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/service/AtlasService.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/spi/ActionProcessor.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/spi/AtlasActionProcessor.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/spi/AtlasCollectionHelper.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/spi/AtlasCombineStrategy.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/spi/AtlasConversionConcern.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/spi/AtlasConversionInfo.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/spi/AtlasConversionService.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/spi/AtlasConverter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/spi/AtlasFieldAction.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/spi/AtlasFieldActionInfo.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/spi/AtlasFieldActionService.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/spi/AtlasFieldReader.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/spi/AtlasFieldWriter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/spi/AtlasInternalSession.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/spi/AtlasModule.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/spi/AtlasModuleDetail.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/spi/AtlasModuleInfo.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/spi/AtlasModuleInfoRegistry.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/spi/AtlasModuleMode.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/spi/AtlasPropertyStrategy.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/spi/AtlasPropertyType.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/spi/AtlasSeparateStrategy.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/spi/AtlasValidator.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/spi/FieldDirection.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/spi/FunctionFactory.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/spi/StringDelimiter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/spi/entaxy/EntaxyAction.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/spi/entaxy/LookupValues.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/ADMDigest.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/AbsoluteValue.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Action.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/ActionDetail.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/ActionDetails.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/ActionListUpgradeDeserializer.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/ActionParameter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/ActionParameters.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/ActionResolver.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Add.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/AddDays.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/AddSeconds.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Append.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/AreaUnitType.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/AtlasActionProperty.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/AtlasHandlerInstantiator.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/AtlasJsonModule.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/AtlasMapping.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/AtlasMappingResult.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/AtlasModelFactory.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/AtlasSchemaFactoryWrapper.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Audit.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/AuditStatus.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Audits.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Average.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/BaseMapping.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Camelize.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Capitalize.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Ceiling.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Collection.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/CollectionType.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Concatenate.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Constant.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/ConstantField.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Constants.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Contains.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/ConvertAreaUnit.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/ConvertDistanceUnit.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/ConvertMassUnit.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/ConvertVolumeUnit.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/CopyTo.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Count.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/CurrentDate.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/CurrentDateTime.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/CurrentTime.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/CustomAction.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/CustomMapping.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/DataSource.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/DataSourceCatalog.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/DataSourceKey.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/DataSourceMetadata.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/DataSourceType.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/DayOfMonth.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/DayOfWeek.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/DayOfYear.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/DistanceUnitType.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Divide.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Document.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/EndsWith.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Equals.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Expression.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Field.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/FieldAction.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/FieldGroup.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/FieldStatus.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/FieldType.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Fields.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/FileExtension.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Floor.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Format.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/GenerateUUID.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/IndexOf.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/InspectionType.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/IsNull.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/ItemAt.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Json.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/LastIndexOf.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Length.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/LookupEntry.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/LookupTable.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/LookupTables.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Lowercase.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/LowercaseChar.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Mapping.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/MappingFileType.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/MappingType.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Mappings.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/MassUnitType.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Maximum.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Minimum.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/MockDocument.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/MockField.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Multiplicity.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Multiply.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Normalize.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/NumberType.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/PadStringLeft.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/PadStringRight.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Prepend.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/ProcessMappingRequest.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/ProcessMappingResponse.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Properties.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Property.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/PropertyField.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/RemoveFileExtension.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Repeat.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/ReplaceAll.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/ReplaceFirst.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Round.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/SeparateByDash.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/SeparateByUnderscore.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/SimpleField.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/SimpleResolver.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Split.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/StartsWith.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/StringList.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/StringMap.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/StringMapEntry.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/SubString.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/SubStringAfter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/SubStringBefore.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Subtract.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/TargetDocument.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Trim.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/TrimLeft.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/TrimRight.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Uppercase.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/UppercaseChar.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Validation.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/ValidationScope.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/ValidationStatus.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/Validations.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/ValueContainer.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/VolumeUnitType.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/v2/entaxy/MapData.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/validators/AtlasValidationHelper.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/validators/CompositeValidator.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/validators/DefaultAtlasValidationsHelper.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/validators/LookupTableNameValidator.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/validators/NonNullValidator.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/validators/NotEmptyValidator.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/validators/PositiveIntegerValidator.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/validators/StringLengthValidator.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/validators/StringPatternValidator.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/core/AtlasXmlConstants.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/core/AtlasXmlNamespaceContext.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/core/XmlCollectionHelper.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/core/XmlComplexTypeFactory.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/core/XmlFieldReader.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/core/XmlFieldTransformer.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/core/XmlFieldWriter.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/core/XmlIOHelper.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/core/XmlPath.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/core/schema/AtlasRewritingXSVisitor.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/core/schema/AtlasXmlSchemaSetParser.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/core/schema/XSOMClasspathEntityResolver.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/core/schema/XSOMErrorHandler.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/inspect/SimpleTypeRestriction.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/inspect/XmlInspectionException.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/inspect/XmlInspectionService.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/inspect/XmlInstanceInspector.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/inspect/XmlSchemaInspector.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/module/XmlModule.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/module/XmlValidationService.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/service/XmlService.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/v2/AtlasXmlModelFactory.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/v2/InspectionType.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/v2/NodeType.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/v2/Restriction.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/v2/RestrictionType.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/v2/Restrictions.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/v2/XmlComplexType.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/v2/XmlDataSource.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/v2/XmlDocument.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/v2/XmlEnumField.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/v2/XmlEnumFields.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/v2/XmlField.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/v2/XmlFields.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/v2/XmlInspectionRequest.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/v2/XmlInspectionResponse.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/v2/XmlNamespace.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/java/io/atlasmap/xml/v2/XmlNamespaces.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/resources/META-INF/services/atlas/module/atlas.module create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/resources/META-INF/services/io.atlasmap.spi.AtlasConverter create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/resources/META-INF/services/io.atlasmap.spi.AtlasFieldAction create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/resources/META-INF/services/io.atlasmap.spi.FunctionFactory create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/resources/META-INF/services/io.atlasmap.v2.Action create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-libs/src/main/resources/atlasmap.properties create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-management/LICENSE.txt create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-management/pom.xml create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-management/src/main/java/ru/entaxy/esb/atlasmap/management/MainMBean.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-management/src/main/java/ru/entaxy/esb/atlasmap/management/impl/MainMBeanImpl.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-rest/LICENSE.txt create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-rest/pom.xml create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-rest/src/main/java/ru/entaxy/esb/atlasmap/rest/AtlasAdminJaxrsApplication.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-rest/src/main/java/ru/entaxy/esb/atlasmap/rest/AtlasServiceJaxrsApplication.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-rest/src/main/java/ru/entaxy/esb/atlasmap/rest/HtpasswdService.java create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-rest/src/main/resources/OSGI-INF/blueprint/atlasmap-service-context.xml create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/LICENSE.txt create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/pom.xml create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/WEB-INF/web.xml create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/asset-manifest.json create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/favicon.ico create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/index.html create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/index.jsp create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/logo256.png create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/logo512.png create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/manifest.json create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/precache-manifest.0fc79823a6f38ea0a130d3ef7ca8012a.js create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/robots.txt create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/service-worker.js create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/css/2.e19c2f02.chunk.css create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/css/2.e19c2f02.chunk.css.map create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/css/main.e814765b.chunk.css create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/css/main.e814765b.chunk.css.map create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/js/2.389c5931.chunk.js create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/js/2.389c5931.chunk.js.LICENSE.txt create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/js/2.389c5931.chunk.js.map create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/js/main.ad5ba31c.chunk.js create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/js/main.ad5ba31c.chunk.js.map create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/js/runtime-main.bb639b7e.js create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/js/runtime-main.bb639b7e.js.map create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/RedHatDisplay-Bold.e4b18666.woff2 create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/RedHatDisplay-Bold.ef99e280.woff create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/RedHatDisplay-Medium.17a79d9d.woff2 create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/RedHatDisplay-Medium.f656301e.woff create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/RedHatDisplay-Regular.3c2eb037.woff create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/RedHatDisplay-Regular.ed055874.woff2 create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/RedHatText-Medium.13359326.woff2 create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/RedHatText-Medium.ed5d521b.woff create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/RedHatText-Regular.4202115c.woff create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/RedHatText-Regular.75752e72.woff2 create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-bold-italic.a3014aca.woff2 create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-bold-italic.c0b5bb3c.woff create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-bold.c6179bc8.woff create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-bold.d031db25.woff2 create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-extrabold-italic.83caef4a.woff create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-extrabold-italic.cd4ba352.woff2 create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-extrabold.1168ce1e.woff create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-extrabold.6e768ba3.woff2 create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-extralight-italic.85914371.woff2 create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-extralight-italic.b4ac9dd8.woff create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-extralight.86fd9ea3.woff create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-extralight.c5791995.woff2 create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-heavy-italic.77a29c6c.woff2 create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-heavy-italic.9a846a97.woff create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-heavy.33b983b6.woff2 create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-heavy.42aa590b.woff create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-italic.0010a44b.woff create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-italic.f45ba39e.woff2 create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-light-italic.5b90b726.woff create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-light-italic.6715ec5e.woff2 create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-light.3875601d.woff create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-light.c97e1959.woff2 create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-mono-bold.6cb4a77b.woff2 create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-mono-bold.75f6145e.woff create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-mono-light.773ec666.woff create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-mono-light.d34d136b.woff2 create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-mono-regular.052fe015.woff2 create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-mono-regular.cf00f67f.woff create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-mono-semibold.404c69d4.woff create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-mono-semibold.b199b8f9.woff2 create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-regular.02d9e0ef.woff2 create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-regular.7b93997b.woff create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-semibold-italic.d91e16a1.woff2 create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-semibold-italic.e244fb96.woff create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-semibold.ca834120.woff2 create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-semibold.ec228a39.woff create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-thin-italic.16380cc4.woff2 create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-thin-italic.849bc426.woff create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-thin.8c022f6d.woff2 create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/overpass-thin.94f49172.woff create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/pfbg_2000.4f598944.jpg create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/pfbg_576.85341a9c.jpg create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/pfbg_576@2x.b48e77bc.jpg create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/pfbg_768.c9839717.jpg create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/pfbg_768@2x.0099dea3.jpg create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/pfbg_992@2x.1423e11e.jpg create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/pficon.328e1e14.woff create mode 100644 platform/runtime/modules/atlasmap/atlasmap-entaxy-ui/src/main/webapp/static/media/pficon.b9bb4abc.woff2 create mode 100644 platform/runtime/modules/atlasmap/entaxy-atlasmap-plugin/LICENSE.txt create mode 100644 platform/runtime/modules/atlasmap/entaxy-atlasmap-plugin/pom.xml create mode 100644 platform/runtime/modules/atlasmap/entaxy-atlasmap-plugin/src/main/java/ru/entaxy/ui/hawtio/atlasmap/PluginContextListener.java create mode 100644 platform/runtime/modules/atlasmap/entaxy-atlasmap-plugin/src/main/resources/WEB-INF/web.xml create mode 100644 platform/runtime/modules/atlasmap/entaxy-atlasmap-plugin/src/main/webapp/index.html create mode 100644 platform/runtime/modules/atlasmap/entaxy-atlasmap-plugin/src/main/webapp/plugin/js/components/atlasmapConsole.js create mode 100644 platform/runtime/modules/atlasmap/entaxy-atlasmap-plugin/src/main/webapp/plugin/js/components/atlasmapConsoleModal.js create mode 100644 platform/runtime/modules/atlasmap/entaxy-atlasmap-plugin/src/main/webapp/plugin/js/entaxyAtlasmapPlugin.js create mode 100644 platform/runtime/modules/atlasmap/pom.xml create mode 100644 platform/runtime/modules/atlasmap/xsom/LICENSE.txt create mode 100644 platform/runtime/modules/atlasmap/xsom/SCD.jj create mode 100644 platform/runtime/modules/atlasmap/xsom/XSOM.ipr create mode 100644 platform/runtime/modules/atlasmap/xsom/copyright-exclude create mode 100644 platform/runtime/modules/atlasmap/xsom/copyright.txt create mode 100644 platform/runtime/modules/atlasmap/xsom/doc/CHANGELOG.txt create mode 100644 platform/runtime/modules/atlasmap/xsom/doc/architecture.png create mode 100644 platform/runtime/modules/atlasmap/xsom/doc/collaboration.png create mode 100644 platform/runtime/modules/atlasmap/xsom/doc/implementation.html create mode 100644 platform/runtime/modules/atlasmap/xsom/doc/limitations.txt create mode 100644 platform/runtime/modules/atlasmap/xsom/doc/readme.html create mode 100644 platform/runtime/modules/atlasmap/xsom/doc/retroweaver-license.html create mode 100644 platform/runtime/modules/atlasmap/xsom/doc/userguide.html create mode 100644 platform/runtime/modules/atlasmap/xsom/examples/dumper/Dumper.java create mode 100644 platform/runtime/modules/atlasmap/xsom/examples/dumper/ErrorReporter.java create mode 100644 platform/runtime/modules/atlasmap/xsom/examples/dumper/TreeDumper.java create mode 100644 platform/runtime/modules/atlasmap/xsom/examples/dumper/readme.txt create mode 100644 platform/runtime/modules/atlasmap/xsom/lib/copying-relaxngDatatype.txt create mode 100644 platform/runtime/modules/atlasmap/xsom/lib/copying-thaiOpensource.txt create mode 100644 platform/runtime/modules/atlasmap/xsom/licenceheader.txt create mode 100644 platform/runtime/modules/atlasmap/xsom/license.txt create mode 100644 platform/runtime/modules/atlasmap/xsom/pom.xml create mode 100644 platform/runtime/modules/atlasmap/xsom/schemas/EAN-UCC/AllowanceOrCharge.xsd create mode 100644 platform/runtime/modules/atlasmap/xsom/schemas/EAN-UCC/Command.xsd create mode 100644 platform/runtime/modules/atlasmap/xsom/schemas/EAN-UCC/Common.xsd create mode 100644 platform/runtime/modules/atlasmap/xsom/schemas/EAN-UCC/Components.xsd create mode 100644 platform/runtime/modules/atlasmap/xsom/schemas/EAN-UCC/Core.xsd create mode 100644 platform/runtime/modules/atlasmap/xsom/schemas/EAN-UCC/DespatchAdvice.xsd create mode 100644 platform/runtime/modules/atlasmap/xsom/schemas/EAN-UCC/Document.xsd create mode 100644 platform/runtime/modules/atlasmap/xsom/schemas/EAN-UCC/DocumentCommand.xsd create mode 100644 platform/runtime/modules/atlasmap/xsom/schemas/EAN-UCC/DocumentIdentificationCommand.xsd create mode 100644 platform/runtime/modules/atlasmap/xsom/schemas/EAN-UCC/Envelope.xml create mode 100644 platform/runtime/modules/atlasmap/xsom/schemas/EAN-UCC/Envelope.xsd create mode 100644 platform/runtime/modules/atlasmap/xsom/schemas/EAN-UCC/Fmcg.xsd create mode 100644 platform/runtime/modules/atlasmap/xsom/schemas/EAN-UCC/FmcgDespatchAdvice.xsd create mode 100644 platform/runtime/modules/atlasmap/xsom/schemas/EAN-UCC/FmcgIdentifiers.xsd create mode 100644 platform/runtime/modules/atlasmap/xsom/schemas/EAN-UCC/FmcgItem.xsd create mode 100644 platform/runtime/modules/atlasmap/xsom/schemas/EAN-UCC/FmcgOrder.xsd create mode 100644 platform/runtime/modules/atlasmap/xsom/schemas/EAN-UCC/FmcgSimpleInvoice.xsd create mode 100644 platform/runtime/modules/atlasmap/xsom/schemas/EAN-UCC/Identifiers.xsd create mode 100644 platform/runtime/modules/atlasmap/xsom/schemas/EAN-UCC/Item.xsd create mode 100644 platform/runtime/modules/atlasmap/xsom/schemas/EAN-UCC/LinkCommand.xsd create mode 100644 platform/runtime/modules/atlasmap/xsom/schemas/EAN-UCC/Message.xsd create mode 100644 platform/runtime/modules/atlasmap/xsom/schemas/EAN-UCC/Order.xsd create mode 100644 platform/runtime/modules/atlasmap/xsom/schemas/EAN-UCC/Party.xsd create mode 100644 platform/runtime/modules/atlasmap/xsom/schemas/EAN-UCC/PaymentTerms.xsd create mode 100644 platform/runtime/modules/atlasmap/xsom/schemas/EAN-UCC/RequestForPayment.xsd create mode 100644 platform/runtime/modules/atlasmap/xsom/schemas/EAN-UCC/Simpl-eb.xsd create mode 100644 platform/runtime/modules/atlasmap/xsom/schemas/EAN-UCC/Simpl-ebParty.xsd create mode 100644 platform/runtime/modules/atlasmap/xsom/schemas/EAN-UCC/SimpleInvoice.xsd create mode 100644 platform/runtime/modules/atlasmap/xsom/schemas/EAN-UCC/Types.xsd create mode 100644 platform/runtime/modules/atlasmap/xsom/src/attribute.rng create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/ForeignAttributes.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/SCD.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/XSAnnotation.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/XSAttContainer.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/XSAttGroupDecl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/XSAttributeDecl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/XSAttributeUse.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/XSComplexType.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/XSComponent.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/XSContentType.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/XSDeclaration.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/XSElementDecl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/XSFacet.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/XSIdentityConstraint.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/XSListSimpleType.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/XSModelGroup.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/XSModelGroupDecl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/XSNotation.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/XSParticle.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/XSRestrictionSimpleType.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/XSSchema.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/XSSchemaSet.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/XSSimpleType.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/XSTerm.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/XSType.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/XSUnionSimpleType.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/XSVariety.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/XSWildcard.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/XSXPath.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/XmlString.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/AnnotationImpl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/AttGroupDeclImpl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/AttributeDeclImpl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/AttributeUseImpl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/AttributesHolder.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/ComplexTypeImpl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/ComponentImpl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/Const.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/ContentTypeImpl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/DeclarationImpl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/ElementDecl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/EmptyImpl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/FacetImpl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/ForeignAttributesImpl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/IdentityConstraintImpl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/ListSimpleTypeImpl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/ModelGroupDeclImpl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/ModelGroupImpl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/NotationImpl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/ParticleImpl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/Ref.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/RestrictionSimpleTypeImpl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/SchemaImpl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/SchemaSetImpl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/SimpleTypeImpl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/UName.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/UnionSimpleTypeImpl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/Util.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/WildcardImpl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/XPathImpl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/package.html create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/BaseContentRef.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/DefaultAnnotationParser.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/DelayedRef.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/Messages.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/Messages.properties create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/Messages_ja.properties create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/NGCCRuntimeEx.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/ParserContext.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/Patch.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/PatcherManager.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/SAXParserFactoryAdaptor.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/SchemaDocumentImpl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/SubstGroupBaseTypeRef.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/datatypes.xsd create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/package.html create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/AttributesImpl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/NGCCEventReceiver.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/NGCCEventSource.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/NGCCHandler.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/NGCCInterleaveFilter.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/NGCCRuntime.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/Schema.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/SimpleType_List.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/SimpleType_Restriction.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/SimpleType_Union.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/annotation.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/attributeDeclBody.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/attributeGroupDecl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/attributeUses.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/complexType.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/complexType_complexContent_body.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/elementDeclBody.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/erSet.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/ersSet.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/facet.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/foreignAttributes.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/group.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/identityConstraint.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/importDecl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/includeDecl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/modelGroupBody.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/notation.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/occurs.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/particle.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/qname.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/qualification.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/redefine.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/simpleType.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/wildcardBody.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/parser/state/xpath.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/scd/AbstractAxisImpl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/scd/Axis.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/scd/Iterators.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/scd/ParseException.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/scd/SCDImpl.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/scd/SCDParser.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/scd/SCDParserConstants.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/scd/SCDParserTokenManager.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/scd/SimpleCharStream.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/scd/Step.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/scd/Token.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/scd/TokenMgrError.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/util/DraconianErrorHandler.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/util/ResourceEntityResolver.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/util/SchemaTreeTraverser.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/util/SchemaWriter.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/impl/util/Uri.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/package.html create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/parser/AnnotationContext.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/parser/AnnotationParser.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/parser/AnnotationParserFactory.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/parser/JAXPParser.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/parser/SchemaDocument.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/parser/XMLParser.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/parser/XSOMParser.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/parser/package.html create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/util/ComponentNameFunction.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/util/ContextClassloaderLocal.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/util/ContextClassloaderLocal.properties create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/util/DeferedCollection.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/util/DomAnnotationParserFactory.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/util/NameGetter.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/util/NameGetter.properties create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/util/SimpleTypeSet.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/util/TypeClosure.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/util/TypeSet.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/util/XSFinder.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/util/XSFunctionFilter.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/visitor/XSContentTypeFunction.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/visitor/XSContentTypeVisitor.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/visitor/XSFunction.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/visitor/XSSimpleTypeFunction.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/visitor/XSSimpleTypeVisitor.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/visitor/XSTermFunction.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/visitor/XSTermFunctionWithParam.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/visitor/XSTermVisitor.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/visitor/XSVisitor.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/visitor/XSWildcardFunction.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/visitor/XSWildcardVisitor.java create mode 100644 platform/runtime/modules/atlasmap/xsom/src/com/sun/xml/xsom/visitor/package.html create mode 100644 platform/runtime/modules/atlasmap/xsom/src/complexType.rng create mode 100644 platform/runtime/modules/atlasmap/xsom/src/element.rng create mode 100644 platform/runtime/modules/atlasmap/xsom/src/include.rng create mode 100644 platform/runtime/modules/atlasmap/xsom/src/modelGroup.rng create mode 100644 platform/runtime/modules/atlasmap/xsom/src/simpleType.rng create mode 100644 platform/runtime/modules/atlasmap/xsom/src/xmlschema.rng create mode 100644 platform/runtime/modules/atlasmap/xsom/test/com/sun/xml/xsom/AbstractXSOMTest.java create mode 100644 platform/runtime/modules/atlasmap/xsom/test/com/sun/xml/xsom/ERDriver.java create mode 100644 platform/runtime/modules/atlasmap/xsom/test/com/sun/xml/xsom/MapNamespaceContext.java create mode 100644 platform/runtime/modules/atlasmap/xsom/test/com/sun/xml/xsom/SCDDriver.java create mode 100644 platform/runtime/modules/atlasmap/xsom/test/com/sun/xml/xsom/SCDTest.java create mode 100644 platform/runtime/modules/atlasmap/xsom/test/com/sun/xml/xsom/XSOMParserTest.java create mode 100644 platform/runtime/modules/atlasmap/xsom/test/scdtest.xsd create mode 100644 platform/runtime/modules/data-modules/LICENSE.txt create mode 100644 platform/runtime/modules/data-modules/data-management/LICENSE.txt create mode 100644 platform/runtime/modules/data-modules/data-management/pom.xml create mode 100644 platform/runtime/modules/data-modules/data-management/src/main/java/ru/entaxy/platform/modules/data/management/DataManagementMBean.java create mode 100644 platform/runtime/modules/data-modules/data-mapper/LICENSE.txt create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-management/LICENSE.txt create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-management/pom.xml create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-management/src/main/java/ru/entaxy/platform/modules/data/datamapper/management/AbstractDataMapperMBean.java create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-management/src/main/java/ru/entaxy/platform/modules/data/datamapper/management/DataMappersMBean.java create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-management/src/main/java/ru/entaxy/platform/modules/data/datamapper/management/EmbeddedDataMapperMBean.java create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-management/src/main/java/ru/entaxy/platform/modules/data/datamapper/management/impl/DataMapperMBeanFactory.java create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-management/src/main/java/ru/entaxy/platform/modules/data/datamapper/management/impl/EmbeddedDataMapperMBeanImpl.java create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-runtime/LICENSE.txt create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-runtime/pom.xml create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-runtime/src/main/java/ru/entaxy/platform/modules/datamapper/AbstractDataMapper.java create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-runtime/src/main/java/ru/entaxy/platform/modules/datamapper/DataMapper.java create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-runtime/src/main/java/ru/entaxy/platform/modules/datamapper/DataMapperService.java create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-runtime/src/main/java/ru/entaxy/platform/modules/datamapper/camel/DataMapperCamelProcessor.java create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-runtime/src/main/java/ru/entaxy/platform/modules/datamapper/exceptions/DataMapperException.java create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-runtime/src/main/java/ru/entaxy/platform/modules/datamapper/exceptions/DataMapperNotFoundException.java create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-runtime/src/main/java/ru/entaxy/platform/modules/datamapper/exceptions/KeyNotFoundException.java create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-runtime/src/main/java/ru/entaxy/platform/modules/datamapper/exceptions/MapNotFoundException.java create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-runtime/src/main/java/ru/entaxy/platform/modules/datamapper/impl/DataMapperServiceImpl.java create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-runtime/src/main/java/ru/entaxy/platform/modules/datamapper/resource/DefaultEntaxyDataMapper.java create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-runtime/src/main/java/ru/entaxy/platform/modules/datamapper/resource/ResourceBasedDataMapper.java create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-shell/LICENSE.txt create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-shell/pom.xml create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-shell/src/main/java/ru/entaxy/platform/modules/datamapper/shell/AbstractDataMapperAwareCommand.java create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-shell/src/main/java/ru/entaxy/platform/modules/datamapper/shell/AbstractDataMapperCommand.java create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-shell/src/main/java/ru/entaxy/platform/modules/datamapper/shell/AddValueCommand.java create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-shell/src/main/java/ru/entaxy/platform/modules/datamapper/shell/DataMapperListCommand.java create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-shell/src/main/java/ru/entaxy/platform/modules/datamapper/shell/DataMapperMapListCommand.java create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-shell/src/main/java/ru/entaxy/platform/modules/datamapper/shell/DataMapperMapsCommand.java create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-shell/src/main/java/ru/entaxy/platform/modules/datamapper/shell/RemoveValueCommand.java create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-shell/src/main/java/ru/entaxy/platform/modules/datamapper/shell/ResolveValueCommand.java create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-shell/src/main/java/ru/entaxy/platform/modules/datamapper/shell/ValueTypes.java create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-shell/src/main/java/ru/entaxy/platform/modules/datamapper/shell/completers/DataMapperCompleter.java create mode 100644 platform/runtime/modules/data-modules/data-mapper/data-mapper-shell/src/main/java/ru/entaxy/platform/modules/datamapper/shell/completers/ValueTypeCompleter.java create mode 100644 platform/runtime/modules/data-modules/data-mapper/pom.xml create mode 100644 platform/runtime/modules/data-modules/pom.xml create mode 100644 platform/runtime/modules/onec/LICENSE.txt create mode 100644 platform/runtime/modules/onec/pom.xml create mode 100644 platform/runtime/modules/onec/src/main/resources/ru/entaxy/resource/schemas/1C_Enterprise8/xslt/attrbute2tagName.xsl create mode 100644 platform/runtime/modules/onec/src/main/resources/ru/entaxy/resource/schemas/1C_Enterprise8/xslt/tagName2attribute.xsl create mode 100644 platform/runtime/modules/uniform-service/connector/src/main/resources/ru/entaxy/factory/uniform-active-exchange-connector-in.json create mode 100644 platform/runtime/modules/uniform-service/connector/src/main/resources/ru/entaxy/factory/uniform-active-exchange-connector-out.json create mode 100644 platform/runtime/modules/uniform-service/connector/src/main/resources/ru/entaxy/factory/uniform-passive-exchange-connector-in.json create mode 100644 platform/runtime/modules/uniform-service/connector/src/main/resources/ru/entaxy/factory/uniform-passive-exchange-connector-out.json create mode 100644 platform/runtime/modules/uniform-service/connector/src/main/resources/ru/entaxy/templates/uniform-active-exchange-connector-in/init.ftl create mode 100644 platform/runtime/modules/uniform-service/connector/src/main/resources/ru/entaxy/templates/uniform-active-exchange-connector-out/init.ftl create mode 100644 platform/runtime/modules/uniform-service/connector/src/main/resources/ru/entaxy/templates/uniform-passive-exchange-connector-in/init.ftl create mode 100644 platform/runtime/modules/uniform-service/connector/src/main/resources/ru/entaxy/templates/uniform-passive-exchange-connector-out/init.ftl create mode 100644 platform/runtime/modules/uniform-service/service/LICENSE.txt create mode 100644 platform/runtime/modules/uniform-service/service/pom.xml create mode 100644 platform/runtime/modules/uniform-service/service/src/main/java/ru/entaxy/platform/runtime/modules/unifrom_service/service/UniformServiceInitializer.java create mode 100644 platform/runtime/modules/uniform-service/service/src/main/resources/ru/entaxy/factory/services/soap/uniform-based-soap-service-protected.json create mode 100644 platform/runtime/modules/uniform-service/service/src/main/resources/ru/entaxy/resource/object-resources/entaxy.runtime.service.uniform-passive-service/operationRouter.xml create mode 100644 platform/runtime/modules/uniform-service/service/src/main/resources/ru/entaxy/templates/uniform-based-soap-service-protected/connectorDispatchingBeans.ftl create mode 100644 platform/runtime/modules/uniform-service/service/src/main/resources/ru/entaxy/templates/uniform-based-soap-service-protected/init.ftl create mode 100644 platform/runtime/modules/uniform-service/src/main/cfg/generated/fragments.xml create mode 100644 platform/runtime/modules/uniform-service/src/main/cfg/uniform.service.support.cfg create mode 100644 platform/runtime/modules/uniform-service/src/main/resources/etc/init/artifacts/shared/uniform-passive-service-blueprint.xml create mode 100644 platform/runtime/modules/uniform-service/src/main/resources/etc/init/install/uniform-service.properties create mode 100644 platform/runtime/modules/uniform-service/support/src/main/resources/ru/entaxy/resource/service-resources/schemas/uniform-service/operationRouterProtected.xml create mode 100644 platform/runtime/security/LICENSE.txt create mode 100644 platform/runtime/security/jaas/LICENSE.txt create mode 100644 platform/runtime/security/jaas/entaxy-legacy-auth-api/LICENSE.txt create mode 100644 platform/runtime/security/jaas/entaxy-legacy-auth-api/pom.xml create mode 100644 platform/runtime/security/jaas/entaxy-legacy-auth-api/src/main/java/ru/entaxy/esb/system/auth/basic/jpa/api/BasicAuthService.java create mode 100644 platform/runtime/security/jaas/entaxy-legacy-auth-api/src/main/java/ru/entaxy/esb/system/auth/basic/jpa/api/entity/BasicAuthAccount.java create mode 100644 platform/runtime/security/jaas/entaxy-legacy-auth-api/src/main/java/ru/entaxy/esb/system/auth/basic/jpa/api/entity/field/EncryptionAlgorithm.java create mode 100644 platform/runtime/security/jaas/entaxy-legacy-auth-api/src/main/java/ru/entaxy/esb/system/auth/basic/jpa/api/entity/field/EncryptionAlgorithmAttributeConverter.java create mode 100644 platform/runtime/security/jaas/entaxy-legacy-auth-api/src/main/java/ru/entaxy/esb/system/auth/basic/jpa/api/exception/BadPasswordException.java create mode 100644 platform/runtime/security/jaas/entaxy-legacy-auth/LICENSE.txt create mode 100644 platform/runtime/security/jaas/entaxy-legacy-auth/pom.xml create mode 100644 platform/runtime/security/jaas/entaxy-legacy-auth/src/main/java/ru/entaxy/esb/system/auth/basic/interceptor/AuthenticationInterceptor.java create mode 100644 platform/runtime/security/jaas/entaxy-legacy-auth/src/main/java/ru/entaxy/esb/system/auth/basic/interceptor/SystemInterceptor.java create mode 100644 platform/runtime/security/jaas/entaxy-legacy-auth/src/main/java/ru/entaxy/esb/system/auth/basic/jpa/impl/BasicAuthServiceImpl.java create mode 100644 platform/runtime/security/jaas/entaxy-legacy-auth/src/main/java/ru/entaxy/esb/system/auth/basic/jpa/listener/BasicAuthPostEventListener.java create mode 100644 platform/runtime/security/jaas/entaxy-legacy-auth/src/main/java/ru/entaxy/esb/system/auth/basic/jpa/listener/EntityEventListenerRegistry.java create mode 100644 platform/runtime/security/jaas/entaxy-legacy-auth/src/main/java/ru/entaxy/esb/system/auth/basic/jpa/util/EncryptionHelper.java create mode 100644 platform/runtime/security/jaas/entaxy-legacy-auth/src/main/java/ru/entaxy/esb/system/common/util/SystemHeadersConstants.java create mode 100644 platform/runtime/security/jaas/entaxy-legacy-auth/src/main/java/ru/entaxy/platform/runtime/security/jaas/modules/entaxylegacy/EntaxyLegacyBackingEngine.java create mode 100644 platform/runtime/security/jaas/entaxy-legacy-auth/src/main/java/ru/entaxy/platform/runtime/security/jaas/modules/entaxylegacy/EntaxyLegacyBackingEngineFactory.java create mode 100644 platform/runtime/security/jaas/entaxy-legacy-auth/src/main/java/ru/entaxy/platform/runtime/security/jaas/modules/entaxylegacy/EntaxyLegacyLoginModule.java create mode 100644 platform/runtime/security/jaas/entaxy-legacy-auth/src/main/java/ru/entaxy/platform/runtime/security/jaas/modules/entaxylegacy/ServiceHolder.java create mode 100644 platform/runtime/security/jaas/entaxy-legacy-auth/src/main/resources/OSGI-INF/blueprint/camel-context.xml create mode 100644 platform/runtime/security/jaas/entaxy-legacy-auth/src/main/resources/hibernate.cfg.xml create mode 100644 platform/runtime/security/jaas/entaxy-legacy-auth/src/main/resources/log4j2.properties create mode 100644 platform/runtime/security/jaas/entaxy-legacy-auth/src/main/resources/ru/entaxy/factory/entaxy-legacy-jaas-login-module.json create mode 100644 platform/runtime/security/jaas/jaas-management/LICENSE.txt create mode 100644 platform/runtime/security/jaas/jaas-management/pom.xml create mode 100644 platform/runtime/security/jaas/jaas-management/src/main/java/ru/entaxy/platform/core/management/jaas/JaasLoginModuleMBean.java create mode 100644 platform/runtime/security/jaas/jaas-management/src/main/java/ru/entaxy/platform/core/management/jaas/JaasLoginModuleWithBackingEngineMBean.java create mode 100644 platform/runtime/security/jaas/jaas-management/src/main/java/ru/entaxy/platform/core/management/jaas/JaasMBean.java create mode 100644 platform/runtime/security/jaas/jaas-management/src/main/java/ru/entaxy/platform/core/management/jaas/JaasRealmMBean.java create mode 100644 platform/runtime/security/jaas/jaas-management/src/main/java/ru/entaxy/platform/core/management/jaas/impl/JaasLoginModuleMBeanImpl.java create mode 100644 platform/runtime/security/jaas/jaas-management/src/main/java/ru/entaxy/platform/core/management/jaas/impl/JaasLoginModuleWithBackingEngineMBeanImpl.java create mode 100644 platform/runtime/security/jaas/jaas-management/src/main/java/ru/entaxy/platform/core/management/jaas/impl/JaasMBeanFactory.java create mode 100644 platform/runtime/security/jaas/jaas-management/src/main/java/ru/entaxy/platform/core/management/jaas/impl/JaasMbeanImpl.java create mode 100644 platform/runtime/security/jaas/jaas-management/src/main/java/ru/entaxy/platform/core/management/jaas/impl/JaasRealmMBeanImpl.java create mode 100644 platform/runtime/security/jaas/jaas-producing/LICENSE.txt create mode 100644 platform/runtime/security/jaas/jaas-producing/pom.xml create mode 100644 platform/runtime/security/jaas/jaas-producing/src/main/java/ru/entaxy/platform/base/security/jaas/producing/JaasComponentProducer.java create mode 100644 platform/runtime/security/jaas/jaas-producing/src/main/resources/ru/entaxy/extensions/objectproducer/merge/config/BlueprintMergeProcessor.json create mode 100644 platform/runtime/security/jaas/jaas-producing/src/main/resources/ru/entaxy/extensions/objectproducer/producer/config.json create mode 100644 platform/runtime/security/jaas/jaas-producing/src/main/resources/ru/entaxy/factory/abstract-jaas-component.json create mode 100644 platform/runtime/security/jaas/jaas-producing/src/main/resources/ru/entaxy/factory/abstract-jaas-login-module.json create mode 100644 platform/runtime/security/jaas/jaas-producing/src/main/resources/ru/entaxy/factory/abstract-security-component.json create mode 100644 platform/runtime/security/jaas/jaas-producing/src/main/resources/ru/entaxy/factory/audit/abstract-audit-jaas-login-module.json create mode 100644 platform/runtime/security/jaas/jaas-producing/src/main/resources/ru/entaxy/factory/audit/eventadmin-audit-jaas-login-module.json create mode 100644 platform/runtime/security/jaas/jaas-producing/src/main/resources/ru/entaxy/factory/audit/file-audit-jaas-login-module.json create mode 100644 platform/runtime/security/jaas/jaas-producing/src/main/resources/ru/entaxy/factory/audit/log-audit-jaas-login-module.json create mode 100644 platform/runtime/security/jaas/jaas-producing/src/main/resources/ru/entaxy/factory/jaas-login-module-empty.json create mode 100644 platform/runtime/security/jaas/jaas-producing/src/main/resources/ru/entaxy/factory/jaas-realm.json create mode 100644 platform/runtime/security/jaas/jaas-producing/src/main/resources/ru/entaxy/factory/real/abstract-real-jaas-login-module-with-backend.json create mode 100644 platform/runtime/security/jaas/jaas-producing/src/main/resources/ru/entaxy/factory/real/abstract-real-jaas-login-module.json create mode 100644 platform/runtime/security/jaas/jaas-producing/src/main/resources/ru/entaxy/factory/real/jaas-login-module-components.json create mode 100644 platform/runtime/security/jaas/jaas-producing/src/main/resources/ru/entaxy/factory/real/jdbc-jaas-login-module.json create mode 100644 platform/runtime/security/jaas/jaas-producing/src/main/resources/ru/entaxy/factory/real/kerberos-jaas-login-module.json create mode 100644 platform/runtime/security/jaas/jaas-producing/src/main/resources/ru/entaxy/factory/real/ldap-jaas-login-module.json create mode 100644 platform/runtime/security/jaas/jaas-producing/src/main/resources/ru/entaxy/factory/real/osgi-jaas-login-module.json create mode 100644 platform/runtime/security/jaas/jaas-producing/src/main/resources/ru/entaxy/factory/real/properties-jaas-login-module.json create mode 100644 platform/runtime/security/jaas/jaas-producing/src/main/resources/ru/entaxy/factory/real/publickey-jaas-login-module.json create mode 100644 platform/runtime/security/jaas/jaas-producing/src/main/resources/ru/entaxy/factory/real/resource-jaas-login-module.json create mode 100644 platform/runtime/security/jaas/jaas-producing/src/main/resources/ru/entaxy/factory/real/syncope-jaas-login-module.json create mode 100644 platform/runtime/security/jaas/jaas-producing/src/main/resources/ru/entaxy/templates/abstract-jaas-login-module/init.ftl create mode 100644 platform/runtime/security/jaas/jaas-producing/src/main/resources/ru/entaxy/templates/abstract-real-jaas-login-module-with-backend/backendFactory.ftl create mode 100644 platform/runtime/security/jaas/jaas-producing/src/main/resources/ru/entaxy/templates/jaas-login-module-empty/init.ftl create mode 100644 platform/runtime/security/jaas/jaas-producing/src/main/resources/ru/entaxy/templates/jaas-realm/init.ftl create mode 100644 platform/runtime/security/jaas/jaas-runtime/LICENSE.txt create mode 100644 platform/runtime/security/jaas/jaas-runtime/pom.xml create mode 100644 platform/runtime/security/jaas/jaas-runtime/src/main/java/ru/entaxy/platform/runtime/security/jaas/JaasHelper.java create mode 100644 platform/runtime/security/jaas/jaas-runtime/src/main/java/ru/entaxy/platform/runtime/security/jaas/JaasInitializer.java create mode 100644 platform/runtime/security/jaas/jaas-runtime/src/main/java/ru/entaxy/platform/runtime/security/jaas/modules/resources/ResourceBackingEngine.java create mode 100644 platform/runtime/security/jaas/jaas-runtime/src/main/java/ru/entaxy/platform/runtime/security/jaas/modules/resources/ResourceBackingEngineFactory.java create mode 100644 platform/runtime/security/jaas/jaas-runtime/src/main/java/ru/entaxy/platform/runtime/security/jaas/modules/resources/ResourceLoginModule.java create mode 100644 platform/runtime/security/jaas/jaas-runtime/src/main/java/ru/entaxy/platform/runtime/security/jaas/modules/resources/ServiceHelper.java create mode 100644 platform/runtime/security/jaas/jaas-runtime/src/main/java/ru/entaxy/platform/runtime/security/jaas/utils/PropertiesWithCallback.java create mode 100644 platform/runtime/security/jaas/jaas-runtime/src/main/java/ru/entaxy/platform/runtime/security/jaas/utils/ResourceCallback.java create mode 100644 platform/runtime/security/jaas/pom.xml create mode 100644 platform/runtime/security/jaas/src/main/features/features.xml create mode 100644 platform/runtime/security/jaas/src/main/resources/etc/init/artifacts/shared/karaf-realm.xml create mode 100644 platform/runtime/security/jaas/src/main/resources/etc/init/install/jaas.properties create mode 100644 platform/runtime/security/jaas/src/main/support/karaf_realm.json create mode 100644 platform/runtime/security/legacy-permissions/LICENSE.txt create mode 100644 platform/runtime/security/legacy-permissions/permission-api/LICENSE.txt create mode 100644 platform/runtime/security/legacy-permissions/permission-api/pom.xml create mode 100644 platform/runtime/security/legacy-permissions/permission-api/src/main/java/ru/entaxy/esb/system/core/permission/jpa/PermissionService.java create mode 100644 platform/runtime/security/legacy-permissions/permission-api/src/main/java/ru/entaxy/esb/system/core/permission/jpa/entity/Permission.java create mode 100644 platform/runtime/security/legacy-permissions/permission-common/LICENSE.txt create mode 100644 platform/runtime/security/legacy-permissions/permission-common/pom.xml create mode 100644 platform/runtime/security/legacy-permissions/permission-common/src/main/java/ru/entaxy/esb/system/core/permission/common/PermissionConstants.java create mode 100644 platform/runtime/security/legacy-permissions/permission-common/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 platform/runtime/security/legacy-permissions/permission-component/LICENSE.txt create mode 100644 platform/runtime/security/legacy-permissions/permission-component/README.md create mode 100644 platform/runtime/security/legacy-permissions/permission-component/pom.xml create mode 100644 platform/runtime/security/legacy-permissions/permission-component/src/main/java/ru/entaxy/esb/system/core/permission/component/PermissionComponent.java create mode 100644 platform/runtime/security/legacy-permissions/permission-component/src/main/java/ru/entaxy/esb/system/core/permission/component/PermissionEndpoint.java create mode 100644 platform/runtime/security/legacy-permissions/permission-component/src/main/java/ru/entaxy/esb/system/core/permission/component/PermissionProducer.java create mode 100644 platform/runtime/security/legacy-permissions/permission-component/src/main/java/ru/entaxy/esb/system/core/permission/component/exception/UnknownOperationException.java create mode 100644 platform/runtime/security/legacy-permissions/permission-component/src/main/java/ru/entaxy/esb/system/core/permission/component/operation/BaseOperation.java create mode 100644 platform/runtime/security/legacy-permissions/permission-component/src/main/java/ru/entaxy/esb/system/core/permission/component/operation/BulkCreate.java create mode 100644 platform/runtime/security/legacy-permissions/permission-component/src/main/java/ru/entaxy/esb/system/core/permission/component/operation/Check.java create mode 100644 platform/runtime/security/legacy-permissions/permission-component/src/main/java/ru/entaxy/esb/system/core/permission/component/operation/CheckSystemAccess.java create mode 100644 platform/runtime/security/legacy-permissions/permission-component/src/main/java/ru/entaxy/esb/system/core/permission/component/operation/CheckSystemAccessWithException.java create mode 100644 platform/runtime/security/legacy-permissions/permission-component/src/main/java/ru/entaxy/esb/system/core/permission/component/operation/CheckWithException.java create mode 100644 platform/runtime/security/legacy-permissions/permission-component/src/main/java/ru/entaxy/esb/system/core/permission/component/operation/Create.java create mode 100644 platform/runtime/security/legacy-permissions/permission-component/src/main/java/ru/entaxy/esb/system/core/permission/component/operation/Delete.java create mode 100644 platform/runtime/security/legacy-permissions/permission-component/src/main/java/ru/entaxy/esb/system/core/permission/component/operation/Get.java create mode 100644 platform/runtime/security/legacy-permissions/permission-component/src/main/java/ru/entaxy/esb/system/core/permission/component/operation/GetByAllParams.java create mode 100644 platform/runtime/security/legacy-permissions/permission-component/src/main/java/ru/entaxy/esb/system/core/permission/component/operation/Operation.java create mode 100644 platform/runtime/security/legacy-permissions/permission-component/src/main/java/ru/entaxy/esb/system/core/permission/component/operation/OperationFactory.java create mode 100644 platform/runtime/security/legacy-permissions/permission-component/src/main/java/ru/entaxy/esb/system/core/permission/component/operation/Update.java create mode 100644 platform/runtime/security/legacy-permissions/permission-component/src/main/java/ru/entaxy/esb/system/core/permission/component/util/PermissionComponentConstants.java create mode 100644 platform/runtime/security/legacy-permissions/permission-component/src/main/resources/META-INF/services/org/apache/camel/component/permission create mode 100644 platform/runtime/security/legacy-permissions/permission-component/src/main/resources/log4j2.properties create mode 100644 platform/runtime/security/legacy-permissions/permission-handler/LICENSE.txt create mode 100644 platform/runtime/security/legacy-permissions/permission-handler/pom.xml create mode 100644 platform/runtime/security/legacy-permissions/permission-handler/src/main/java/ru/entaxy/esb/system/core/permission/handler/PermissionChecker.java create mode 100644 platform/runtime/security/legacy-permissions/permission-handler/src/main/java/ru/entaxy/esb/system/core/permission/handler/PermissionCheckerImpl.java create mode 100644 platform/runtime/security/legacy-permissions/permission-handler/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 platform/runtime/security/legacy-permissions/permission-impl/LICENSE.txt create mode 100644 platform/runtime/security/legacy-permissions/permission-impl/pom.xml create mode 100644 platform/runtime/security/legacy-permissions/permission-impl/src/main/java/ru/entaxy/esb/system/core/permission/interceptor/ServiceInterceptor.java create mode 100644 platform/runtime/security/legacy-permissions/permission-impl/src/main/java/ru/entaxy/esb/system/core/permission/jpa/impl/PermissionServiceImpl.java create mode 100644 platform/runtime/security/legacy-permissions/permission-impl/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 platform/runtime/security/legacy-permissions/permission-impl/src/main/resources/hibernate.cfg.xml create mode 100644 platform/runtime/security/legacy-permissions/permission-soap/LICENSE.txt create mode 100644 platform/runtime/security/legacy-permissions/permission-soap/pom.xml create mode 100644 platform/runtime/security/legacy-permissions/permission-soap/src/main/resources/OSGI-INF/blueprint/camel-context.xml create mode 100644 platform/runtime/security/legacy-permissions/permission-soap/src/main/resources/ru/entaxy/esb/system/core/permission/template/permission.xsl create mode 100644 platform/runtime/security/legacy-permissions/permission-soap/src/main/resources/types/permission.ftl create mode 100644 platform/runtime/security/legacy-permissions/permission-soap/src/main/resources/wsdl/permission-service.wsdl create mode 100644 platform/runtime/security/legacy-permissions/pom.xml create mode 100644 platform/runtime/security/pom.xml create mode 100644 platform/runtime/security/secure-vault/LICENSE.txt create mode 100644 platform/runtime/security/secure-vault/pom.xml create mode 100644 platform/runtime/security/secure-vault/secure-vault-design/LICENSE.txt create mode 100644 platform/runtime/security/secure-vault/secure-vault-design/pom.xml create mode 100644 platform/runtime/security/secure-vault/secure-vault-design/src/main/java/ru/entaxy/security/vault/design/lookup/AddVaultsLookupCommand.java create mode 100644 platform/runtime/security/secure-vault/secure-vault-design/src/main/resources/ru/entaxy/extensions/objectproducer/producer/config.json create mode 100644 platform/runtime/security/secure-vault/secure-vault-design/src/main/resources/ru/entaxy/factory/secure-vault-abstract.json create mode 100644 platform/runtime/security/secure-vault/secure-vault-design/src/main/resources/ru/entaxy/factory/secure-vault-resources.json create mode 100644 platform/runtime/security/secure-vault/secure-vault-design/src/main/resources/ru/entaxy/templates/secure-vault-abstract/lookup.ftl create mode 100644 platform/runtime/security/secure-vault/secure-vault-design/src/main/resources/ru/entaxy/templates/secure-vault-abstract/vaultsField.ftl create mode 100644 platform/runtime/security/secure-vault/secure-vault-design/src/main/resources/ru/entaxy/templates/secure-vault-resources/init.ftl create mode 100644 platform/runtime/security/secure-vault/secure-vault-management/LICENSE.txt create mode 100644 platform/runtime/security/secure-vault/secure-vault-management/pom.xml create mode 100644 platform/runtime/security/secure-vault/secure-vault-management/src/main/java/ru/entaxy/security/vault/management/SecureVaultMBean.java create mode 100644 platform/runtime/security/secure-vault/secure-vault-management/src/main/java/ru/entaxy/security/vault/management/SecureVaultsMBean.java create mode 100644 platform/runtime/security/secure-vault/secure-vault-management/src/main/java/ru/entaxy/security/vault/management/impl/SecureVaultMBeanFactory.java create mode 100644 platform/runtime/security/secure-vault/secure-vault-management/src/main/java/ru/entaxy/security/vault/management/impl/SecureVaultMBeanImpl.java create mode 100644 platform/runtime/security/secure-vault/secure-vault-management/src/main/java/ru/entaxy/security/vault/management/impl/SecureVaultsMBeanImpl.java create mode 100644 platform/runtime/security/secure-vault/secure-vault-runtime/LICENSE.txt create mode 100644 platform/runtime/security/secure-vault/secure-vault-runtime/pom.xml create mode 100644 platform/runtime/security/secure-vault/secure-vault-runtime/src/main/java/ru/entaxy/security/vault/runtime/EntaxyVault.java create mode 100644 platform/runtime/security/secure-vault/secure-vault-runtime/src/main/java/ru/entaxy/security/vault/runtime/camel/EntaxyVaultAccessorFunction.java create mode 100644 platform/runtime/security/secure-vault/secure-vault-runtime/src/main/java/ru/entaxy/security/vault/runtime/camel/EntaxyVaultHelperBean.java create mode 100644 platform/runtime/security/secure-vault/secure-vault-runtime/src/main/java/ru/entaxy/security/vault/runtime/lookup/CmPropertiesDefaultsLookup.java create mode 100644 platform/runtime/security/secure-vault/secure-vault-runtime/src/main/java/ru/entaxy/security/vault/runtime/lookup/SecretsLookupConfigurationPlugin.java create mode 100644 platform/runtime/security/secure-vault/secure-vault-runtime/src/main/java/ru/entaxy/security/vault/runtime/lookup/SecretsLookupProvider.java create mode 100644 platform/runtime/security/secure-vault/secure-vault-runtime/src/main/java/ru/entaxy/security/vault/runtime/resourcevault/ResourceBasedVault.java create mode 100644 platform/runtime/security/secure-vault/secure-vault-runtime/src/main/java/ru/entaxy/security/vault/runtime/resourcevault/internal/ServiceHelper.java create mode 100644 platform/runtime/security/secure-vault/secure-vault-runtime/src/main/java/ru/entaxy/security/vault/runtime/resourcevault/internal/VaultInitializer.java create mode 100644 platform/runtime/security/secure-vault/src/main/features/features.xml create mode 100644 platform/runtime/security/secure-vault/src/main/resources/etc/init/artifacts/shared/vault-default.xml create mode 100644 platform/runtime/security/secure-vault/src/main/resources/etc/init/install/vault.properties create mode 100644 platform/runtime/security/secure-vault/src/main/support/vault-default.json create mode 100644 platform/runtime/security/security-integration/LICENSE.txt create mode 100644 platform/runtime/security/security-integration/htpasswd/LICENSE.txt create mode 100644 platform/runtime/security/security-integration/htpasswd/README.md create mode 100644 platform/runtime/security/security-integration/htpasswd/pom.xml create mode 100644 platform/runtime/security/security-integration/htpasswd/src/main/java/ru/entaxy/esb/system/auth/basic/htpasswd/HtpasswdGenerator.java create mode 100644 platform/runtime/security/security-integration/htpasswd/src/main/java/ru/entaxy/esb/system/auth/basic/htpasswd/entity/Htpasswd.java create mode 100644 platform/runtime/security/security-integration/htpasswd/src/main/java/ru/entaxy/esb/system/auth/basic/htpasswd/entity/HtpasswdEntry.java create mode 100644 platform/runtime/security/security-integration/htpasswd/src/main/java/ru/entaxy/esb/system/auth/basic/htpasswd/rest/HtpasswdService.java create mode 100644 platform/runtime/security/security-integration/htpasswd/src/main/resources/OSGI-INF/blueprint/htpasswd-context.xml create mode 100644 platform/runtime/security/security-integration/htpasswd/src/main/resources/script/htpasswd-checker.sh create mode 100644 platform/runtime/security/security-integration/pom.xml create mode 100644 platform/runtime/security/security-keystore/LICENSE.txt create mode 100644 platform/runtime/security/security-keystore/keystore-design/LICENSE.txt create mode 100644 platform/runtime/security/security-keystore/keystore-design/pom.xml create mode 100644 platform/runtime/security/security-keystore/keystore-design/src/main/resources/ru/entaxy/extensions/objectproducer/producer/config.json create mode 100644 platform/runtime/security/security-keystore/keystore-design/src/main/resources/ru/entaxy/factory/abstract-keystore.json create mode 100644 platform/runtime/security/security-keystore/keystore-design/src/main/resources/ru/entaxy/factory/jks-keystore.json create mode 100644 platform/runtime/security/security-keystore/keystore-design/src/main/resources/ru/entaxy/factory/jwk-keystore.json create mode 100644 platform/runtime/security/security-keystore/keystore-design/src/main/resources/ru/entaxy/templates/abstract-keystore/init.ftl create mode 100644 platform/runtime/security/security-keystore/keystore-design/src/main/resources/ru/entaxy/templates/abstract-keystore/keystorePropertiesFile.ftl create mode 100644 platform/runtime/security/security-keystore/keystore-design/src/main/resources/ru/entaxy/templates/jwk-keystore/init0.ftl create mode 100644 platform/runtime/security/security-keystore/keystore-management/LICENSE.txt create mode 100644 platform/runtime/security/security-keystore/keystore-management/pom.xml create mode 100644 platform/runtime/security/security-keystore/keystore-management/src/main/java/ru/entaxy/security/keystore/management/JWKKeystoreMBean.java create mode 100644 platform/runtime/security/security-keystore/keystore-management/src/main/java/ru/entaxy/security/keystore/management/KeystoreMBean.java create mode 100644 platform/runtime/security/security-keystore/keystore-management/src/main/java/ru/entaxy/security/keystore/management/KeystoresMBean.java create mode 100644 platform/runtime/security/security-keystore/keystore-management/src/main/java/ru/entaxy/security/keystore/management/impl/JWKKeystoreMBeanImpl.java create mode 100644 platform/runtime/security/security-keystore/keystore-management/src/main/java/ru/entaxy/security/keystore/management/impl/KeystoreMBeanFactory.java create mode 100644 platform/runtime/security/security-keystore/keystore-management/src/main/java/ru/entaxy/security/keystore/management/impl/KeystoreMBeanImpl.java create mode 100644 platform/runtime/security/security-keystore/keystore-management/src/main/java/ru/entaxy/security/keystore/management/impl/KeystoresMBeanImpl.java create mode 100644 platform/runtime/security/security-keystore/keystore-runtime/LICENSE.txt create mode 100644 platform/runtime/security/security-keystore/keystore-runtime/pom.xml create mode 100644 platform/runtime/security/security-keystore/keystore-runtime/src/main/java/ru/entaxy/security/keystore/runtime/EntaxyKeystore.java create mode 100644 platform/runtime/security/security-keystore/keystore-runtime/src/main/java/ru/entaxy/security/keystore/runtime/EntaxyKeystoreCausedException.java create mode 100644 platform/runtime/security/security-keystore/keystore-runtime/src/main/java/ru/entaxy/security/keystore/runtime/EntaxyKeystoreException.java create mode 100644 platform/runtime/security/security-keystore/keystore-runtime/src/main/java/ru/entaxy/security/keystore/runtime/EntaxyKeystoreNotFoundException.java create mode 100644 platform/runtime/security/security-keystore/keystore-runtime/src/main/java/ru/entaxy/security/keystore/runtime/EntaxyKeystoreUrlNotDefinedException.java create mode 100644 platform/runtime/security/security-keystore/keystore-runtime/src/main/java/ru/entaxy/security/keystore/runtime/KeystoreManager.java create mode 100644 platform/runtime/security/security-keystore/keystore-runtime/src/main/java/ru/entaxy/security/keystore/runtime/UnsupportedKeyFormatException.java create mode 100644 platform/runtime/security/security-keystore/keystore-runtime/src/main/java/ru/entaxy/security/keystore/runtime/impl/JWKKeystoreHelper.java create mode 100644 platform/runtime/security/security-keystore/keystore-runtime/src/main/java/ru/entaxy/security/keystore/runtime/impl/KeystoreHelper.java create mode 100644 platform/runtime/security/security-keystore/keystore-runtime/src/main/java/ru/entaxy/security/keystore/runtime/impl/KeystoreManagerImpl.java create mode 100644 platform/runtime/security/security-keystore/keystore-runtime/src/main/java/ru/entaxy/security/keystore/runtime/impl/KeystoreResource.java create mode 100644 platform/runtime/security/security-keystore/keystore-runtime/src/main/java/ru/entaxy/security/keystore/runtime/internal/JKSResourceProcessor.java create mode 100644 platform/runtime/security/security-keystore/keystore-runtime/src/main/java/ru/entaxy/security/keystore/runtime/internal/JWKResourceProcessor.java create mode 100644 platform/runtime/security/security-keystore/keystore-runtime/src/main/java/ru/entaxy/security/keystore/runtime/internal/KeyStoreResourceProvider.java create mode 100644 platform/runtime/security/security-keystore/keystore-runtime/src/main/java/ru/entaxy/security/keystore/runtime/internal/KeystoreProcessorHelper.java create mode 100644 platform/runtime/security/security-keystore/keystore-shell/LICENSE.txt create mode 100644 platform/runtime/security/security-keystore/keystore-shell/pom.xml create mode 100644 platform/runtime/security/security-keystore/keystore-shell/src/main/java/ru/entaxy/security/keystore/shell/KeystoreAliasesCommand.java create mode 100644 platform/runtime/security/security-keystore/keystore-shell/src/main/java/ru/entaxy/security/keystore/shell/KeystoreAwareCommand.java create mode 100644 platform/runtime/security/security-keystore/keystore-shell/src/main/java/ru/entaxy/security/keystore/shell/KeystoreKeyAddCommand.java create mode 100644 platform/runtime/security/security-keystore/keystore-shell/src/main/java/ru/entaxy/security/keystore/shell/KeystoreKeyRemoveCommand.java create mode 100644 platform/runtime/security/security-keystore/keystore-shell/src/main/java/ru/entaxy/security/keystore/shell/KeystoreListCommand.java create mode 100644 platform/runtime/security/security-keystore/keystore-shell/src/main/java/ru/entaxy/security/keystore/shell/KeystoreManagerSupport.java create mode 100644 platform/runtime/security/security-keystore/keystore-shell/src/main/java/ru/entaxy/security/keystore/shell/KeystoreShell.java create mode 100644 platform/runtime/security/security-keystore/keystore-shell/src/main/java/ru/entaxy/security/keystore/shell/KeystoreUpdateCommand.java create mode 100644 platform/runtime/security/security-keystore/keystore-shell/src/main/java/ru/entaxy/security/keystore/shell/completer/KeystoreIdCompleter.java create mode 100644 platform/runtime/security/security-keystore/pom.xml create mode 100644 platform/runtime/security/src/main/features/features.xml create mode 100644 platform/src/update/scripts/generated/fragments.xml create mode 100644 system/src/main/cfg/generated/fragments.xml create mode 100644 ui/entaxy-hawtio/entaxy-branding-plugin/src/main/webapp/plugin/img/icons/cicd/entaxy-cicd-applications-icon.png create mode 100644 ui/entaxy-hawtio/entaxy-branding-plugin/src/main/webapp/plugin/img/icons/cicd/entaxy-cicd-build-info-icon.png create mode 100644 ui/entaxy-hawtio/entaxy-branding-plugin/src/main/webapp/plugin/img/icons/cicd/entaxy-cicd-projects-icon.png create mode 100644 ui/entaxy-hawtio/entaxy-branding-plugin/src/main/webapp/plugin/img/icons/cicd/entaxy-cicd-revisions-icon.png create mode 100644 ui/entaxy-hawtio/entaxy-branding-plugin/src/main/webapp/plugin/img/icons/cicd/entaxy-cicd-storages-icon.png create mode 100644 ui/entaxy-hawtio/entaxy-branding-plugin/src/main/webapp/plugin/img/icons/cicd/entaxy-cicd-versions-icon.png create mode 100644 ui/entaxy-hawtio/entaxy-branding-plugin/src/main/webapp/plugin/img/icons/connector-selector.png create mode 100644 ui/entaxy-hawtio/entaxy-branding-plugin/src/main/webapp/plugin/img/icons/cranberry-red/entaxy-adapters-icon.png create mode 100644 ui/entaxy-hawtio/entaxy-branding-plugin/src/main/webapp/plugin/img/icons/cranberry-red/entaxy-configs-icon.png create mode 100644 ui/entaxy-hawtio/entaxy-branding-plugin/src/main/webapp/plugin/img/icons/cranberry-red/entaxy-data-management-icon.png create mode 100644 ui/entaxy-hawtio/entaxy-branding-plugin/src/main/webapp/plugin/img/icons/cranberry-red/entaxy-objects-icon.png create mode 100644 ui/entaxy-hawtio/entaxy-branding-plugin/src/main/webapp/plugin/img/icons/cranberry-red/entaxy-repositories-icon.png create mode 100644 ui/entaxy-hawtio/entaxy-branding-plugin/src/main/webapp/plugin/img/icons/cranberry-red/entaxy-route-libraries-icon.png create mode 100644 ui/entaxy-hawtio/entaxy-branding-plugin/src/main/webapp/plugin/img/icons/cranberry-red/entaxy-routes-aggregator-icon.png create mode 100644 ui/entaxy-hawtio/entaxy-branding-plugin/src/main/webapp/plugin/img/icons/cranberry-red/entaxy-search-icon.png create mode 100644 ui/entaxy-hawtio/entaxy-branding-plugin/src/main/webapp/plugin/img/icons/cranberry-red/entaxy-security-icon.png create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/LICENSE.txt create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/pom.xml create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/src/main/java/ru/entaxy/ui/hawtio/cicd/PluginContextListener.java create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/src/main/resources/WEB-INF/web.xml create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/src/main/webapp/plugin/js/components/applications/application.js create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/src/main/webapp/plugin/js/components/applications/applicationManagementButtons.js create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/src/main/webapp/plugin/js/components/applications/applications.js create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/src/main/webapp/plugin/js/components/applications/configuration.js create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/src/main/webapp/plugin/js/components/applications/configurations.js create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/src/main/webapp/plugin/js/components/applications/items.js create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/src/main/webapp/plugin/js/components/applications/revision.js create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/src/main/webapp/plugin/js/components/applications/versionsRevisionsInfo.js create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/src/main/webapp/plugin/js/components/applicationsTable.js create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/src/main/webapp/plugin/js/components/contents.js create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/src/main/webapp/plugin/js/components/navigation.js create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/src/main/webapp/plugin/js/components/projects/addObjectsModal.js create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/src/main/webapp/plugin/js/components/projects/buildInfo.js create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/src/main/webapp/plugin/js/components/projects/components.js create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/src/main/webapp/plugin/js/components/projects/items.js create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/src/main/webapp/plugin/js/components/projects/objects.js create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/src/main/webapp/plugin/js/components/projects/objectsSelect.js create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/src/main/webapp/plugin/js/components/projects/project.js create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/src/main/webapp/plugin/js/components/projects/projects.js create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/src/main/webapp/plugin/js/components/projects/versions.js create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/src/main/webapp/plugin/js/components/requirements.js create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/src/main/webapp/plugin/js/components/simpleFieldsModal.js create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/src/main/webapp/plugin/js/components/tree.js create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/src/main/webapp/plugin/js/entaxyCICDHelpers.js create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/src/main/webapp/plugin/js/entaxyCICDPlugin.js create mode 100644 ui/entaxy-hawtio/entaxy-cicd-plugin/src/main/webapp/plugin/js/services/entaxyCICDService.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/codemirror/mode/freemarker/freemarker.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/codemirror/mode/freemarkermixed/freemarkermixed.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/hotkeys/hotkeys.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/ng-sortable/ng-sortable.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/copyToClipboardButton.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/directives/contextMenuDirective.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/directives/draggableDroppableDirectives.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/directives/draggableModalDirective.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/directives/fileDropDirective.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/directives/setFileModelDirective.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/directives/setFocusedDirective.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/editor.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/expandableList.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/extendedData.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/formFieldExtraInfo.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/formFields.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/header.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/inputs/innerObjectInput/innerObjectInput.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/inputs/innerObjectInput/innerObjectInputModal.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/inputs/inputWithExtension.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/inputs/listInput/listInput.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/inputs/listInput/listItemContent.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/inputs/mapInput.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/inputs/passwordInput.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/inputs/resourceInput.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/inputs/select.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/inputs/selectFromEnum.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/inputs/urlInput.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/inputs/xml.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/modals/addConnectorModal.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/modals/confirmationModal.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/modals/createResourceModal.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/modals/editorModal.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/modals/modal.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/modals/operationTableRequestModal.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/modals/resourceViewerModal.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/modals/simpleResourceNameInputModal.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/modals/xmlModal.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/profileDiagram/connectorBlock.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/profileDiagram/connectorsWithFlow.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/profileDiagram/customConnectorBlock.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/profileDiagram/externalSystemPoints.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/profileDiagram/flowBlock.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/profileDiagram/inFlowBlock.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/profileDiagram/normalConnectorBlock.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/profileDiagram/outFlowBlock.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/profileDiagram/profileDiagram.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/profileDiagram/profileDiagramPalette.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/tables/aliases.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/tables/allConnectorsTable.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/tables/configProperties.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/tables/connections.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/tables/connectors.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/tables/keyStores.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/tables/operationAffectedTable.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/tables/profiles.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/tables/realms.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/tables/repositories.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/tables/routeLibraries.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/tables/routes.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/tables/routesTable.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/tables/services.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/tables/table.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/tables/vaults.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/userManagement/associatedProfileSelect.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/userManagement/groupsAndRolesList.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/userManagement/groupsTable.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/userManagement/userManagement.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/userManagement/userManagementModal.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/userManagement/users.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/components/userManagement/usersTable.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/entaxyHotkeysHelper.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/services/entaxyAttributesCacheService.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/services/entaxyHotkeysService.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/services/entaxyPrivateObjectsCacheService.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/services/entaxyProfileDiagramService.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/services/entaxyResourcesService.js create mode 100644 ui/entaxy-hawtio/entaxy-management-plugin/src/main/webapp/plugin/js/services/restService.js create mode 100644 ui/entaxy-hawtio/src/main/cfg/generated/fragments.xml create mode 100644 ui/entaxy-hawtio/src/main/cfg/ru.entaxy.esb.ui.hawtio.cfg create mode 100644 ui/generate-provided create mode 100644 ui/generated-resources/provided/ui.xml create mode 100644 ui/support/xslt/generate-provided-repo.xslt diff --git a/platform/runtime/core/objects-implementations/connector-implementation/connector-storage/LICENSE.txt b/platform-backward-compat/LICENSE.txt similarity index 100% rename from platform/runtime/core/objects-implementations/connector-implementation/connector-storage/LICENSE.txt rename to platform-backward-compat/LICENSE.txt diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-storage/LICENSE.txt b/platform-backward-compat/blueprint-generator-service/LICENSE.txt similarity index 100% rename from platform/runtime/core/objects-implementations/profile-implementation/profile-storage/LICENSE.txt rename to platform-backward-compat/blueprint-generator-service/LICENSE.txt diff --git a/platform-backward-compat/blueprint-generator-service/pom.xml b/platform-backward-compat/blueprint-generator-service/pom.xml new file mode 100644 index 00000000..75c2e0f3 --- /dev/null +++ b/platform-backward-compat/blueprint-generator-service/pom.xml @@ -0,0 +1,76 @@ + + 4.0.0 + + ru.entaxy.platform + platform-backward-compat + 1.11.0 + + ru.entaxy.platform.backward-compat + blueprint-generator-service + bundle + ENTAXY :: PLATFORM :: BACKWARD COMPATIBILITY :: BLUEPRINT GENERATOR SERVICE + ENTAXY :: PLATFORM :: BACKWARD COMPATIBILITY :: BLUEPRINT GENERATOR SERVICE + + + ru.entaxy.platform.core.blueprint.generator + + + + + org.apache.karaf + org.apache.karaf.util + + + + org.osgi + org.osgi.service.component.annotations + 1.4.0 + compile + + + + + ru.entaxy.esb.platform.runtime.base.connecting.generator + + generator-api + ${project.version} + + + + ru.entaxy.esb.platform.runtime.base.connecting.generator + + generator-factory + ${project.version} + + + + + + + org.apache.felix + maven-bundle-plugin + ${maven-bundle-plugin.version} + true + + + true + <_dsannotations>* + + + + + + + diff --git a/platform-backward-compat/blueprint-generator-service/src/main/java/ru/entaxy/platform/core/blueprint/generator/Blueprint.java b/platform-backward-compat/blueprint-generator-service/src/main/java/ru/entaxy/platform/core/blueprint/generator/Blueprint.java new file mode 100644 index 00000000..a73eae8e --- /dev/null +++ b/platform-backward-compat/blueprint-generator-service/src/main/java/ru/entaxy/platform/core/blueprint/generator/Blueprint.java @@ -0,0 +1,69 @@ +/*- + * ~~~~~~licensing~~~~~~ + * blueprint-generator + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.blueprint.generator; + +import java.util.HashMap; +import java.util.Map; + +public class Blueprint { + + private String name; + private byte[] body; + + private Map properties = new HashMap<>(); + + public Blueprint(String name, byte[] body) { + this.name = name; + this.body = body; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public byte[] getBody() { + return body; + } + + public void setBody(byte[] body) { + this.body = body; + } + + public Map getProperties() { + return properties; + } + + @Override + public String toString() { + return "Blueprint{" + + "name='" + name + '\'' + + '}'; + } +} diff --git a/platform-backward-compat/blueprint-generator-service/src/main/java/ru/entaxy/platform/core/blueprint/generator/BlueprintGenerator.java b/platform-backward-compat/blueprint-generator-service/src/main/java/ru/entaxy/platform/core/blueprint/generator/BlueprintGenerator.java new file mode 100644 index 00000000..dcf65501 --- /dev/null +++ b/platform-backward-compat/blueprint-generator-service/src/main/java/ru/entaxy/platform/core/blueprint/generator/BlueprintGenerator.java @@ -0,0 +1,38 @@ +/*- + * ~~~~~~licensing~~~~~~ + * blueprint-generator + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.blueprint.generator; + +import java.net.URL; +import java.util.Map; + +public interface BlueprintGenerator { + + Blueprint createBlueprint(URL templateUrl, String templateName, String systemName, Map params) + throws Exception; + + Blueprint createBlueprint(String templateName, String systemName, Map params) + throws Exception; +} diff --git a/platform-backward-compat/blueprint-generator-service/src/main/java/ru/entaxy/platform/core/blueprint/generator/BlueprintGeneratorImpl.java b/platform-backward-compat/blueprint-generator-service/src/main/java/ru/entaxy/platform/core/blueprint/generator/BlueprintGeneratorImpl.java new file mode 100644 index 00000000..55ddd9c6 --- /dev/null +++ b/platform-backward-compat/blueprint-generator-service/src/main/java/ru/entaxy/platform/core/blueprint/generator/BlueprintGeneratorImpl.java @@ -0,0 +1,113 @@ +/*- + * ~~~~~~licensing~~~~~~ + * blueprint-generator + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.blueprint.generator; + +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +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; + +import ru.entaxy.base.generator.template.Template; +import ru.entaxy.base.generator.template.TemplateAwareGenerator; +import ru.entaxy.base.generator.template.TemplateImpl; +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; + +@Component(service = {BlueprintGenerator.class}, immediate = true) +public class BlueprintGeneratorImpl implements BlueprintGenerator { + + private static final Logger LOG = LoggerFactory.getLogger(BlueprintGeneratorImpl.class); + private static final String SYSTEM_NAME = "systemName"; + + @Reference(cardinality = ReferenceCardinality.MANDATORY) + protected TemplateService templateService; + + @Override + public Blueprint createBlueprint(URL templateUrl, String templateName, String systemName, Map params) + throws Exception { + TemplateImpl template = new TemplateImpl(); + template.setTemplateName(templateName); + template.setTemplateLocation(templateUrl.toString()); + template.setType("ftl"); + return createBlueprintWithTemplate(template, systemName, params); + } + + @Override + public Blueprint createBlueprint(String templateName, String systemName, Map params) throws Exception { + Template template = templateService.getTemplateById(templateName); + if (template == null) { + LOG.error("Template not found: [{}]", templateName); + // TODO throw exception + return null; + } + return createBlueprintWithTemplate(template, systemName, params); + } + + protected Blueprint createBlueprintWithTemplate(ru.entaxy.base.generator.template.Template template, + String systemName, Map params) throws Exception { + TemplateAwareGenerator generator = GeneratorFactory.createGenerator(template); + if (generator == null) { + LOG.error("Generator not found for template: [{}]", template.getId()); + // TODO throw exception + return null; + } + addSystemParam(params, systemName); + Map parameters = new HashMap<>(); + parameters.putAll(params); + Generated result = generator.generate(template,parameters); + if ((result == null) || (result.getObject() == null)) { + LOG.error("Generator returned null for template: [{}]", template.getId()); + // TODO throw exception + return null; + } + if (!Generated.GENERATED_TYPE_BLUEPRINT.equals(result.getType())) { + LOG.error("Generator returned type [{}], while [{}] is expected for template: [{}]" + , result.getType() + , Generated.GENERATED_TYPE_BLUEPRINT + , template.getId()); + // TODO throw exception + return null; + } + Blueprint blueprint = new Blueprint(template.getTemplateName(), result.getObject().toString().getBytes()); + blueprint.getProperties().putAll(result.getProperties()); + blueprint.getProperties().put("template.name", template.getTemplateName()); + blueprint.getProperties().put("template.id", template.getId()); + blueprint.getProperties().put("template.type", template.getType()); + return blueprint; + } + + private void addSystemParam(Map params, String systemName) { + params.put(SYSTEM_NAME, systemName); + } + +} diff --git a/platform-backward-compat/blueprint-generator-service/src/main/resources/ru/entaxy/templates/bridge-profile.ftl b/platform-backward-compat/blueprint-generator-service/src/main/resources/ru/entaxy/templates/bridge-profile.ftl new file mode 100644 index 00000000..f8ec2a15 --- /dev/null +++ b/platform-backward-compat/blueprint-generator-service/src/main/resources/ru/entaxy/templates/bridge-profile.ftl @@ -0,0 +1,39 @@ +[#ftl attributes={"generated.type":"blueprint"}] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + system:[=systemName] + + + + + diff --git a/platform-backward-compat/blueprint-generator-service/src/main/resources/ru/entaxy/templates/default-route.ftl b/platform-backward-compat/blueprint-generator-service/src/main/resources/ru/entaxy/templates/default-route.ftl new file mode 100644 index 00000000..49a697f3 --- /dev/null +++ b/platform-backward-compat/blueprint-generator-service/src/main/resources/ru/entaxy/templates/default-route.ftl @@ -0,0 +1,48 @@ +[#ftl attributes={"generated.type":"blueprint"}] + + + + + + + + + + + + ${headers.ENTAXY_Destination} == 'nsi' + && ${headers.ENTAXY_DestinationType} == null + + + true + + + + + + + ${headers.ENTAXY_DestinationType} == 'system.name' + + + + ${headers.ENTAXY_DestinationType} == 'system-group.name' + + + + ${headers.ENTAXY_DestinationType} == 'queue.name' + + + + ${headers.ENTAXY_DestinationType} == 'topic.name' + + + + + + + + + diff --git a/platform-backward-compat/blueprint-generator-service/src/main/resources/ru/entaxy/templates/metadata.json b/platform-backward-compat/blueprint-generator-service/src/main/resources/ru/entaxy/templates/metadata.json new file mode 100644 index 00000000..5f01bc16 --- /dev/null +++ b/platform-backward-compat/blueprint-generator-service/src/main/resources/ru/entaxy/templates/metadata.json @@ -0,0 +1,23 @@ +{ + "templates":[ + { + "id":"bridge-profile", + /* by default: + "name":"{id}", + "type":"ftl", + "path":"DEFAULT_PATH" + "filename":"{id}" + "fullname":"{id}.{type}", + */ + "description":"Ftl template for bridge profile" + }, + { + "id":"default-route", + "description":"Ftl template for default route from profile" + }, + { + "id":"profile", + "description":"Ftl template for system profile" + } + ] +} \ No newline at end of file diff --git a/platform-backward-compat/blueprint-generator-service/src/main/resources/ru/entaxy/templates/profile.ftl b/platform-backward-compat/blueprint-generator-service/src/main/resources/ru/entaxy/templates/profile.ftl new file mode 100644 index 00000000..8e555cd9 --- /dev/null +++ b/platform-backward-compat/blueprint-generator-service/src/main/resources/ru/entaxy/templates/profile.ftl @@ -0,0 +1,75 @@ +[#ftl attributes={"generated.type":"blueprint"}] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${headers.NTX_NextPoint} != null + + ${headers.NTX_NextPoint} + + + + + + + + + + + + + +[#-- --] +[#-- --] +[#-- ${headers.NTX_Origin} == null--] +[#-- --] +[#-- --] +[#-- --] + + + + diff --git a/platform-backward-compat/connector-storage/LICENSE.txt b/platform-backward-compat/connector-storage/LICENSE.txt new file mode 100644 index 00000000..4ae94b75 --- /dev/null +++ b/platform-backward-compat/connector-storage/LICENSE.txt @@ -0,0 +1,175 @@ + ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ + +Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой) +версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего +Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН +7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова, +д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу +https://www.emdev.ru/about (далее - Компания). + +Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями» +(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения, +Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в +настоящем документе, в противном случае, он должен не использовать или не получать доступ +к Программному обеспечению. + + 1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ + +a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии +или редакции, исключительные права на которую принадлежат Правообладателю. +b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные +права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ +для ЭВМ № 2021610848 от 19.01.2021 года. +c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта +https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО. +d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также +личные неимущественные права авторов произведений на результат интеллектуальной деятельности. +e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование +ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка +включает предоставление Пользователю неисключительного права использования ПО, в том числе +получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение +патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается +Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается +для каждого Пользователя индивидуально в Сертификате. +f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром), +подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное +обеспечение в ограниченном объёме и на определённый период времени. +g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО, +предоставленных Пользователю согласно условиям Подписки. +h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного +обеспечения. +i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий +из одного или нескольких файлов, который может быть прочтён человеком. +j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля +программы, полученный в результате обработки исходного кода, еще не связанный в полную программу. +Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый +продукт. +k) Некоммерческое использование – индивидуальное личное использование Пользователем программного +обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации +возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая +выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения. + + 2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ + +2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного +обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом +воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения +в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ. +2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит +неисключительный характер. +2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию, +лицензия на ограниченное использование Программного обеспечения. +2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования +имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан +обратиться в службу поддержки Правообладателя по адресу: https://entaxy.ru/ для изменения +вида лицензии с Базовой бесплатной версии на Подписки. +2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для +пробного использования программного обеспечения – не ограничен. +2.6. Использование Пользователем настоящего программного обеспечения в целях разработки, +модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю, +без разрешения Правообладателя не допускается. + + 3. АВТОРСКОЕ ПРАВО. + +3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение +и любые его копии принадлежат Правообладателю. +3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента, +к которому можно получить доступ с помощью Программного обеспечения, является собственностью +соответствующего владельца контента и защищается применимым законодательством об авторском +праве или другими законами и договорами об интеллектуальной собственности. +3.3. Условия использования Программного обеспечения. +Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь +придерживается следующих условий: +3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять +какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании +Программного обеспечения или на нем. +3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать, +расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать +Программное обеспечение. +3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования +ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне. +3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено +использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам. + + 4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС» + +4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю +на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с +использованием Пользователем: +4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в +Программное обеспечение; +4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями +настоящего соглашения; +4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием, +или данными, не предоставленными Пользователю Правообладателем; +4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем. + + +5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ +ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ +И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ +ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ +И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ +ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО. + + 6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ. +НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ +ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ, +ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ; +ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ. +ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ +ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ; +КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ +ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ. + + 7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ: +Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия +(включая, но не ограничиваясь) по: +-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код) + Программного обеспечения; +-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный +код Программного обеспечения, за исключением тех изменений, которые вносятся средствами, +включёнными в Программное обеспечение и описанными непосредственно в документации к нему; +-созданию условий для использования Программного обеспечения лицами, не имеющими прав на +использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство +третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа +к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку; +-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию). + + 8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА. + +8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из +лицензионных продуктов, используемых на законных основаниях, а +именно https://entaxy.ru/libs/licenses/root-aggregated.deps. +8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть +совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения. +8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться +Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения, +содержащих все изменения и дополнения программного обеспечения. + + 9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ. + +9.1. Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым +программным обеспечением. +9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно +с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм +«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public. +9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий +пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя, +прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер +ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства +Российской Федерации. + + 10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ. + +10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет +право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб, +недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий +пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере +2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения +исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy). +10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое +законодательство – Российской Федерации. +10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным, +остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать +исполнять свои обязанности в соответствии с этими положениями. diff --git a/platform/runtime/core/objects-implementations/connector-implementation/connector-storage/pom.xml b/platform-backward-compat/connector-storage/pom.xml similarity index 59% rename from platform/runtime/core/objects-implementations/connector-implementation/connector-storage/pom.xml rename to platform-backward-compat/connector-storage/pom.xml index c5d75a80..8e27ff3d 100644 --- a/platform/runtime/core/objects-implementations/connector-implementation/connector-storage/pom.xml +++ b/platform-backward-compat/connector-storage/pom.xml @@ -1,16 +1,18 @@ 4.0.0 - - connector-implementation - ru.entaxy.esb.platform.runtime.core.objects-implementations - 1.10.0 - - ru.entaxy.esb.platform.runtime.core.objects-implementations.connector-implementation + + + ru.entaxy.platform + platform-backward-compat + 1.11.0 + + + ru.entaxy.platform.backward-compat connector-storage bundle - ENTAXY :: PLATFORM :: CORE :: OBJECTS IMPLEMENTATIONS :: CONNECTOR :: STORAGE - ENTAXY :: PLATFORM :: CORE :: OBJECTS IMPLEMENTATIONS :: CONNECTOR :: STORAGE + ENTAXY :: PLATFORM :: BACKWARD COMPATIBILITY :: CONNECTOR :: STORAGE + ENTAXY :: PLATFORM :: BACKWARD COMPATIBILITY :: CONNECTOR :: STORAGE ru.entaxy.platform.base.objects.connector.storage diff --git a/platform/runtime/core/objects-implementations/connector-implementation/connector-storage/src/main/java/ru/entaxy/platform/base/objects/connector/storage/ConnectorObjectStorage.java b/platform-backward-compat/connector-storage/src/main/java/ru/entaxy/platform/base/objects/connector/storage/ConnectorObjectStorage.java similarity index 99% rename from platform/runtime/core/objects-implementations/connector-implementation/connector-storage/src/main/java/ru/entaxy/platform/base/objects/connector/storage/ConnectorObjectStorage.java rename to platform-backward-compat/connector-storage/src/main/java/ru/entaxy/platform/base/objects/connector/storage/ConnectorObjectStorage.java index a18fa7a6..2724aa54 100644 --- a/platform/runtime/core/objects-implementations/connector-implementation/connector-storage/src/main/java/ru/entaxy/platform/base/objects/connector/storage/ConnectorObjectStorage.java +++ b/platform-backward-compat/connector-storage/src/main/java/ru/entaxy/platform/base/objects/connector/storage/ConnectorObjectStorage.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * connector-storage * ========== - * Copyright (C) 2020 - 2023 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform-backward-compat/pom.xml b/platform-backward-compat/pom.xml new file mode 100644 index 00000000..8aa4c2c2 --- /dev/null +++ b/platform-backward-compat/pom.xml @@ -0,0 +1,47 @@ + + + 4.0.0 + + ru.entaxy.esb + root + 1.11.0 + + ru.entaxy.platform + platform-backward-compat + pom + ENTAXY :: PLATFORM :: BACKWARD COMPATIBILITY + ENTAXY :: PLATFORM :: BACKWARD COMPATIBILITY + + + + com.google.code.gson + gson + + + org.osgi + org.osgi.service.component.annotations + + + org.apache.felix + org.apache.felix.scr + + + ru.entaxy.esb.platform.runtime.base + base-support + ${project.version} + + + ru.entaxy.esb.platform.runtime.base.objects-base + objects-core + ${project.version} + + + + + blueprint-generator-service + profile-management-service-adapters + connector-storage + profile-storage + + + diff --git a/platform-backward-compat/profile-management-service-adapters/LICENSE.txt b/platform-backward-compat/profile-management-service-adapters/LICENSE.txt new file mode 100644 index 00000000..4ae94b75 --- /dev/null +++ b/platform-backward-compat/profile-management-service-adapters/LICENSE.txt @@ -0,0 +1,175 @@ + ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ + +Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой) +версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего +Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН +7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова, +д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу +https://www.emdev.ru/about (далее - Компания). + +Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями» +(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения, +Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в +настоящем документе, в противном случае, он должен не использовать или не получать доступ +к Программному обеспечению. + + 1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ + +a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии +или редакции, исключительные права на которую принадлежат Правообладателю. +b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные +права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ +для ЭВМ № 2021610848 от 19.01.2021 года. +c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта +https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО. +d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также +личные неимущественные права авторов произведений на результат интеллектуальной деятельности. +e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование +ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка +включает предоставление Пользователю неисключительного права использования ПО, в том числе +получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение +патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается +Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается +для каждого Пользователя индивидуально в Сертификате. +f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром), +подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное +обеспечение в ограниченном объёме и на определённый период времени. +g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО, +предоставленных Пользователю согласно условиям Подписки. +h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного +обеспечения. +i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий +из одного или нескольких файлов, который может быть прочтён человеком. +j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля +программы, полученный в результате обработки исходного кода, еще не связанный в полную программу. +Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый +продукт. +k) Некоммерческое использование – индивидуальное личное использование Пользователем программного +обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации +возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая +выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения. + + 2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ + +2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного +обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом +воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения +в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ. +2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит +неисключительный характер. +2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию, +лицензия на ограниченное использование Программного обеспечения. +2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования +имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан +обратиться в службу поддержки Правообладателя по адресу: https://entaxy.ru/ для изменения +вида лицензии с Базовой бесплатной версии на Подписки. +2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для +пробного использования программного обеспечения – не ограничен. +2.6. Использование Пользователем настоящего программного обеспечения в целях разработки, +модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю, +без разрешения Правообладателя не допускается. + + 3. АВТОРСКОЕ ПРАВО. + +3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение +и любые его копии принадлежат Правообладателю. +3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента, +к которому можно получить доступ с помощью Программного обеспечения, является собственностью +соответствующего владельца контента и защищается применимым законодательством об авторском +праве или другими законами и договорами об интеллектуальной собственности. +3.3. Условия использования Программного обеспечения. +Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь +придерживается следующих условий: +3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять +какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании +Программного обеспечения или на нем. +3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать, +расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать +Программное обеспечение. +3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования +ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне. +3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено +использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам. + + 4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС» + +4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю +на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с +использованием Пользователем: +4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в +Программное обеспечение; +4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями +настоящего соглашения; +4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием, +или данными, не предоставленными Пользователю Правообладателем; +4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем. + + +5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ +ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ +И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ +ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ +И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ +ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО. + + 6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ. +НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ +ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ, +ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ; +ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ. +ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ +ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ; +КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ +ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ. + + 7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ: +Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия +(включая, но не ограничиваясь) по: +-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код) + Программного обеспечения; +-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный +код Программного обеспечения, за исключением тех изменений, которые вносятся средствами, +включёнными в Программное обеспечение и описанными непосредственно в документации к нему; +-созданию условий для использования Программного обеспечения лицами, не имеющими прав на +использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство +третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа +к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку; +-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию). + + 8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА. + +8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из +лицензионных продуктов, используемых на законных основаниях, а +именно https://entaxy.ru/libs/licenses/root-aggregated.deps. +8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть +совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения. +8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться +Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения, +содержащих все изменения и дополнения программного обеспечения. + + 9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ. + +9.1. Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым +программным обеспечением. +9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно +с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм +«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public. +9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий +пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя, +прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер +ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства +Российской Федерации. + + 10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ. + +10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет +право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб, +недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий +пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере +2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения +исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy). +10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое +законодательство – Российской Федерации. +10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным, +остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать +исполнять свои обязанности в соответствии с этими положениями. diff --git a/platform-backward-compat/profile-management-service-adapters/pom.xml b/platform-backward-compat/profile-management-service-adapters/pom.xml new file mode 100644 index 00000000..d4742bed --- /dev/null +++ b/platform-backward-compat/profile-management-service-adapters/pom.xml @@ -0,0 +1,131 @@ + + + 4.0.0 + + + ru.entaxy.platform + platform-backward-compat + 1.11.0 + + + ru.entaxy.platform.backward-compat + profile-management-service-adapters + bundle + + ENTAXY :: PLATFORM :: BACKWARD COMPATIBILITY :: PROFILE MANAGEMENT SERVICE ADAPTERS + ENTAXY :: PLATFORM :: BACKWARD COMPATIBILITY :: PROFILE MANAGEMENT SERVICE ADAPTERS + + + + + + + ru.entaxy.esb.platform.core.management.profile.adapters + + + + + + + org.osgi + org.osgi.service.component.annotations + 1.4.0 + compile + + + org.apache.felix + org.apache.felix.scr + 2.1.20 + + + + ru.entaxy.esb.platform.runtime.base + + base-support + ${project.version} + + + + ru.entaxy.esb.platform.runtime.core.management + profile-management + ${project.version} + + + ru.entaxy.esb.system.management.profile.manager + profile-manager + ${project.version} + + + ru.entaxy.esb.system.registry.systems + system-api + ${project.version} + + + ru.entaxy.esb.system.management + system-management-api + ${project.version} + + + + ru.entaxy.esb.system.management.connector.manager + + connector-manager + ${project.version} + + + ru.entaxy.esb.system.management.bundle.jpa + bundle-service + ${project.version} + + + ru.entaxy.esb.system.registry.connector + connector-api + ${project.version} + + + ru.entaxy.esb.system.registry.connector + connector-impl + ${project.version} + + + ru.entaxy.esb.system.core.permission + permission-api + ${project.version} + + + ru.entaxy.platform.security.jaas + entaxy-legacy-auth-api + ${project.version} + + + + ru.entaxy.esb.system.management.permission.manager + + permission-manager + ${project.version} + + + + + + org.apache.felix + maven-bundle-plugin + true + + + <_dsannotations>* + + + + + + + diff --git a/platform-backward-compat/profile-management-service-adapters/src/main/java/ru/entaxy/esb/platform/core/management/profile/adapters/AccountManagerAdapter.java b/platform-backward-compat/profile-management-service-adapters/src/main/java/ru/entaxy/esb/platform/core/management/profile/adapters/AccountManagerAdapter.java new file mode 100644 index 00000000..f4c7f3b0 --- /dev/null +++ b/platform-backward-compat/profile-management-service-adapters/src/main/java/ru/entaxy/esb/platform/core/management/profile/adapters/AccountManagerAdapter.java @@ -0,0 +1,52 @@ +/*- + * ~~~~~~licensing~~~~~~ + * profile-management-service-adapters + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.platform.core.management.profile.adapters; + +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.component.annotations.ReferenceCardinality; + +import ru.entaxy.esb.system.auth.basic.jpa.api.BasicAuthService; +import ru.entaxy.platform.core.management.profile.support.legacy.AccountManager; + +@Component(service = AccountManager.class, immediate = true) +public class AccountManagerAdapter implements AccountManager { + + @Reference(cardinality = ReferenceCardinality.MANDATORY) + BasicAuthService basicAuthService; + + @Override + public String getAccountForSystem(String systemUuid) throws Exception { + return basicAuthService.getBySystem(systemUuid).get().getLogin(); + } + + @Override + public void createAccountForSystem(String login, String password, String systemUUID, String createdBy, + String editedBy) throws Exception { + basicAuthService.saveCommon(login, password, systemUUID, createdBy, editedBy); + } + +} diff --git a/platform-backward-compat/profile-management-service-adapters/src/main/java/ru/entaxy/esb/platform/core/management/profile/adapters/ConnectorManagerAdapter.java b/platform-backward-compat/profile-management-service-adapters/src/main/java/ru/entaxy/esb/platform/core/management/profile/adapters/ConnectorManagerAdapter.java new file mode 100644 index 00000000..d72c815b --- /dev/null +++ b/platform-backward-compat/profile-management-service-adapters/src/main/java/ru/entaxy/esb/platform/core/management/profile/adapters/ConnectorManagerAdapter.java @@ -0,0 +1,135 @@ +/*- + * ~~~~~~licensing~~~~~~ + * profile-management-service-adapters + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.platform.core.management.profile.adapters; + +import java.util.Map; + +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 ru.entaxy.esb.system.connector.entity.Connector; +import ru.entaxy.esb.system.connector.impl.ConnectorService; +import ru.entaxy.esb.system.jpa.SystemService; +import ru.entaxy.esb.system.jpa.entity.System; +import ru.entaxy.esb.system.management.bundle.jpa.dto.BundleDto; +import ru.entaxy.esb.system.management.bundle.jpa.dto.BundleStatus; +import ru.entaxy.esb.system.management.connector.manager.ConnectorManager; +import ru.entaxy.esb.system.management.connector.manager.dto.ConnectorDto; + +@Component(service = ru.entaxy.platform.core.management.profile.support.legacy.ConnectorManager.class, immediate = true) +public class ConnectorManagerAdapter + implements ru.entaxy.platform.core.management.profile.support.legacy.ConnectorManager { + + @Reference(service = ConnectorManager.class, cardinality = ReferenceCardinality.MANDATORY, + collectionType = CollectionType.SERVICE) + ConnectorManager connectorManager; + + @Reference(service = SystemService.class, cardinality = ReferenceCardinality.MANDATORY, + collectionType = CollectionType.SERVICE) + SystemService systemService; + + @Reference(service = ConnectorService.class, cardinality = ReferenceCardinality.MANDATORY, + collectionType = CollectionType.SERVICE) + ConnectorService connectorService; + + @Override + public void addConnector(String idOrName, String connectorFactoryId, Map parameters) + throws Exception { + + System system = getSystemByIdOrName(idOrName); + if (system == null) + throw new IllegalArgumentException("System not found by Id or Name [" + idOrName + "]"); + ConnectorDto connectorDto = new ConnectorDto(); + connectorDto.setConnectorParams(parameters); + connectorDto.setSystemUuid(system.getUuid()); + connectorDto.setTemplateName(connectorFactoryId); + + // FIXME remove hardcoded + connectorDto.setCreatedBy("admin"); + + checkBundleResult(connectorManager.installConnector(connectorDto), BundleStatus.ACTIVE); + + } + + @Override + public void removeConnector(String idOrName, String connectorName) throws Exception { + + System system = getSystemByIdOrName(idOrName); + if (system == null) + throw new IllegalArgumentException("System not found by Id or Name [" + idOrName + "]"); + + Connector connector = connectorService.getConnectorByName(connectorName); + if (connector == null) + throw new IllegalArgumentException("Connector not found by Name [" + connectorName + "]"); + + checkBundleResult(connectorManager.uninstallConnector(connector), BundleStatus.UNINSTALL); + } + + @Override + public void startConnector(String idOrName, String connectorName) throws Exception { + + System system = getSystemByIdOrName(idOrName); + if (system == null) + throw new IllegalArgumentException("System not found by Id or Name [" + idOrName + "]"); + + Connector connector = connectorService.getConnectorByName(connectorName); + if (connector == null) + throw new IllegalArgumentException("Connector not found by Name [" + connectorName + "]"); + + checkBundleResult(connectorManager.startConnector(connector), BundleStatus.ACTIVE); + + } + + @Override + public void stopConnector(String idOrName, String connectorName) throws Exception { + + System system = getSystemByIdOrName(idOrName); + if (system == null) + throw new IllegalArgumentException("System not found by Id or Name [" + idOrName + "]"); + + Connector connector = connectorService.getConnectorByName(connectorName); + if (connector == null) + throw new IllegalArgumentException("Connector not found by Name [" + connectorName + "]"); + + checkBundleResult(connectorManager.stopConnector(connector), BundleStatus.RESOLVED); + + } + + protected System getSystemByIdOrName(String idOrName) { + System result = systemService.getByName(idOrName); + if (result == null) + result = systemService.getByUuid(idOrName); + return result; + } + + protected void checkBundleResult(BundleDto bundleDto, BundleStatus expectedStatus) throws Exception { + if ((bundleDto == null) || !expectedStatus.equals(bundleDto.getStatus())) + throw new Exception("Result bundle is null or in a wrong state"); + + } +} diff --git a/platform-backward-compat/profile-management-service-adapters/src/main/java/ru/entaxy/esb/platform/core/management/profile/adapters/PermissionManagerAdapter.java b/platform-backward-compat/profile-management-service-adapters/src/main/java/ru/entaxy/esb/platform/core/management/profile/adapters/PermissionManagerAdapter.java new file mode 100644 index 00000000..116fdbea --- /dev/null +++ b/platform-backward-compat/profile-management-service-adapters/src/main/java/ru/entaxy/esb/platform/core/management/profile/adapters/PermissionManagerAdapter.java @@ -0,0 +1,114 @@ +/*- + * ~~~~~~licensing~~~~~~ + * profile-management-service-adapters + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.platform.core.management.profile.adapters; + +import java.util.ArrayList; +import java.util.List; + +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 ru.entaxy.esb.system.core.permission.jpa.PermissionService; +import ru.entaxy.esb.system.core.permission.jpa.entity.Permission; +import ru.entaxy.esb.system.jpa.SystemService; +import ru.entaxy.esb.system.management.permission.manager.dto.PermissionDto; +import ru.entaxy.platform.core.management.profile.support.legacy.PermissionManager; + +@Component(service = PermissionManager.class, + immediate = true) +public class PermissionManagerAdapter implements PermissionManager { + + @Reference(service = ru.entaxy.esb.system.management.permission.manager.PermissionManager.class, + cardinality = ReferenceCardinality.MANDATORY, + collectionType = CollectionType.SERVICE) + ru.entaxy.esb.system.management.permission.manager.PermissionManager permissionManager; + + @Reference(service = PermissionService.class, cardinality = ReferenceCardinality.MANDATORY, + collectionType = CollectionType.SERVICE) + PermissionService permissionService; + + @Reference(service = SystemService.class, cardinality = ReferenceCardinality.MANDATORY, + collectionType = CollectionType.SERVICE) + SystemService systemService; + + @Override + public List getObjectPermissions(String objectId) throws Exception { + ru.entaxy.esb.system.jpa.entity.System system = getRequiredSystemByIdOrName(objectId); + List permissions = permissionService.getAllById(system.getId(), "system"); + long systemId = system.getId(); + List result = new ArrayList<>(); + for (Permission perm : permissions) { + if (perm.getObjectId() == systemId) { + if ("system".equals(perm.getSubjectType())) { + ru.entaxy.esb.system.jpa.entity.System s = systemService.get(Long.parseLong(perm.getSubjectId())); + if (s != null) + result.add(s.getName()); + } + } + } + return result; + } + + @Override + public List getSubjectPermissions(String subjectId) throws Exception { + ru.entaxy.esb.system.jpa.entity.System system = getRequiredSystemByIdOrName(subjectId); + List permissions = permissionService.getAllById(system.getId(), "system"); + String systemId = system.getId() + ""; + List result = new ArrayList<>(); + for (Permission perm : permissions) { + if (perm.getSubjectId().equals(systemId)) { + ru.entaxy.esb.system.jpa.entity.System s = systemService.get(perm.getObjectId()); + if (s != null) + result.add(s.getName()); + } + } + return result; + } + + @Override + public void createPermission(String objectId, String subjectId) throws Exception { + PermissionDto dto = new PermissionDto(objectId, subjectId); + permissionManager.createPermission(dto); + } + + protected ru.entaxy.esb.system.jpa.entity.System getSystemByIdOrName(String idOrName) { + ru.entaxy.esb.system.jpa.entity.System result = systemService.getByName(idOrName); + if (result == null) + result = systemService.getByUuid(idOrName); + return result; + } + + protected ru.entaxy.esb.system.jpa.entity.System getRequiredSystemByIdOrName(String idOrName) throws Exception { + ru.entaxy.esb.system.jpa.entity.System result = systemService.getByName(idOrName); + if (result == null) + result = systemService.getByUuid(idOrName); + if (result == null) + throw new IllegalArgumentException("System not found by Id or Name: [" + idOrName + "]"); + return result; + } +} diff --git a/platform-backward-compat/profile-management-service-adapters/src/main/java/ru/entaxy/esb/platform/core/management/profile/adapters/ProfileManagerAdapter.java b/platform-backward-compat/profile-management-service-adapters/src/main/java/ru/entaxy/esb/platform/core/management/profile/adapters/ProfileManagerAdapter.java new file mode 100644 index 00000000..0eed1897 --- /dev/null +++ b/platform-backward-compat/profile-management-service-adapters/src/main/java/ru/entaxy/esb/platform/core/management/profile/adapters/ProfileManagerAdapter.java @@ -0,0 +1,112 @@ +/*- + * ~~~~~~licensing~~~~~~ + * profile-management-service-adapters + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.platform.core.management.profile.adapters; + +import javax.naming.OperationNotSupportedException; + +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 ru.entaxy.esb.system.jpa.SystemService; +import ru.entaxy.esb.system.jpa.entity.System; +import ru.entaxy.esb.system.management.profile.manager.ProfileManager; +import ru.entaxy.esb.system.management.profile.manager.dto.ProfileDto; +import ru.entaxy.esb.system.management.profile.manager.mapper.ProfileMapper; + +@Component( + service = {ru.entaxy.platform.core.management.profile.support.legacy.ProfileManager.class}, immediate = true) +public class ProfileManagerAdapter implements ru.entaxy.platform.core.management.profile.support.legacy.ProfileManager { + + @Reference(service = ProfileManager.class, cardinality = ReferenceCardinality.MANDATORY, + collectionType = CollectionType.SERVICE) + ProfileManager profileManager; + + @Reference(service = ProfileMapper.class, cardinality = ReferenceCardinality.MANDATORY, + collectionType = CollectionType.SERVICE) + ProfileMapper profileMapper; + + @Reference(service = SystemService.class, cardinality = ReferenceCardinality.MANDATORY, + collectionType = CollectionType.SERVICE) + SystemService systemService; + + @Override + public void createProfile(String id, String name, String description) throws Exception { + ProfileDto dto = new ProfileDto(); + dto.setUuid(id); + dto.setName(name); + dto.setDescription(description); + + // TODO get the user name from JMX, + // need to investigate, how + dto.setCreatedBy("admin"); + + profileManager.installProfile(dto); + } + + @Override + public void startProfile(String idOrName) throws Exception { + ProfileDto dto = getProfileForSystem(getSystemByIdOrName(idOrName)); + if (dto == null) + throw new IllegalArgumentException("System/profile not found for [" + idOrName + "]"); + profileManager.startProfile(dto); + } + + @Override + public void stopProfile(String idOrName) throws Exception { + ProfileDto dto = getProfileForSystem(getSystemByIdOrName(idOrName)); + if (dto == null) + throw new IllegalArgumentException("System/profile not found for [" + idOrName + "]"); + profileManager.stopProfile(dto); + } + + @Override + public void uninstallProfile(String idOrName) throws Exception { + ProfileDto dto = getProfileForSystem(getSystemByIdOrName(idOrName)); + if (dto == null) + throw new IllegalArgumentException("System/profile not found for [" + idOrName + "]"); + profileManager.uninstallProfile(dto); + } + + @Override + public String getProfileConfig(String idOrName) throws Exception { + throw new OperationNotSupportedException(); + } + + protected System getSystemByIdOrName(String idOrName) { + System result = systemService.getByName(idOrName); + if (result == null) + result = systemService.getByUuid(idOrName); + return result; + } + + protected ProfileDto getProfileForSystem(System system) { + if (system == null) + return null; + return profileMapper.toProfileDto(system); + } +} diff --git a/platform-backward-compat/profile-management-service-adapters/src/main/java/ru/entaxy/esb/platform/core/management/profile/adapters/SystemManagerAdapter.java b/platform-backward-compat/profile-management-service-adapters/src/main/java/ru/entaxy/esb/platform/core/management/profile/adapters/SystemManagerAdapter.java new file mode 100644 index 00000000..07f42139 --- /dev/null +++ b/platform-backward-compat/profile-management-service-adapters/src/main/java/ru/entaxy/esb/platform/core/management/profile/adapters/SystemManagerAdapter.java @@ -0,0 +1,46 @@ +/*- + * ~~~~~~licensing~~~~~~ + * profile-management-service-adapters + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.platform.core.management.profile.adapters; + +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.component.annotations.ReferenceCardinality; + +import ru.entaxy.esb.system.jpa.SystemService; +import ru.entaxy.platform.core.management.profile.support.legacy.SystemManager; + +@Component(service = SystemManager.class, immediate = true) +public class SystemManagerAdapter implements SystemManager { + + @Reference(cardinality = ReferenceCardinality.MANDATORY) + SystemService systemService; + + @Override + public String getUUIDbyName(String name) throws Exception { + return systemService.getByName(name).getUuid(); + } + +} diff --git a/platform-backward-compat/profile-storage/LICENSE.txt b/platform-backward-compat/profile-storage/LICENSE.txt new file mode 100644 index 00000000..4ae94b75 --- /dev/null +++ b/platform-backward-compat/profile-storage/LICENSE.txt @@ -0,0 +1,175 @@ + ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ + +Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой) +версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего +Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН +7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова, +д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу +https://www.emdev.ru/about (далее - Компания). + +Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями» +(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения, +Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в +настоящем документе, в противном случае, он должен не использовать или не получать доступ +к Программному обеспечению. + + 1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ + +a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии +или редакции, исключительные права на которую принадлежат Правообладателю. +b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные +права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ +для ЭВМ № 2021610848 от 19.01.2021 года. +c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта +https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО. +d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также +личные неимущественные права авторов произведений на результат интеллектуальной деятельности. +e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование +ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка +включает предоставление Пользователю неисключительного права использования ПО, в том числе +получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение +патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается +Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается +для каждого Пользователя индивидуально в Сертификате. +f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром), +подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное +обеспечение в ограниченном объёме и на определённый период времени. +g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО, +предоставленных Пользователю согласно условиям Подписки. +h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного +обеспечения. +i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий +из одного или нескольких файлов, который может быть прочтён человеком. +j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля +программы, полученный в результате обработки исходного кода, еще не связанный в полную программу. +Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый +продукт. +k) Некоммерческое использование – индивидуальное личное использование Пользователем программного +обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации +возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая +выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения. + + 2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ + +2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного +обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом +воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения +в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ. +2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит +неисключительный характер. +2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию, +лицензия на ограниченное использование Программного обеспечения. +2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования +имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан +обратиться в службу поддержки Правообладателя по адресу: https://entaxy.ru/ для изменения +вида лицензии с Базовой бесплатной версии на Подписки. +2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для +пробного использования программного обеспечения – не ограничен. +2.6. Использование Пользователем настоящего программного обеспечения в целях разработки, +модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю, +без разрешения Правообладателя не допускается. + + 3. АВТОРСКОЕ ПРАВО. + +3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение +и любые его копии принадлежат Правообладателю. +3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента, +к которому можно получить доступ с помощью Программного обеспечения, является собственностью +соответствующего владельца контента и защищается применимым законодательством об авторском +праве или другими законами и договорами об интеллектуальной собственности. +3.3. Условия использования Программного обеспечения. +Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь +придерживается следующих условий: +3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять +какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании +Программного обеспечения или на нем. +3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать, +расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать +Программное обеспечение. +3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования +ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне. +3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено +использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам. + + 4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС» + +4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю +на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с +использованием Пользователем: +4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в +Программное обеспечение; +4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями +настоящего соглашения; +4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием, +или данными, не предоставленными Пользователю Правообладателем; +4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем. + + +5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ +ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ +И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ +ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ +И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ +ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО. + + 6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ. +НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ +ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ, +ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ; +ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ. +ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ +ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ; +КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ +ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ. + + 7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ: +Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия +(включая, но не ограничиваясь) по: +-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код) + Программного обеспечения; +-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный +код Программного обеспечения, за исключением тех изменений, которые вносятся средствами, +включёнными в Программное обеспечение и описанными непосредственно в документации к нему; +-созданию условий для использования Программного обеспечения лицами, не имеющими прав на +использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство +третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа +к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку; +-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию). + + 8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА. + +8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из +лицензионных продуктов, используемых на законных основаниях, а +именно https://entaxy.ru/libs/licenses/root-aggregated.deps. +8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть +совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения. +8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться +Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения, +содержащих все изменения и дополнения программного обеспечения. + + 9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ. + +9.1. Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым +программным обеспечением. +9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно +с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм +«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public. +9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий +пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя, +прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер +ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства +Российской Федерации. + + 10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ. + +10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет +право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб, +недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий +пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере +2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения +исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy). +10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое +законодательство – Российской Федерации. +10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным, +остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать +исполнять свои обязанности в соответствии с этими положениями. diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-storage/pom.xml b/platform-backward-compat/profile-storage/pom.xml similarity index 58% rename from platform/runtime/core/objects-implementations/profile-implementation/profile-storage/pom.xml rename to platform-backward-compat/profile-storage/pom.xml index b38d737e..20e4ef83 100644 --- a/platform/runtime/core/objects-implementations/profile-implementation/profile-storage/pom.xml +++ b/platform-backward-compat/profile-storage/pom.xml @@ -1,15 +1,17 @@ 4.0.0 - - ru.entaxy.esb.platform.runtime.core.objects-implementations - profile-implementation - 1.10.0 - - ru.entaxy.esb.platform.runtime.core.objects-implementations.profile-implementation + + + ru.entaxy.platform + platform-backward-compat + 1.11.0 + + + ru.entaxy.platform.backward-compat profile-storage bundle - ENTAXY :: PLATFORM :: CORE :: OBJECTS IMPLEMENTATIONS :: PROFILE :: STORAGE - ENTAXY :: PLATFORM :: CORE :: OBJECTS IMPLEMENTATIONS :: PROFILE :: STORAGE + ENTAXY :: PLATFORM :: BACKWARD COMPATIBILITY :: PROFILE :: STORAGE + ENTAXY :: PLATFORM :: BACKWARD COMPATIBILITY :: PROFILE :: STORAGE ru.entaxy.platform.base.objects.profile.storage diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-storage/src/main/java/ru/entaxy/platform/base/objects/profile/storage/SystemObjectStorage.java b/platform-backward-compat/profile-storage/src/main/java/ru/entaxy/platform/base/objects/profile/storage/SystemObjectStorage.java similarity index 99% rename from platform/runtime/core/objects-implementations/profile-implementation/profile-storage/src/main/java/ru/entaxy/platform/base/objects/profile/storage/SystemObjectStorage.java rename to platform-backward-compat/profile-storage/src/main/java/ru/entaxy/platform/base/objects/profile/storage/SystemObjectStorage.java index 57169300..ec8799ef 100644 --- a/platform/runtime/core/objects-implementations/profile-implementation/profile-storage/src/main/java/ru/entaxy/platform/base/objects/profile/storage/SystemObjectStorage.java +++ b/platform-backward-compat/profile-storage/src/main/java/ru/entaxy/platform/base/objects/profile/storage/SystemObjectStorage.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2023 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform-backward-compat/src/main/features/features.xml b/platform-backward-compat/src/main/features/features.xml new file mode 100644 index 00000000..365dac15 --- /dev/null +++ b/platform-backward-compat/src/main/features/features.xml @@ -0,0 +1,153 @@ + + + + + + + mvn:ru.entaxy.esb/platform/${project.version}/xml/features + + + + + entaxy-platform + + entaxy-backward-compatibility-resources + + entaxy-bc-system + + entaxy-bc-api + + entaxy-bc-impl + + entaxy-bc-management + + entaxy-bc-modules + + + + + + + mvn:ru.entaxy.platform/platform-backward-compat/${project.version}/script/entaxy.bc.shell + + + + + + entaxy-platform + + mvn:ru.entaxy.esb.system/system-parent/${project.version}/cfg/ru.entaxy.esb + + + mvn:ru.entaxy.esb.system/system-parent/${project.version}/cfg/org.apache.felix.hc.generalchecks.BundlesStartedCheck-system + + mvn:ru.entaxy.esb.system.commons/system-commons/${project.version} + mvn:ru.entaxy.esb.system.core/template/${project.version} + + + + + entaxy-bc-system + + mvn:ru.entaxy.platform.security.jaas/entaxy-legacy-auth-api/${project.version} + mvn:ru.entaxy.esb.system.registry.systems/system-api/${project.version} + mvn:ru.entaxy.esb.system.registry.connector/connector-api/${project.version} + + mvn:ru.entaxy.esb.system.core.permission/permission-api/${project.version} + + + + + + + entaxy-bc-api + + mvn:ru.entaxy.platform.security.jaas/entaxy-legacy-auth/${project.version} + + mvn:ru.entaxy.esb.system.registry.systems/system-impl/${project.version} + + mvn:ru.entaxy.esb.system.registry.connector/connector-impl/${project.version} + + mvn:ru.entaxy.esb.system.core.permission/permission-common/${project.version} + mvn:ru.entaxy.esb.system.core.permission/permission-handler/${project.version} + mvn:ru.entaxy.esb.system.core.permission/permission-component/${project.version} + mvn:ru.entaxy.esb.system.core.permission/permission-impl/${project.version} + + + + + + + + entaxy-bc-api + entaxy-bc-impl + + mvn:ru.entaxy.platform.backward-compat/blueprint-generator-service/${project.version} + + mvn:ru.entaxy.esb.system.core.dispatcher/dispatcher/${project.version} + mvn:ru.entaxy.esb.system.management.bundle.jpa/bundle-service/${project.version} + + mvn:ru.entaxy.esb.system.management.bundle.manager/bundle-manager/${project.version} + mvn:ru.entaxy.esb.system.management.connector.manager/connector-manager/${project.version} + + mvn:ru.entaxy.esb.system.management.profile.manager/profile-manager/${project.version} + mvn:ru.entaxy.esb.system.management.bridge.profile.manager/bridge-profile-manager/${project.version} + mvn:ru.entaxy.esb.system.management.route.manager/route-manager/${project.version} + + mvn:ru.entaxy.esb.system.management.permission.manager/permission-manager/${project.version} + mvn:ru.entaxy.esb.system.auth.basic.htpasswd/htpasswd/${project.version} + + mvn:ru.entaxy.esb.system.management/system-management-api/${project.version} + + + + + + mvn:ru.entaxy.platform.backward-compat/profile-management-service-adapters/${project.version} + mvn:ru.entaxy.platform.backward-compat/profile-storage/${project.version} + mvn:ru.entaxy.platform.backward-compat/connector-storage/${project.version} + + + diff --git a/platform-backward-compat/src/main/scripts/entaxy.bc.shell.script b/platform-backward-compat/src/main/scripts/entaxy.bc.shell.script new file mode 100644 index 00000000..4544abbe --- /dev/null +++ b/platform-backward-compat/src/main/scripts/entaxy.bc.shell.script @@ -0,0 +1,60 @@ +entaxy:back-comp = { + + service = (service:get org.apache.karaf.features.FeaturesService) + + if { $1'' equals "install" } { + + # check repo + _repo = (feature:repo-list | grep ru.entaxy.platform/platform-backward-compat) + _repo_length = ($_repo length) + if { $_repo_length'' equals "0" } { + echo "Installing feature repo ru.entaxy.platform/platform-backward-compat/${project.version}" + feature:repo-add mvn:ru.entaxy.platform/platform-backward-compat/${project.version}/xml/features + } + + _platform_feature = ($service getFeature entaxy-platform) + _feature_id = $_platform_feature getId + _status = ($service getState $_feature_id) toString + + if { $_status equals "Uninstalled" } { + echo "Entaxy Platform not found, installation aborted" + } else { + _bc_feature = ($service getFeature entaxy-backward-compatibility-modules) + _feature_id = $_bc_feature getId + _status = ($service getState $_feature_id) toString + + if { $_status equals "Uninstalled" } { + echo "Installing feature 'entaxy-backward-compatibility-modules'" + feature:install -r -v entaxy-backward-compatibility-modules + echo + echo " --> DONE" + } else { + echo "Feature 'entaxy-backward-compatibility-modules' is already installed" + } + + } + + } else { + if { $1'' equals "uninstall" } { + echo "Uninstalling feature 'entaxy-backward-compatibility-modules'" + feature:uninstall -r -v entaxy-backward-compatibility-modules + echo + echo " --> DONE" + } else { + + _bc_feature = ($service getFeature entaxy-backward-compatibility-modules) + _feature_id = $_bc_feature getId + _status = ($service getState $_feature_id) toString + + if { $_status equals "Uninstalled" } { + echo + echo " --> UNINSTALLED" + } else { + echo + echo " --> INSTALLED" + } + + } + + } +} \ No newline at end of file diff --git a/platform-backward-compat/src/main/scripts/generated/fragments.xml b/platform-backward-compat/src/main/scripts/generated/fragments.xml new file mode 100644 index 00000000..75acdd57 --- /dev/null +++ b/platform-backward-compat/src/main/scripts/generated/fragments.xml @@ -0,0 +1,5 @@ + + + mvn:ru.entaxy.platform/platform-backward-compat/1.11.0/script/entaxy.bc.shell + + \ No newline at end of file diff --git a/platform-provided-modules/LICENSE.txt b/platform-provided-modules/LICENSE.txt new file mode 100644 index 00000000..4ae94b75 --- /dev/null +++ b/platform-provided-modules/LICENSE.txt @@ -0,0 +1,175 @@ + ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ + +Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой) +версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего +Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН +7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова, +д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу +https://www.emdev.ru/about (далее - Компания). + +Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями» +(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения, +Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в +настоящем документе, в противном случае, он должен не использовать или не получать доступ +к Программному обеспечению. + + 1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ + +a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии +или редакции, исключительные права на которую принадлежат Правообладателю. +b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные +права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ +для ЭВМ № 2021610848 от 19.01.2021 года. +c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта +https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО. +d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также +личные неимущественные права авторов произведений на результат интеллектуальной деятельности. +e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование +ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка +включает предоставление Пользователю неисключительного права использования ПО, в том числе +получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение +патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается +Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается +для каждого Пользователя индивидуально в Сертификате. +f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром), +подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное +обеспечение в ограниченном объёме и на определённый период времени. +g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО, +предоставленных Пользователю согласно условиям Подписки. +h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного +обеспечения. +i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий +из одного или нескольких файлов, который может быть прочтён человеком. +j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля +программы, полученный в результате обработки исходного кода, еще не связанный в полную программу. +Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый +продукт. +k) Некоммерческое использование – индивидуальное личное использование Пользователем программного +обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации +возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая +выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения. + + 2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ + +2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного +обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом +воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения +в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ. +2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит +неисключительный характер. +2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию, +лицензия на ограниченное использование Программного обеспечения. +2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования +имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан +обратиться в службу поддержки Правообладателя по адресу: https://entaxy.ru/ для изменения +вида лицензии с Базовой бесплатной версии на Подписки. +2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для +пробного использования программного обеспечения – не ограничен. +2.6. Использование Пользователем настоящего программного обеспечения в целях разработки, +модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю, +без разрешения Правообладателя не допускается. + + 3. АВТОРСКОЕ ПРАВО. + +3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение +и любые его копии принадлежат Правообладателю. +3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента, +к которому можно получить доступ с помощью Программного обеспечения, является собственностью +соответствующего владельца контента и защищается применимым законодательством об авторском +праве или другими законами и договорами об интеллектуальной собственности. +3.3. Условия использования Программного обеспечения. +Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь +придерживается следующих условий: +3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять +какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании +Программного обеспечения или на нем. +3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать, +расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать +Программное обеспечение. +3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования +ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне. +3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено +использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам. + + 4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС» + +4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю +на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с +использованием Пользователем: +4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в +Программное обеспечение; +4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями +настоящего соглашения; +4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием, +или данными, не предоставленными Пользователю Правообладателем; +4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем. + + +5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ +ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ +И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ +ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ +И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ +ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО. + + 6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ. +НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ +ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ, +ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ; +ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ. +ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ +ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ; +КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ +ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ. + + 7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ: +Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия +(включая, но не ограничиваясь) по: +-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код) + Программного обеспечения; +-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный +код Программного обеспечения, за исключением тех изменений, которые вносятся средствами, +включёнными в Программное обеспечение и описанными непосредственно в документации к нему; +-созданию условий для использования Программного обеспечения лицами, не имеющими прав на +использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство +третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа +к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку; +-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию). + + 8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА. + +8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из +лицензионных продуктов, используемых на законных основаниях, а +именно https://entaxy.ru/libs/licenses/root-aggregated.deps. +8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть +совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения. +8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться +Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения, +содержащих все изменения и дополнения программного обеспечения. + + 9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ. + +9.1. Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым +программным обеспечением. +9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно +с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм +«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public. +9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий +пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя, +прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер +ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства +Российской Федерации. + + 10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ. + +10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет +право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб, +недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий +пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере +2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения +исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy). +10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое +законодательство – Российской Федерации. +10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным, +остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать +исполнять свои обязанности в соответствии с этими положениями. diff --git a/platform-provided-modules/pom.xml b/platform-provided-modules/pom.xml new file mode 100644 index 00000000..de9411b1 --- /dev/null +++ b/platform-provided-modules/pom.xml @@ -0,0 +1,91 @@ + + 4.0.0 + + ru.entaxy.esb + root + 1.11.0 + + ru.entaxy + platform-provided-modules + pom + ENTAXY :: PLATFORM PROVIDED MODULES + ENTAXY :: PLATFORM PROVIDED MODULES + + + + + + src/main/provided + true + ${project.build.directory}/provided + + + src/main/support + true + ${project.build.directory}/support + + + + + + org.codehaus.mojo + build-helper-maven-plugin + ${build-helper-maven-plugin.version} + + + attach-provided + + attach-artifact + + + + + + + ${project.build.directory}/provided/ui.xml + + xml + ui + + + ${project.build.directory}/support/ui/collect-ui-features.xslt + + xslt + collect-ui-features + + + ${project.build.directory}/support/ui/process-ui-modules.xslt + + xslt + process-ui-modules + + + + + + maven-install-plugin + + + install-provided-modules-data + package + + install-file + + + ${platform.provided.groupId} + ${platform.provided.data.artifactId} + ${project.version} + ui + xml + false + ${project.build.directory}/provided/ui.xml + + + + + + + + + diff --git a/platform-provided-modules/src/main/provided/ui.xml b/platform-provided-modules/src/main/provided/ui.xml new file mode 100644 index 00000000..24fec2b1 --- /dev/null +++ b/platform-provided-modules/src/main/provided/ui.xml @@ -0,0 +1,27 @@ + + + diff --git a/platform-provided-modules/src/main/support/ui/collect-ui-features.xslt b/platform-provided-modules/src/main/support/ui/collect-ui-features.xslt new file mode 100644 index 00000000..2ba9e2f3 --- /dev/null +++ b/platform-provided-modules/src/main/support/ui/collect-ui-features.xslt @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + ]]>]]> + + + + + + + + + + + + diff --git a/platform-provided-modules/src/main/support/ui/process-ui-modules.xslt b/platform-provided-modules/src/main/support/ui/process-ui-modules.xslt new file mode 100644 index 00000000..de3621b5 --- /dev/null +++ b/platform-provided-modules/src/main/support/ui/process-ui-modules.xslt @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/platform/integration/LICENSE.txt b/platform/integration/LICENSE.txt new file mode 100644 index 00000000..4ae94b75 --- /dev/null +++ b/platform/integration/LICENSE.txt @@ -0,0 +1,175 @@ + ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ + +Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой) +версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего +Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН +7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова, +д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу +https://www.emdev.ru/about (далее - Компания). + +Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями» +(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения, +Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в +настоящем документе, в противном случае, он должен не использовать или не получать доступ +к Программному обеспечению. + + 1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ + +a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии +или редакции, исключительные права на которую принадлежат Правообладателю. +b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные +права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ +для ЭВМ № 2021610848 от 19.01.2021 года. +c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта +https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО. +d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также +личные неимущественные права авторов произведений на результат интеллектуальной деятельности. +e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование +ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка +включает предоставление Пользователю неисключительного права использования ПО, в том числе +получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение +патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается +Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается +для каждого Пользователя индивидуально в Сертификате. +f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром), +подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное +обеспечение в ограниченном объёме и на определённый период времени. +g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО, +предоставленных Пользователю согласно условиям Подписки. +h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного +обеспечения. +i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий +из одного или нескольких файлов, который может быть прочтён человеком. +j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля +программы, полученный в результате обработки исходного кода, еще не связанный в полную программу. +Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый +продукт. +k) Некоммерческое использование – индивидуальное личное использование Пользователем программного +обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации +возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая +выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения. + + 2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ + +2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного +обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом +воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения +в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ. +2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит +неисключительный характер. +2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию, +лицензия на ограниченное использование Программного обеспечения. +2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования +имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан +обратиться в службу поддержки Правообладателя по адресу: https://entaxy.ru/ для изменения +вида лицензии с Базовой бесплатной версии на Подписки. +2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для +пробного использования программного обеспечения – не ограничен. +2.6. Использование Пользователем настоящего программного обеспечения в целях разработки, +модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю, +без разрешения Правообладателя не допускается. + + 3. АВТОРСКОЕ ПРАВО. + +3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение +и любые его копии принадлежат Правообладателю. +3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента, +к которому можно получить доступ с помощью Программного обеспечения, является собственностью +соответствующего владельца контента и защищается применимым законодательством об авторском +праве или другими законами и договорами об интеллектуальной собственности. +3.3. Условия использования Программного обеспечения. +Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь +придерживается следующих условий: +3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять +какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании +Программного обеспечения или на нем. +3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать, +расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать +Программное обеспечение. +3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования +ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне. +3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено +использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам. + + 4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС» + +4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю +на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с +использованием Пользователем: +4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в +Программное обеспечение; +4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями +настоящего соглашения; +4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием, +или данными, не предоставленными Пользователю Правообладателем; +4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем. + + +5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ +ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ +И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ +ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ +И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ +ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО. + + 6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ. +НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ +ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ, +ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ; +ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ. +ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ +ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ; +КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ +ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ. + + 7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ: +Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия +(включая, но не ограничиваясь) по: +-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код) + Программного обеспечения; +-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный +код Программного обеспечения, за исключением тех изменений, которые вносятся средствами, +включёнными в Программное обеспечение и описанными непосредственно в документации к нему; +-созданию условий для использования Программного обеспечения лицами, не имеющими прав на +использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство +третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа +к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку; +-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию). + + 8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА. + +8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из +лицензионных продуктов, используемых на законных основаниях, а +именно https://entaxy.ru/libs/licenses/root-aggregated.deps. +8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть +совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения. +8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться +Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения, +содержащих все изменения и дополнения программного обеспечения. + + 9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ. + +9.1. Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым +программным обеспечением. +9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно +с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм +«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public. +9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий +пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя, +прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер +ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства +Российской Федерации. + + 10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ. + +10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет +право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб, +недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий +пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере +2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения +исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy). +10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое +законодательство – Российской Федерации. +10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным, +остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать +исполнять свои обязанности в соответствии с этими положениями. diff --git a/platform/integration/applications/LICENSE.txt b/platform/integration/applications/LICENSE.txt new file mode 100644 index 00000000..4ae94b75 --- /dev/null +++ b/platform/integration/applications/LICENSE.txt @@ -0,0 +1,175 @@ + ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ + +Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой) +версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего +Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН +7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова, +д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу +https://www.emdev.ru/about (далее - Компания). + +Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями» +(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения, +Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в +настоящем документе, в противном случае, он должен не использовать или не получать доступ +к Программному обеспечению. + + 1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ + +a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии +или редакции, исключительные права на которую принадлежат Правообладателю. +b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные +права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ +для ЭВМ № 2021610848 от 19.01.2021 года. +c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта +https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО. +d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также +личные неимущественные права авторов произведений на результат интеллектуальной деятельности. +e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование +ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка +включает предоставление Пользователю неисключительного права использования ПО, в том числе +получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение +патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается +Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается +для каждого Пользователя индивидуально в Сертификате. +f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром), +подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное +обеспечение в ограниченном объёме и на определённый период времени. +g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО, +предоставленных Пользователю согласно условиям Подписки. +h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного +обеспечения. +i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий +из одного или нескольких файлов, который может быть прочтён человеком. +j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля +программы, полученный в результате обработки исходного кода, еще не связанный в полную программу. +Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый +продукт. +k) Некоммерческое использование – индивидуальное личное использование Пользователем программного +обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации +возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая +выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения. + + 2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ + +2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного +обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом +воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения +в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ. +2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит +неисключительный характер. +2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию, +лицензия на ограниченное использование Программного обеспечения. +2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования +имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан +обратиться в службу поддержки Правообладателя по адресу: https://entaxy.ru/ для изменения +вида лицензии с Базовой бесплатной версии на Подписки. +2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для +пробного использования программного обеспечения – не ограничен. +2.6. Использование Пользователем настоящего программного обеспечения в целях разработки, +модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю, +без разрешения Правообладателя не допускается. + + 3. АВТОРСКОЕ ПРАВО. + +3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение +и любые его копии принадлежат Правообладателю. +3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента, +к которому можно получить доступ с помощью Программного обеспечения, является собственностью +соответствующего владельца контента и защищается применимым законодательством об авторском +праве или другими законами и договорами об интеллектуальной собственности. +3.3. Условия использования Программного обеспечения. +Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь +придерживается следующих условий: +3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять +какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании +Программного обеспечения или на нем. +3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать, +расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать +Программное обеспечение. +3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования +ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне. +3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено +использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам. + + 4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС» + +4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю +на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с +использованием Пользователем: +4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в +Программное обеспечение; +4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями +настоящего соглашения; +4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием, +или данными, не предоставленными Пользователю Правообладателем; +4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем. + + +5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ +ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ +И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ +ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ +И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ +ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО. + + 6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ. +НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ +ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ, +ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ; +ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ. +ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ +ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ; +КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ +ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ. + + 7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ: +Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия +(включая, но не ограничиваясь) по: +-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код) + Программного обеспечения; +-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный +код Программного обеспечения, за исключением тех изменений, которые вносятся средствами, +включёнными в Программное обеспечение и описанными непосредственно в документации к нему; +-созданию условий для использования Программного обеспечения лицами, не имеющими прав на +использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство +третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа +к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку; +-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию). + + 8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА. + +8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из +лицензионных продуктов, используемых на законных основаниях, а +именно https://entaxy.ru/libs/licenses/root-aggregated.deps. +8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть +совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения. +8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться +Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения, +содержащих все изменения и дополнения программного обеспечения. + + 9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ. + +9.1. Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым +программным обеспечением. +9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно +с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм +«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public. +9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий +пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя, +прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер +ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства +Российской Федерации. + + 10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ. + +10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет +право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб, +недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий +пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере +2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения +исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy). +10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое +законодательство – Российской Федерации. +10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным, +остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать +исполнять свои обязанности в соответствии с этими положениями. diff --git a/platform/integration/applications/application-api/LICENSE.txt b/platform/integration/applications/application-api/LICENSE.txt new file mode 100644 index 00000000..4ae94b75 --- /dev/null +++ b/platform/integration/applications/application-api/LICENSE.txt @@ -0,0 +1,175 @@ + ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ + +Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой) +версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего +Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН +7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова, +д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу +https://www.emdev.ru/about (далее - Компания). + +Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями» +(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения, +Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в +настоящем документе, в противном случае, он должен не использовать или не получать доступ +к Программному обеспечению. + + 1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ + +a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии +или редакции, исключительные права на которую принадлежат Правообладателю. +b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные +права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ +для ЭВМ № 2021610848 от 19.01.2021 года. +c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта +https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО. +d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также +личные неимущественные права авторов произведений на результат интеллектуальной деятельности. +e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование +ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка +включает предоставление Пользователю неисключительного права использования ПО, в том числе +получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение +патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается +Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается +для каждого Пользователя индивидуально в Сертификате. +f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром), +подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное +обеспечение в ограниченном объёме и на определённый период времени. +g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО, +предоставленных Пользователю согласно условиям Подписки. +h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного +обеспечения. +i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий +из одного или нескольких файлов, который может быть прочтён человеком. +j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля +программы, полученный в результате обработки исходного кода, еще не связанный в полную программу. +Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый +продукт. +k) Некоммерческое использование – индивидуальное личное использование Пользователем программного +обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации +возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая +выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения. + + 2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ + +2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного +обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом +воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения +в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ. +2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит +неисключительный характер. +2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию, +лицензия на ограниченное использование Программного обеспечения. +2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования +имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан +обратиться в службу поддержки Правообладателя по адресу: https://entaxy.ru/ для изменения +вида лицензии с Базовой бесплатной версии на Подписки. +2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для +пробного использования программного обеспечения – не ограничен. +2.6. Использование Пользователем настоящего программного обеспечения в целях разработки, +модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю, +без разрешения Правообладателя не допускается. + + 3. АВТОРСКОЕ ПРАВО. + +3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение +и любые его копии принадлежат Правообладателю. +3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента, +к которому можно получить доступ с помощью Программного обеспечения, является собственностью +соответствующего владельца контента и защищается применимым законодательством об авторском +праве или другими законами и договорами об интеллектуальной собственности. +3.3. Условия использования Программного обеспечения. +Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь +придерживается следующих условий: +3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять +какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании +Программного обеспечения или на нем. +3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать, +расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать +Программное обеспечение. +3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования +ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне. +3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено +использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам. + + 4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС» + +4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю +на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с +использованием Пользователем: +4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в +Программное обеспечение; +4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями +настоящего соглашения; +4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием, +или данными, не предоставленными Пользователю Правообладателем; +4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем. + + +5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ +ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ +И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ +ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ +И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ +ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО. + + 6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ. +НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ +ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ, +ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ; +ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ. +ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ +ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ; +КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ +ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ. + + 7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ: +Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия +(включая, но не ограничиваясь) по: +-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код) + Программного обеспечения; +-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный +код Программного обеспечения, за исключением тех изменений, которые вносятся средствами, +включёнными в Программное обеспечение и описанными непосредственно в документации к нему; +-созданию условий для использования Программного обеспечения лицами, не имеющими прав на +использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство +третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа +к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку; +-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию). + + 8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА. + +8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из +лицензионных продуктов, используемых на законных основаниях, а +именно https://entaxy.ru/libs/licenses/root-aggregated.deps. +8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть +совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения. +8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться +Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения, +содержащих все изменения и дополнения программного обеспечения. + + 9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ. + +9.1. Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым +программным обеспечением. +9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно +с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм +«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public. +9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий +пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя, +прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер +ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства +Российской Федерации. + + 10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ. + +10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет +право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб, +недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий +пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере +2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения +исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy). +10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое +законодательство – Российской Федерации. +10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным, +остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать +исполнять свои обязанности в соответствии с этими положениями. diff --git a/platform/integration/applications/application-api/pom.xml b/platform/integration/applications/application-api/pom.xml new file mode 100644 index 00000000..b4d4daa9 --- /dev/null +++ b/platform/integration/applications/application-api/pom.xml @@ -0,0 +1,43 @@ + + 4.0.0 + + ru.entaxy.platform.integration + applications + 1.11.0 + + ru.entaxy.platform.integration.applications + application-api + bundle + ENTAXY :: PLATFORM :: INTEGRATION :: APPLICATIONS :: API + ENTAXY :: PLATFORM :: INTEGRATION :: APPLICATIONS :: API + + + + ru.entaxy.platform.integration.applications, + ru.entaxy.platform.integration.applications.descriptor, + ru.entaxy.platform.integration.applications.exceptions, + ru.entaxy.platform.integration.applications.item.project, + ru.entaxy.platform.integration.applications.storage, + ru.entaxy.platform.integration.applications.utils + + + + + + ru.entaxy.esb.platform.runtime.base.resources + resources-api + ${project.version} + + + ru.entaxy.esb.platform.runtime.core + object-runtime-core + ${project.version} + + + ru.entaxy.esb.platform.runtime.core + artifact-management + ${project.version} + + + + diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationContent.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationContent.java new file mode 100644 index 00000000..76011479 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationContent.java @@ -0,0 +1,48 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications; + +import java.util.List; +import java.util.stream.Collectors; + +import ru.entaxy.platform.integration.applications.descriptor.ApplicationDescriptor; + +public interface ApplicationContent { + + ApplicationDescriptor getDescriptor(); + + List getItems(); + + default List getEditables() { + return getItems().stream().filter(item -> item.isEditable()).collect(Collectors.toList()); + }; + + default List getRevisionables() { + return getItems().stream().filter(item -> item.isRevisionable()).collect(Collectors.toList()); + }; + + List getResources(); +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationItem.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationItem.java new file mode 100644 index 00000000..71622101 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationItem.java @@ -0,0 +1,46 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications; + +import java.io.InputStream; + +public interface ApplicationItem { + + InputStream getInputStream(); + + void update(InputStream inputStream) throws Exception; + + boolean isEditable(); + + boolean isRevisionable(); + + String getLocation(); + + EntaxyApplication.ITEM_TYPE getType(); + + String getId(); + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationManager.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationManager.java new file mode 100644 index 00000000..edbde410 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationManager.java @@ -0,0 +1,139 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import ru.entaxy.platform.integration.applications.exceptions.ApplicationException; +import ru.entaxy.platform.integration.applications.exceptions.ProjectAlreadyExistsException; +import ru.entaxy.platform.integration.applications.exceptions.ProjectException; +import ru.entaxy.platform.integration.applications.exceptions.StorageException; +import ru.entaxy.platform.integration.applications.exceptions.StorageNotEnabledException; +import ru.entaxy.platform.integration.applications.exceptions.StorageNotFoundException; +import ru.entaxy.platform.integration.applications.exceptions.ProjectVersionException; + +public interface ApplicationManager { + + // storages + + ApplicationStorage getStorage(String storageName); + + default List getActiveStorages() { + return getStorages(true); + }; + + default List getStorages(boolean enabledOnly) { + if (!enabledOnly) + return getAllStorages(); + return getAllStorages().stream().filter(s -> s.isEnabled()).collect(Collectors.toList()); + }; + + List getAllStorages(); + + void addStorage(ApplicationStorage applicationStorage) throws StorageException; + + void removeStorage(ApplicationStorage applicationStorage) throws StorageException; + + // projects + + default EntaxyApplicationProject createProject(String storageName, String applicationName, String initialVersion) + throws ProjectException, StorageException { + ApplicationStorage storage = getStorage(storageName); + if (storage == null) + throw new StorageNotFoundException(storageName); + if (!storage.isEnabled()) + throw new StorageNotEnabledException(storageName); + EntaxyApplicationProject app = storage.getProject(applicationName); + if (app != null) + throw new ProjectAlreadyExistsException(applicationName); + app = storage.createProject(applicationName); + app.createVersion(initialVersion); + return app; + }; + + default List getProjects() { + List result = new ArrayList<>(); + for (ApplicationStorage storage : getActiveStorages()) { + result.addAll(storage.getProjects()); + } + return result; + } + + default List getProjects(String storageName) + throws ProjectException, StorageException { + ApplicationStorage storage = getStorage(storageName); + if (storage == null) + throw new StorageNotFoundException(storageName); + return getProjects(storage); + } + + default List getProjects(ApplicationStorage storage) + throws ProjectException, StorageException { + if (!storage.isEnabled()) + throw new StorageNotEnabledException(storage.getName()); + return storage.getProjects(); + } + + void exportToFile(EntaxyApplicationProjectVersion version, String filePath) throws ProjectVersionException; + + void exportToRepository(EntaxyApplicationProjectVersion version, String repositoryName) throws ProjectVersionException; + + // applications + + default List getApplications() { + List result = new ArrayList<>(); + for (ApplicationStorage storage : getActiveStorages()) { + result.addAll(storage.getApplications()); + } + return result; + } + + default List getApplications(String storageName) + throws ProjectException, StorageException { + ApplicationStorage storage = getStorage(storageName); + if (storage == null) + throw new StorageNotFoundException(storageName); + return getApplications(storage); + } + + default List getApplications(ApplicationStorage storage) + throws ProjectException, StorageException { + if (!storage.isEnabled()) + throw new StorageNotEnabledException(storage.getName()); + return storage.getApplications(); + } + + + EntaxyApplication importApplicationFromFile(String storageName, String filePath) + throws ApplicationException, StorageException; + + EntaxyApplication importApplicationFromRepository(String storageName, String mavenUrl) + throws ApplicationException, StorageException; + + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationProjectContent.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationProjectContent.java new file mode 100644 index 00000000..05d6b90d --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationProjectContent.java @@ -0,0 +1,70 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications; + +import java.util.List; +import java.util.Map; + +import ru.entaxy.esb.resources.EntaxyResource; +import ru.entaxy.platform.integration.applications.exceptions.ItemException; +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject; +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObjectResource; + +public interface ApplicationProjectContent { + + public interface STANDARD_PROPERTIES { + String APPLICATION = "application"; + String GROUP = "group"; + String VERSION = "version"; + String CREATED_ON = "createdOn"; + String CREATED_BY = "createdBy"; + String MODIFIED_ON = "modifiedOn"; + String MODIFIED_BY = "modifiedBy"; + } + + List getItems(); + + List getItems(Class itemClass); + + void addItem(ApplicationProjectItem item) throws ItemException; + + void ignoreItem(ApplicationProjectItem item) throws ItemException; + + void removeItem(ApplicationProjectItem item) throws ItemException; + + default boolean isConsistent() { + return getItems().stream().filter(item -> (item.isRequired() && !item.isIgnored())).count() == 0; + } + + ApplicationProjectItem addObject(EntaxyRuntimeObject runtimeObject); + + ApplicationProjectItem addResource(EntaxyRuntimeObjectResource runtimeObjectResource); + + ApplicationProjectItem addResource(EntaxyResource entaxyResource); + + Map getProperties(); + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationProjectInfo.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationProjectInfo.java new file mode 100644 index 00000000..f8e193b6 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationProjectInfo.java @@ -0,0 +1,49 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications; + +import java.util.List; + +public interface ApplicationProjectInfo { + + + String getName(); + + String getGroup(); + + long getCreatedOn(); + + String getCreatedBy(); + + long getLastModifiedOn(); + + String getLastModifiedBy(); + + String getLatestVersion(); + + List getAvailableVersions(); + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationProjectItem.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationProjectItem.java new file mode 100644 index 00000000..a7e720aa --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationProjectItem.java @@ -0,0 +1,55 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications; + +import java.util.List; + +public interface ApplicationProjectItem { + + String getId(); + + EntaxyApplication.ITEM_SCOPE getScope(); + + EntaxyApplication.ITEM_TYPE getType(); + + boolean isGhost(); + + boolean isRequired(); + + List getRequiredBy(); + + List getRequirements(); + + List getColocated(); + + boolean isIgnored(); + + void ignore(); + + boolean isPlatform(); + + boolean isDeleted(); +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationResource.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationResource.java new file mode 100644 index 00000000..f491af11 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationResource.java @@ -0,0 +1,34 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications; + +import java.io.InputStream; + +public interface ApplicationResource { + + InputStream getInputStream(); + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationStorage.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationStorage.java new file mode 100644 index 00000000..f1fe5617 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/ApplicationStorage.java @@ -0,0 +1,93 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications; + +import java.io.IOException; +import java.io.InputStream; +import java.util.List; +import java.util.Map; + +import ru.entaxy.platform.integration.applications.exceptions.ApplicationException; +import ru.entaxy.platform.integration.applications.exceptions.ProjectException; +import ru.entaxy.platform.integration.applications.exceptions.StorageException; + +public interface ApplicationStorage { + + // storage itself + + String getName(); + + String getType(); + + Map getInfo(); + + boolean isEnabled(); + + void enable(); + + void disable(); + + // projects + + List getProjects(); + + EntaxyApplicationProject getProject(String applicationName); + + void addProject(EntaxyApplicationProject project) throws ProjectException, StorageException; + + void removeProject(EntaxyApplicationProject project) throws ProjectException, StorageException; + + EntaxyApplicationProject createProject(String applicationName) + throws ProjectException, StorageException; + + // applications + + public interface ApplicationImportContent { + + Map getItems(); + + void clear(); + } + + public interface ApplicationImportItem { + String getName(); + + String getLocation(); + + String getPath(); + + InputStream getInputStream() throws IOException; + } + + List getApplications(); + + EntaxyApplication getApplication(String applicationName); + + void removeApplication(EntaxyApplication application) throws ApplicationException, StorageException; + + EntaxyApplication createApplication(ApplicationImportContent content) throws ApplicationException, StorageException; + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/EntaxyApplication.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/EntaxyApplication.java new file mode 100644 index 00000000..33a32b3a --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/EntaxyApplication.java @@ -0,0 +1,83 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications; + +import java.util.List; + +import ru.entaxy.esb.resources.EntaxyResource.RESOURCE_SCOPE; +import ru.entaxy.platform.base.objects.EntaxyObject.OBJECT_RELATION_SCOPE; + +public interface EntaxyApplication { + + String DESCRIPTOR_NAME = "descriptor.json"; + + String DEFAULT_GROUP_ID = "entaxy.application"; + + enum ITEM_TYPE { + OBJECT, + CONFIG, + BUNDLE, + RESOURCE, + FEATURES + } + + enum ITEM_SCOPE { + DESIGN, + RUNTIME, + UNKNOWN; + + public static ITEM_SCOPE convert(OBJECT_RELATION_SCOPE originScope) { + try { + return ITEM_SCOPE.valueOf(originScope.name().toUpperCase()); + } catch (Exception e) { + return UNKNOWN; + } + } + + public static ITEM_SCOPE convert(RESOURCE_SCOPE originScope) { + try { + return ITEM_SCOPE.valueOf(originScope.name().toUpperCase()); + } catch (Exception e) { + return UNKNOWN; + } + } + + } + + String getName(); + + ApplicationStorage getStorage(); + + List getVersions(); + + EntaxyApplicationVersion getLatestVersion(); + + EntaxyApplicationVersion getVersion(String version); + + void removeVersion(String version); + + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/EntaxyApplicationProject.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/EntaxyApplicationProject.java new file mode 100644 index 00000000..e21dc6bb --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/EntaxyApplicationProject.java @@ -0,0 +1,56 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications; + +import java.util.List; + +import ru.entaxy.platform.integration.applications.exceptions.ProjectVersionException; + +public interface EntaxyApplicationProject { + String getName(); + + String getGroup(); + + ApplicationStorage getStorage(); + + void save(); + + void disgard(); + + List getVersions(); + + EntaxyApplicationProjectVersion getLatestVersion(); + + EntaxyApplicationProjectVersion getVersion(String version); + + EntaxyApplicationProjectVersion createVersion(String version) throws ProjectVersionException; + + EntaxyApplicationProjectVersion createVersion(String version, String fromVersion) throws ProjectVersionException; + + void removeVersion(String version); + + ApplicationProjectInfo getInfo(); +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/EntaxyApplicationProjectVersion.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/EntaxyApplicationProjectVersion.java new file mode 100644 index 00000000..7042fc01 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/EntaxyApplicationProjectVersion.java @@ -0,0 +1,84 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications; + +import java.io.InputStream; +import java.net.URL; + +import ru.entaxy.platform.integration.applications.descriptor.ApplicationDescriptor; +import ru.entaxy.platform.integration.applications.exceptions.ProjectVersionException; + +public interface EntaxyApplicationProjectVersion extends ApplicationProjectContent { + + public enum VERSION_STATUS { + NEW, + MODIFIED, + BUILT + } + + EntaxyApplicationProject getApplication(); + + String getVersionNumber(); + + default int compareTo(EntaxyApplicationProjectVersion otherVersion) { + String[] thisV = otherVersion.getVersionNumber().split("\\."); + String[] otherV = otherVersion.getVersionNumber().split("\\."); + + for (int i = 0; i < Math.max(thisV.length, otherV.length); i++) { + try { + int thisValue = Integer.parseInt(thisV[i]); + int otherValue = Integer.parseInt(otherV[i]); + if (thisValue > otherValue) + return 1; + if (thisValue < otherValue) + return -1; + } catch (Exception ignore) { + continue; + } + } + + return 0; + } + + void save(); + + void disgard(); + + URL build() throws ProjectVersionException; + + boolean isBuildAvailable(); + + URL getBuildUrl(); + + InputStream getBuild(); + + ApplicationDescriptor getBuildInfo(); + + VERSION_STATUS getStatus(); + + boolean isDirty(); + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/EntaxyApplicationRevision.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/EntaxyApplicationRevision.java new file mode 100644 index 00000000..0fe38780 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/EntaxyApplicationRevision.java @@ -0,0 +1,61 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications; + +import ru.entaxy.platform.integration.applications.exceptions.RevisionException; + +public interface EntaxyApplicationRevision extends ApplicationContent { + + public enum REVISION_STATUS { + NEW, + CONFIGURED, + DEPLOYED, + INSTALLED, + UNINSTALLED + } + + int getRevisionNumber(); + + REVISION_STATUS getStatus(); + + void configure() throws RevisionException; + + void deploy() throws RevisionException; + + default void install(boolean devMode) throws RevisionException { + if (devMode) + installDev(); + else + install(); + }; + + void install() throws RevisionException; + + void installDev() throws RevisionException; + + void uninstall() throws RevisionException; + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/EntaxyApplicationVersion.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/EntaxyApplicationVersion.java new file mode 100644 index 00000000..0f52a793 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/EntaxyApplicationVersion.java @@ -0,0 +1,90 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications; + +import java.util.List; + +import ru.entaxy.platform.integration.applications.exceptions.ApplicationVersionException; +import ru.entaxy.platform.integration.applications.exceptions.RevisionException; +import ru.entaxy.platform.integration.applications.exceptions.RevisionIllegalNumber; + +public interface EntaxyApplicationVersion extends ApplicationContent { + + EntaxyApplication getApplication(); + + String getVersionNumber(); + + List getRevisions(); + + EntaxyApplicationRevision getLastRevision(); + + default int compareTo(EntaxyApplicationVersion otherVersion) { + String[] thisV = otherVersion.getVersionNumber().split("\\."); + String[] otherV = otherVersion.getVersionNumber().split("\\."); + + for (int i = 0; i < Math.max(thisV.length, otherV.length); i++) { + try { + int thisValue = Integer.parseInt(thisV[i]); + int otherValue = Integer.parseInt(otherV[i]); + if (thisValue > otherValue) + return 1; + if (thisValue < otherValue) + return -1; + } catch (Exception ignore) { + continue; + } + } + + return 0; + } + + default EntaxyApplicationRevision getRevision(String revision) throws RevisionException { + int rev = -1; + try { + rev = Integer.parseInt(revision); + } catch (Exception ignore) { + + } + if (rev < 0) + throw new RevisionIllegalNumber(getApplication().getName(), getVersionNumber(), revision); + return getRevision(rev); + }; + + EntaxyApplicationRevision getRevision(int revision); + + // creates next revision from last revision + default EntaxyApplicationRevision createRevision() throws ApplicationVersionException { + if (getLastRevision() == null) + // create initial revision + return createRevision(-1); + return createRevision(getLastRevision().getRevisionNumber()); + }; + + // creates next revision from given revision + // -1 means create origin revision + EntaxyApplicationRevision createRevision(int fromRevision) throws ApplicationVersionException; + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/descriptor/ApplicationComponent.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/descriptor/ApplicationComponent.java new file mode 100644 index 00000000..97e3596a --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/descriptor/ApplicationComponent.java @@ -0,0 +1,84 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.descriptor; + +import ru.entaxy.platform.base.support.CommonUtils; +import ru.entaxy.platform.integration.applications.EntaxyApplication; + +public class ApplicationComponent { + + public String id; + public EntaxyApplication.ITEM_TYPE type; + public String internalLocation; + public String mavenLocation; + public String targetProtocol; + public String targetLocation; + public String targetQueryString; + + public int priority; + + public String getId() { + return id; + } + + public EntaxyApplication.ITEM_TYPE getType() { + return type; + } + + public String getInternalLocation() { + return internalLocation; + } + + public String getMavenLocation() { + return mavenLocation; + } + + public String getTargetLocation() { + return targetLocation; + } + + public int getPriority() { + return priority; + } + + public String getTargetProtocol() { + return targetProtocol; + } + + public String getTargetQueryString() { + return targetQueryString; + } + + public String getFullTargetLocation() { + StringBuffer result = new StringBuffer(); + if (CommonUtils.isValid(targetProtocol)) + result.append(targetProtocol).append(':'); + result.append(targetLocation); + if (CommonUtils.isValid(targetQueryString)) + result.append('?').append(targetQueryString); + return result.toString(); + } +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/descriptor/ApplicationContentItem.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/descriptor/ApplicationContentItem.java new file mode 100644 index 00000000..05007426 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/descriptor/ApplicationContentItem.java @@ -0,0 +1,50 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.descriptor; + +import ru.entaxy.platform.integration.applications.EntaxyApplication; + +public class ApplicationContentItem { + + public String id; + public EntaxyApplication.ITEM_TYPE type; + public String componentId; + + public String getId() { + return id; + } + + public EntaxyApplication.ITEM_TYPE getType() { + return type; + } + + public String getComponentId() { + return componentId; + } + + + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/descriptor/ApplicationDescriptor.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/descriptor/ApplicationDescriptor.java new file mode 100644 index 00000000..7b3a4a7d --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/descriptor/ApplicationDescriptor.java @@ -0,0 +1,112 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.descriptor; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplication.ITEM_TYPE; + +public class ApplicationDescriptor { + + public String name; + public String group; + public String version; + public String buildOn; + public String buildBy; + + public String mavenUrl; + public String mavenAsset; + + public ApplicationFeatures features; + + public volatile List requirements = new ArrayList<>(); + + public volatile List items = new ArrayList<>(); + + public volatile List components = new ArrayList<>(); + + public String getName() { + return name; + } + + public String getGroup() { + return group; + } + + public String getVersion() { + return version; + } + + public String getBuildOn() { + return buildOn; + } + + public String getBuildBy() { + return buildBy; + } + + public String getMavenUrl() { + return mavenUrl; + } + + public String getMavenAsset() { + return mavenAsset; + } + + public List getRequirements() { + return requirements; + } + + public List getItems() { + return items; + } + + public List getComponents() { + return components; + } + + public List getComponents(EntaxyApplication.ITEM_TYPE type) { + if (type == null) + return getComponents(); + return components.stream().filter(comp -> type.equals(comp.type)).collect(Collectors.toList()); + } + + public List getBundleComponents() { + return getComponents(ITEM_TYPE.BUNDLE); + } + + public List getConfigComponents() { + return getComponents(ITEM_TYPE.CONFIG); + } + + public ApplicationFeatures getFeatures() { + return features; + } + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/descriptor/ApplicationFeatures.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/descriptor/ApplicationFeatures.java new file mode 100644 index 00000000..bd4c1812 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/descriptor/ApplicationFeatures.java @@ -0,0 +1,43 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.descriptor; + +import ru.entaxy.platform.integration.applications.EntaxyApplication; + +public class ApplicationFeatures extends ApplicationComponent { + + public static final String DEV_FEATURE_SUFFIX = "-dev"; + + public ApplicationFeatures() { + id = "application.features"; + type = EntaxyApplication.ITEM_TYPE.FEATURES; + } + + public String getDevId() { + return getId() + DEV_FEATURE_SUFFIX; + } + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/descriptor/ApplicationRequirement.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/descriptor/ApplicationRequirement.java new file mode 100644 index 00000000..29329c9a --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/descriptor/ApplicationRequirement.java @@ -0,0 +1,50 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.descriptor; + +import ru.entaxy.platform.integration.applications.EntaxyApplication; + +public class ApplicationRequirement { + + public String id; + public EntaxyApplication.ITEM_TYPE type; + public EntaxyApplication.ITEM_SCOPE scope; + + public String getId() { + return id; + } + + public EntaxyApplication.ITEM_TYPE getType() { + return type; + } + + public EntaxyApplication.ITEM_SCOPE getScope() { + return scope; + } + + + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationCausedException.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationCausedException.java new file mode 100644 index 00000000..dab43cb5 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationCausedException.java @@ -0,0 +1,41 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public class ApplicationCausedException extends ApplicationException { + + private static final long serialVersionUID = 1L; + + public ApplicationCausedException(String applicationName, Throwable cause) { + super(applicationName, cause); + } + + @Override + public String getMessage() { + return String.format("Application exception on [%s]: %s", applicationName, getCause().getMessage()); + } + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationDescriptorIsInvalid.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationDescriptorIsInvalid.java new file mode 100644 index 00000000..6d641e2c --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationDescriptorIsInvalid.java @@ -0,0 +1,40 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public class ApplicationDescriptorIsInvalid extends ApplicationException { + + private static final long serialVersionUID = 1L; + + public ApplicationDescriptorIsInvalid(String applicationName) { + super(applicationName); + } + + @Override + protected String getMessageInfo() { + return "descriptor is invalid"; + } +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationDescriptorNotFound.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationDescriptorNotFound.java new file mode 100644 index 00000000..aaa64c01 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationDescriptorNotFound.java @@ -0,0 +1,40 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public class ApplicationDescriptorNotFound extends ApplicationException { + + private static final long serialVersionUID = 1L; + + public ApplicationDescriptorNotFound(String applicationName) { + super(applicationName); + } + + @Override + protected String getMessageInfo() { + return "descriptor not found"; + } +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationException.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationException.java new file mode 100644 index 00000000..92d9d36b --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationException.java @@ -0,0 +1,60 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public abstract class ApplicationException extends EntaxyApplicationsException { + + private static final long serialVersionUID = 1L; + protected String applicationName; + + public ApplicationException(String applicationName) { + super(); + this.applicationName = applicationName; + } + + public ApplicationException(String applicationName, Throwable cause) { + super(cause); + this.applicationName = applicationName; + } + + public String getApplicationName() { + return applicationName; + } + + public void setApplicationName(String applicationName) { + this.applicationName = applicationName; + } + + @Override + public String getMessage() { + return String.format("Application %s: [%s]", getMessageInfo(), applicationName); + } + + protected String getMessageInfo() { + return "exception"; + } + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationImportCausedException.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationImportCausedException.java new file mode 100644 index 00000000..c53e37b0 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationImportCausedException.java @@ -0,0 +1,42 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public class ApplicationImportCausedException extends ApplicationException { + + private static final long serialVersionUID = 1L; + + public ApplicationImportCausedException(String applicationName, Throwable cause) { + super(applicationName, cause); + } + + @Override + public String getMessage() { + return String.format("Application exception while importing from [%s]: %s", applicationName, + getCause().getMessage()); + } + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationNotFoundException.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationNotFoundException.java new file mode 100644 index 00000000..006ccb45 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationNotFoundException.java @@ -0,0 +1,41 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public class ApplicationNotFoundException extends ApplicationException { + + private static final long serialVersionUID = 1L; + + public ApplicationNotFoundException(String applicationName) { + super(applicationName); + // TODO Auto-generated constructor stub + } + + @Override + protected String getMessageInfo() { + return "not found"; + } +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationVersionAlreadyExists.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationVersionAlreadyExists.java new file mode 100644 index 00000000..abd0cd54 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationVersionAlreadyExists.java @@ -0,0 +1,40 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public class ApplicationVersionAlreadyExists extends ApplicationVersionException { + + private static final long serialVersionUID = 1L; + + public ApplicationVersionAlreadyExists(String applicationName, String versionNumber) { + super(applicationName, versionNumber); + } + + @Override + protected String getMessageInfo() { + return "already exists"; + } +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationVersionCausedException.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationVersionCausedException.java new file mode 100644 index 00000000..a0b52688 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationVersionCausedException.java @@ -0,0 +1,42 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public class ApplicationVersionCausedException extends ApplicationVersionException { + + private static final long serialVersionUID = 1L; + + public ApplicationVersionCausedException(String applicationName, Throwable e, String versionNumber) { + super(applicationName, e, versionNumber); + } + + @Override + public String getMessage() { + return String.format("Aplication version exception: [%s]/[%s]; %s", getApplicationName(), getVersionNumber(), + getCause().getMessage()); + } + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationVersionException.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationVersionException.java new file mode 100644 index 00000000..4d2da284 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationVersionException.java @@ -0,0 +1,61 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public class ApplicationVersionException extends ApplicationException { + + private static final long serialVersionUID = 1L; + + String versionNumber; + + public ApplicationVersionException(String applicationName, String versionNumber) { + super(applicationName); + setVersionNumber(versionNumber); + } + + public ApplicationVersionException(String applicationName, Throwable e, String versionNumber) { + super(applicationName, e); + setVersionNumber(versionNumber); + } + + public String getVersionNumber() { + return versionNumber; + } + + public void setVersionNumber(String versionNumber) { + this.versionNumber = versionNumber; + } + + @Override + public String getMessage() { + return String.format("Application version %s: [%s]/[%s]", getMessageInfo(), applicationName, versionNumber); + } + + protected String getMessageInfo() { + return "caused exception"; + } + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationVersionHasInstalledException.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationVersionHasInstalledException.java new file mode 100644 index 00000000..3f78d25e --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ApplicationVersionHasInstalledException.java @@ -0,0 +1,36 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public class ApplicationVersionHasInstalledException extends ApplicationVersionException { + + private static final long serialVersionUID = 1L; + + public ApplicationVersionHasInstalledException(String applicationName, String versionNumber) { + super(applicationName, versionNumber); + } + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/EntaxyApplicationsException.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/EntaxyApplicationsException.java new file mode 100644 index 00000000..d04bbb09 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/EntaxyApplicationsException.java @@ -0,0 +1,40 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public class EntaxyApplicationsException extends Exception { + + private static final long serialVersionUID = 1L; + + public EntaxyApplicationsException() { + super(); + } + + public EntaxyApplicationsException(Throwable cause) { + super(cause); + } + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ItemException.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ItemException.java new file mode 100644 index 00000000..fac38b64 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ItemException.java @@ -0,0 +1,47 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public abstract class ItemException extends ProjectVersionException { + + private static final long serialVersionUID = 1L; + + protected String itemId; + + public ItemException(String applicationName, String versionNumber, String itemId) { + super(applicationName, versionNumber); + this.itemId = itemId; + } + + public String getItemId() { + return itemId; + } + + public void setItemId(String itemId) { + this.itemId = itemId; + } + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ItemIsGhostException.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ItemIsGhostException.java new file mode 100644 index 00000000..e258c2d2 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ItemIsGhostException.java @@ -0,0 +1,42 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public class ItemIsGhostException extends ItemException { + + + + private static final long serialVersionUID = 1L; + + public ItemIsGhostException(String applicationName, String versionNumber, String itemId) { + super(applicationName, versionNumber, itemId); + } + + @Override + public String getMessage() { + return String.format("Item operation not allowed for ghost: [%s]", itemId); + } +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ItemIsPlatformException.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ItemIsPlatformException.java new file mode 100644 index 00000000..3455c774 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ItemIsPlatformException.java @@ -0,0 +1,42 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public class ItemIsPlatformException extends ItemException { + + + + private static final long serialVersionUID = 1L; + + public ItemIsPlatformException(String applicationName, String versionNumber, String itemId) { + super(applicationName, versionNumber, itemId); + } + + @Override + public String getMessage() { + return String.format("Item operation not allowed for platform object: [%s]", itemId); + } +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ItemNotFoundException.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ItemNotFoundException.java new file mode 100644 index 00000000..51f7c79e --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ItemNotFoundException.java @@ -0,0 +1,40 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public class ItemNotFoundException extends ItemException { + + private static final long serialVersionUID = 1L; + + public ItemNotFoundException(String applicationName, String versionNumber, String itemId) { + super(applicationName, versionNumber, itemId); + } + + @Override + public String getMessage() { + return String.format("Item [%s] not found in [%s]/[%s]", itemId, applicationName, versionNumber); + } +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectAlreadyExistsException.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectAlreadyExistsException.java new file mode 100644 index 00000000..2507aa25 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectAlreadyExistsException.java @@ -0,0 +1,41 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public class ProjectAlreadyExistsException extends ProjectException { + + private static final long serialVersionUID = 1L; + + public ProjectAlreadyExistsException(String applicationName) { + super(applicationName); + } + + @Override + public String getMessage() { + return String.format("Application [%s] already exists", applicationName); + } + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectException.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectException.java new file mode 100644 index 00000000..9fb468a8 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectException.java @@ -0,0 +1,51 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public abstract class ProjectException extends EntaxyApplicationsException { + + private static final long serialVersionUID = 1L; + protected String applicationName; + + public ProjectException(String applicationName) { + super(); + this.applicationName = applicationName; + } + + public ProjectException(String applicationName, Throwable cause) { + super(cause); + this.applicationName = applicationName; + } + + public String getApplicationName() { + return applicationName; + } + + public void setApplicationName(String applicationName) { + this.applicationName = applicationName; + } + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectNotFoundException.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectNotFoundException.java new file mode 100644 index 00000000..97c70dbc --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectNotFoundException.java @@ -0,0 +1,39 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public class ProjectNotFoundException extends ProjectException { + + public ProjectNotFoundException(String applicationName) { + super(applicationName); + } + + @Override + public String getMessage() { + return String.format("Application [%s] not found", applicationName); + } + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectVersionBuildNotAvailable.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectVersionBuildNotAvailable.java new file mode 100644 index 00000000..75408b5b --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectVersionBuildNotAvailable.java @@ -0,0 +1,41 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public class ProjectVersionBuildNotAvailable extends ProjectVersionException { + + private static final long serialVersionUID = 1L; + + public ProjectVersionBuildNotAvailable(String applicationName, String versionNumber) { + super(applicationName, versionNumber); + } + + @Override + protected String getMessageInfo() { + return "bild not available"; + } + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectVersionCausedException.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectVersionCausedException.java new file mode 100644 index 00000000..d9370cb5 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectVersionCausedException.java @@ -0,0 +1,41 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public class ProjectVersionCausedException extends ProjectVersionException { + + private static final long serialVersionUID = 1L; + + public ProjectVersionCausedException(String applicationName, String versionNumber, Throwable cause) { + super(applicationName, versionNumber, cause); + } + + @Override + public String getMessage() { + return String.format("Version exception on [%s]/[%s]: %s", applicationName, versionNumber, + getCause().getMessage()); + } +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectVersionException.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectVersionException.java new file mode 100644 index 00000000..a884ef53 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectVersionException.java @@ -0,0 +1,61 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public class ProjectVersionException extends ProjectException { + + private static final long serialVersionUID = 1L; + + protected String versionNumber; + + public ProjectVersionException(String applicationName, String versionNumber) { + super(applicationName); + this.versionNumber = versionNumber; + } + + public ProjectVersionException(String applicationName, String versionNumber, Throwable cause) { + super(applicationName, cause); + this.versionNumber = versionNumber; + } + + public String getVersionNumber() { + return versionNumber; + } + + public void setVersionNumber(String versionNumber) { + this.versionNumber = versionNumber; + } + + @Override + public String getMessage() { + return String.format("Version %s: [%s]/[%s]", getMessageInfo(), applicationName, versionNumber); + } + + protected String getMessageInfo() { + return "caused exception"; + } + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectVersionIsDirtyException.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectVersionIsDirtyException.java new file mode 100644 index 00000000..91135db1 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectVersionIsDirtyException.java @@ -0,0 +1,41 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public class ProjectVersionIsDirtyException extends ProjectVersionException { + + private static final long serialVersionUID = 1L; + + public ProjectVersionIsDirtyException(String applicationName, String versionNumber) { + super(applicationName, versionNumber); + } + + @Override + protected String getMessageInfo() { + return "is dirty"; + } + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectVersionNotConsistentException.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectVersionNotConsistentException.java new file mode 100644 index 00000000..5b0dbc63 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectVersionNotConsistentException.java @@ -0,0 +1,41 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public class ProjectVersionNotConsistentException extends ProjectVersionException { + + private static final long serialVersionUID = 1L; + + public ProjectVersionNotConsistentException(String applicationName, String versionNumber) { + super(applicationName, versionNumber); + } + + @Override + protected String getMessageInfo() { + return "not consistent"; + } + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectVersionNotFoundException.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectVersionNotFoundException.java new file mode 100644 index 00000000..fb9b8d0b --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/ProjectVersionNotFoundException.java @@ -0,0 +1,40 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public class ProjectVersionNotFoundException extends ProjectVersionException { + + private static final long serialVersionUID = 1L; + + public ProjectVersionNotFoundException(String applicationName, String versionNumber) { + super(applicationName, versionNumber); + } + + @Override + public String getMessageInfo() { + return "not found"; + } +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/RevisionCausedException.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/RevisionCausedException.java new file mode 100644 index 00000000..59d919e2 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/RevisionCausedException.java @@ -0,0 +1,41 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public class RevisionCausedException extends RevisionException { + + private static final long serialVersionUID = 1L; + + public RevisionCausedException(String applicationName, Throwable e, String versionNumber, int revisionNumber) { + super(applicationName, e, versionNumber, revisionNumber); + } + + @Override + public String getMessage() { + return String.format("Application revision [%s]/[%s]:[%d] caused exception: %s", getApplicationName(), + getVersionNumber(), getRevisionNumber(), getCause().getMessage()); + } +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/RevisionException.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/RevisionException.java new file mode 100644 index 00000000..ce953fc8 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/RevisionException.java @@ -0,0 +1,62 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public class RevisionException extends ApplicationVersionException { + + private static final long serialVersionUID = 1L; + int revisionNumber; + + public RevisionException(String applicationName, String versionNumber, int revisionNumber) { + super(applicationName, versionNumber); + setRevisionNumber(revisionNumber); + } + + public RevisionException(String applicationName, Throwable e, String versionNumber, int revisionNumber) { + super(applicationName, e, versionNumber); + setRevisionNumber(revisionNumber); + } + + public int getRevisionNumber() { + return revisionNumber; + } + + public void setRevisionNumber(int revisionNumber) { + this.revisionNumber = revisionNumber; + } + + @Override + public String getMessage() { + return String.format("Application revision %s: [%s]/[%s]:[%d]", getMessageInfo(), getApplicationName(), + getVersionNumber(), getRevisionNumber()); + } + + @Override + protected String getMessageInfo() { + return "caused exception"; + } + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/RevisionIllegalNumber.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/RevisionIllegalNumber.java new file mode 100644 index 00000000..ece2a848 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/RevisionIllegalNumber.java @@ -0,0 +1,53 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public class RevisionIllegalNumber extends RevisionException { + + private static final long serialVersionUID = 1L; + + String illegalNumber; + + public RevisionIllegalNumber(String applicationName, String versionNumber, String illegalNumber) { + super(applicationName, versionNumber, 0); + setIllegalNumber(illegalNumber); + } + + public String getIllegalNumber() { + return illegalNumber; + } + + public void setIllegalNumber(String illegalNumber) { + this.illegalNumber = illegalNumber; + } + + @Override + public String getMessage() { + return String.format("Illegal revision number [%s] in application: [%s]/[%s]", illegalNumber, + getApplicationName(), getVersionNumber()); + } + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/RevisionIllegalTransition.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/RevisionIllegalTransition.java new file mode 100644 index 00000000..a3e064ce --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/RevisionIllegalTransition.java @@ -0,0 +1,50 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +import ru.entaxy.platform.integration.applications.EntaxyApplicationRevision.REVISION_STATUS; + +public class RevisionIllegalTransition extends RevisionException { + + private static final long serialVersionUID = 1L; + + protected REVISION_STATUS fromStatus; + + protected REVISION_STATUS toStatus; + + public RevisionIllegalTransition(String applicationName, String versionNumber, int revisionNumber, + REVISION_STATUS fromStatus, REVISION_STATUS toStatus) { + super(applicationName, versionNumber, revisionNumber); + this.fromStatus = fromStatus; + this.toStatus = toStatus; + } + + @Override + protected String getMessageInfo() { + return String.format("transition not allowed from [%s] to [%s]", fromStatus.name(), toStatus.name()); + } + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/RevisionNotConfigurable.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/RevisionNotConfigurable.java new file mode 100644 index 00000000..7fd5fb44 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/RevisionNotConfigurable.java @@ -0,0 +1,40 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public class RevisionNotConfigurable extends RevisionException { + + private static final long serialVersionUID = 1L; + + public RevisionNotConfigurable(String applicationName, String versionNumber, int revisionNumber) { + super(applicationName, versionNumber, revisionNumber); + } + + @Override + protected String getMessageInfo() { + return "not configurable"; + } +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/RevisionNotFound.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/RevisionNotFound.java new file mode 100644 index 00000000..a456abf6 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/RevisionNotFound.java @@ -0,0 +1,40 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public class RevisionNotFound extends RevisionException { + + private static final long serialVersionUID = 1L; + + public RevisionNotFound(String applicationName, String versionNumber, int revisionNumber) { + super(applicationName, versionNumber, revisionNumber); + } + + @Override + protected String getMessageInfo() { + return "not found"; + } +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/RevisionRequirementsNotSatisfied.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/RevisionRequirementsNotSatisfied.java new file mode 100644 index 00000000..26f1148d --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/RevisionRequirementsNotSatisfied.java @@ -0,0 +1,53 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +import java.util.List; + +import ru.entaxy.platform.integration.applications.descriptor.ApplicationRequirement; + +public class RevisionRequirementsNotSatisfied extends RevisionException { + + private static final long serialVersionUID = 1L; + + protected List requirements; + + public RevisionRequirementsNotSatisfied(String applicationName, String versionNumber, int revisionNumber, + List requirements) { + super(applicationName, versionNumber, revisionNumber); + this.requirements = requirements; + } + + @Override + protected String getMessageInfo() { + String data = "requirements not satisfied:"; + for (ApplicationRequirement req : requirements) + data = data.concat("\n\t").concat(req.getId()).concat(": ").concat(req.getType().name()).concat(" / ") + .concat(req.getScope().name()); + return data.concat("\n"); + } + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/StorageException.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/StorageException.java new file mode 100644 index 00000000..3eab4a42 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/StorageException.java @@ -0,0 +1,38 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public abstract class StorageException extends EntaxyApplicationsException { + + private static final long serialVersionUID = 1L; + protected String storageName; + + public StorageException(String storageName) { + super(); + this.storageName = storageName; + } + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/StorageNotEnabledException.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/StorageNotEnabledException.java new file mode 100644 index 00000000..4a58a5a2 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/StorageNotEnabledException.java @@ -0,0 +1,41 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public class StorageNotEnabledException extends StorageException { + + private static final long serialVersionUID = 1L; + + public StorageNotEnabledException(String storageName) { + super(storageName); + } + + @Override + public String getMessage() { + return String.format("Storage [%s] not enabled", this.storageName); + } + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/StorageNotFoundException.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/StorageNotFoundException.java new file mode 100644 index 00000000..f4b50875 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/exceptions/StorageNotFoundException.java @@ -0,0 +1,41 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.exceptions; + +public class StorageNotFoundException extends StorageException { + + private static final long serialVersionUID = 1L; + + public StorageNotFoundException(String storageName) { + super(storageName); + } + + @Override + public String getMessage() { + return String.format("Storage [%s] not found", this.storageName); + } + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/item/project/EntaxyBundleItem.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/item/project/EntaxyBundleItem.java new file mode 100644 index 00000000..fee4be80 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/item/project/EntaxyBundleItem.java @@ -0,0 +1,34 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.item.project; + +import ru.entaxy.platform.integration.applications.ApplicationProjectItem; + +public interface EntaxyBundleItem extends ApplicationProjectItem { + long getBundleId(); + + String getBundleSymbolicName(); +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/item/project/EntaxyConfigItem.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/item/project/EntaxyConfigItem.java new file mode 100644 index 00000000..5d2bc8bc --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/item/project/EntaxyConfigItem.java @@ -0,0 +1,30 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.item.project; + +public interface EntaxyConfigItem extends EntaxyObjectItem { + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/item/project/EntaxyObjectItem.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/item/project/EntaxyObjectItem.java new file mode 100644 index 00000000..80e06f2a --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/item/project/EntaxyObjectItem.java @@ -0,0 +1,34 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.item.project; + +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject; + +public interface EntaxyObjectItem extends EntaxyBundleItem { + + EntaxyRuntimeObject getObject(); + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/item/project/EntaxyResourceItem.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/item/project/EntaxyResourceItem.java new file mode 100644 index 00000000..d321b7f6 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/item/project/EntaxyResourceItem.java @@ -0,0 +1,35 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.item.project; + +import ru.entaxy.esb.resources.EntaxyResource; +import ru.entaxy.platform.integration.applications.ApplicationProjectItem; + +public interface EntaxyResourceItem extends ApplicationProjectItem { + + EntaxyResource getResource(); + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/storage/AbstractApplicationStorage.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/storage/AbstractApplicationStorage.java new file mode 100644 index 00000000..2bc99198 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/storage/AbstractApplicationStorage.java @@ -0,0 +1,96 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.storage; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import ru.entaxy.platform.integration.applications.ApplicationStorage; + +public abstract class AbstractApplicationStorage implements ApplicationStorage { + + protected String name; + + protected String type = "unknown"; + + protected boolean isEnabled = true; + + protected Map storageInfo = new HashMap<>(); + + protected AbstractApplicationStorage() { + super(); + if (this.getClass().isAnnotationPresent(ApplicationStorageInfo.class)) { + ApplicationStorageInfo anno = this.getClass().getAnnotation(ApplicationStorageInfo.class); + setName(anno.name()); + setEnabled(anno.defaultEnabled()); + type = anno.type(); + } + } + + public void setName(String name) { + this.name = name; + } + + public void setEnabled(boolean isEnabled) { + this.isEnabled = isEnabled; + } + + protected void setInfo(String key, Object value) { + this.storageInfo.put(key, value); + } + + @Override + public String getName() { + return name; + } + + @Override + public String getType() { + return type; + } + + @Override + public Map getInfo() { + return Collections.unmodifiableMap(storageInfo); + } + + @Override + public boolean isEnabled() { + return isEnabled; + } + + @Override + public void enable() { + setEnabled(true); + } + + @Override + public void disable() { + setEnabled(false); + } + +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/storage/ApplicationStorageInfo.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/storage/ApplicationStorageInfo.java new file mode 100644 index 00000000..750b8e98 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/storage/ApplicationStorageInfo.java @@ -0,0 +1,42 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.storage; + +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +@Retention(RUNTIME) +@Target(TYPE) +public @interface ApplicationStorageInfo { + String name(); + + String type() default "unknown"; + + boolean defaultEnabled() default true; +} diff --git a/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/utils/JarArtifact.java b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/utils/JarArtifact.java new file mode 100644 index 00000000..38138817 --- /dev/null +++ b/platform/integration/applications/application-api/src/main/java/ru/entaxy/platform/integration/applications/utils/JarArtifact.java @@ -0,0 +1,30 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.utils; + +public class JarArtifact { + +} diff --git a/platform/integration/applications/application-impl/LICENSE.txt b/platform/integration/applications/application-impl/LICENSE.txt new file mode 100644 index 00000000..4ae94b75 --- /dev/null +++ b/platform/integration/applications/application-impl/LICENSE.txt @@ -0,0 +1,175 @@ + ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ + +Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой) +версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего +Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН +7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова, +д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу +https://www.emdev.ru/about (далее - Компания). + +Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями» +(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения, +Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в +настоящем документе, в противном случае, он должен не использовать или не получать доступ +к Программному обеспечению. + + 1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ + +a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии +или редакции, исключительные права на которую принадлежат Правообладателю. +b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные +права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ +для ЭВМ № 2021610848 от 19.01.2021 года. +c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта +https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО. +d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также +личные неимущественные права авторов произведений на результат интеллектуальной деятельности. +e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование +ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка +включает предоставление Пользователю неисключительного права использования ПО, в том числе +получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение +патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается +Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается +для каждого Пользователя индивидуально в Сертификате. +f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром), +подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное +обеспечение в ограниченном объёме и на определённый период времени. +g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО, +предоставленных Пользователю согласно условиям Подписки. +h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного +обеспечения. +i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий +из одного или нескольких файлов, который может быть прочтён человеком. +j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля +программы, полученный в результате обработки исходного кода, еще не связанный в полную программу. +Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый +продукт. +k) Некоммерческое использование – индивидуальное личное использование Пользователем программного +обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации +возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая +выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения. + + 2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ + +2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного +обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом +воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения +в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ. +2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит +неисключительный характер. +2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию, +лицензия на ограниченное использование Программного обеспечения. +2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования +имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан +обратиться в службу поддержки Правообладателя по адресу: https://entaxy.ru/ для изменения +вида лицензии с Базовой бесплатной версии на Подписки. +2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для +пробного использования программного обеспечения – не ограничен. +2.6. Использование Пользователем настоящего программного обеспечения в целях разработки, +модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю, +без разрешения Правообладателя не допускается. + + 3. АВТОРСКОЕ ПРАВО. + +3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение +и любые его копии принадлежат Правообладателю. +3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента, +к которому можно получить доступ с помощью Программного обеспечения, является собственностью +соответствующего владельца контента и защищается применимым законодательством об авторском +праве или другими законами и договорами об интеллектуальной собственности. +3.3. Условия использования Программного обеспечения. +Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь +придерживается следующих условий: +3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять +какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании +Программного обеспечения или на нем. +3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать, +расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать +Программное обеспечение. +3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования +ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне. +3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено +использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам. + + 4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС» + +4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю +на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с +использованием Пользователем: +4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в +Программное обеспечение; +4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями +настоящего соглашения; +4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием, +или данными, не предоставленными Пользователю Правообладателем; +4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем. + + +5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ +ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ +И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ +ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ +И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ +ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО. + + 6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ. +НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ +ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ, +ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ; +ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ. +ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ +ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ; +КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ +ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ. + + 7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ: +Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия +(включая, но не ограничиваясь) по: +-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код) + Программного обеспечения; +-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный +код Программного обеспечения, за исключением тех изменений, которые вносятся средствами, +включёнными в Программное обеспечение и описанными непосредственно в документации к нему; +-созданию условий для использования Программного обеспечения лицами, не имеющими прав на +использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство +третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа +к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку; +-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию). + + 8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА. + +8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из +лицензионных продуктов, используемых на законных основаниях, а +именно https://entaxy.ru/libs/licenses/root-aggregated.deps. +8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть +совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения. +8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться +Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения, +содержащих все изменения и дополнения программного обеспечения. + + 9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ. + +9.1. Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым +программным обеспечением. +9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно +с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм +«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public. +9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий +пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя, +прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер +ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства +Российской Федерации. + + 10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ. + +10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет +право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб, +недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий +пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере +2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения +исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy). +10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое +законодательство – Российской Федерации. +10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным, +остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать +исполнять свои обязанности в соответствии с этими положениями. diff --git a/platform/integration/applications/application-impl/pom.xml b/platform/integration/applications/application-impl/pom.xml new file mode 100644 index 00000000..dfb2912c --- /dev/null +++ b/platform/integration/applications/application-impl/pom.xml @@ -0,0 +1,142 @@ + + + 4.0.0 + + ru.entaxy.platform.integration + applications + 1.11.0 + + ru.entaxy.platform.integration.applications + application-impl + bundle + ENTAXY :: PLATFORM :: INTEGRATION :: APPLICATIONS :: IMPL + ENTAXY :: PLATFORM :: INTEGRATION :: APPLICATIONS :: IMPL + + + ru.entaxy.platform.integration.applications.impl, + ru.entaxy.platform.integration.applications.impl.* + + + + + + org.apache.felix + maven-bundle-plugin + true + + + true + + + + + + + + + + ru.entaxy.platform.integration.applications + application-api + ${project.version} + + + org.apache.felix + org.apache.felix.scr + + + + + ru.entaxy.esb.platform.runtime.base + base-support + ${project.version} + + + org.apache.felix + org.apache.felix.scr + + + + + ru.entaxy.esb.platform.runtime.core + artifact-management + ${project.version} + + + org.apache.felix + org.apache.felix.scr + + + org.apache.karaf + org.apache.karaf.util + + + + + ru.entaxy.esb.platform.runtime.core + artifact-management-extensions + ${project.version} + + + org.apache.felix + org.apache.felix.scr + + + org.apache.karaf + org.apache.karaf.util + + + + + commons-io + commons-io + ${commons-io.version} + + + ru.entaxy.esb.platform.runtime.base.connecting.generator + generator-api + ${project.version} + + + org.apache.felix + org.apache.felix.scr + + + org.apache.karaf + org.apache.karaf.util + + + + + ru.entaxy.esb.platform.runtime.base.connecting.generator + generator-factory + ${project.version} + + + org.apache.felix + org.apache.felix.scr + + + + + ru.entaxy.esb.platform.runtime.base + cellar-extensions + ${project.version} + + + org.apache.felix + org.apache.felix.scr + + + org.apache.karaf + org.apache.karaf.util + + + + + ru.entaxy.esb.platform.runtime.core.objects-implementations.config-implementation + config-runtime + ${project.version} + + + + diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/ApplicationManagerImpl.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/ApplicationManagerImpl.java new file mode 100644 index 00000000..b4f5ce04 --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/ApplicationManagerImpl.java @@ -0,0 +1,175 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +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 ru.entaxy.platform.integration.applications.ApplicationManager; +import ru.entaxy.platform.integration.applications.ApplicationStorage; +import ru.entaxy.platform.integration.applications.ApplicationStorage.ApplicationImportContent; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProjectVersion; +import ru.entaxy.platform.integration.applications.exceptions.ApplicationException; +import ru.entaxy.platform.integration.applications.exceptions.ApplicationImportCausedException; +import ru.entaxy.platform.integration.applications.exceptions.StorageException; +import ru.entaxy.platform.integration.applications.exceptions.StorageNotEnabledException; +import ru.entaxy.platform.integration.applications.exceptions.StorageNotFoundException; +import ru.entaxy.platform.integration.applications.exceptions.ProjectVersionBuildNotAvailable; +import ru.entaxy.platform.integration.applications.exceptions.ProjectVersionCausedException; +import ru.entaxy.platform.integration.applications.exceptions.ProjectVersionException; + +@Component(service = ApplicationManager.class, immediate = true) +public class ApplicationManagerImpl implements ApplicationManager { + + protected Map storages = new HashMap<>(); + protected Object storagesLock = new Object(); + + @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC, + policyOption = ReferencePolicyOption.GREEDY) + volatile ExportImportHelper exportImportHelper; + + @Reference(cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC, + policyOption = ReferencePolicyOption.GREEDY, unbind = "unregisterStorage") + public void registerStorage(ApplicationStorage storage) { + synchronized (storagesLock) { + storages.put(storage.getName(), storage); + } + } + + public void unregisterStorage(ApplicationStorage storage) { + synchronized (storagesLock) { + storages.remove(storage.getName()); + } + } + + protected ApplicationStorage getStorageUnsafe(String storageName) throws StorageException { + ApplicationStorage storage = storages.get(storageName); + if (storage == null) + throw new StorageNotFoundException(storageName); + if (!storage.isEnabled()) + throw new StorageNotEnabledException(storageName); + return storage; + } + + /* ApplicationManager implementation */ + + @Override + public ApplicationStorage getStorage(String storageName) { + return storages.get(storageName); + } + + @Override + public List getAllStorages() { + return new ArrayList<>(storages.values()); + } + + @Override + public void addStorage(ApplicationStorage applicationStorage) { + // TODO Auto-generated method stub + + } + + @Override + public void removeStorage(ApplicationStorage applicationStorage) { + // TODO Auto-generated method stub + + } + + @Override + public void exportToFile(EntaxyApplicationProjectVersion version, String filePath) throws ProjectVersionException { + if (!version.isBuildAvailable()) + throw new ProjectVersionBuildNotAvailable(version.getApplication().getName(), version.getVersionNumber()); + Map props = new HashMap<>(); + props.put("filePath", filePath); + try { + exportImportHelper.doExport(version, "file", props); + } catch (ProjectVersionException ve) { + throw ve; + } catch (Exception e) { + throw new ProjectVersionCausedException(version.getApplication().getName(), version.getVersionNumber(), e); + } + } + + @Override + public void exportToRepository(EntaxyApplicationProjectVersion version, String repositoryName) + throws ProjectVersionException { + if (!version.isBuildAvailable()) + throw new ProjectVersionBuildNotAvailable(version.getApplication().getName(), version.getVersionNumber()); + Map props = new HashMap<>(); + props.put("repositoryName", repositoryName); + try { + exportImportHelper.doExport(version, "repository", props); + } catch (ProjectVersionException ve) { + throw ve; + } catch (Exception e) { + throw new ProjectVersionCausedException(version.getApplication().getName(), version.getVersionNumber(), e); + } + } + + @Override + public EntaxyApplication importApplicationFromFile(String storageName, String filePath) + throws ApplicationException, StorageException { + Map props = new HashMap<>(); + props.put("filePath", filePath); + try { + ApplicationImportContent result = exportImportHelper.doImport("file", props); + return createApplicationFromImport(storageName, result); + } catch (Exception e) { + throw new ApplicationImportCausedException(filePath, e); + } + } + + @Override + public EntaxyApplication importApplicationFromRepository(String storageName, String mavenUrl) + throws ApplicationException, StorageException { + Map props = new HashMap<>(); + props.put("mavenUrl", mavenUrl); + try { + ApplicationImportContent result = exportImportHelper.doImport("repository", props); + return createApplicationFromImport(storageName, result); + } catch (Exception e) { + throw new ApplicationImportCausedException(mavenUrl, e); + } + } + + protected EntaxyApplication createApplicationFromImport(String storageName, ApplicationImportContent importContent) + throws Exception { + ApplicationStorage storage = getStorageUnsafe(storageName); + EntaxyApplication result = storage.createApplication(importContent); + importContent.clear(); + return result; + } + +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/ApplicationObjectExtendedDataProvider.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/ApplicationObjectExtendedDataProvider.java new file mode 100644 index 00000000..355740e0 --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/ApplicationObjectExtendedDataProvider.java @@ -0,0 +1,123 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.karaf.features.Feature; +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.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ru.entaxy.platform.base.support.CommonUtils; +import ru.entaxy.platform.base.support.osgi.bundle.CapabilityDescriptor; +import ru.entaxy.platform.base.support.osgi.feature.FeatureCapabilityHelper; +import ru.entaxy.platform.base.support.osgi.feature.FeaturesUtils; +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject; +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObjectExtendedDataProvider; + +@Component(service = EntaxyRuntimeObjectExtendedDataProvider.class, immediate = true) +public class ApplicationObjectExtendedDataProvider implements EntaxyRuntimeObjectExtendedDataProvider { + + private static final Logger LOG = LoggerFactory.getLogger(ApplicationObjectExtendedDataProvider.class); + + private static final String APPLICATIONS_PROVIDER_ID = "applications"; + + protected final static String APP_NAMESPACE = "entaxy.application"; + + protected BundleContext bundleContext; + + @Activate + public void activate(ComponentContext componentContext) { + this.bundleContext = componentContext.getBundleContext(); + } + + @Override + public String getProviderId() { + return APPLICATIONS_PROVIDER_ID; + } + + @Override + public Map getExtendedData(EntaxyRuntimeObject runtimeObject) { + Map result = new HashMap<>(); + try { + Bundle b = bundleContext.getBundle(runtimeObject.getBundleInfo().getBundleId()); + List features = FeaturesUtils.FeaturesHelper.create(bundleContext) + .withCapabilityNamespace(APP_NAMESPACE) + .installedOnly() + .containingBundle(b).find(); + if (features.isEmpty()) + return null; + + List> applicationData = new ArrayList<>(); + for (Feature feature : features) { + List> featureApplications = getApplicationData(feature); + if (!featureApplications.isEmpty()) + applicationData.addAll(featureApplications); + } + + if (applicationData.isEmpty()) + return null; + + result.put("application", applicationData); + result.put("managed", true); + + } catch (Exception e) { + result.put("error", String.format("[%s:%s]", e.getClass().getName(), e.getMessage())); + LOG.error(String.format("Error getting extended data for [$s]", runtimeObject.getObjectFullId()), e); + } + return result; + } + + protected List> getApplicationData(Feature feature) { + List> result = new ArrayList<>(); + + FeatureCapabilityHelper capabilityHelper = new FeatureCapabilityHelper(feature); + List descriptors = capabilityHelper.getProvidedCapabilities(APP_NAMESPACE); + for (CapabilityDescriptor descriptor : descriptors) { + String name = descriptor.getAttributes().getOrDefault("name", "").toString(); + if (!CommonUtils.isValid(name)) + continue; + String version = descriptor.getAttributes().getOrDefault("version", "").toString(); + String revision = descriptor.getAttributes().getOrDefault("revision", "").toString(); + + Map data = new HashMap<>(); + data.put("name", name); + data.put("version", version); + data.put("revision", revision); + result.add(data); + } + return result; + } + +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/ExportImportHelper.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/ExportImportHelper.java new file mode 100644 index 00000000..0bb8b97b --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/ExportImportHelper.java @@ -0,0 +1,440 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +import org.osgi.framework.ServiceException; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import ru.entaxy.platform.base.support.CommonUtils; +import ru.entaxy.platform.base.support.JSONUtils; +import ru.entaxy.platform.base.support.osgi.OSGIUtils; +import ru.entaxy.platform.core.artifact.Artifact; +import ru.entaxy.platform.core.artifact.ArtifactCoordinates; +import ru.entaxy.platform.core.artifact.Artifacts; +import ru.entaxy.platform.core.artifact.repository.ArtifactRepository; +import ru.entaxy.platform.core.artifact.service.ArtifactService; +import ru.entaxy.platform.integration.applications.ApplicationStorage.ApplicationImportContent; +import ru.entaxy.platform.integration.applications.ApplicationStorage.ApplicationImportItem; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProjectVersion; +import ru.entaxy.platform.integration.applications.EntaxyApplicationRevision; +import ru.entaxy.platform.integration.applications.EntaxyApplicationVersion; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationComponent; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationDescriptor; +import ru.entaxy.platform.integration.applications.exceptions.ApplicationDescriptorIsInvalid; +import ru.entaxy.platform.integration.applications.exceptions.ApplicationDescriptorNotFound; + +@Component(service = ExportImportHelper.class, immediate = true) +public class ExportImportHelper { + + private static final Logger LOG = LoggerFactory.getLogger(ExportImportHelper.class); + + public final Map exporters = new HashMap<>(); + + public final Map importers = new HashMap<>(); + + protected static ExportImportHelper INSTANCE = null; + + @Activate + public void activate() { + exporters.put("file", new FileExporter()); + exporters.put("repository", new RepositoryExporter()); + importers.put("file", new FileImporter()); + importers.put("repository", new RepositoryImporter()); + ExportImportHelper.INSTANCE = this; + } + + public void doExport(EntaxyApplicationProjectVersion version, String exporterType, Map properties) + throws Exception { + if (!exporters.containsKey(exporterType)) + return; + Exporter exporter = exporters.get(exporterType); + exporter.execute(version, properties); + } + + public ApplicationImportContent doImport(String importerType, Map properties) + throws Exception { + if (!importers.containsKey(importerType)) + return null; + Importer importer = importers.get(importerType); + return importer.execute(properties); + } + + // importers + + + protected static class JarFileImportContent implements ApplicationImportContent { + + protected interface Cleaner { + void clean() throws Exception; + } + + protected static class FileCleaner implements Cleaner { + + protected File file; + + public FileCleaner(File file) { + this.file = file; + } + + @Override + public void clean() throws Exception { + file.delete(); + } + + } + + protected JarFile jarFile; + + protected Map items; + + protected Cleaner cleaner; + + public JarFileImportContent(JarFile jarFile) { + super(); + items = new HashMap<>(); + this.jarFile = jarFile; + Iterator entries = jarFile.entries().asIterator(); + while (entries.hasNext()) { + JarEntryImportItem item = new JarEntryImportItem(jarFile, entries.next()); + items.put(item.getPath(), item); + } + } + + public void setCleaner(Cleaner cleaner) { + this.cleaner = cleaner; + } + + @Override + public Map getItems() { + return items; + } + + @Override + public void clear() { + try { + jarFile.close(); + } catch (IOException ignore) { + // NOOP + } + if (cleaner != null) + try { + cleaner.clean(); + } catch (Exception ignore) { + // NOOP + } + } + + } + + protected static class JarEntryImportItem implements ApplicationImportItem { + + protected JarFile jarFile; + protected JarEntry jarEntry; + + protected String name; + protected String path; + protected String location; + + public JarEntryImportItem(JarFile jarFile, JarEntry jarEntry) { + super(); + this.jarEntry = jarEntry; + this.jarFile = jarFile; + init(); + } + + protected void init() { + path = jarEntry.getName(); + int index = path.lastIndexOf('/'); + if (index > 0) { + name = path.substring(index + 1); + location = path.substring(0, index); + } else { + name = path; + location = ""; + } + } + + @Override + public String getName() { + return name; + } + + @Override + public String getLocation() { + return location; + } + + @Override + public String getPath() { + return path; + } + + @Override + public InputStream getInputStream() throws IOException { + return jarFile.getInputStream(jarEntry); + } + + } + + protected abstract static class Importer { + + public abstract ApplicationImportContent execute(Map properties) + throws Exception; + + } + + protected static class FileImporter extends Importer { + + @Override + public ApplicationImportContent execute(Map properties) throws Exception { + String filePath = properties.getOrDefault("filePath", "").toString(); + if (!CommonUtils.isValid(filePath)) + throw new IllegalArgumentException("Invalid filePath: " + filePath); + File targetFile = new File(filePath); + if (!targetFile.exists()) + throw new IllegalArgumentException("File not exists: " + filePath); + if (targetFile.isDirectory()) + throw new IllegalArgumentException("File is directory: " + filePath); + JarFile jarFile = new JarFile(targetFile); + return new JarFileImportContent(jarFile); + } + + } + + protected static class RepositoryImporter extends Importer { + + @Override + public ApplicationImportContent execute(Map properties) throws Exception { + String mavenUrl = properties.getOrDefault("mavenUrl", "").toString(); + if (!CommonUtils.isValid(mavenUrl)) + throw new IllegalArgumentException("mavenUrl not set"); + if (!mavenUrl.startsWith("mvn:")) + mavenUrl = "mvn:" + mavenUrl; + + URL url = new URL(mavenUrl); + File tempFile = File.createTempFile("app-import-", Calendar.getInstance().getTimeInMillis() + ""); + try (InputStream is = url.openStream()) { + Files.copy(is, tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING); + } + + Map props = new HashMap<>(); + props.put("filePath", tempFile.getAbsolutePath()); + + ApplicationImportContent result = ExportImportHelper.INSTANCE.doImport("file", props); + ((JarFileImportContent) result).setCleaner(new JarFileImportContent.FileCleaner(tempFile)); + + return result; + } + + } + + // exporters + + protected abstract static class Exporter { + + public abstract void execute(EntaxyApplicationProjectVersion version, Map properties) + throws Exception; + + } + + protected static class FileExporter extends Exporter { + + @Override + public void execute(EntaxyApplicationProjectVersion version, Map properties) throws Exception { + String filePath = properties.getOrDefault("filePath", "").toString(); + if (filePath.endsWith("/")) { + // it's directory + String url = version.getBuildUrl().toString(); + String fileName = url.substring(url.lastIndexOf('/')); + filePath = filePath.concat(fileName); + } + if (!CommonUtils.isValid(filePath)) + return; + File targetFile = new File(filePath); + targetFile.getAbsoluteFile().getParentFile().mkdirs(); + try (FileOutputStream fos = new FileOutputStream(targetFile); + InputStream is = version.getBuild();) { + fos.write(is.readAllBytes()); + } + } + + } + + protected static class RepositoryExporter extends Exporter { + + @Override + public void execute(EntaxyApplicationProjectVersion version, Map properties) throws Exception { + ArtifactService artifactService = + OSGIUtils.services().ofClass(ArtifactService.class).waitService(20000).get(); + if (artifactService == null) + throw new ServiceException("Service not found: ArtifactService.class"); + + String repositoryName = properties.getOrDefault("repositoryName", "").toString(); + if (!CommonUtils.isValid(repositoryName)) + throw new IllegalArgumentException("repositoryName not set"); + + ArtifactRepository repo = artifactService.getRepository(repositoryName); + if (repo == null) + throw new IllegalArgumentException("Repository not found: " + repositoryName); + if (repo.isReadOnly()) { + throw new IllegalArgumentException("Repository " + repositoryName + " is read only."); + } + + Artifact artifact = Artifacts.create(Artifact.ARTIFACT_CATEGORY_JAR); + String mavenCoordinates = version.getBuildInfo().mavenUrl; + artifact.getCoordinates().update(ArtifactCoordinates.fromUrl(mavenCoordinates)); + try (InputStream is = version.getBuild()) { + artifact.setContent(is); + repo.deploy(artifact); + } + + } + + } + public static class ApplicationImporter { + + static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); + + protected StorageImportAdapter storageAdapter; + + protected ApplicationDescriptor applicationDescriptor = null; + + public ApplicationImporter(StorageImportAdapter storageAdapter) { + super(); + this.storageAdapter = storageAdapter; + } + + public void executeImport(ApplicationImportContent importContent) throws Exception { + // check descriptor + String applicationName = "unknown"; + ApplicationImportItem descriptorItem = importContent.getItems().get(EntaxyApplication.DESCRIPTOR_NAME); + + if (descriptorItem == null) + throw new ApplicationDescriptorNotFound(applicationName); + try (InputStream is = descriptorItem.getInputStream()) { + String descriptorData = new String(is.readAllBytes()); + applicationDescriptor = + GSON.fromJson(JSONUtils.getJsonRootObject(descriptorData), ApplicationDescriptor.class); + } catch (Exception e1) { + throw new ApplicationDescriptorIsInvalid(applicationName); + } + if (applicationDescriptor == null) + throw new ApplicationDescriptorIsInvalid(applicationName); + + // if something's wrong with descriptor, exception is thrown + storageAdapter.checkDescriptor(applicationDescriptor); + applicationName = applicationDescriptor.name; + + // if something's wrong, exception is thrown + StorageApplicationContentAdapter contentAdapter = + storageAdapter.getContentAdapter(applicationName, applicationDescriptor); + fillContent(applicationDescriptor, importContent, contentAdapter); + EntaxyApplicationVersion createdVersion = + storageAdapter.getVersion(applicationName, applicationDescriptor.version); + if (createdVersion == null) { + throw new java.lang.InstantiationException("Version not created"); + } + EntaxyApplicationRevision revision = createdVersion.createRevision(); + if (revision == null) { + throw new java.lang.InstantiationException("Revision not created"); + } + + } + + public ApplicationDescriptor getApplicationDescriptor() { + return applicationDescriptor; + } + + protected void fillContent(ApplicationDescriptor descriptor, ApplicationImportContent source, + StorageApplicationContentAdapter target) throws Exception { + + List locationsToProcess = new ArrayList<>(source.getItems().keySet()); + + // we skip descriptor 'cause it's already there + locationsToProcess.remove(EntaxyApplication.DESCRIPTOR_NAME); + + // we ignore manifest + locationsToProcess.remove("META-INF/MANIFEST.MF"); + + + // load features + if (descriptor.features == null) + throw new IllegalArgumentException("Features not found in descriptor"); + StorageItemAdapter item = target.createItem(descriptor.features); + try (InputStream is = source.getItems().get(descriptor.features.internalLocation).getInputStream()) { + item.write(is); + } catch (Exception e) { + LOG.error("Error writing [" + descriptor.features.internalLocation + "]", e); + } + locationsToProcess.remove(descriptor.features.internalLocation); + + // load components + for (ApplicationComponent comp : descriptor.getComponents()) { + item = target.createItem(comp); + try (InputStream is = source.getItems().get(comp.getInternalLocation()).getInputStream()) { + item.write(is); + } catch (Exception e) { + LOG.error("Error writing [" + comp.getInternalLocation() + "]", e); + } + locationsToProcess.remove(comp.getInternalLocation()); + } + + // left only resources + for (String location : locationsToProcess) { + try (InputStream is = source.getItems().get(location).getInputStream()) { + target.createResource(location, is); + } catch (Exception e) { + LOG.error("Error writing [" + location + "]", e); + } + } + + } + + } +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/ServiceHelper.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/ServiceHelper.java new file mode 100644 index 00000000..07e7a952 --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/ServiceHelper.java @@ -0,0 +1,94 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl; + +import org.apache.karaf.bundle.core.BundleService; +import org.osgi.service.component.annotations.Activate; +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 ru.entaxy.base.generator.template.TemplateService; +import ru.entaxy.esb.resources.EntaxyResourceService; +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObjectService; + +@Component(service = ServiceHelper.class, immediate = true) +public class ServiceHelper { + + private static ServiceHelper INSTANCE; + + public static ServiceHelper getInstance() { + return INSTANCE; + } + + @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC, + policyOption = ReferencePolicyOption.GREEDY) + volatile EntaxyRuntimeObjectService entaxyRuntimeObjectService; + + @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC, + policyOption = ReferencePolicyOption.GREEDY) + volatile EntaxyResourceService entaxyResourceService; + + + @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC, + policyOption = ReferencePolicyOption.GREEDY) + volatile TemplateService templateService; + + @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC, + policyOption = ReferencePolicyOption.GREEDY) + volatile BundleService bundleService; + + @Activate + public void activate() { + INSTANCE = this; + } + + public EntaxyRuntimeObjectService getEntaxyRuntimeObjectService() { + return entaxyRuntimeObjectService; + } + + public EntaxyResourceService getEntaxyResourceService() { + return entaxyResourceService; + } + + public TemplateService getTemplateService() { + return templateService; + } + + public BundleService getBundleService() { + return bundleService; + } + + public boolean objectExists(String objectFullId) { + return entaxyRuntimeObjectService.getRuntimeObject(objectFullId) != null; + } + + public boolean resourceExists(String resourceUrl) { + return entaxyResourceService.getResource(resourceUrl).exists(); + } +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/StorageApplicationContentAdapter.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/StorageApplicationContentAdapter.java new file mode 100644 index 00000000..8e4d5b6a --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/StorageApplicationContentAdapter.java @@ -0,0 +1,41 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl; + +import java.io.InputStream; + +import ru.entaxy.platform.integration.applications.ApplicationResource; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationComponent; + +public interface StorageApplicationContentAdapter { + + StorageItemAdapter createItem(ApplicationComponent applicationComponent) throws Exception; + + ApplicationResource createResource(String location, InputStream inputStream) throws Exception; + + StorageItemAdapter getItemAdapter(String location) throws Exception; + +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/StorageImportAdapter.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/StorageImportAdapter.java new file mode 100644 index 00000000..ba4cdd5a --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/StorageImportAdapter.java @@ -0,0 +1,42 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl; + +import ru.entaxy.platform.integration.applications.EntaxyApplicationVersion; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationDescriptor; +import ru.entaxy.platform.integration.applications.exceptions.ApplicationException; +import ru.entaxy.platform.integration.applications.exceptions.StorageException; + +public interface StorageImportAdapter { + + void checkDescriptor(ApplicationDescriptor applicationDescriptor) throws ApplicationException, StorageException; + + StorageApplicationContentAdapter getContentAdapter(String applicationName, + ApplicationDescriptor applicationDescriptor) throws ApplicationException, StorageException; + + EntaxyApplicationVersion getVersion(String applicationName, String version) + throws ApplicationException, StorageException; +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/StorageItemAdapter.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/StorageItemAdapter.java new file mode 100644 index 00000000..a2b32015 --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/StorageItemAdapter.java @@ -0,0 +1,36 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl; + +import java.io.InputStream; + +public interface StorageItemAdapter { + + InputStream getInputStream(); + + void write(InputStream source) throws Exception; + +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/application/ApplicationContentImpl.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/application/ApplicationContentImpl.java new file mode 100644 index 00000000..f015285c --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/application/ApplicationContentImpl.java @@ -0,0 +1,70 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.application; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import ru.entaxy.platform.integration.applications.ApplicationContent; +import ru.entaxy.platform.integration.applications.ApplicationItem; +import ru.entaxy.platform.integration.applications.ApplicationResource; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationDescriptor; + +public class ApplicationContentImpl implements ApplicationContent { + + protected ApplicationDescriptor descriptor; + + protected Map items = new HashMap<>(); + + protected Map resources = new HashMap<>(); + + public ApplicationContentImpl(ApplicationDescriptor descriptor) { + super(); + this.descriptor = descriptor; + } + + public void setDescriptor(ApplicationDescriptor descriptor) { + this.descriptor = descriptor; + } + + @Override + public ApplicationDescriptor getDescriptor() { + return descriptor; + } + + @Override + public List getItems() { + return items.values().stream().collect(Collectors.toList()); + } + + @Override + public List getResources() { + return resources.values().stream().collect(Collectors.toList()); + } + +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/application/ApplicationItemImpl.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/application/ApplicationItemImpl.java new file mode 100644 index 00000000..fb3d9cbb --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/application/ApplicationItemImpl.java @@ -0,0 +1,95 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.application; + +import java.io.InputStream; + +import ru.entaxy.platform.integration.applications.ApplicationItem; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplication.ITEM_TYPE; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationComponent; +import ru.entaxy.platform.integration.applications.impl.StorageItemAdapter; + +public class ApplicationItemImpl implements ApplicationItem { + + protected String id; + protected EntaxyApplication.ITEM_TYPE type; + protected String location; + + protected boolean isRevisionable = true; + protected boolean isEditable = true; + + protected transient StorageItemAdapter itemAdapter; + + public ApplicationItemImpl(ApplicationComponent applicationComponent, StorageItemAdapter itemAdapter) { + super(); + this.itemAdapter = itemAdapter; + id = applicationComponent.id; + type = applicationComponent.type; + location = applicationComponent.internalLocation; + isRevisionable = ITEM_TYPE.CONFIG.equals(type) || ITEM_TYPE.FEATURES.equals(type); + isEditable = ITEM_TYPE.CONFIG.equals(type); + } + + + + @Override + public InputStream getInputStream() { + return itemAdapter.getInputStream(); + } + + @Override + public void update(InputStream inputStream) throws Exception { + this.itemAdapter.write(inputStream); + } + + @Override + public String getId() { + return id; + } + + @Override + public EntaxyApplication.ITEM_TYPE getType() { + return type; + } + + @Override + public String getLocation() { + return location; + } + + @Override + public boolean isRevisionable() { + return isRevisionable; + } + + @Override + public boolean isEditable() { + return isEditable; + } + + +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/application/ApplicationResourceImpl.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/application/ApplicationResourceImpl.java new file mode 100644 index 00000000..5c4f3d78 --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/application/ApplicationResourceImpl.java @@ -0,0 +1,40 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.application; + +import java.io.InputStream; + +import ru.entaxy.platform.integration.applications.ApplicationResource; + +public class ApplicationResourceImpl implements ApplicationResource { + + @Override + public InputStream getInputStream() { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/application/RevisionHelper.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/application/RevisionHelper.java new file mode 100644 index 00000000..cd9a775c --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/application/RevisionHelper.java @@ -0,0 +1,599 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.application; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +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.factory.GeneratorFactory; +import ru.entaxy.platform.base.support.osgi.OSGIUtils; +import ru.entaxy.platform.core.artifact.Artifact; +import ru.entaxy.platform.core.artifact.ArtifactCoordinates; +import ru.entaxy.platform.core.artifact.Artifacts; +import ru.entaxy.platform.core.artifact.DeployedArtifact; +import ru.entaxy.platform.core.artifact.ext.ArtifactExtended; +import ru.entaxy.platform.core.artifact.ext.binary.UntypedBinaryInstaller; +import ru.entaxy.platform.core.artifact.ext.features.FeatureInstaller; +import ru.entaxy.platform.core.artifact.ext.features.FeaturesInstaller; +import ru.entaxy.platform.core.artifact.installer.builder.ClusterInstaller; +import ru.entaxy.platform.core.artifact.installer.builder.InstallationResult; +import ru.entaxy.platform.core.artifact.service.ArtifactService; +import ru.entaxy.platform.integration.applications.ApplicationItem; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationRevision.REVISION_STATUS; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationComponent; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationFeatures; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationRequirement; +import ru.entaxy.platform.integration.applications.exceptions.RevisionCausedException; +import ru.entaxy.platform.integration.applications.exceptions.RevisionException; +import ru.entaxy.platform.integration.applications.exceptions.RevisionIllegalTransition; +import ru.entaxy.platform.integration.applications.exceptions.RevisionNotConfigurable; +import ru.entaxy.platform.integration.applications.exceptions.RevisionRequirementsNotSatisfied; +import ru.entaxy.platform.integration.applications.impl.ServiceHelper; +import ru.entaxy.platform.runtime.cellar.sequence.CellarSequenceManager; + +public class RevisionHelper { + + private static final Logger LOG = LoggerFactory.getLogger(RevisionHelper.class); + + public static interface RevisionHelperAdapter { + REVISION_STATUS getCurrentStatus(); + + void updateStatus(REVISION_STATUS newStatus); + + int getRevisionNumber(); + + void writeItem(String location, InputStream inputStream) throws Exception; + } + + protected ApplicationContentImpl applicationContent; + protected RevisionHelperAdapter adapter; + + protected int revisionNumber; + + protected REVISION_STATUS currentStatus; + + protected String applicationName; + + protected String version; + + public RevisionHelper(ApplicationContentImpl applicationContent, RevisionHelperAdapter adapter) { + super(); + this.applicationContent = applicationContent; + this.adapter = adapter; + this.revisionNumber = this.adapter.getRevisionNumber(); + this.currentStatus = this.adapter.getCurrentStatus(); + this.applicationName = applicationContent.getDescriptor().name; + this.version = applicationContent.getDescriptor().version; + } + + public void configure() throws RevisionException { + if (applicationContent.getEditables().isEmpty()) + throw new RevisionNotConfigurable(applicationName, + version, revisionNumber); + // revision 0 is not configured !!! + if (revisionNumber == 0) { + throw new RevisionNotConfigurable(applicationName, + version, revisionNumber); + } + if (!REVISION_STATUS.NEW.equals(currentStatus) && !REVISION_STATUS.CONFIGURED.equals(currentStatus) + && !REVISION_STATUS.DEPLOYED.equals(currentStatus)) + throw new RevisionIllegalTransition(applicationName, version, revisionNumber, currentStatus, + REVISION_STATUS.CONFIGURED); + currentStatus = REVISION_STATUS.CONFIGURED; + adapter.updateStatus(currentStatus); + } + + public void deploy() throws RevisionException { + if (REVISION_STATUS.INSTALLED.equals(currentStatus) || REVISION_STATUS.UNINSTALLED.equals(currentStatus) + || REVISION_STATUS.DEPLOYED.equals(currentStatus)) + throw new RevisionIllegalTransition(applicationName, version, revisionNumber, currentStatus, + REVISION_STATUS.DEPLOYED); + + try { + ArtifactService artifactService = + OSGIUtils.services().ofClass(ArtifactService.class).waitService(2000).get(); + + if (artifactService == null) + throw new IllegalArgumentException("ArtifactService not available"); + + Map componentMap = new HashMap<>(); + componentMap.put(applicationContent.getDescriptor().getFeatures().internalLocation, + applicationContent.getDescriptor().getFeatures()); + for (ApplicationComponent comp : applicationContent.getDescriptor().getComponents()) + componentMap.put(comp.internalLocation, comp); + + for (ApplicationItem item : applicationContent.getItems()) { + + ApplicationComponent comp = componentMap.get(item.getLocation()); + if (comp == null) + continue; + + Artifact artifact = Artifacts.create(ArtifactExtended.ARTIFACT_CATEGORY_UNTYPED_BINARY); + artifact.getCoordinates().set(ArtifactCoordinates.fromUrl(comp.mavenLocation)); + try (InputStream is = item.getInputStream()) { + artifact.setContent(is); + artifactService.deployShared(artifact); + } + } + + } catch (RevisionException rethrow) { + throw rethrow; + } catch (Exception e) { + throw new RevisionCausedException(applicationName, e, version, revisionNumber); + } + + + currentStatus = REVISION_STATUS.DEPLOYED; + adapter.updateStatus(currentStatus); + + } + + public void install() throws RevisionException { + if (!REVISION_STATUS.DEPLOYED.equals(currentStatus) && !REVISION_STATUS.UNINSTALLED.equals(currentStatus)) + throw new RevisionIllegalTransition(applicationName, version, revisionNumber, currentStatus, + REVISION_STATUS.INSTALLED); + List failed = checkRequirements(); + if (!failed.isEmpty()) + throw new RevisionRequirementsNotSatisfied(applicationName, version, revisionNumber, failed); + + try { + ArtifactService artifactService = + OSGIUtils.services().ofClass(ArtifactService.class).waitService(2000).get(); + + if (artifactService == null) + throw new IllegalArgumentException("ArtifactService not available"); + + CellarSequenceManager sequenceManager = + OSGIUtils.services().ofClass(CellarSequenceManager.class).waitService(2000).get(); + + if (sequenceManager == null) + throw new IllegalArgumentException("CellarSequenceManager not available"); + + + String sequenceId = applicationContent.getDescriptor().getFeatures().mavenLocation; + + FeaturesInstaller installer = + artifactService.installers().cluster().typed(FeaturesInstaller.class).refresh() + .inSequence(sequenceId); + installer.setSourceLocation(applicationContent.getDescriptor().getFeatures().getFullTargetLocation()); + InstallationResult result = installer.install(); + + if (!result.isSuccessful()) { + if (result.getError() != null) + throw new Exception(result.getMessage(), result.getError()); + } + + FeatureInstaller featureInstaller = artifactService.installers().cluster().typed(FeatureInstaller.class); + String featureVersion = ArtifactCoordinates + .fromUrl(applicationContent.getDescriptor().getFeatures().mavenLocation).getVersion(); + InstallationResult featureResult = featureInstaller + .inSequence(sequenceId) + .feature(applicationContent.getDescriptor().getFeatures().getId()) + .version(featureVersion) + .noRefresh() + .upgrade() + .install(); + + // set up sequence + + sequenceManager.getSequence(sequenceId).getEvent().setWaitLast(false); + + // process sequence + + sequenceManager.produceSequence(sequenceId); + sequenceManager.releaseSequence(sequenceId); + + if (!featureResult.isSuccessful()) { + InstallationResult firstFailedSubresult = null; + for (InstallationResult res : featureResult.getSubResults()) + if (!res.isSuccessful()) { + firstFailedSubresult = res; + break; + } + if (firstFailedSubresult == null) + throw new Exception("Feature installation failed"); + + if (firstFailedSubresult.getError() != null) + throw new Exception("Feature installation failed: [" + firstFailedSubresult.getObject() != null + ? firstFailedSubresult.getObject().toString() + : "unknown" + "]", firstFailedSubresult.getError()); + else + throw new Exception("Feature installation failed: [" + firstFailedSubresult.getObject() != null + ? firstFailedSubresult.getObject().toString() + : "unknown" + "]"); + } + + List failedfeatures = new ArrayList<>(); + for (InstallationResult res : featureResult.getSubResults()) + if (!res.isSuccessful()) { + // TODO implement rollback if we have failed subresults + if (res.getObject() != null) + failedfeatures.add(res.getObject().toString()); + else + failedfeatures.add("unknown_" + failedfeatures.size()); + } + + if (!failedfeatures.isEmpty()) + throw new Exception("Feature installation failed: [" + + failedfeatures.stream().collect(Collectors.joining(",")) + "]"); + } catch (RevisionException rethrow) { + throw rethrow; + } catch (Exception e) { + throw new RevisionCausedException(applicationName, e, version, revisionNumber); + } + + currentStatus = REVISION_STATUS.INSTALLED; + adapter.updateStatus(currentStatus); + + } + + public void installDev() throws RevisionException { + if (!REVISION_STATUS.DEPLOYED.equals(currentStatus) && !REVISION_STATUS.UNINSTALLED.equals(currentStatus)) + throw new RevisionIllegalTransition(applicationName, version, revisionNumber, currentStatus, + REVISION_STATUS.INSTALLED); + List failed = checkRequirements(); + if (!failed.isEmpty()) + throw new RevisionRequirementsNotSatisfied(applicationName, version, revisionNumber, failed); + + try { + + /* + * Install features repo & *-dev feature: configs only + */ + + ArtifactService artifactService = + OSGIUtils.services().ofClass(ArtifactService.class).waitService(2000).get(); + + if (artifactService == null) + throw new IllegalArgumentException("ArtifactService not available"); + + CellarSequenceManager sequenceManager = + OSGIUtils.services().ofClass(CellarSequenceManager.class).waitService(2000).get(); + + if (sequenceManager == null) + throw new IllegalArgumentException("CellarSequenceManager not available"); + + + String sequenceId = applicationContent.getDescriptor().getFeatures().mavenLocation; + + FeaturesInstaller installer = + artifactService.installers().cluster().typed(FeaturesInstaller.class).refresh() + .inSequence(sequenceId); + installer.setSourceLocation(applicationContent.getDescriptor().getFeatures().getFullTargetLocation()); + InstallationResult result = installer.install(); + + if (!result.isSuccessful()) { + if (result.getError() != null) + throw new Exception(result.getMessage(), result.getError()); + } + + FeatureInstaller featureInstaller = artifactService.installers().cluster().typed(FeatureInstaller.class); + String featureVersion = ArtifactCoordinates + .fromUrl(applicationContent.getDescriptor().getFeatures().mavenLocation).getVersion(); + InstallationResult featureResult = featureInstaller + .inSequence(sequenceId) + .feature(applicationContent.getDescriptor().getFeatures().getDevId()) + .version(featureVersion) + .noRefresh() + .upgrade() + .install(); + + // set up sequence + + sequenceManager.getSequence(sequenceId).getEvent().setWaitLast(false); + + // process sequence + + sequenceManager.produceSequence(sequenceId); + sequenceManager.releaseSequence(sequenceId); + + if (!featureResult.isSuccessful()) { + InstallationResult firstFailedSubresult = null; + for (InstallationResult res : featureResult.getSubResults()) + if (!res.isSuccessful()) { + firstFailedSubresult = res; + break; + } + if (firstFailedSubresult == null) + throw new Exception("Feature installation failed"); + + if (firstFailedSubresult.getError() != null) + throw new Exception("Feature installation failed: [" + firstFailedSubresult.getObject() != null + ? firstFailedSubresult.getObject().toString() + : "unknown" + "]", firstFailedSubresult.getError()); + else + throw new Exception("Feature installation failed: [" + firstFailedSubresult.getObject() != null + ? firstFailedSubresult.getObject().toString() + : "unknown" + "]"); + } + + List failedfeatures = new ArrayList<>(); + for (InstallationResult res : featureResult.getSubResults()) + if (!res.isSuccessful()) { + // TODO implement rollback if we have failed subresults + if (res.getObject() != null) + failedfeatures.add(res.getObject().toString()); + else + failedfeatures.add("unknown_" + failedfeatures.size()); + } + + if (!failedfeatures.isEmpty()) + throw new Exception("Feature installation failed: [" + + failedfeatures.stream().collect(Collectors.joining(",")) + "]"); + + /* + * Install components (bundles & blueprints) one by one + */ + + Map componentMap = new HashMap<>(); + for (ApplicationComponent comp : applicationContent.getDescriptor().getComponents()) + if (EntaxyApplication.ITEM_TYPE.BUNDLE.equals(comp.getType())) + componentMap.put(comp.internalLocation, comp); + + + for (ApplicationItem item : applicationContent.getItems()) { + + ClusterInstaller ci = artifactService.installers().cluster(); + + ApplicationComponent comp = componentMap.get(item.getLocation()); + if (comp == null) + continue; + + Artifact artifact = Artifacts.create(ArtifactExtended.ARTIFACT_CATEGORY_UNTYPED_BINARY); + artifact.getCoordinates().set(ArtifactCoordinates.fromUrl(comp.mavenLocation)); + + DeployedArtifact da = new DeployedArtifact() { + + @Override + public String getLocation() { + return comp.getFullTargetLocation(); + } + + @Override + public Artifact getArtifact() { + return artifact; + } + }; + + InstallationResult installationResult = + ci.artifact(da).sourceLocation(comp.getFullTargetLocation()).typed(UntypedBinaryInstaller.class) + .startLevel(comp.getPriority()) + .update() + .start() + .install(); + + if (!installationResult.isSuccessful()) + if (installationResult.getError() != null) + throw new Exception(installationResult.getError()); + else + throw new Exception("Installation exceptin: [" + installationResult.getError() + "]"); + + } + + + + } catch (RevisionException rethrow) { + throw rethrow; + } catch (Exception e) { + throw new RevisionCausedException(applicationName, e, version, revisionNumber); + } + + } + + public void uninstall() throws RevisionException { + if (!REVISION_STATUS.INSTALLED.equals(currentStatus)) + throw new RevisionIllegalTransition(applicationName, version, revisionNumber, currentStatus, + REVISION_STATUS.UNINSTALLED); + + try { + ArtifactService artifactService = + OSGIUtils.services().ofClass(ArtifactService.class).waitService(2000).get(); + + if (artifactService == null) + throw new IllegalArgumentException("ArtifactService not available"); + + CellarSequenceManager sequenceManager = + OSGIUtils.services().ofClass(CellarSequenceManager.class).waitService(2000).get(); + + if (sequenceManager == null) + throw new IllegalArgumentException("CellarSequenceManager not available"); + + + String sequenceId = applicationContent.getDescriptor().getFeatures().mavenLocation; + + FeaturesInstaller installer = + artifactService.installers().cluster().typed(FeaturesInstaller.class).refresh() + .inSequence(sequenceId); + installer.setSourceLocation(applicationContent.getDescriptor().getFeatures().getFullTargetLocation()); + InstallationResult result = installer.uninstall(); + + if (!result.isSuccessful()) { + if (result.getError() != null) + throw new Exception(result.getMessage(), result.getError()); + } + + FeatureInstaller featureInstaller = artifactService.installers().cluster().typed(FeatureInstaller.class); + String featureVersion = ArtifactCoordinates + .fromUrl(applicationContent.getDescriptor().getFeatures().mavenLocation).getVersion(); + InstallationResult featureResult = featureInstaller + .inSequence(sequenceId) + .feature(applicationContent.getDescriptor().getFeatures().getId()) + .version(featureVersion) + .noRefresh() + .uninstall(); + + // set up sequence + + sequenceManager.getSequence(sequenceId).getEvent().setWaitLast(false); + + // process sequence + + sequenceManager.produceSequence(sequenceId); + sequenceManager.releaseSequence(sequenceId); + + if (!featureResult.isSuccessful()) { + InstallationResult firstFailedSubresult = null; + for (InstallationResult res : featureResult.getSubResults()) + if (!res.isSuccessful()) { + firstFailedSubresult = res; + break; + } + if (firstFailedSubresult == null) + throw new Exception("Feature uninstallation failed"); + + if (firstFailedSubresult.getError() != null) + throw new Exception("Feature uninstallation failed: [" + firstFailedSubresult.getObject() != null + ? firstFailedSubresult.getObject().toString() + : "unknown" + "]", firstFailedSubresult.getError()); + else + throw new Exception("Feature uninstallation failed: [" + firstFailedSubresult.getObject() != null + ? firstFailedSubresult.getObject().toString() + : "unknown" + "]"); + } + + List failedfeatures = new ArrayList<>(); + for (InstallationResult res : featureResult.getSubResults()) + if (!res.isSuccessful()) { + // TODO implement rollback if we have failed subresults + if (res.getObject() != null) + failedfeatures.add(res.getObject().toString()); + else + failedfeatures.add("unknown_" + failedfeatures.size()); + } + + if (!failedfeatures.isEmpty()) + throw new Exception("Feature installation failed: [" + + failedfeatures.stream().collect(Collectors.joining(",")) + "]"); + } catch (RevisionException rethrow) { + throw rethrow; + } catch (Exception e) { + throw new RevisionCausedException(applicationName, e, version, revisionNumber); + } + + currentStatus = REVISION_STATUS.UNINSTALLED; + adapter.updateStatus(currentStatus); + + } + + protected List checkRequirements() { + List result = new ArrayList<>(); + for (ApplicationRequirement req : applicationContent.getDescriptor().getRequirements()) { + if (!checkRequirement(req)) + result.add(req); + } + return result; + } + + protected boolean checkRequirement(ApplicationRequirement req) { + if (EntaxyApplication.ITEM_TYPE.OBJECT.equals(req.getType())) { + return ServiceHelper.getInstance().objectExists(req.getId()); + } + if (EntaxyApplication.ITEM_TYPE.RESOURCE.equals(req.getType())) { + return ServiceHelper.getInstance().resourceExists(req.getId()); + } + return true; + } + + public void update() throws Exception { + updateComponentVersions(); + updateFeatures(); + } + + protected void updateComponentVersions() throws Exception { + List components = new ArrayList<>(); + components.add(applicationContent.getDescriptor().features); + + components.addAll(applicationContent.getDescriptor().getComponents()); + + List revisionableIds = applicationContent.getItems().stream().filter(item -> item.isRevisionable()) + .map(item -> item.getId()).collect(Collectors.toList()); + + for (ApplicationComponent component : components) { + + if (!revisionableIds.contains(component.id)) + continue; + + ArtifactCoordinates coordinates = ArtifactCoordinates.fromUrl(component.mavenLocation); + coordinates.qualifier(String.format("REV_%03d", revisionNumber)); + component.mavenLocation = coordinates.toMavenString(); + coordinates = ArtifactCoordinates.fromUrl(component.targetLocation); + // coordinates may be null for configs + if (coordinates == null) + continue; + coordinates.qualifier(String.format("REV_%03d", revisionNumber)); + component.targetLocation = coordinates.toMavenString(); + } + } + + protected void updateFeatures() throws Exception { + + Template template = + ServiceHelper.getInstance().getTemplateService().getTemplateById("applications.builder.features"); + TemplateAwareGenerator generator = GeneratorFactory.createGenerator(template); + + if (generator != null) { + ApplicationFeatures features = applicationContent.getDescriptor().getFeatures(); + ArtifactCoordinates coord = ArtifactCoordinates.fromUrl(features.mavenLocation); + String repoName = String.format("%s.%s-%s", coord.getGroupId(), coord.getArtifactId(), coord.getVersion()); + String featureName = String.format("%s.%s", coord.getGroupId(), coord.getArtifactId()); + + // convert to OSGI-style version + String featureVersion = coord.getVersion().replace('-', '.'); + + Map params = new HashMap<>(); + params.put("descriptor", applicationContent.getDescriptor()); + params.put("repoName", repoName); + params.put("featureName", featureName); + params.put("featureVersion", featureVersion); + params.put("revisionNumber", revisionNumber + ""); + Generated generated; + generated = generator.generate(template, params); + if ((generated == null) || (generated.getObject() == null)) { + throw new IllegalArgumentException("Generated features is null"); + } + + try (ByteArrayInputStream bis = new ByteArrayInputStream(generated.getObject().toString().getBytes())) { + adapter.writeItem(features.internalLocation, bis); + } + + } else { + throw new IllegalArgumentException("Generator not defined for 'applications.builder.features'"); + } + + } +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/AbstractDescriptor.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/AbstractDescriptor.java new file mode 100644 index 00000000..03a92caf --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/AbstractDescriptor.java @@ -0,0 +1,56 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.build; + +public abstract class AbstractDescriptor { + + public enum TYPE { + BUNDLE, + RESOURCE, + CONFIG + } + + TYPE type; + + // location within application bundle + String finalLocation; + + // source location for final installation + String finalMavenLocation; + + int priority = 50; + + boolean consistent = true; + + protected AbstractDescriptor() { + super(); + type = getDescriptorType(); + } + + abstract public String getDescriptorId(); + + abstract protected TYPE getDescriptorType(); +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/AbstractStorage.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/AbstractStorage.java new file mode 100644 index 00000000..356176e6 --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/AbstractStorage.java @@ -0,0 +1,74 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.build; + +import java.io.File; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import ru.entaxy.platform.core.artifact.ArtifactCoordinates; + +public abstract class AbstractStorage { + + public static class BuildResult { + + Map newDescriptors = new HashMap<>(); + Map changes = new HashMap<>(); + } + + File parentDir; + + File tempDir; + + File rootDirectory; + + List descriptors = new ArrayList<>(); + + protected AbstractStorage(File parentDir, File tempDir) { + super(); + this.parentDir = parentDir; + this.tempDir = tempDir; + this.rootDirectory = new File(Paths.get(parentDir.getAbsolutePath(), getStorageDir()).toAbsolutePath().toUri()); + this.rootDirectory.mkdirs(); + } + + + public void addDescriptor(T descriptor) { + this.descriptors.add(descriptor); + } + + protected abstract String getStorageDir(); + + public abstract void prepare(); + + public abstract void prepareDescriptor(T descriptor); + + public abstract BuildResult build(ArtifactCoordinates applicationCoordinates); + +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/ApplicationBuilder.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/ApplicationBuilder.java new file mode 100644 index 00000000..667545b3 --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/ApplicationBuilder.java @@ -0,0 +1,558 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.build; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URL; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.UUID; +import java.util.stream.Collectors; + +import org.apache.commons.io.FileUtils; +import org.osgi.framework.Bundle; +import org.osgi.framework.FrameworkUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; + +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.factory.GeneratorFactory; +import ru.entaxy.platform.core.artifact.ArtifactCoordinates; +import ru.entaxy.platform.integration.applications.ApplicationProjectContent.STANDARD_PROPERTIES; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplication.ITEM_TYPE; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationComponent; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationContentItem; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationDescriptor; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationFeatures; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationRequirement; +import ru.entaxy.platform.integration.applications.impl.ServiceHelper; +import ru.entaxy.platform.integration.applications.impl.build.AbstractStorage.BuildResult; +import ru.entaxy.platform.integration.applications.impl.jar.FolderBasedJarBuilder; +import ru.entaxy.platform.integration.applications.impl.project.ApplicationProjectContentImpl; +import ru.entaxy.platform.integration.applications.impl.project.ApplicationProjectItemImpl; +import ru.entaxy.platform.integration.applications.impl.project.item.BundleItemImpl; +import ru.entaxy.platform.integration.applications.impl.project.item.ConfigItemImpl; +import ru.entaxy.platform.integration.applications.impl.project.item.ObjectItemImpl; +import ru.entaxy.platform.integration.applications.impl.project.item.ResourceItemImpl; +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject; + +public class ApplicationBuilder { + + private static final Logger LOG = LoggerFactory.getLogger(ApplicationBuilder.class); + + protected static Gson GSON = new GsonBuilder().setPrettyPrinting().create(); + + public static final String DEFAULT_VERSION = "1.0.0"; + + public static final String DEFAULT_APP_NAME = "app-0"; + + protected static final String CONTENT_ROOT_NAME = "content"; + + protected static final String TEMP_ROOT_NAME = "temp"; + + protected static final URI ROOT_FILE_URI = + Paths.get(System.getProperty("karaf.home"), "data/tmp/.appbuilder").toAbsolutePath().toUri(); + + protected static File ROOT_FILE; + + protected static boolean IS_INITED = false; + + protected static void initRootFile() { + if (IS_INITED) + return; + ROOT_FILE = new File(ROOT_FILE_URI); + ROOT_FILE.mkdirs(); + IS_INITED = true; + } + + final protected ArtifactCoordinates coordinates = new ArtifactCoordinates(); + + protected ApplicationProjectContentImpl applicationContent; + + protected String buildRootName = UUID.randomUUID().toString(); + + protected File buildRoot; + + protected File buildContentRoot; + + protected File buildTempRoot; + + protected Map bundleDescriptors = new HashMap<>(); + + protected Map resourceDescriptors = new HashMap<>(); + + protected Map configDescriptors = new HashMap<>(); + + protected Map itemToDescriptorMap = new HashMap<>(); + + protected BundleStorage bundleStorage; + + protected ResourceStorage resourceStorage; + + protected ConfigStorage configStorage; + + protected ApplicationDescriptor descriptor; + + protected File buildResult; + + public ApplicationBuilder(ApplicationProjectContentImpl applicationContent) { + super(); + initRootFile(); + this.applicationContent = applicationContent; + coordinates.groupId(applicationContent.getProperties().getOrDefault(STANDARD_PROPERTIES.GROUP, + EntaxyApplication.DEFAULT_GROUP_ID).toString()) + .version(applicationContent.getProperties().getOrDefault(STANDARD_PROPERTIES.VERSION, + DEFAULT_VERSION).toString()) + .artifactId(applicationContent.getProperties().getOrDefault(STANDARD_PROPERTIES.APPLICATION, + DEFAULT_APP_NAME).toString()); + buildRoot = new File(Paths.get(ROOT_FILE.getAbsolutePath(), buildRootName).toAbsolutePath().toUri()); + buildRoot.mkdirs(); + + buildContentRoot = new File(Paths.get(buildRoot.getAbsolutePath(), CONTENT_ROOT_NAME).toAbsolutePath().toUri()); + buildContentRoot.mkdirs(); + + buildTempRoot = new File(Paths.get(buildRoot.getAbsolutePath(), TEMP_ROOT_NAME).toAbsolutePath().toUri()); + buildTempRoot.mkdirs(); + + bundleStorage = new BundleStorage(buildContentRoot, buildTempRoot); + + resourceStorage = new ResourceStorage(buildContentRoot, buildTempRoot); + + configStorage = new ConfigStorage(buildContentRoot, buildTempRoot); + } + + public ArtifactCoordinates getCoordinates() { + return coordinates; + } + + public void prepareContent() { + + // get only included items + List includedItems = applicationContent.getItemsMap().values().stream() + .filter(item -> !item.isRequired()).collect(Collectors.toList()); + + // get by type + List includedBundles = new ArrayList<>(); + List includedObjects = new ArrayList<>(); + List includedConfigs = new ArrayList<>(); + List includedResources = new ArrayList<>(); + + for (ApplicationProjectItemImpl item : includedItems) + if (item instanceof ConfigItemImpl) + includedConfigs.add((ConfigItemImpl) item); + else if (item instanceof ObjectItemImpl) + includedObjects.add((ObjectItemImpl) item); + else if (item instanceof BundleItemImpl) + includedBundles.add((BundleItemImpl) item); + else if (item instanceof ResourceItemImpl) + includedResources.add((ResourceItemImpl) item); + else + continue; + + // collect bundles for objects + for (ObjectItemImpl item : includedObjects) { + // actualize object info + EntaxyRuntimeObject runtimeObject = + ServiceHelper.getInstance().getEntaxyRuntimeObjectService().getRuntimeObject( + item.getObject().getObjectFullId()); + String containerId = runtimeObject.getContainer().getId(); + BundleDescriptor desc; + if (!bundleDescriptors.containsKey(containerId)) { + long bundleId = Long.parseLong(containerId); + Bundle bundle = FrameworkUtil.getBundle(getClass()).getBundleContext().getBundle(bundleId); + desc = BundleDescriptor.forBundle(bundle); + if (!desc.consistent) { + LOG.error(String.format("Descritor is inconcistent for bundle [%s]", containerId)); + continue; + } + bundleDescriptors.put(containerId, desc); + bundleStorage.addDescriptor(desc); + } else { + desc = bundleDescriptors.get(containerId); + } + itemToDescriptorMap.put(item.getId(), desc); + } + + // collect other bundles + for (BundleItemImpl item : includedBundles) { + // TODO implement + } + + // collect resources + for (ResourceItemImpl item : includedResources) { + ResourceDescriptor desc; + if (!resourceDescriptors.containsKey(item.getId())) { + desc = ResourceDescriptor.forResource(item.getResource()); + resourceStorage.addDescriptor(desc); + } else { + desc = resourceDescriptors.get(item.getId()); + } + itemToDescriptorMap.put(item.getId(), desc); + } + + // collect configs + for (ConfigItemImpl item : includedConfigs) { + ConfigDescriptor desc = null; + EntaxyRuntimeObject configObject = + ServiceHelper.getInstance().getEntaxyRuntimeObjectService().getRuntimeObject( + item.getObject().getObjectFullId()); + if (!configDescriptors.containsKey(item.getId())) { + + /* + + + if (!configObject.getIncomiingSubordRelations().isEmpty()) { + // this is object config + Optional rel = configObject.getIncomiingSubordRelations().stream() + .filter(r -> "config".equals(r.getName())).findFirst(); + if (rel.isPresent()) { + EntaxyRuntimeObject configuredObject = rel.get().getMain(); + + // check data consistency + if (configuredObject.getObjectFullId() + .equals(ObjectConfig.getConfiguredObjectId(configObject.getId()))) { + + + } + + } + } + if (desc == null) { + // this is custom config + desc = ConfigDescriptor.forConfig(item.getId()); + } + */ + + desc = ConfigDescriptor.forConfig(item.getId(), getCoordinates()); + + configStorage.addDescriptor(desc); + } else { + desc = configDescriptors.get(item.getId()); + } + itemToDescriptorMap.put(item.getObject().getObjectFullId(), desc); + } + + bundleStorage.prepare(); + configStorage.prepare(); + resourceStorage.prepare(); + + BuildResult result = resourceStorage.build(coordinates); + for (Entry entry : result.changes.entrySet()) { + itemToDescriptorMap.put(entry.getKey(), entry.getValue()); + } + for (Entry entry : result.newDescriptors.entrySet()) { + if (entry.getValue() instanceof BundleDescriptor) { + // register descriptor + bundleDescriptors.put(entry.getKey(), (BundleDescriptor) entry.getValue()); + + + + // add descriptor to storage + bundleStorage.prepareDescriptor((BundleDescriptor) entry.getValue()); + } + } + + result = bundleStorage.build(coordinates); + // process result + // NOOP + + } + + public void generateDescriptor() { + descriptor = new ApplicationDescriptor(); + + descriptor.name = coordinates.getArtifactId(); + descriptor.group = coordinates.getGroupId(); + descriptor.version = coordinates.getVersion(); + descriptor.buildBy = ""; + descriptor.buildOn = Calendar.getInstance().getTimeInMillis() + ""; + + descriptor.mavenUrl = coordinates.toMavenString(); + descriptor.mavenAsset = coordinates.toAssetName(); + + // get requirements + List reqs = applicationContent.getItemsMap().values().stream() + .filter(item -> item.isRequired()).collect(Collectors.toList()); + Map requirementsMap = new LinkedHashMap<>(); + for (ApplicationProjectItemImpl req : reqs) { + ApplicationRequirement appReq = convertToRequirement(req); + requirementsMap.put(appReq.id, appReq); + } + for (ApplicationRequirement appReq : requirementsMap.values()) + descriptor.requirements.add(appReq); + + Map contentItems = new LinkedHashMap<>(); + Map components = new LinkedHashMap<>(); + for (Entry entry : itemToDescriptorMap.entrySet()) { + String itemId = entry.getKey(); + ApplicationProjectItemImpl itemImpl = applicationContent.getItemsMap().get(itemId); + ApplicationContentItem contentItem = new ApplicationContentItem(); + contentItem.id = itemImpl.getId(); + contentItem.type = itemImpl.getType(); + contentItem.componentId = entry.getValue().getDescriptorId(); + contentItems.put(contentItem.id, contentItem); + ApplicationComponent component = convertToComponent(entry.getValue()); + if (component == null) { + LOG.error("Failed converting descriptor [{}]/[{}] to component", entry.getValue().getDescriptorId(), + entry.getValue().type.name()); + continue; + } else { + // components.put(entry.getKey(), component); + // exclude duplicates + components.putIfAbsent(component.getId(), component); + } + } + + for (ApplicationContentItem item : contentItems.values()) + descriptor.items.add(item); + + List componentList = new ArrayList<>(components.values()); + Collections.sort(componentList, new Comparator() { + + @Override + public int compare(ApplicationComponent o1, ApplicationComponent o2) { + if (o1.priority > o2.priority) + return 1; + if (o1.priority < o2.priority) + return -1; + return 0; + } + }); + + descriptor.components.addAll(componentList); + + } + + public void saveDescriptor() { + File descriptorFile = + new File(Paths.get(buildContentRoot.getAbsolutePath(), EntaxyApplication.DESCRIPTOR_NAME) + .toAbsolutePath().toUri()); + try (OutputStream bos = new FileOutputStream(descriptorFile)) { + JsonElement je = GSON.toJsonTree(descriptor); + String jsonData = je.toString(); + bos.write(jsonData.getBytes()); + } catch (Exception e) { + LOG.error("Error saving descriptor file", e); + } + } + + protected ApplicationComponent convertToComponent(AbstractDescriptor descriptor) { + switch (descriptor.type) { + case BUNDLE: + return convertToComponent((BundleDescriptor) descriptor); + case RESOURCE: + return convertToComponent((ResourceDescriptor) descriptor); + case CONFIG: + return convertToComponent((ConfigDescriptor) descriptor); + default: + return null; + } + } + + protected ApplicationComponent convertToComponent(BundleDescriptor descriptor) { + ApplicationComponent result = new ApplicationComponent(); + + result.id = descriptor.getDescriptorId(); + result.internalLocation = descriptor.finalLocation; + result.mavenLocation = descriptor.finalMavenLocation; + result.priority = descriptor.priority; + result.type = ITEM_TYPE.BUNDLE; + + String temp = descriptor.installLocation; + int index1 = temp.lastIndexOf(':'); + if (index1 > 0) { + result.targetProtocol = temp.substring(0, index1); + temp = temp.substring(index1 + 1); + } + int index2 = temp.indexOf('?'); + if (index2 > 0) { + result.targetQueryString = temp.substring(index2 + 1); + temp = temp.substring(0, index2); + } + result.targetLocation = temp; + + return result; + } + + protected ApplicationComponent convertToComponent(ResourceDescriptor descriptor) { + ApplicationComponent result = new ApplicationComponent(); + + result.id = descriptor.getDescriptorId(); + result.internalLocation = descriptor.finalLocation; + result.mavenLocation = ""; + result.targetLocation = descriptor.resourceUrl; + result.priority = 25; + result.type = ITEM_TYPE.RESOURCE; + result.targetLocation = descriptor.resourceUrl; + + return result; + } + + protected ApplicationComponent convertToComponent(ConfigDescriptor descriptor) { + ApplicationComponent result = new ApplicationComponent(); + + result.id = descriptor.getDescriptorId(); + result.internalLocation = descriptor.finalLocation; + result.mavenLocation = descriptor.finalMavenLocation; + result.targetLocation = descriptor.pid + ".cfg"; + result.priority = 25; + result.type = ITEM_TYPE.CONFIG; + + return result; + } + + protected ApplicationRequirement convertToRequirement(ApplicationProjectItemImpl sourceItem) { + ApplicationRequirement result = new ApplicationRequirement(); + result.id = sourceItem.getId(); + result.type = sourceItem.getType(); + result.scope = sourceItem.getScope(); + return result; + } + + public void generateFeatures() { + Template template = + ServiceHelper.getInstance().getTemplateService().getTemplateById("applications.builder.features"); + TemplateAwareGenerator generator = GeneratorFactory.createGenerator(template); + if (generator != null) { + String repoName = String.format("%s.%s-%s", coordinates.getGroupId(), coordinates.getArtifactId(), + coordinates.getVersion()); + String featureName = coordinates.getGroupId().concat(".").concat(coordinates.getArtifactId()); + Map params = new HashMap<>(); + params.put("descriptor", descriptor); + params.put("repoName", repoName); + params.put("featureName", featureName); + params.put("featureVersion", coordinates.getVersion()); + Generated generated; + try { + generated = generator.generate(template, params); + } catch (Exception e) { + LOG.error("Error generating features", e); + return; + } + if ((generated == null) || (generated.getObject() == null)) { + LOG.error("Generated NULL"); + } + ArtifactCoordinates featuresCoordinates = + ArtifactCoordinates.fromUrl(coordinates.toMavenString()).classifier("features").type("xml"); + String path = featuresCoordinates.toRepositoryPath(); + File featuresFile = new File(Paths.get(bundleStorage.rootDirectory.getAbsolutePath(), path).toUri()); + featuresFile.getAbsoluteFile().getParentFile().mkdirs(); + + try (OutputStream fos = new FileOutputStream(featuresFile)) { + fos.write(generated.getObject().toString().getBytes()); + } catch (Exception e) { + LOG.error("Error writing features file", e); + } + + descriptor.features = new ApplicationFeatures(); + descriptor.features.id = featureName; + descriptor.features.internalLocation = + buildContentRoot.toPath().relativize(featuresFile.toPath()).toString().replace('\\', '/'); + descriptor.features.mavenLocation = featuresCoordinates.toMavenString(); + descriptor.features.targetProtocol = "mvn"; + descriptor.features.targetLocation = descriptor.features.mavenLocation; + + } + } + + public void pack() { + File targetFile = + new File(Paths.get(buildRoot.getAbsolutePath(), "result", coordinates.toRepositoryPath()).toUri()); + targetFile.getAbsoluteFile().getParentFile().mkdirs(); + FolderBasedJarBuilder builder = new FolderBasedJarBuilder(targetFile, buildContentRoot); + builder.putAttribute("Entaxy-Application", coordinates.getArtifactId()); + builder.putAttribute("Entaxy-ApplicationGroup", coordinates.getGroupId()); + builder.putAttribute("Entaxy-ApplicationVersion", coordinates.getVersion()); + try { + builder.loadFiles(); + } catch (IllegalStateException | IOException e) { + LOG.error("Error building application file", e); + } + try { + builder.close(); + } catch (IOException e) { + LOG.error("Error building application file", e); + return; + } + buildResult = targetFile; + } + + public void clear() { + try { + FileUtils.deleteDirectory(buildRoot); + } catch (IOException e) { + LOG.error("Error clearing ApplicationBuilder", e); + } + } + + public URL build() { + + prepareContent(); + generateDescriptor(); + generateFeatures(); + saveDescriptor(); + pack(); + + if (buildResult == null) + return null; + + try { + return buildResult.toURI().toURL(); + } catch (MalformedURLException e) { + LOG.error("Error creating URL for [" + buildResult.getAbsolutePath() + "]", e); + return null; + } + } + + public ApplicationDescriptor getDescriptor() { + return descriptor; + } + + public File getBuildResult() { + return buildResult; + } + +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/BundleDescriptor.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/BundleDescriptor.java new file mode 100644 index 00000000..554c625e --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/BundleDescriptor.java @@ -0,0 +1,101 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.build; + +import org.apache.karaf.bundle.core.BundleInfo; +import org.apache.karaf.bundle.core.BundleService; +import org.osgi.framework.Bundle; +import org.osgi.framework.startlevel.BundleStartLevel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ru.entaxy.platform.integration.applications.impl.ServiceHelper; + +public class BundleDescriptor extends AbstractDescriptor { + + private static final Logger LOG = LoggerFactory.getLogger(BundleDescriptor.class); + + public static BundleDescriptor forBundle(Bundle bundle) { + BundleDescriptor result = new BundleDescriptor(); + result.readBundle(bundle); + return result; + } + + @Override + protected TYPE getDescriptorType() { + return TYPE.BUNDLE; + } + + String symbolicName; + long id; + + // origin install location + String installLocation; + + // origin maven artifact location + String mavenLocation; + + // location from where we can download the artifact + String sourceLocation; + + public void readBundle(Bundle bundle) { + symbolicName = bundle.getSymbolicName(); + id = bundle.getBundleId(); + + priority = ((BundleStartLevel) bundle.adapt(BundleStartLevel.class)).getStartLevel(); + + // installLocation = bundle.getLocation(); + + try { + BundleService bundleService = ServiceHelper.getInstance().getBundleService(); + BundleInfo bundleInfo = bundleService.getInfo(bundle); + installLocation = bundleInfo.getUpdateLocation(); + } catch (Exception e) { + LOG.error("Error reading bundle info", e); + consistent = false; + return; + } + + int index = installLocation.indexOf("mvn:"); + if (index < 0) { + consistent = false; + return; + } + + int index2 = installLocation.indexOf('?'); + if (index2 > index) + mavenLocation = installLocation.substring(index + 4, index2); + else + mavenLocation = installLocation.substring(index + 4); + + sourceLocation = installLocation.substring(index); + } + + @Override + public String getDescriptorId() { + return symbolicName + "~" + getDescriptorType(); + } +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/BundleStorage.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/BundleStorage.java new file mode 100644 index 00000000..3e1f211a --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/BundleStorage.java @@ -0,0 +1,118 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.build; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.nio.file.Paths; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ru.entaxy.platform.base.support.CommonUtils; +import ru.entaxy.platform.core.artifact.ArtifactCoordinates; + +public class BundleStorage extends AbstractStorage { + + private static final Logger LOG = LoggerFactory.getLogger(BundleStorage.class); + + final String dirName = "repository"; + + public BundleStorage(File parentDir, File tempDir) { + super(parentDir, tempDir); + } + + @Override + protected String getStorageDir() { + return dirName; + } + + @Override + public void prepare() { + for (BundleDescriptor descriptor : descriptors) + prepareDescriptor(descriptor); + } + + @Override + public void prepareDescriptor(BundleDescriptor descriptor) { + + ArtifactCoordinates bundleCoordinates = ArtifactCoordinates.fromUrl(descriptor.mavenLocation); + + if (!CommonUtils.isValid(bundleCoordinates.getType())) + bundleCoordinates.type("jar"); + + File targetDir = new File( + Paths.get(rootDirectory.getAbsolutePath(), + bundleCoordinates.getGroupId().replace('.', '/'), + bundleCoordinates.getArtifactId(), + bundleCoordinates.getVersion()).toAbsolutePath().toUri()); + targetDir.mkdirs(); + + String fileName = bundleCoordinates.getArtifactId().concat("-").concat(bundleCoordinates.getVersion()) + .concat(CommonUtils.isValid(bundleCoordinates.getClassifier()) + ? "-".concat(bundleCoordinates.getClassifier()) + : "") + .concat(".".concat(bundleCoordinates.getType())); + File targetFile = new File(Paths.get(targetDir.getAbsolutePath(), fileName).toAbsolutePath().toUri()); + + URL sourceUrl; + try { + sourceUrl = new URL(descriptor.sourceLocation); + } catch (MalformedURLException e) { + LOG.error("Error creating URL for [" + descriptor.mavenLocation + "]", e); + return; + } + + try ( + InputStream is = sourceUrl.openStream(); + OutputStream os = new FileOutputStream(targetFile)) { + + os.write(is.readAllBytes()); + + String targetLocation = + dirName.concat(targetFile.getAbsolutePath().replace(rootDirectory.getAbsolutePath(), "")) + .replace('\\', '/'); + + descriptor.finalLocation = targetLocation; + + descriptor.finalMavenLocation = descriptor.mavenLocation; + + } catch (IOException e) { + LOG.error("Error reading from URL [" + sourceUrl.toString() + "]", e); + return; + } + } + + @Override + public BuildResult build(ArtifactCoordinates applicationCoordinates) { + return new BuildResult(); + } +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/ConfigDescriptor.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/ConfigDescriptor.java new file mode 100644 index 00000000..e51f80be --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/ConfigDescriptor.java @@ -0,0 +1,87 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.build; + +import ru.entaxy.platform.core.artifact.ArtifactCoordinates; +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject; + +public class ConfigDescriptor extends AbstractDescriptor { + + public static ConfigDescriptor forConfig(String configId) { + ConfigDescriptor result = new ConfigDescriptor(); + result.pid = configId.split(":")[0]; + return result; + } + + public static ConfigDescriptor forConfig(String configId, ArtifactCoordinates applicationCoordinates) { + ConfigDescriptor result = new ConfigDescriptor(); + result.pid = configId.split(":")[0]; + result.init(applicationCoordinates); + return result; + } + + + public static ConfigDescriptor forObjectConfig(EntaxyRuntimeObject configObject, + EntaxyRuntimeObject configuredObject) { + ConfigDescriptor result = new ConfigDescriptor(); + result.pid = configObject.getId(); + return result; + } + + String pid; + + // origin install location + String installLocation; + + // origin maven artifact location + String mavenLocation; + + // location from where we can download the artifact + String sourceLocation; + + @Override + public String getDescriptorId() { + return pid + "~" + getDescriptorType(); + } + + @Override + protected TYPE getDescriptorType() { + return TYPE.CONFIG; + } + + public void init(ArtifactCoordinates applicationCoordinates) { + ArtifactCoordinates localCoordinates = ArtifactCoordinates.fromUrl(applicationCoordinates.toMavenString()); + localCoordinates.type("cfg").classifier(pid); + + mavenLocation = localCoordinates.toMavenString(); + + sourceLocation = "mvn:" + mavenLocation; + + installLocation = pid + ".cfg"; + + } + +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/ConfigStorage.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/ConfigStorage.java new file mode 100644 index 00000000..dd62f397 --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/ConfigStorage.java @@ -0,0 +1,118 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.build; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.nio.file.Paths; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ru.entaxy.platform.base.support.CommonUtils; +import ru.entaxy.platform.core.artifact.ArtifactCoordinates; + +public class ConfigStorage extends AbstractStorage { + + private static final Logger LOG = LoggerFactory.getLogger(ConfigStorage.class); + + final String dirName = "repository"; + + protected ConfigStorage(File parentDir, File tempDir) { + super(parentDir, tempDir); + } + + @Override + protected String getStorageDir() { + return dirName; + } + + @Override + public void prepare() { + for (ConfigDescriptor desc : descriptors) + prepareDescriptor(desc); + + } + + @Override + public void prepareDescriptor(ConfigDescriptor descriptor) { + ArtifactCoordinates configCoordinates = ArtifactCoordinates.fromUrl(descriptor.mavenLocation); + + if (!CommonUtils.isValid(configCoordinates.getType())) + configCoordinates.type("cfg"); + + String fileName = configCoordinates.toAssetName(); + String repositoryPath = configCoordinates.toRepositoryPath(); + String subfolder = + repositoryPath.substring(0, repositoryPath.length() - fileName.length()); + + File targetDir = new File( + Paths.get(rootDirectory.getAbsolutePath(), + subfolder).toAbsolutePath().toUri()); + targetDir.mkdirs(); + + File targetFile = new File(Paths.get(targetDir.getAbsolutePath(), fileName).toAbsolutePath().toUri()); + + URL sourceUrl; + try { + sourceUrl = Paths.get(System.getProperty("karaf.etc"), descriptor.pid + ".cfg").toAbsolutePath().toUri() + .toURL(); + } catch (MalformedURLException e) { + LOG.error("Error creating URL for [" + descriptor.mavenLocation + "]", e); + return; + } + + try ( + InputStream is = sourceUrl.openStream(); + OutputStream os = new FileOutputStream(targetFile)) { + + os.write(is.readAllBytes()); + + String targetLocation = + dirName.concat(targetFile.getAbsolutePath().replace(rootDirectory.getAbsolutePath(), "")) + .replace('\\', '/'); + + descriptor.finalLocation = targetLocation; + + descriptor.finalMavenLocation = descriptor.mavenLocation; + + } catch (IOException e) { + LOG.error("Error reading from URL [" + sourceUrl.toString() + "]", e); + return; + } + } + + @Override + public BuildResult build(ArtifactCoordinates applicationCoordinates) { + return new BuildResult(); + } + +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/ResourceDescriptor.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/ResourceDescriptor.java new file mode 100644 index 00000000..ca84b0e2 --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/ResourceDescriptor.java @@ -0,0 +1,54 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.build; + +import ru.entaxy.esb.resources.EntaxyResource; + +public class ResourceDescriptor extends AbstractDescriptor { + + public static ResourceDescriptor forResource(EntaxyResource entaxyResource) { + ResourceDescriptor result = new ResourceDescriptor(); + result.readResource(entaxyResource); + return result; + } + + public String resourceUrl; + + public void readResource(EntaxyResource entaxyResource) { + resourceUrl = entaxyResource.getURL(); + } + + @Override + protected TYPE getDescriptorType() { + return TYPE.RESOURCE; + } + + @Override + public String getDescriptorId() { + return resourceUrl + "~" + getDescriptorType(); + } + +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/ResourceStorage.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/ResourceStorage.java new file mode 100644 index 00000000..86456bab --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/build/ResourceStorage.java @@ -0,0 +1,188 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.build; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.MalformedURLException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.stream.Stream; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ru.entaxy.esb.resources.EntaxyResource; +import ru.entaxy.platform.core.artifact.ArtifactCoordinates; +import ru.entaxy.platform.integration.applications.impl.ServiceHelper; +import ru.entaxy.platform.integration.applications.impl.jar.FolderBasedJarBuilder; + +public class ResourceStorage extends AbstractStorage { + + private static final Logger LOG = LoggerFactory.getLogger(ResourceStorage.class); + + static final String startDirName = "resources/resources"; + + static final String subDirName = "ru/entaxy/resource"; + + static final String storageDirName = startDirName + "/" + subDirName; + + protected File startDir; + + public ResourceStorage(File parentDir, File tempDir) { + super(parentDir, tempDir); + this.startDir = new File(Paths.get(parentDir.getAbsolutePath(), startDirName).toAbsolutePath().toUri()); + + } + + @Override + protected String getStorageDir() { + return storageDirName; + } + + @Override + public void prepare() { + for (ResourceDescriptor descriptor : descriptors) + prepareDescriptor(descriptor); + + } + + @Override + public void prepareDescriptor(ResourceDescriptor descriptor) { + EntaxyResource entaxyResource = + ServiceHelper.getInstance().getEntaxyResourceService().getResource(descriptor.resourceUrl); + if (!entaxyResource.exists()) { + LOG.error("Resource doesn't exist: [{}]", descriptor.resourceUrl); + return; + } + String targetPath = descriptor.resourceUrl.replace(':', '/'); + File targetFile = new File(Paths.get(rootDirectory.getAbsolutePath(), targetPath).toAbsolutePath().toUri()); + targetFile.getParentFile().mkdirs(); + + try (InputStream is = entaxyResource.getInputStream(); + OutputStream os = new FileOutputStream(targetFile)) { + + os.write(is.readAllBytes()); + + String targetLocation = + storageDirName.concat(targetFile.getAbsolutePath().replace(rootDirectory.getAbsolutePath(), "")) + .replace('\\', '/'); + + descriptor.finalLocation = targetLocation; + + + } catch (Exception e) { + LOG.error("Error reading resource [" + descriptor.resourceUrl + "]", e); + return; + } + + } + + @Override + public BuildResult build(ArtifactCoordinates applicationCoordinates) { + + // first check if we have resources + try (Stream pathStream = Files.walk(startDir.getAbsoluteFile().toPath())) { + long count = pathStream + .parallel() + .filter(p -> !p.toFile().isDirectory()) + .count(); + if (count == 0) + return new BuildResult(); + } catch (IOException e) { + LOG.error("ERROR checking the directory [" + startDir.getAbsolutePath() + "]", e); + return new BuildResult(); + } + + ArtifactCoordinates jarCoordinates = ArtifactCoordinates.fromUrl(applicationCoordinates.toString()); + jarCoordinates.type("jar").classifier("resources"); + + File jarFile = new File(Paths + .get(tempDir.getAbsolutePath(), ".resources", jarCoordinates.getGroupId().replace('.', '/'), + jarCoordinates.getArtifactId(), + jarCoordinates.getVersion(), + jarCoordinates.getArtifactId().concat("-") + .concat(jarCoordinates.getVersion().concat("-") + .concat(jarCoordinates.getClassifier().concat(".") + .concat(jarCoordinates.getType())))) + .toAbsolutePath().toUri()); + + jarFile.getAbsoluteFile().getParentFile().mkdirs(); + + String bundleName = String.format("APPLICATION :: %s :: %s :: RESOURCES", jarCoordinates.getArtifactId(), + jarCoordinates.getVersion()); + String bundleDecription = bundleName; + String bundleSymboliName = + jarCoordinates.getGroupId().concat(".").concat(jarCoordinates.getArtifactId()).concat(".resources"); + + FolderBasedJarBuilder jarBuilder = new FolderBasedJarBuilder(jarFile, startDir); + jarBuilder.getOsgiInfo() + .name(bundleName) + .symbolicName(bundleSymboliName) + .description(bundleDecription) + .version(jarCoordinates.getVersion()) + .update(); + + jarBuilder.putAttribute("Entaxy-Resource-Provider", "true"); + + try { + jarBuilder.loadFiles(); + } catch (IllegalStateException | IOException e) { + LOG.error("Error loading files", e); + } + + try { + jarBuilder.close(); + } catch (IOException e) { + LOG.error("Error closing jar", e); + } + + BundleDescriptor bundleDesc = new BundleDescriptor(); + bundleDesc.id = -1; + bundleDesc.symbolicName = bundleSymboliName; + bundleDesc.mavenLocation = jarCoordinates.toString(); + bundleDesc.installLocation = "mvn:" + bundleDesc.mavenLocation; + try { + bundleDesc.sourceLocation = jarFile.getAbsoluteFile().toURI().toURL().toString(); + } catch (MalformedURLException e) { + bundleDesc.sourceLocation = "file:///" + jarFile.getAbsolutePath().replace('\\', '/'); + } + bundleDesc.priority = 90; + + BuildResult result = new BuildResult(); + result.newDescriptors.put(bundleSymboliName, bundleDesc); + + for (ResourceDescriptor desc : descriptors) + result.changes.put(desc.resourceUrl, bundleDesc); + + + return result; + } +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/jar/FolderBasedJarBuilder.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/jar/FolderBasedJarBuilder.java new file mode 100644 index 00000000..81c9bbe0 --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/jar/FolderBasedJarBuilder.java @@ -0,0 +1,61 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.jar; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Iterator; + +import org.apache.commons.io.FileUtils; + +public class FolderBasedJarBuilder extends JarBuilder { + + File rootFolder; + + public FolderBasedJarBuilder(File targetFile, File rootFolder) { + super(targetFile); + this.rootFolder = rootFolder; + } + + public void loadFiles() throws FileNotFoundException, IOException, IllegalStateException { + if (Status.FINALIZED.equals(status)) + throw new IllegalStateException("JarBuilder is finalized"); + if (Status.NEW.equals(status)) + open(); + + Iterator iterator = FileUtils.iterateFiles(rootFolder, null, true); + while (iterator.hasNext()) { + File file = iterator.next(); + String name = file.getAbsolutePath().replace(rootFolder.getAbsolutePath(), "").replace('\\', '/'); + if (name.startsWith("/")) + name = name.substring(1); + addFile(file, name); + } + + } + +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/jar/JarBuilder.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/jar/JarBuilder.java new file mode 100644 index 00000000..554a49af --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/jar/JarBuilder.java @@ -0,0 +1,186 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.jar; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.jar.Attributes; +import java.util.jar.Attributes.Name; +import java.util.jar.JarEntry; +import java.util.jar.JarOutputStream; +import java.util.jar.Manifest; + +public class JarBuilder { + + public enum Status { + NEW, + OPENED, + FINALIZED + } + + public static interface OsgiAttributes { + Name NAME = new Name("Bundle-Name"); + Name SYMBOLIC_NAME = new Name("Bundle-SymbolicName"); + Name DESCRIPTION = new Name("Bundle-Description"); + Name DOC_URL = new Name("Bundle-DocURL"); + Name MANIFEST_VERSION = new Name("Bundle-ManifestVersion"); + Name VENDOR = new Name("Bundle-Vendor"); + Name VERSION = new Name("Bundle-Version"); + } + + + protected Manifest manifest; + + protected Status status = Status.NEW; + + protected File targetFile; + + protected Map osgiInfo = new HashMap<>(); + + protected JarOutputStream jarOutputStream; + + public class OsgiInfo { + + public OsgiInfo() { + String fileName = targetFile.getName(); + if (fileName.lastIndexOf('.') > 0) + fileName = fileName.substring(0, fileName.lastIndexOf('.')); + osgiInfo.put(OsgiAttributes.NAME, fileName); + osgiInfo.put(OsgiAttributes.SYMBOLIC_NAME, fileName); + osgiInfo.put(OsgiAttributes.DESCRIPTION, fileName); + osgiInfo.put(OsgiAttributes.DOC_URL, "https://entaxy.ru/"); + osgiInfo.put(OsgiAttributes.VENDOR, "Entaxy"); + osgiInfo.put(OsgiAttributes.VERSION, "1.0.0"); + } + + public OsgiInfo name(String name) { + osgiInfo.put(OsgiAttributes.NAME, name); + return this; + } + + public OsgiInfo symbolicName(String name) { + osgiInfo.put(OsgiAttributes.SYMBOLIC_NAME, name); + return this; + } + + public OsgiInfo description(String desc) { + osgiInfo.put(OsgiAttributes.DESCRIPTION, desc); + return this; + } + + public OsgiInfo docUrl(String url) { + osgiInfo.put(OsgiAttributes.DOC_URL, url); + return this; + } + + public OsgiInfo vendor(String vendor) { + osgiInfo.put(OsgiAttributes.VENDOR, vendor); + return this; + } + + public OsgiInfo version(String version) { + osgiInfo.put(OsgiAttributes.VERSION, version); + return this; + } + + public void update() { + updateOsgiInfo(); + } + + } + + public JarBuilder(File targetFile) { + this.targetFile = targetFile; + this.targetFile.getAbsoluteFile().getParentFile().mkdirs(); + this.manifest = new Manifest(); + initializeManifest(); + this.osgiInfo.put(OsgiAttributes.MANIFEST_VERSION, "2"); + } + + public boolean isReady() { + return Status.FINALIZED.equals(status); + } + + protected void initializeManifest() { + this.manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0"); + } + + public void updateOsgiInfo() { + if (Status.NEW.equals(status)) + for (Entry entry : osgiInfo.entrySet()) + this.manifest.getMainAttributes().put(entry.getKey(), entry.getValue()); + } + + public OsgiInfo getOsgiInfo() { + return new OsgiInfo(); + } + + public void putAttribute(String name, String value) { + if (status.equals(Status.NEW)) + this.manifest.getMainAttributes().putValue(name, value); + } + + public void open() throws FileNotFoundException, IOException { + status = Status.OPENED; + jarOutputStream = new JarOutputStream(new FileOutputStream(targetFile), this.manifest); + } + + public void addFile(File source, String targetLocation) throws IllegalStateException, IOException { + if (!Status.OPENED.equals(status)) + throw new IllegalStateException("JarBuilder is not in OPENED status"); + JarEntry entry = new JarEntry(targetLocation); + entry.setTime(source.lastModified()); + jarOutputStream.putNextEntry(entry); + + try ( + BufferedInputStream in = new BufferedInputStream(new FileInputStream(source))) { + byte[] buffer = new byte[1024]; + while (true) { + int count = in.read(buffer); + if (count == -1) { + break; + } + jarOutputStream.write(buffer, 0, count); + } + } finally { + jarOutputStream.closeEntry(); + } + } + + public File close() throws IOException { + jarOutputStream.close(); + status = Status.FINALIZED; + return targetFile; + } + +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/ApplicationProjectContentImpl.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/ApplicationProjectContentImpl.java new file mode 100644 index 00000000..265fe651 --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/ApplicationProjectContentImpl.java @@ -0,0 +1,333 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.project; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import com.google.gson.JsonObject; + +import ru.entaxy.esb.resources.EntaxyResource; +import ru.entaxy.platform.base.support.JSONUtils; +import ru.entaxy.platform.integration.applications.ApplicationProjectContent; +import ru.entaxy.platform.integration.applications.ApplicationProjectItem; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.exceptions.ItemException; +import ru.entaxy.platform.integration.applications.exceptions.ItemIsGhostException; +import ru.entaxy.platform.integration.applications.exceptions.ItemIsPlatformException; +import ru.entaxy.platform.integration.applications.exceptions.ItemNotFoundException; +import ru.entaxy.platform.integration.applications.impl.ServiceHelper; +import ru.entaxy.platform.integration.applications.impl.project.item.ItemFactory; +import ru.entaxy.platform.integration.applications.impl.project.model.ContentModel; +import ru.entaxy.platform.integration.applications.impl.project.model.item.ContentModelItem; +import ru.entaxy.platform.integration.applications.item.project.EntaxyObjectItem; +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject; +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObjectResource; + +public class ApplicationProjectContentImpl implements ApplicationProjectContent { + + final protected Map properties = new HashMap<>(); + + final protected Map items = new HashMap<>(); + + final protected Object itemsLock = new Object(); + + protected ApplicationProjectItemImpl getItemImpl(String itemId) throws ItemException { + ApplicationProjectItemImpl result = items.get(itemId); + if (result == null) + throw new ItemNotFoundException(null, null, itemId); + return result; + } + + protected JsonObject getAsJson() { + ContentModel contentModel = new ContentModel(); + contentModel.update(this); + return contentModel.getAsJson(); + } + + public String marshall() { + return getAsJson().toString(); + } + + public void unmarshall(String data) { + + ContentModel contentModel = ContentModel.load(JSONUtils.getJsonRootObject(data)); + properties.put(STANDARD_PROPERTIES.APPLICATION, contentModel.getApplication()); + properties.put(STANDARD_PROPERTIES.GROUP, contentModel.getGroup()); + properties.put(STANDARD_PROPERTIES.VERSION, contentModel.getVersion()); + properties.put(STANDARD_PROPERTIES.CREATED_ON, contentModel.getCreatedOn()); + properties.put(STANDARD_PROPERTIES.CREATED_BY, contentModel.getCreatedBy()); + properties.put(STANDARD_PROPERTIES.MODIFIED_ON, contentModel.getModifiedOn()); + properties.put(STANDARD_PROPERTIES.MODIFIED_BY, contentModel.getModifiedBy()); + + for (ContentModelItem modelItem : contentModel.getIncludedItems()) { + ApplicationProjectItem item; + switch (modelItem.getItemType()) { + case BUNDLE: + continue; + case CONFIG: + case OBJECT: + EntaxyRuntimeObject runtimeObject = ServiceHelper.getInstance().getEntaxyRuntimeObjectService() + .getRuntimeObject(modelItem.getId()); + if(runtimeObject != null) { + item = addObject(runtimeObject); + } else { + item = addDefaultItem(modelItem); + ((ApplicationProjectItemImpl)item).setDeleted(true); + } + break; + case RESOURCE: + EntaxyResource entaxyResource = + ServiceHelper.getInstance().getEntaxyResourceService().getResource(modelItem.getId()); + if(entaxyResource != null && entaxyResource.exists()) { + item = addResource(entaxyResource); + } else { + item = addDefaultItem(modelItem); + ((ApplicationProjectItemImpl)item).setDeleted(true); + } + break; + + default: + continue; + } + ApplicationProjectItemImpl itemImpl = items.get(item.getId()); + itemImpl.setScope(modelItem.getItemScope()); + } + + for (ContentModelItem modelItem : contentModel.getRequiredItems()) { + ApplicationProjectItem item; + switch (modelItem.getItemType()) { + case BUNDLE: + continue; + case CONFIG: + case OBJECT: + EntaxyRuntimeObject runtimeObject = ServiceHelper.getInstance().getEntaxyRuntimeObjectService() + .getRuntimeObject(modelItem.getId()); + if(runtimeObject != null) { + item = addObject(runtimeObject); + } else { + item = addDefaultItem(modelItem); + ((ApplicationProjectItemImpl)item).setDeleted(true); + } + break; + case RESOURCE: + EntaxyResource entaxyResource = + ServiceHelper.getInstance().getEntaxyResourceService().getResource(modelItem.getId()); + if(entaxyResource != null && entaxyResource.exists()) { + item = addResource(entaxyResource); + } else { + item = addDefaultItem(modelItem); + ((ApplicationProjectItemImpl)item).setDeleted(true); + } + break; + + default: + continue; + } + ApplicationProjectItemImpl itemImpl = items.get(item.getId()); + itemImpl.setScope(modelItem.getItemScope()); + itemImpl.setRequired(modelItem.isRequired()); + itemImpl.setIgnored(modelItem.isIgnored()); + } + + + } + + public Map getItemsMap() { + return items; + } + + @Override + public List getItems() { + return new ArrayList<>(items.values()); + } + + @Override + public List getItems(Class itemClass) { + return getItems().stream().filter(item -> itemClass.isInstance(item)).map(item -> itemClass.cast(item)) + .collect(Collectors.toList()); + } + + @Override + public void addItem(ApplicationProjectItem item) throws ItemException { + ApplicationProjectItemImpl itemImpl = getItemImpl(item.getId()); + if (!item.isRequired()) + // already added + return; + if (item.isGhost()) + throw new ItemIsGhostException(null, null, item.getId()); + if (item.isPlatform()) + throw new ItemIsPlatformException(null, null, item.getId()); + itemImpl.setIgnored(false); + itemImpl.setRequired(false); + if (item.getType().equals(EntaxyApplication.ITEM_TYPE.OBJECT)) { + EntaxyRuntimeObject runtimeObject = ServiceHelper.getInstance().getEntaxyRuntimeObjectService() + .getRuntimeObject(((EntaxyObjectItem) item).getObject().getObjectFullId()); + Map linkedItems = new HashMap<>(); + ItemFactory.INSTANCE.processDependencies(itemImpl, runtimeObject, items, linkedItems); + processColocatedObjects(runtimeObject, linkedItems); + items.putAll(linkedItems); + } + } + + @Override + public void ignoreItem(ApplicationProjectItem item) throws ItemException { + ApplicationProjectItemImpl itemImpl = getItemImpl(item.getId()); + itemImpl.setIgnored(true); + itemImpl.setRequired(true); + for (ApplicationProjectItem req : itemImpl.getRequirements()) { + if (!req.isRequired()) + // that means it's added + continue; + if (req.getRequiredBy().size() > 1) + // required item is required by someone else + continue; + if (req.getRequiredBy().isEmpty()) { + // something strange + ignoreItem(req); + continue; + } + ApplicationProjectItem backRef = req.getRequiredBy().get(0); + if (backRef == null) { + // something strange + ignoreItem(req); + continue; + } + if (backRef.getId().equals(item.getId())) { + ignoreItem(req); + } + } + } + + @Override + public void removeItem(ApplicationProjectItem item) throws ItemException { + ApplicationProjectItemImpl itemImpl = getItemImpl(item.getId()); + if (itemImpl.getRequiredBy().isEmpty()) { + for (ApplicationProjectItem required : itemImpl.getRequirements()) { + // unlink required items + try { + ApplicationProjectItemImpl requiredImpl = getItemImpl(required.getId()); + itemImpl.removeRequired(requiredImpl); + } catch (Exception ignore) { + // NOOP + } + } + synchronized (itemsLock) { + items.remove(itemImpl.getId()); + } + } else if (!item.isPlatform()) { + // just mark as s requirement + itemImpl.setRequired(true); + itemImpl.setIgnored(false); + } + } + + @Override + public ApplicationProjectItem addObject(EntaxyRuntimeObject runtimeObject) { + synchronized (itemsLock) { + Map linked = new HashMap<>(); + ApplicationProjectItemImpl result = ItemFactory.INSTANCE.createItem(runtimeObject, items, linked); + + result.setScope(EntaxyApplication.ITEM_SCOPE.RUNTIME); + + items.put(result.getId(), result); + items.putAll(linked); + + processColocatedObjects(runtimeObject, linked); + + if (result.isPlatform()) { + result.setRequired(true); + result.setIgnored(true); + } else { + result.setRequired(false); + } + + return result; + } + } + + protected void processColocatedObjects(EntaxyRuntimeObject runtimeObject, + Map linked) { + List colocatedObjects = runtimeObject.getColocatedObjects(); + for (EntaxyRuntimeObject obj : colocatedObjects) { + ApplicationProjectItemImpl item; + if (items.containsKey(obj.getObjectFullId())) { + item = items.get(obj.getObjectFullId()); + } else { + linked = new HashMap<>(); + item = ItemFactory.INSTANCE.createItem(obj, items, linked); + if (!items.containsKey(item.getId())) + items.put(item.getId(), item); + items.putAll(linked); + } + + if (item.isPlatform()) { + item.setRequired(true); + item.setIgnored(true); + } else { + item.setRequired(false); + item.setIgnored(false); + } + + item.setScope(EntaxyApplication.ITEM_SCOPE.RUNTIME); + } + } + + @Override + public ApplicationProjectItem addResource(EntaxyRuntimeObjectResource runtimeObjectResource) { + synchronized (itemsLock) { + ApplicationProjectItemImpl result = ItemFactory.INSTANCE.createItem(runtimeObjectResource, items); + items.put(result.getId(), result); + return result; + } + } + + @Override + public ApplicationProjectItem addResource(EntaxyResource entaxyResource) { + synchronized (itemsLock) { + ApplicationProjectItemImpl result = ItemFactory.INSTANCE.createItem(entaxyResource, items); + result.setScope(EntaxyApplication.ITEM_SCOPE.RUNTIME); + items.put(result.getId(), result); + return result; + } + } + + @Override + public Map getProperties() { + return properties; + } + + public ApplicationProjectItem addDefaultItem(ContentModelItem modelItem) { + synchronized (itemsLock) { + ApplicationProjectItemImpl result = DefaultApplicationProjectItem.create(modelItem); + items.put(result.getId(), result); + return result; + } + } +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/ApplicationProjectItemImpl.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/ApplicationProjectItemImpl.java new file mode 100644 index 00000000..cbfde184 --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/ApplicationProjectItemImpl.java @@ -0,0 +1,184 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.project; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import ru.entaxy.platform.integration.applications.ApplicationProjectItem; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.impl.project.item.ColocationGroup; + +public abstract class ApplicationProjectItemImpl implements ApplicationProjectItem { + + boolean isRequired = false; + + boolean isIgnored = false; + + boolean isPlatform = false; + + boolean isDeleted = false; + + EntaxyApplication.ITEM_SCOPE scope = EntaxyApplication.ITEM_SCOPE.DESIGN; + + EntaxyApplication.ITEM_TYPE type; + + Map required = new HashMap<>(); + + Map requiredBy = new HashMap<>(); + + ColocationGroup colocationGroup; + + public void setPlatform(Boolean platform) { + isPlatform = platform; + } + + public void setRequired(boolean isRequired) { + this.isRequired = isRequired; + } + + public void setIgnored(boolean isIgnored) { + this.isIgnored = isIgnored; + } + + public void addRequired(ApplicationProjectItemImpl item) { + required.put(item.getId(), item); + item.addRequiredBy(this); + } + + public void removeRequired(ApplicationProjectItemImpl item) { + item.removeRequiredBy(this); + required.remove(item.getId()); + } + + protected void addRequiredBy(ApplicationProjectItemImpl item) { + requiredBy.put(item.getId(), item); + } + + protected void removeRequiredBy(ApplicationProjectItemImpl item) { + requiredBy.remove(item.getId()); + } + + public ColocationGroup getColocationGroup() { + return colocationGroup; + } + + public void colocate(ColocationGroup colocationGroup) { + if (colocationGroup == null) { + if (this.colocationGroup != null) + this.colocationGroup.remove(this); + } + this.colocationGroup = colocationGroup; + if (this.colocationGroup != null) + this.colocationGroup.add(this); + } + + public void updateScope(EntaxyApplication.ITEM_SCOPE newScope) { + + // we'll leave most strict scope as a result + + // leave scope as is + if (EntaxyApplication.ITEM_SCOPE.DESIGN.equals(newScope)) + return; + scope = newScope; + } + + public void setScope(EntaxyApplication.ITEM_SCOPE scope) { + this.scope = scope; + } + + protected void setType(EntaxyApplication.ITEM_TYPE type) { + this.type = type; + } + + @Override + public EntaxyApplication.ITEM_SCOPE getScope() { + return scope; + } + + @Override + public EntaxyApplication.ITEM_TYPE getType() { + return type; + } + + @Override + public boolean isGhost() { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean isRequired() { + return isRequired; + } + + @Override + public boolean isPlatform() { + return isPlatform; + } + + @Override + public List getRequiredBy() { + return new ArrayList<>(this.requiredBy.values()); + } + + @Override + public List getRequirements() { + return new ArrayList<>(this.required.values()); + } + + @Override + public boolean isIgnored() { + return isIgnored; + } + + @Override + public void ignore() { + setIgnored(true); + } + + @Override + public boolean isDeleted() { + return isDeleted; + } + + public void setDeleted(boolean isDeleted) { + this.isDeleted = isDeleted; + } + + @Override + public List getColocated() { + if (this.colocationGroup == null) + return Collections.emptyList(); + return this.colocationGroup.getMembers().stream().filter(item -> !item.getId().equalsIgnoreCase(getId())) + .collect(Collectors.toList()); + } + +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/DefaultApplicationProjectItem.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/DefaultApplicationProjectItem.java new file mode 100644 index 00000000..968e695e --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/DefaultApplicationProjectItem.java @@ -0,0 +1,110 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.project; + +import java.util.Collections; +import java.util.List; + +import ru.entaxy.platform.integration.applications.ApplicationProjectItem; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplication.ITEM_SCOPE; +import ru.entaxy.platform.integration.applications.EntaxyApplication.ITEM_TYPE; +import ru.entaxy.platform.integration.applications.impl.project.model.item.ContentModelItem; + +public class DefaultApplicationProjectItem extends ApplicationProjectItemImpl implements ApplicationProjectItem { + + String id; + boolean ghost = false; + + EntaxyApplication.ITEM_SCOPE scope; + EntaxyApplication.ITEM_TYPE type; + + public DefaultApplicationProjectItem() { + } + + public static DefaultApplicationProjectItem create(ContentModelItem contentModelItem) throws IllegalArgumentException { + DefaultApplicationProjectItem item = new DefaultApplicationProjectItem(); + item.setId(contentModelItem.getId()); + item.setGhost(contentModelItem.isGhost()); + item.setRequired(contentModelItem.isRequired()); + item.setIgnored(contentModelItem.isIgnored()); + item.setScope(contentModelItem.getItemScope()); + item.setType(contentModelItem.getItemType()); + return item; + } + + @Override + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @Override + public ITEM_SCOPE getScope() { + return scope; + } + + public void setScope(EntaxyApplication.ITEM_SCOPE scope) { + this.scope = scope; + } + + @Override + public ITEM_TYPE getType() { + return type; + } + + public void setType(EntaxyApplication.ITEM_TYPE type) { + this.type = type; + } + + @Override + public boolean isGhost() { + return ghost; + } + + public void setGhost(boolean ghost) { + this.ghost = ghost; + } + + @Override + public List getRequiredBy() { + return Collections.emptyList(); + } + + @Override + public List getRequirements() { + return Collections.emptyList(); + } + + @Override + public List getColocated() { + return Collections.emptyList(); + } + +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/item/BundleItemImpl.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/item/BundleItemImpl.java new file mode 100644 index 00000000..fb93d9ef --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/item/BundleItemImpl.java @@ -0,0 +1,62 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.project.item; + +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.impl.project.ApplicationProjectItemImpl; +import ru.entaxy.platform.integration.applications.item.project.EntaxyBundleItem; + +public class BundleItemImpl extends ApplicationProjectItemImpl implements EntaxyBundleItem { + + protected long bundleId; + + protected String bundleSymbolicName; + + public BundleItemImpl(long bundleId, String bundleSymbolicName) { + super(); + this.bundleId = bundleId; + this.bundleSymbolicName = bundleSymbolicName; + setType(EntaxyApplication.ITEM_TYPE.BUNDLE); + } + + + + @Override + public long getBundleId() { + return bundleId; + } + + @Override + public String getId() { + return bundleSymbolicName; + } + + @Override + public String getBundleSymbolicName() { + return bundleSymbolicName; + } + +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/item/ColocationGroup.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/item/ColocationGroup.java new file mode 100644 index 00000000..0199cdd8 --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/item/ColocationGroup.java @@ -0,0 +1,66 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.project.item; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import ru.entaxy.platform.integration.applications.impl.project.ApplicationProjectItemImpl; + +public class ColocationGroup { + + Map members; + + Object membersLock = new Object(); + + String id; + + public ColocationGroup(String id) { + this.id = id; + } + + public String getId() { + return id; + } + + public void add(ApplicationProjectItemImpl item) { + synchronized (membersLock) { + members.put(item.getId(), item); + } + } + + public void remove(ApplicationProjectItemImpl item) { + synchronized (membersLock) { + members.remove(item.getId()); + } + } + + public List getMembers() { + return new ArrayList<>(this.members.values()); + } + +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/item/ConfigItemImpl.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/item/ConfigItemImpl.java new file mode 100644 index 00000000..c837762e --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/item/ConfigItemImpl.java @@ -0,0 +1,58 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.project.item; + +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.item.project.EntaxyConfigItem; +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject; +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObjectContainer; + +public class ConfigItemImpl extends ObjectItemImpl implements EntaxyConfigItem { + + public static ConfigItemImpl create(EntaxyRuntimeObject runtimeObject) throws IllegalArgumentException { + EntaxyRuntimeObjectContainer container = runtimeObject.getContainer(); + if (!"bundle".equals(container.getType())) + throw new IllegalArgumentException("Object container is not a bundle: " + runtimeObject.getObjectFullId()); + String containerId = container.getId(); + long bundleId = -1; + String bundleSymbolicName = container.getName(); + try { + bundleId = Long.parseLong(containerId); + if (bundleId <= 0) + throw new Exception(); + } catch (Exception e) { + throw new IllegalArgumentException("Object container id is not a bundle id: [" + + runtimeObject.getObjectFullId() + "] [" + containerId + "]"); + } + return new ConfigItemImpl(bundleId, bundleSymbolicName, runtimeObject); + } + + public ConfigItemImpl(long bundleId, String bundleSymbolicName, EntaxyRuntimeObject runtimeObject) { + super(bundleId, bundleSymbolicName, runtimeObject); + setType(EntaxyApplication.ITEM_TYPE.CONFIG); + } + +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/item/ItemFactory.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/item/ItemFactory.java new file mode 100644 index 00000000..ee323562 --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/item/ItemFactory.java @@ -0,0 +1,168 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.project.item; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import ru.entaxy.esb.resources.EntaxyResource; +import ru.entaxy.platform.base.objects.EntaxyObject.OBJECT_RELATION; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.impl.project.ApplicationProjectItemImpl; +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject; +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObjectResource; +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeRelation; + +public class ItemFactory { + + static public final ItemFactory INSTANCE = new ItemFactory(); + + static public final List CONFIG_TYPES = Arrays.asList(new String[] {"entaxy.runtime.config"}); + + private ItemFactory() { + + } + + public ApplicationProjectItemImpl createItem(EntaxyRuntimeObject runtimeObject, + Map currentStorage, + final Map linkedItems) { + return createItem(runtimeObject, currentStorage, linkedItems, false, false); + } + + public ApplicationProjectItemImpl createItem(EntaxyRuntimeObject runtimeObject, + Map currentStorage, + final Map linkedItems, boolean skipDependencies, boolean skipISR) { + + String fullId = runtimeObject.getObjectFullId(); + if (currentStorage.containsKey(fullId)) + return currentStorage.get(fullId); + + if (linkedItems.containsKey(fullId)) + return linkedItems.get(fullId); + + boolean isConfig = false; + for (String type : CONFIG_TYPES) + if (runtimeObject.getType().startsWith(type)) + isConfig = true; + + ApplicationProjectItemImpl result; + if (isConfig) { + result = ConfigItemImpl.create(runtimeObject); + } else { + result = ObjectItemImpl.create(runtimeObject); + } + + if (!skipDependencies) { + processDependencies(result, runtimeObject, currentStorage, linkedItems, skipISR, false); + } + + for (ApplicationProjectItemImpl item : linkedItems.values()) + if (!currentStorage.containsKey(item.getId())) + item.setRequired(true); + + return result; + } + + public void processDependencies(ApplicationProjectItemImpl targetItem, EntaxyRuntimeObject runtimeObject, + Map currentStorage, + final Map linkedItems) { + processDependencies(targetItem, runtimeObject, currentStorage, linkedItems, false, true); + } + + public void processDependencies(ApplicationProjectItemImpl targetItem, EntaxyRuntimeObject runtimeObject, + Map currentStorage, + final Map linkedItems, boolean skipISR, boolean skipComposition) { + + List relations; + if (!skipISR) { + // process object relations: incoming aggregations and compositions + relations = runtimeObject.getIncomiingSubordRelations(); + for (EntaxyRuntimeRelation rel : relations) { + EntaxyRuntimeObject object = rel.getMain(); + ApplicationProjectItemImpl item = createItem(object, currentStorage, linkedItems, false, false); + targetItem.addRequired(item); + item.updateScope(EntaxyApplication.ITEM_SCOPE.convert(rel.getScope())); + if (!currentStorage.containsKey(item.getId())) + item.setRequired(true); + if (!linkedItems.containsKey(item.getId())) + linkedItems.put(item.getId(), item); + } + } + + // process object relations: outgoing dependencies and uses + relations = runtimeObject.getRelations(OBJECT_RELATION.DEPENDENCY); + relations.addAll(runtimeObject.getRelations(OBJECT_RELATION.USE)); + for (EntaxyRuntimeRelation rel : relations) { + EntaxyRuntimeObject object = rel.getMain(); + ApplicationProjectItemImpl item = createItem(object, currentStorage, linkedItems); + item.updateScope(EntaxyApplication.ITEM_SCOPE.convert(rel.getScope())); + targetItem.addRequired(item); + if (!currentStorage.containsKey(item.getId())) + item.setRequired(true); + if (!linkedItems.containsKey(item.getId())) + linkedItems.put(item.getId(), item); + } + + if (!skipComposition) { + //add default route as mandatory + relations = runtimeObject.getRelations(OBJECT_RELATION.COMPOSITION); + for (EntaxyRuntimeRelation rel : relations) { + EntaxyRuntimeObject object = rel.getTarget(); + ApplicationProjectItemImpl item = createItem(object, currentStorage, linkedItems, false, true); + item.updateScope(EntaxyApplication.ITEM_SCOPE.convert(rel.getScope())); + item.addRequired(targetItem); + if (!currentStorage.containsKey(item.getId())) + item.setRequired(true); + if (!linkedItems.containsKey(item.getId())) + linkedItems.put(item.getId(), item); + } + } + + // process object resources + List resources = runtimeObject.getResources(); + for (EntaxyRuntimeObjectResource resource : resources) { + ApplicationProjectItemImpl item = createItem(resource, currentStorage); + item.updateScope(EntaxyApplication.ITEM_SCOPE.convert(resource.getScope())); + targetItem.addRequired(item); + if (!currentStorage.containsKey(item.getId())) + item.setRequired(true); + if (!linkedItems.containsKey(item.getId())) + linkedItems.put(item.getId(), item); + } + } + + public ApplicationProjectItemImpl createItem(EntaxyRuntimeObjectResource objectResource, + Map currentStorage) { + return new ResourceItemImpl(objectResource); + } + + public ApplicationProjectItemImpl createItem(EntaxyResource entaxyResource, + Map currentStorage) { + return new ResourceItemImpl(entaxyResource); + } + +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/item/ObjectItemImpl.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/item/ObjectItemImpl.java new file mode 100644 index 00000000..15ce4c44 --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/item/ObjectItemImpl.java @@ -0,0 +1,77 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.project.item; + +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.item.project.EntaxyObjectItem; +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject; +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObjectContainer; + +public class ObjectItemImpl extends BundleItemImpl implements EntaxyObjectItem { + + public static ObjectItemImpl create(EntaxyRuntimeObject runtimeObject) throws IllegalArgumentException { + EntaxyRuntimeObjectContainer container = runtimeObject.getContainer(); + if (!"bundle".equals(container.getType())) + throw new IllegalArgumentException("Object container is not a bundle: " + runtimeObject.getObjectFullId()); + String containerId = container.getId(); + long bundleId = -1; + String bundleSymbolicName = container.getName(); + try { + bundleId = Long.parseLong(containerId); + if (bundleId <= 0) + throw new Exception(); + } catch (Exception e) { + throw new IllegalArgumentException("Object container id is not a bundle id: [" + + runtimeObject.getObjectFullId() + "] [" + containerId + "]"); + } + return new ObjectItemImpl(bundleId, bundleSymbolicName, runtimeObject); + } + + protected EntaxyRuntimeObject runtimeObject; + + public ObjectItemImpl(long bundleId, String bundleSymbolicName, EntaxyRuntimeObject runtimeObject) { + super(bundleId, bundleSymbolicName); + this.runtimeObject = runtimeObject; + Object isPlatform = runtimeObject.getAttribute("platform"); + if ("true".equals(isPlatform)) { + this.setPlatform(true); + this.setIgnored(true); + this.setRequired(true); + } + setType(EntaxyApplication.ITEM_TYPE.OBJECT); + } + + @Override + public String getId() { + return runtimeObject.getObjectFullId(); + } + + @Override + public EntaxyRuntimeObject getObject() { + return this.runtimeObject; + } + +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/item/ResourceItemImpl.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/item/ResourceItemImpl.java new file mode 100644 index 00000000..09c39308 --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/item/ResourceItemImpl.java @@ -0,0 +1,60 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.project.item; + +import ru.entaxy.esb.resources.EntaxyResource; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.impl.project.ApplicationProjectItemImpl; +import ru.entaxy.platform.integration.applications.item.project.EntaxyResourceItem; +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObjectResource; + +public class ResourceItemImpl extends ApplicationProjectItemImpl implements EntaxyResourceItem { + + protected EntaxyResource entaxyResource; + + public ResourceItemImpl(EntaxyRuntimeObjectResource objectResource) { + super(); + this.entaxyResource = objectResource.getResource(); + setType(EntaxyApplication.ITEM_TYPE.RESOURCE); + } + + public ResourceItemImpl(EntaxyResource entaxyResource) { + super(); + this.entaxyResource = entaxyResource; + setType(EntaxyApplication.ITEM_TYPE.RESOURCE); + } + + @Override + public String getId() { + return entaxyResource.getURL(); + } + + @Override + public EntaxyResource getResource() { + return entaxyResource; + } + +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/ContentChecker.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/ContentChecker.java new file mode 100644 index 00000000..ef729c5d --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/ContentChecker.java @@ -0,0 +1,49 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.project.model; + +import com.google.gson.JsonObject; + +import ru.entaxy.platform.base.support.JSONUtils; +import ru.entaxy.platform.base.support.JSONUtils.ObjectWrapper; + +public class ContentChecker extends JSONUtils.ObjectChecker { + + public ContentModel contentModel; + + public ContentChecker(ContentModel contentModel) { + super(); + this.contentModel = contentModel; + } + + @Override + public ObjectWrapper checkObject(JsonObject object) { + if (ContentModelItemWrapper.isModelItem(object)) + return new ContentModelItemWrapper(this.contentModel); + return null; + } + +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/ContentModel.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/ContentModel.java new file mode 100644 index 00000000..dd6d8f84 --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/ContentModel.java @@ -0,0 +1,248 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.project.model; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; + +import ru.entaxy.platform.base.support.JSONUtils.JsonTraverse; +import ru.entaxy.platform.integration.applications.ApplicationProjectContent; +import ru.entaxy.platform.integration.applications.impl.project.ApplicationProjectContentImpl; +import ru.entaxy.platform.integration.applications.impl.project.ApplicationProjectItemImpl; +import ru.entaxy.platform.integration.applications.impl.project.model.item.BundleItem; +import ru.entaxy.platform.integration.applications.impl.project.model.item.ConfigItem; +import ru.entaxy.platform.integration.applications.impl.project.model.item.ContentModelItem; +import ru.entaxy.platform.integration.applications.impl.project.model.item.ObjectItem; +import ru.entaxy.platform.integration.applications.impl.project.model.item.ResourceItem; +import ru.entaxy.platform.integration.applications.item.project.EntaxyBundleItem; +import ru.entaxy.platform.integration.applications.item.project.EntaxyConfigItem; +import ru.entaxy.platform.integration.applications.item.project.EntaxyObjectItem; +import ru.entaxy.platform.integration.applications.item.project.EntaxyResourceItem; + +public class ContentModel { + + public static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); + + public static ContentModel load(JsonObject jsonObject) { + ContentModel result = GSON.fromJson(jsonObject, ContentModel.class); + JsonTraverse traverser = new JsonTraverse().checker(new ContentChecker(result)); + traverser.traverse(jsonObject); + return result; + } + + String application = ""; + String group = ""; + String version = ""; + String createdOn = Calendar.getInstance().getTimeInMillis() + ""; + String createdBy = ""; + String modifiedOn = ""; + String modifiedBy = ""; + + transient List requiredItems = new ArrayList<>(); + transient List includedItems = new ArrayList<>(); + + public void update(ApplicationProjectContentImpl applicationContentImpl) { + + application = applicationContentImpl.getProperties() + .getOrDefault(ApplicationProjectContent.STANDARD_PROPERTIES.APPLICATION, application).toString(); + group = applicationContentImpl.getProperties() + .getOrDefault(ApplicationProjectContent.STANDARD_PROPERTIES.GROUP, group).toString(); + version = applicationContentImpl.getProperties() + .getOrDefault(ApplicationProjectContent.STANDARD_PROPERTIES.VERSION, version).toString(); + createdOn = applicationContentImpl.getProperties() + .getOrDefault(ApplicationProjectContent.STANDARD_PROPERTIES.CREATED_ON, createdOn).toString(); + createdBy = applicationContentImpl.getProperties() + .getOrDefault(ApplicationProjectContent.STANDARD_PROPERTIES.CREATED_BY, createdBy).toString(); + modifiedOn = applicationContentImpl.getProperties() + .getOrDefault(ApplicationProjectContent.STANDARD_PROPERTIES.MODIFIED_ON, modifiedOn).toString(); + modifiedBy = applicationContentImpl.getProperties() + .getOrDefault(ApplicationProjectContent.STANDARD_PROPERTIES.MODIFIED_BY, modifiedBy).toString(); + + requiredItems.clear(); + includedItems.clear(); + for (ApplicationProjectItemImpl item : applicationContentImpl.getItemsMap().values()) { + List targetList; + if (item.isRequired()) + targetList = requiredItems; + else + targetList = includedItems; + ContentModelItem converted = convert(item); + targetList.add(converted); + } + } + + public JsonObject getAsJson() { + JsonElement je = GSON.toJsonTree(this, ContentModel.class); + if (!je.isJsonObject()) { + return new JsonObject(); + } + JsonObject result = je.getAsJsonObject(); + + // add requirements + JsonArray ja = new JsonArray(); + for (ContentModelItem item : requiredItems) { + JsonElement itemElement = GSON.toJsonTree(item, item.getClass()); + ja.add(itemElement); + } + result.add("requirements", ja); + + // add items + ja = new JsonArray(); + for (ContentModelItem item : includedItems) { + JsonElement itemElement = GSON.toJsonTree(item, item.getClass()); + ja.add(itemElement); + } + result.add("items", ja); + + return result; + } + + protected ContentModelItem convert(ApplicationProjectItemImpl item) { + ContentModelItem result = null; + switch (item.getType()) { + case BUNDLE: + result = new BundleItem(); + break; + case OBJECT: + result = new ObjectItem(); + break; + case CONFIG: + result = new ConfigItem(); + break; + case RESOURCE: + result = new ResourceItem(); + break; + default: + return null; + } + result.setContentModel(this); + result.setId(item.getId()); + result.setGhost(item.isGhost()); + result.setIgnored(item.isIgnored()); + result.setItemScope(item.getScope()); + result.setItemType(item.getType()); + result.setRequired(item.isRequired()); + + if (item.getColocationGroup() != null) + result.setColocationGroupId(item.getColocationGroup().getId()); + + if (item instanceof EntaxyBundleItem) { + BundleItem typedResult = (BundleItem) result; + EntaxyBundleItem typedOrigin = (EntaxyBundleItem) item; + typedResult.setBundleId(typedOrigin.getBundleId()); + typedResult.setBundleSymbolicName(typedOrigin.getBundleSymbolicName()); + } + + if (item instanceof EntaxyObjectItem) { + ObjectItem typedResult = (ObjectItem) result; + EntaxyObjectItem typedOrigin = (EntaxyObjectItem) item; + } + + if (item instanceof EntaxyConfigItem) { + ConfigItem typedResult = (ConfigItem) result; + EntaxyConfigItem typedOrigin = (EntaxyConfigItem) item; + } + + if (item instanceof EntaxyResourceItem) { + ResourceItem typedResult = (ResourceItem) result; + EntaxyResourceItem typedOrigin = (EntaxyResourceItem) item; + } + + return result; + } + + public String getApplication() { + return application; + } + + public void setApplication(String application) { + this.application = application; + } + + public String getGroup() { + return group; + } + + public void setGroup(String group) { + this.group = group; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(String createdOn) { + this.createdOn = createdOn; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public String getModifiedOn() { + return modifiedOn; + } + + public void setModifiedOn(String modifiedOn) { + this.modifiedOn = modifiedOn; + } + + public String getModifiedBy() { + return modifiedBy; + } + + public void setModifiedBy(String modifiedBy) { + this.modifiedBy = modifiedBy; + } + + public List getRequiredItems() { + return requiredItems; + } + + public List getIncludedItems() { + return includedItems; + } + +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/ContentModelItemWrapper.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/ContentModelItemWrapper.java new file mode 100644 index 00000000..6b37b42b --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/ContentModelItemWrapper.java @@ -0,0 +1,101 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.project.model; + +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gson.JsonObject; + +import ru.entaxy.platform.base.support.JSONUtils.ObjectWrapper; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplication.ITEM_SCOPE; +import ru.entaxy.platform.integration.applications.EntaxyApplication.ITEM_TYPE; +import ru.entaxy.platform.integration.applications.impl.project.model.item.BundleItem; +import ru.entaxy.platform.integration.applications.impl.project.model.item.ConfigItem; +import ru.entaxy.platform.integration.applications.impl.project.model.item.ContentModelItem; +import ru.entaxy.platform.integration.applications.impl.project.model.item.ObjectItem; +import ru.entaxy.platform.integration.applications.impl.project.model.item.ResourceItem; + +public class ContentModelItemWrapper extends ObjectWrapper { + + private static final Logger LOG = LoggerFactory.getLogger(ContentModelItemWrapper.class); + + public static boolean isModelItem(JsonObject object) { + return object.has("id") && object.has("scope") && object.has("type"); + } + + ContentModel contentModel; + + ContentModelItem contentModelItem; + + public ContentModelItemWrapper(ContentModel contentModel) { + super(); + this.contentModel = contentModel; + } + + @Override + public void wrap(JsonObject object, Map context, String path) { + try { + String type = object.get("type").getAsString(); + EntaxyApplication.ITEM_TYPE itemType = EntaxyApplication.ITEM_TYPE.valueOf(type.toUpperCase()); + switch (itemType) { + case BUNDLE: + contentModelItem = ContentModel.GSON.fromJson(object, BundleItem.class); + break; + case CONFIG: + contentModelItem = ContentModel.GSON.fromJson(object, ConfigItem.class); + break; + case OBJECT: + contentModelItem = ContentModel.GSON.fromJson(object, ObjectItem.class); + break; + case RESOURCE: + contentModelItem = ContentModel.GSON.fromJson(object, ResourceItem.class); + break; + default: + return; + } + contentModelItem.setItemType(itemType); + + try { + contentModelItem.setItemScope(EntaxyApplication.ITEM_SCOPE.valueOf(object.get("scope").getAsString().toUpperCase())); + } catch (Exception e) { + contentModelItem.setItemScope(EntaxyApplication.ITEM_SCOPE.UNKNOWN); + } + + if (contentModelItem.isRequired()) + contentModel.requiredItems.add(contentModelItem); + else + contentModel.includedItems.add(contentModelItem); + + } catch (Exception e) { + LOG.error("Error reading object", e); + } + } + +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/item/BundleItem.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/item/BundleItem.java new file mode 100644 index 00000000..cf7a9864 --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/item/BundleItem.java @@ -0,0 +1,51 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.project.model.item; + +public class BundleItem extends ContentModelItem { + + long bundleId; + String bundleSymbolicName; + + public long getBundleId() { + return bundleId; + } + + public void setBundleId(long bundleId) { + this.bundleId = bundleId; + } + + public String getBundleSymbolicName() { + return bundleSymbolicName; + } + + public void setBundleSymbolicName(String bundleSymbolicName) { + this.bundleSymbolicName = bundleSymbolicName; + } + + + +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/item/ConfigItem.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/item/ConfigItem.java new file mode 100644 index 00000000..4c33cd47 --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/item/ConfigItem.java @@ -0,0 +1,30 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.project.model.item; + +public class ConfigItem extends ObjectItem { + +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/item/ContentModelItem.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/item/ContentModelItem.java new file mode 100644 index 00000000..db384021 --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/item/ContentModelItem.java @@ -0,0 +1,109 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.project.model.item; + +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.impl.project.model.ContentModel; + +public class ContentModelItem { + + transient ContentModel contentModel; + + String id; + boolean required = false; + boolean ignored = false; + boolean ghost = false; + + EntaxyApplication.ITEM_SCOPE scope; + EntaxyApplication.ITEM_TYPE type; + + String colocationGroupId; + + public ContentModel getContentModel() { + return contentModel; + } + + public void setContentModel(ContentModel contentModel) { + this.contentModel = contentModel; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public boolean isRequired() { + return required; + } + + public void setRequired(boolean required) { + this.required = required; + } + + public boolean isIgnored() { + return ignored; + } + + public void setIgnored(boolean ignored) { + this.ignored = ignored; + } + + public boolean isGhost() { + return ghost; + } + + public void setGhost(boolean ghost) { + this.ghost = ghost; + } + + public EntaxyApplication.ITEM_SCOPE getItemScope() { + return scope; + } + + public void setItemScope(EntaxyApplication.ITEM_SCOPE itemScope) { + this.scope = itemScope; + } + + public EntaxyApplication.ITEM_TYPE getItemType() { + return type; + } + + public void setItemType(EntaxyApplication.ITEM_TYPE itemType) { + this.type = itemType; + } + + public String getColocationGroupId() { + return colocationGroupId; + } + + public void setColocationGroupId(String colocationGroupId) { + this.colocationGroupId = colocationGroupId; + } + +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/item/ObjectItem.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/item/ObjectItem.java new file mode 100644 index 00000000..028fd2f0 --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/item/ObjectItem.java @@ -0,0 +1,30 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.project.model.item; + +public class ObjectItem extends BundleItem { + +} diff --git a/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/item/ResourceItem.java b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/item/ResourceItem.java new file mode 100644 index 00000000..abeb238e --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/java/ru/entaxy/platform/integration/applications/impl/project/model/item/ResourceItem.java @@ -0,0 +1,30 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-impl + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.impl.project.model.item; + +public class ResourceItem extends ContentModelItem { + +} diff --git a/platform/integration/applications/application-impl/src/main/resources/ru/entaxy/templates/applications/builder/features.ftl b/platform/integration/applications/application-impl/src/main/resources/ru/entaxy/templates/applications/builder/features.ftl new file mode 100644 index 00000000..e69ac13b --- /dev/null +++ b/platform/integration/applications/application-impl/src/main/resources/ru/entaxy/templates/applications/builder/features.ftl @@ -0,0 +1,41 @@ +[#ftl attributes={"generated.type":"features"}] + + + + + [#list descriptor.getConfigComponents() as config] + + mvn:[=config.mavenLocation] + + [/#list] + [#list descriptor.getBundleComponents() as bundle] + [=bundle.fullTargetLocation] + [/#list] + + [#if revisionNumber??] + [#assign finalRevision=revisionNumber] + [#else] + [#assign finalRevision="0"] + [/#if] + + + entaxy.application;name=[=descriptor.name];version=[=descriptor.version];revision=[=finalRevision] + + + + + + [#list descriptor.getConfigComponents() as config] + + mvn:[=config.mavenLocation] + + [/#list] + + + + \ No newline at end of file diff --git a/platform/integration/applications/application-management/LICENSE.txt b/platform/integration/applications/application-management/LICENSE.txt new file mode 100644 index 00000000..4ae94b75 --- /dev/null +++ b/platform/integration/applications/application-management/LICENSE.txt @@ -0,0 +1,175 @@ + ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ + +Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой) +версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего +Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН +7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова, +д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу +https://www.emdev.ru/about (далее - Компания). + +Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями» +(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения, +Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в +настоящем документе, в противном случае, он должен не использовать или не получать доступ +к Программному обеспечению. + + 1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ + +a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии +или редакции, исключительные права на которую принадлежат Правообладателю. +b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные +права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ +для ЭВМ № 2021610848 от 19.01.2021 года. +c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта +https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО. +d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также +личные неимущественные права авторов произведений на результат интеллектуальной деятельности. +e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование +ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка +включает предоставление Пользователю неисключительного права использования ПО, в том числе +получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение +патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается +Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается +для каждого Пользователя индивидуально в Сертификате. +f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром), +подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное +обеспечение в ограниченном объёме и на определённый период времени. +g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО, +предоставленных Пользователю согласно условиям Подписки. +h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного +обеспечения. +i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий +из одного или нескольких файлов, который может быть прочтён человеком. +j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля +программы, полученный в результате обработки исходного кода, еще не связанный в полную программу. +Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый +продукт. +k) Некоммерческое использование – индивидуальное личное использование Пользователем программного +обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации +возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая +выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения. + + 2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ + +2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного +обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом +воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения +в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ. +2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит +неисключительный характер. +2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию, +лицензия на ограниченное использование Программного обеспечения. +2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования +имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан +обратиться в службу поддержки Правообладателя по адресу: https://entaxy.ru/ для изменения +вида лицензии с Базовой бесплатной версии на Подписки. +2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для +пробного использования программного обеспечения – не ограничен. +2.6. Использование Пользователем настоящего программного обеспечения в целях разработки, +модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю, +без разрешения Правообладателя не допускается. + + 3. АВТОРСКОЕ ПРАВО. + +3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение +и любые его копии принадлежат Правообладателю. +3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента, +к которому можно получить доступ с помощью Программного обеспечения, является собственностью +соответствующего владельца контента и защищается применимым законодательством об авторском +праве или другими законами и договорами об интеллектуальной собственности. +3.3. Условия использования Программного обеспечения. +Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь +придерживается следующих условий: +3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять +какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании +Программного обеспечения или на нем. +3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать, +расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать +Программное обеспечение. +3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования +ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне. +3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено +использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам. + + 4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС» + +4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю +на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с +использованием Пользователем: +4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в +Программное обеспечение; +4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями +настоящего соглашения; +4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием, +или данными, не предоставленными Пользователю Правообладателем; +4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем. + + +5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ +ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ +И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ +ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ +И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ +ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО. + + 6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ. +НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ +ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ, +ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ; +ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ. +ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ +ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ; +КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ +ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ. + + 7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ: +Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия +(включая, но не ограничиваясь) по: +-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код) + Программного обеспечения; +-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный +код Программного обеспечения, за исключением тех изменений, которые вносятся средствами, +включёнными в Программное обеспечение и описанными непосредственно в документации к нему; +-созданию условий для использования Программного обеспечения лицами, не имеющими прав на +использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство +третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа +к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку; +-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию). + + 8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА. + +8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из +лицензионных продуктов, используемых на законных основаниях, а +именно https://entaxy.ru/libs/licenses/root-aggregated.deps. +8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть +совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения. +8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться +Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения, +содержащих все изменения и дополнения программного обеспечения. + + 9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ. + +9.1. Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым +программным обеспечением. +9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно +с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм +«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public. +9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий +пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя, +прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер +ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства +Российской Федерации. + + 10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ. + +10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет +право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб, +недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий +пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере +2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения +исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy). +10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое +законодательство – Российской Федерации. +10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным, +остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать +исполнять свои обязанности в соответствии с этими положениями. diff --git a/platform/integration/applications/application-management/pom.xml b/platform/integration/applications/application-management/pom.xml new file mode 100644 index 00000000..5dc0f7d3 --- /dev/null +++ b/platform/integration/applications/application-management/pom.xml @@ -0,0 +1,67 @@ + + + 4.0.0 + + ru.entaxy.platform.integration + applications + 1.11.0 + + ru.entaxy.platform.integration.applications + application-management + bundle + ENTAXY :: PLATFORM :: INTEGRATION :: APPLICATIONS :: MANAGEMENT + ENTAXY :: PLATFORM :: INTEGRATION :: APPLICATIONS :: MANAGEMENT + + + ru.entaxy.platform.integration.applications.management + ru.entaxy.platform.integration.applications.management.impl + + + + + + ru.entaxy.esb.platform.runtime.core.management + object-management + ${project.version} + + + org.osgi + org.osgi.service.component.annotations + 1.4.0 + compile + + + org.apache.felix + org.apache.felix.scr + 2.1.20 + + + ru.entaxy.esb.platform.runtime.base + base-support + ${project.version} + + + ru.entaxy.esb.platform.runtime.base + management-core + ${project.version} + + + ru.entaxy.platform.integration.applications + application-api + ${project.version} + + + ru.entaxy.platform.integration.applications + application-impl + ${project.version} + + + commons-io + commons-io + ${commons-io.version} + + + + diff --git a/platform/integration/applications/application-management/src/main/java/ru/entaxy/platform/integration/applications/management/ApplicationsMBean.java b/platform/integration/applications/application-management/src/main/java/ru/entaxy/platform/integration/applications/management/ApplicationsMBean.java new file mode 100644 index 00000000..97ac8f3f --- /dev/null +++ b/platform/integration/applications/application-management/src/main/java/ru/entaxy/platform/integration/applications/management/ApplicationsMBean.java @@ -0,0 +1,198 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-management + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.management; + +import ru.entaxy.esb.platform.base.management.core.Qualifier; +import ru.entaxy.esb.platform.base.management.core.api.MBeanAnnotated; +import ru.entaxy.esb.platform.base.management.core.api.MBeanExportPolicy; +import ru.entaxy.esb.platform.base.management.core.api.Operation; +import ru.entaxy.esb.platform.base.management.core.api.Parameter; + +import java.util.List; +import java.util.Map; + +@MBeanAnnotated(policy = MBeanExportPolicy.ANNOTATED_ONLY) +public interface ApplicationsMBean { + + public static final String MODULE_JMX_DOMAIN = "ru.entaxy.cicd"; + + public static final String MAIN_MODULE_KEY = "module"; + + public static final String MAIN_MODULE_KEY_VALUE = "applications"; + + public static final Qualifier Q_MAIN_MODULE = new Qualifier(MAIN_MODULE_KEY, MAIN_MODULE_KEY_VALUE); + + public static final String Q_MAIN_MODULE_S = MODULE_JMX_DOMAIN + ":" + MAIN_MODULE_KEY + "=" + MAIN_MODULE_KEY_VALUE; + + @Operation(desc = "Gets tree") + String readAsTree() throws Exception; + + @Operation(desc = "Import project from repository") + void importFromRepository( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "mavenUrl", desc = "Maven URL of the application") String mavenUrl + ) throws Exception; + + @Operation(desc = "Import project from base64 string") + void importFromBase64String( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "fileContentBase64String", + desc = "The application file content encoded into base64 string") String fileContentBase64 + ) throws Exception; + + @Operation(desc = "Remove application") + void removeApplication( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "applicationName", desc = "Name of the application") String applicationName + ) throws Exception; + + @Operation(desc = "List application items") + List> listApplicationItems( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "applicationName", desc = "Name of the application") String applicationName, + @Parameter(name = "applicationVersion", desc = "Version of the application") String applicationVersion + ) throws Exception; + + @Operation(desc = "List application requirements") + List> listApplicationRequirements( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "applicationName", desc = "Name of the application") String applicationName, + @Parameter(name = "applicationVersion", desc = "Version of the application") String applicationVersion + ) throws Exception; + + @Operation(desc = "Read last and installed revision of the application version") + Map readApplicationVersionLastAndInstalledRevision( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "applicationName", desc = "Name of the application") String applicationName, + @Parameter(name = "applicationVersion", desc = "Version of the application") String applicationVersion + ) throws Exception; + + @Operation(desc = "Read application item types") + List readApplicationItemTypes(); + + @Operation(desc = "Read project item scopes") + List readApplicationItemScopes(); + + @Operation(desc = "Remove application version") + void removeVersion(@Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "applicationName", desc = "Name of the application") String applicationName, + @Parameter(name = "versionToRemove", desc = "Version to remove") String versionToRemove + ) throws Exception; + + @Operation(desc = "Create revision for application version") + void createRevision( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "applicationName", desc = "Name of the application") String applicationName, + @Parameter(name = "applicationVersion", desc = "Version of the application") String applicationVersion, + @Parameter(name = "prototypeRevision", desc = "Existent revision to base on") int prototypeRevision + ) throws Exception; + + @Operation(desc = "Configure application revision") + void configureRevision( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "applicationName", desc = "Name of the application") String applicationName, + @Parameter(name = "applicationVersion", desc = "Version of the application") String applicationVersion, + @Parameter(name = "applicationVersionRevision", desc = "Revision of the application version") + String applicationVersionRevision + ) throws Exception; + + @Operation(desc = "Deploy application revision") + void deployRevision( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "applicationName", desc = "Name of the application") String applicationName, + @Parameter(name = "applicationVersion", desc = "Version of the application") String applicationVersion, + @Parameter(name = "applicationVersionRevision", desc = "Revision of the application version") + String applicationVersionRevision + ) throws Exception; + + @Operation(desc = "Install application revision") + void installRevision( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "applicationName", desc = "Name of the application") String applicationName, + @Parameter(name = "applicationVersion", desc = "Version of the application") String applicationVersion, + @Parameter(name = "applicationVersionRevision", desc = "Revision of the application version") + String applicationVersionRevision + ) throws Exception; + + @Operation(desc = "Uninstall application revision") + void uninstallRevision( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "applicationName", desc = "Name of the application") String applicationName, + @Parameter(name = "applicationVersion", desc = "Version of the application") String applicationVersion, + @Parameter(name = "applicationVersionRevision", desc = "Revision of the application version") + String applicationVersionRevision + ) throws Exception; + + @Operation(desc = "Get application revision status") + String readRevisionStatus( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "applicationName", desc = "Name of the application") String applicationName, + @Parameter(name = "applicationVersion", desc = "Version of the application") String applicationVersion, + @Parameter(name = "applicationVersionRevision", desc = "Revision of the application version") + String applicationVersionRevision + ) throws Exception; + + @Operation(desc = "List application revision configurations") + List> listRevisionConfigurations( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "applicationName", desc = "Name of the application") String applicationName, + @Parameter(name = "applicationVersion", desc = "Version of the application") String applicationVersion, + @Parameter(name = "applicationVersionRevision", desc = "Revision of the application version") + String applicationVersionRevision + ) throws Exception; + + @Operation(desc = "Read application revision configuration") + Map readRevisionConfiguration( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "applicationName", desc = "Name of the application") String applicationName, + @Parameter(name = "applicationVersion", desc = "Version of the application") String applicationVersion, + @Parameter(name = "applicationVersionRevision", desc = "Revision of the application version") + String applicationVersionRevision, + @Parameter(name = "configId", desc = "Configuration Id") String configId + ) throws Exception; + + @Operation(desc = "Fill in application revision configuration with local configuration values") + void fillInRevisionConfigurationWithLocalValues( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "applicationName", desc = "Name of the application") String applicationName, + @Parameter(name = "applicationVersion", desc = "Version of the application") String applicationVersion, + @Parameter(name = "applicationVersionRevision", desc = "Revision of the application version") + String applicationVersionRevision, + @Parameter(name = "configId", desc = "Configuration Id") String configId + ) throws Exception; + + @Operation(desc = "Save application revision configuration changes") + void saveRevisionConfiguration( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "applicationName", desc = "Name of the application") String applicationName, + @Parameter(name = "applicationVersion", desc = "Version of the application") String applicationVersion, + @Parameter(name = "applicationVersionRevision", desc = "Revision of the application version") + String applicationVersionRevision, + @Parameter(name = "configId", desc = "Configuration Id") String configId, + @Parameter(name = "properties", desc = "Map of changed properties") Map properties + ) throws Exception; + +} diff --git a/platform/integration/applications/application-management/src/main/java/ru/entaxy/platform/integration/applications/management/ProjectsMBean.java b/platform/integration/applications/application-management/src/main/java/ru/entaxy/platform/integration/applications/management/ProjectsMBean.java new file mode 100644 index 00000000..1101b615 --- /dev/null +++ b/platform/integration/applications/application-management/src/main/java/ru/entaxy/platform/integration/applications/management/ProjectsMBean.java @@ -0,0 +1,206 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-management + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.management; + +import ru.entaxy.esb.platform.base.management.core.Qualifier; +import ru.entaxy.esb.platform.base.management.core.api.MBeanAnnotated; +import ru.entaxy.esb.platform.base.management.core.api.MBeanExportPolicy; +import ru.entaxy.esb.platform.base.management.core.api.Operation; +import ru.entaxy.esb.platform.base.management.core.api.Parameter; + +import java.util.List; +import java.util.Map; + +@MBeanAnnotated(policy = MBeanExportPolicy.ANNOTATED_ONLY) +public interface ProjectsMBean { + + public static final String MODULE_JMX_DOMAIN = "ru.entaxy.cicd"; + + public static final String MAIN_MODULE_KEY = "module"; + + public static final String MAIN_MODULE_KEY_VALUE = "projects"; + + public static final Qualifier Q_MAIN_MODULE = new Qualifier(MAIN_MODULE_KEY, MAIN_MODULE_KEY_VALUE); + + public static final String Q_MAIN_MODULE_S = MODULE_JMX_DOMAIN + ":" + MAIN_MODULE_KEY + "=" + MAIN_MODULE_KEY_VALUE; + + @Operation(desc = "Gets tree") + String readAsTree() throws Exception; + + @Operation(desc = "List project items") + List> listProjectItems( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "projectName", desc = "Name of the project") String projectName, + @Parameter(name = "projectVersion", desc = "Version of the project") String projectVersion + ) throws Exception; + + @Operation(desc = "Read project item statuses") + List readProjectItemStatuses(); + + @Operation(desc = "Create project") + void createProject( + @Parameter(name = "projectName", desc = "Name of created project") String projectName, + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "initialVersion", desc = "Initial version for the created project") String initialVersion + ) throws Exception; + + @Operation(desc = "Remove project") + void removeProject( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "projectName", desc = "Name of the project") String projectName + ) throws Exception; + + @Operation(desc = "Add object to the project") + List> addObject( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "projectName", desc = "Name of the project") String projectName, + @Parameter(name = "projectVersion", desc = "Version of the project") String projectVersion, + @Parameter(name = "objectId", desc = "Id of the object") String objectId + ) throws Exception; + + @Operation(desc = "List objects") + List> listObjects() throws Exception; + + @Operation(desc = "Get related objects") + List> getRelatedObjects( + @Parameter(name = "objectId", desc = "Id of the object") String objectId + ) throws Exception; + + @Operation(desc = "Add resource to the project") + void addResource( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "projectName", desc = "Name of the project") String projectName, + @Parameter(name = "projectVersion", desc = "Version of the project") String projectVersion, + @Parameter(name = "location", desc = "Location of the resource") String location + ) throws Exception; + + @Operation(desc = "Add item to the project") + void addItem( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "projectName", desc = "Name of the project") String projectName, + @Parameter(name = "projectVersion", desc = "Version of the project") String projectVersion, + @Parameter(name = "itemId", desc = "Id of the item") String itemId + ) throws Exception; + + @Operation(desc = "Ignore item from the project") + void ignoreItem( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "projectName", desc = "Name of the project") String projectName, + @Parameter(name = "projectVersion", desc = "Version of the project") String projectVersion, + @Parameter(name = "itemId", desc = "Id of the item") String itemId + ) throws Exception; + + @Operation(desc = "Remove item from the project") + void removeItem( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "projectName", desc = "Name of the project") String projectName, + @Parameter(name = "projectVersion", desc = "Version of the project") String projectVersion, + @Parameter(name = "itemId", desc = "Id of the item") String itemId + ) throws Exception; + + @Operation(desc = "Remove items from the project") + Map> removeItems( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "projectName", desc = "Name of the project") String projectName, + @Parameter(name = "projectVersion", desc = "Version of the project") String projectVersion, + @Parameter(name = "itemIds", desc = "Ids of the items") List itemIds + ) throws Exception; + + @Operation(desc = "Create version") + void createVersion( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "projectName", desc = "Name of the project") String projectName, + @Parameter(name = "createdVersion", desc = "Created version") String createdVersion, + @Parameter(name = "prototypeVersion", desc = "Existent version to base on") String prototypeVersion + ) throws Exception; + + @Operation(desc = "Remove version") + void removeVersion( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "projectName", desc = "Name of the project") String projectName, + @Parameter(name = "versionToRemove", desc = "Version to remove") String versionToRemove + ) throws Exception; + + @Operation(desc = "Save project version") + void saveProjectVersion( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "projectName", desc = "Name of the project") String projectName, + @Parameter(name = "projectVersion", desc = "Version of the project") String projectVersion + ) throws Exception; + + @Operation(desc = "Build project version") + void buildProjectVersion( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "projectName", desc = "Name of the project") String projectName, + @Parameter(name = "projectVersion", desc = "Version of the project") String projectVersion + ) throws Exception; + + @Operation(desc = "List built project items") + List> listBuiltProjectItems( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "projectName", desc = "Name of the project") String projectName, + @Parameter(name = "projectVersion", desc = "Version of the project") String projectVersion + ) throws Exception; + + @Operation(desc = "List built project requirements") + List> listBuiltProjectRequirements( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "projectName", desc = "Name of the project") String projectName, + @Parameter(name = "projectVersion", desc = "Version of the project") String projectVersion + ) throws Exception; + + @Operation(desc = "List built project components") + List> listBuiltProjectComponents( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "projectName", desc = "Name of the project") String projectName, + @Parameter(name = "projectVersion", desc = "Version of the project") String projectVersion + ) throws Exception; + + @Operation(desc = "Read build info") + String readMavenUrl( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "projectName", desc = "Name of the project") String projectName, + @Parameter(name = "projectVersion", desc = "Version of the project") String projectVersion + ) throws Exception; + + @Operation(desc = "List repositories") + List listRepositories() throws Exception; + + @Operation(desc = "Export project to repository") + void exportToRepository( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "projectName", desc = "Name of the project") String projectName, + @Parameter(name = "projectVersion", desc = "Version of the project") String projectVersion, + @Parameter(name = "repositoryName", desc = "Name of the repository") String repositoryName + ) throws Exception; + + @Operation(desc = "Export project to file") + String exportToFile( + @Parameter(name = "storage", desc = "Name of the storage") String storage, + @Parameter(name = "projectName", desc = "Name of the project") String projectName, + @Parameter(name = "projectVersion", desc = "Version of the project") String projectVersion + ) throws Exception; +} diff --git a/platform/integration/applications/application-management/src/main/java/ru/entaxy/platform/integration/applications/management/impl/ApplicationsMBeanImpl.java b/platform/integration/applications/application-management/src/main/java/ru/entaxy/platform/integration/applications/management/impl/ApplicationsMBeanImpl.java new file mode 100644 index 00000000..6eb99b76 --- /dev/null +++ b/platform/integration/applications/application-management/src/main/java/ru/entaxy/platform/integration/applications/management/impl/ApplicationsMBeanImpl.java @@ -0,0 +1,568 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-management + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.management.impl; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Base64; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +import javax.management.DynamicMBean; +import javax.management.MBeanRegistration; +import javax.management.NotCompliantMBeanException; + +import org.apache.commons.io.FileUtils; +import org.apache.karaf.features.FeaturesService; +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.ServiceScope; + +import ru.entaxy.esb.platform.base.management.core.ManagementCore; +import ru.entaxy.esb.platform.base.management.core.api.AnnotatedMBean; +import ru.entaxy.esb.resources.EntaxyResource; +import ru.entaxy.esb.resources.EntaxyResourceService; +import ru.entaxy.platform.base.support.CommonUtils; +import ru.entaxy.platform.base.support.JSONUtils; +import ru.entaxy.platform.base.support.osgi.bundle.CapabilityDescriptor; +import ru.entaxy.platform.base.support.osgi.feature.FeatureCapabilityHelper; +import ru.entaxy.platform.config.runtime.ObjectConfigEditor; +import ru.entaxy.platform.integration.applications.ApplicationItem; +import ru.entaxy.platform.integration.applications.ApplicationManager; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationRevision; +import ru.entaxy.platform.integration.applications.EntaxyApplicationVersion; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationRequirement; +import ru.entaxy.platform.integration.applications.exceptions.ApplicationException; +import ru.entaxy.platform.integration.applications.exceptions.ApplicationVersionHasInstalledException; +import ru.entaxy.platform.integration.applications.exceptions.ItemNotFoundException; +import ru.entaxy.platform.integration.applications.exceptions.StorageException; +import ru.entaxy.platform.integration.applications.management.ApplicationsMBean; +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject; +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObjectService; + +@Component( + service = {DynamicMBean.class, MBeanRegistration.class, ApplicationsMBean.class}, + property = {ManagementCore.JMX_OBJECTNAME + "=" + ApplicationsMBean.Q_MAIN_MODULE_S}, + scope = ServiceScope.SINGLETON, + immediate = true +) +public class ApplicationsMBeanImpl extends AnnotatedMBean implements ApplicationsMBean { + + public static final String EXPRESSION_PREFIX = "${"; + public static final String EXPRESSION_PREFIX_WITH_UNDERLINES = "$__{"; + + @Reference(cardinality = ReferenceCardinality.MANDATORY) + public ApplicationManager applicationManager; + + @Reference(cardinality = ReferenceCardinality.MANDATORY) + EntaxyRuntimeObjectService entaxyRuntimeObjectService; + + @Reference(cardinality = ReferenceCardinality.MANDATORY) + EntaxyResourceService entaxyResourceService; + + public ApplicationsMBeanImpl() throws NotCompliantMBeanException { + super(ApplicationsMBean.class); + } + + @Override + public String readAsTree() { + final String TITLE = "title"; + final String CHILDREN = "children"; + + List> applicationStorages = new ArrayList<>(); + applicationManager.getActiveStorages().forEach(storage -> { + + Map applicationStorage = new HashMap<>(); + applicationStorage.put(TITLE, storage.getName()); + applicationStorage.put(CHILDREN, storage.getApplications().stream().map(application -> { + Map applicationMap = new HashMap<>(); + applicationMap.put(TITLE, application.getName()); + applicationMap.put(CHILDREN, application.getVersions().stream().map(version -> { + Map versionMap = new HashMap<>(); + versionMap.put(TITLE, version.getVersionNumber()); + versionMap.put(CHILDREN, version.getRevisions().stream().map(revision -> { + Map revisionMap = new HashMap<>(); + String revisionTitle = revision.getRevisionNumber() + + " [" + revision.getStatus().toString() + "]"; + revisionMap.put(TITLE, revisionTitle); + return revisionMap; + }).collect(Collectors.toList())); + return versionMap; + }).collect(Collectors.toList())); + return applicationMap; + }).collect(Collectors.toList())); + + applicationStorages.add(applicationStorage); + }); + + return JSONUtils.GSON.toJson(applicationStorages); + } + + @Override + public void importFromRepository(String storage, String mavenUrl) throws Exception { + applicationManager.importApplicationFromRepository(storage, mavenUrl); + } + + @Override + public void importFromBase64String(String storage, String fileContentBase64) throws Exception { + byte[] byteArray = Base64.getDecoder().decode(fileContentBase64); + + Path temp; + try { + temp = Files.createTempFile("TEMP", null); + } catch (IOException e) { + throw e; + } + + File tempFile = temp.toFile().getAbsoluteFile(); + tempFile.getParentFile().mkdirs(); + + try (FileOutputStream fileOutputStream = new FileOutputStream(tempFile)) { + fileOutputStream.write(byteArray); + + importFromFile(storage, tempFile.getPath()); + } catch (RuntimeException e) { + throw e; + } finally { + FileUtils.deleteQuietly(tempFile); + } + } + + private void importFromFile(String storage, String filePath) throws ApplicationException, StorageException { + applicationManager.importApplicationFromFile(storage, filePath); + } + + @Override + public void removeApplication(String storage, String applicationName) throws Exception { + EntaxyApplication application = getApplication(storage, applicationName); + List versions = application.getVersions(); + for (EntaxyApplicationVersion version : versions) { + checkNotInstalled(application, version); + } + + applicationManager.getStorage(storage).removeApplication(application); + } + + @Override + public List> listApplicationItems(String storage, + String applicationName, + String applicationVersion) { + return getApplicationVersion(storage, applicationName, applicationVersion).getLastRevision() + .getItems().stream().map(item -> { + Map itemMap = new HashMap<>(); + itemMap.put("id", item.getId()); + itemMap.put("type", item.getType().toString()); + itemMap.put("revisionable", item.isRevisionable()); + itemMap.put("editable", item.isEditable()); + return itemMap; + }).collect(Collectors.toList()); + } + + @Override + public List> listApplicationRequirements(String storage, + String applicationName, + String applicationVersion) { + return getApplicationVersion(storage, applicationName, applicationVersion).getLastRevision() + .getDescriptor().getRequirements().stream().map(requirement -> { + Map requirementMap = new HashMap<>(); + requirementMap.put("id", requirement.getId()); + requirementMap.put("type", requirement.getType().toString()); + requirementMap.put("scope", requirement.getScope().toString()); + requirementMap.put("status", checkRequirement(requirement)); + return requirementMap; + }).collect(Collectors.toList()); + } + + // copied from application-shell + private boolean checkRequirement(ApplicationRequirement requirement) { + switch (requirement.type) { + case OBJECT: + EntaxyRuntimeObject runtimeObject = entaxyRuntimeObjectService.getRuntimeObject(requirement.id); + return runtimeObject != null && !runtimeObject.isGhost(); + case RESOURCE: + EntaxyResource entaxyResource = entaxyResourceService.getResource(requirement.id); + return entaxyResource.exists(); + case BUNDLE: + case CONFIG: + // TODO implement + return true; + default: + return true; + } + } + + @Override + public Map readApplicationVersionLastAndInstalledRevision(String storage, + String applicationName, + String applicationVersion) { + EntaxyApplicationVersion version = getApplicationVersion(storage, applicationName, applicationVersion); + Map revisions = new HashMap<>(2); + revisions.put("lastRevision", String.valueOf(version.getLastRevision().getRevisionNumber())); + revisions.put("installedRevision", getInstalledRevisionValue(version)); + return revisions; + } + + protected final static String APP_NAMESPACE = "entaxy.application"; + + @Reference + FeaturesService featuresService; + + // copied from application-shell + protected String getInstalledRevisionValue(EntaxyApplicationVersion version) { + try { + List helpers = Arrays.asList(featuresService.listInstalledFeatures()).stream() + .map(f -> new FeatureCapabilityHelper(f)) + .filter(h -> h.isCapabilityProvided(APP_NAMESPACE)) + .collect(Collectors.toList()); + + for (FeatureCapabilityHelper helper : helpers) { + List descriptors = helper.getProvidedCapabilities(APP_NAMESPACE); + for (CapabilityDescriptor descriptor : descriptors) { + String nameValue = descriptor.getAttributes() + .getOrDefault("name", "").toString(); + String versionValue = descriptor.getAttributes() + .getOrDefault("version", "").toString(); + if (version.getApplication().getName().equals(nameValue) + && version.getVersionNumber().equals(versionValue)) { + String revision = descriptor.getAttributes() + .getOrDefault("revision", "").toString(); + if (CommonUtils.isValid(revision)) + return revision; + } + } + } + } catch (Exception ignore) { + // NOOP +// ignore.printStackTrace(); + } + return "-"; + } + + @Override + public List readApplicationItemTypes() { + return Arrays.stream(EntaxyApplication.ITEM_TYPE.values()) + .map(itemType -> itemType.toString()).collect(Collectors.toList()); + } + + @Override + public List readApplicationItemScopes() { + return Arrays.stream(EntaxyApplication.ITEM_SCOPE.values()) + .map(scope -> scope.toString()).collect(Collectors.toList()); + } + + @Override + public void removeVersion(String storage, String applicationName, String versionToRemove) throws ApplicationVersionHasInstalledException { + EntaxyApplication application = getApplication(storage, applicationName); + EntaxyApplicationVersion version = application.getVersion(versionToRemove); + checkNotInstalled(application, version); + + application.removeVersion(versionToRemove); + } + + protected void checkNotInstalled(EntaxyApplication application, EntaxyApplicationVersion version) + throws ApplicationVersionHasInstalledException { + List revisions = version.getRevisions(); + for (EntaxyApplicationRevision revision : revisions) { + if(EntaxyApplicationRevision.REVISION_STATUS.INSTALLED.equals(revision.getStatus())) { + throw new ApplicationVersionHasInstalledException(application.getName(), version.getVersionNumber()); + } + } + } + + @Override + public void createRevision(String storage, + String applicationName, + String applicationVersion, + int prototypeRevision) throws Exception { + if (prototypeRevision > -1) { + getApplicationVersion(storage, applicationName, applicationVersion).createRevision(prototypeRevision); + } else { + getApplicationVersion(storage, applicationName, applicationVersion).createRevision(); + } + } + + @Override + public void configureRevision(String storage, + String applicationName, + String applicationVersion, + String applicationVersionRevision) throws Exception { + getApplicationRevision(storage, applicationName, applicationVersion, applicationVersionRevision).configure(); + } + + @Override + public void deployRevision(String storage, + String applicationName, + String applicationVersion, + String applicationVersionRevision) throws Exception { + getApplicationRevision(storage, applicationName, applicationVersion, applicationVersionRevision).deploy(); + } + + @Override + public void installRevision(String storage, + String applicationName, + String applicationVersion, + String applicationVersionRevision) throws Exception { + getApplicationRevision(storage, applicationName, applicationVersion, applicationVersionRevision).install(); + } + + @Override + public void uninstallRevision(String storage, + String applicationName, + String applicationVersion, + String applicationVersionRevision) throws Exception { + getApplicationRevision(storage, applicationName, applicationVersion, applicationVersionRevision).uninstall(); + } + + @Override + public String readRevisionStatus(String storage, + String applicationName, + String applicationVersion, + String applicationVersionRevision) throws Exception { + return getApplicationRevision(storage, applicationName, applicationVersion, applicationVersionRevision) + .getStatus().toString(); + } + + @Override + public List> listRevisionConfigurations(String storage, + String applicationName, + String applicationVersion, + String applicationVersionRevision) throws Exception { + return getApplicationRevision(storage, applicationName, applicationVersion, applicationVersionRevision) + .getItems().stream() + .filter(item -> EntaxyApplication.ITEM_TYPE.CONFIG.equals(item.getType())) + .map(item -> { + Map itemMap = new HashMap<>(); + itemMap.put("id", item.getId()); + itemMap.put("location", item.getLocation()); + return itemMap; + }).collect(Collectors.toList()); + } + + @Override + public Map readRevisionConfiguration(String storage, + String applicationName, + String applicationVersion, + String applicationVersionRevision, + String configId) throws Exception { + + ApplicationItem configItem = getConfigItem(storage, applicationName, applicationVersion, + applicationVersionRevision, configId); + + ObjectConfigEditor editor = getEditor(configId, configItem); + + List> fields = new ArrayList<>(); + + String configuredType = null; + String configuredId = null; + + try { + for (String name : editor.getPropertiesNames()) { + ObjectConfigEditor.ConfigProperty property = editor.getAsConfigProperty(name); + + if (!property.hint.isInternal()) { + Map field = new HashMap<>(); + + field.put("name", name); + field.put("displayName", property.hint.getDisplayName()); + field.put("type", property.hint.getType()); + field.put("importedValue", property.configValue); + field.put("localValue", property.currentValue); + + fields.add(field); + } else { + if ("__entaxy_configuredId".equals(name)) { + configuredId = property.configValue.toString(); + } else if ("__entaxy_configuredType".equals(name)) { + configuredType = property.configValue.toString(); + } + } + } + } catch (Exception e) { + throw e; + } finally { + editor.clear(); + } + + Map configuration = new HashMap<>(); + configuration.put("id", configuredId); + configuration.put("type", configuredType); + configuration.put("fields", fields); + + return configuration; + } + + @Override + public void fillInRevisionConfigurationWithLocalValues(String storage, + String applicationName, + String applicationVersion, + String applicationVersionRevision, + String configId) throws Exception { + + ApplicationItem configItem = getConfigItem(storage, applicationName, applicationVersion, + applicationVersionRevision, configId); + + ObjectConfigEditor editor = getEditor(configId, configItem); + + InputStream is = null; + try { + for (String propertyName : editor.getPropertiesNames()) { + ObjectConfigEditor.ConfigProperty property = editor.getAsConfigProperty(propertyName); + + if (property.currentValue != null) { + editor.setValue(propertyName, property.currentValue.toString()); + } else { + throw new RuntimeException("Cannot set local values to configuration [" + configId + "]"); + } + } + + editor.save(); + + is = new FileInputStream(editor.getConfigFile()); + configItem.update(is); + } catch (Exception e) { + throw e; + } finally { + editor.clear(); + if (is != null) { + is.close(); + } + } + } + + @Override + public void saveRevisionConfiguration(String storage, + String applicationName, + String applicationVersion, + String applicationVersionRevision, + String configId, + Map properties) throws Exception { + + ApplicationItem configItem = getConfigItem(storage, applicationName, applicationVersion, + applicationVersionRevision, configId); + + ObjectConfigEditor editor = getEditor(configId, configItem); + + InputStream is = null; + try { + for (String propertyName : properties.keySet()) { + ObjectConfigEditor.ConfigProperty property = editor.getAsConfigProperty(propertyName); + + if (property == null) { + throw new RuntimeException("Property [" + propertyName + "] is not found"); + } + + Object propertyValue = properties.get(propertyName); + + if (propertyValue instanceof String && ((String) propertyValue).contains(EXPRESSION_PREFIX)) { + propertyValue = ((String) propertyValue).replace(EXPRESSION_PREFIX, EXPRESSION_PREFIX_WITH_UNDERLINES); + } + + editor.setValue(propertyName, propertyValue == null ? "" : propertyValue.toString()); + } + + editor.save(); + + is = new FileInputStream(editor.getConfigFile()); + configItem.update(is); + } catch (Exception e) { + throw e; + } finally { + editor.clear(); + if (is != null) { + is.close(); + } + } + } + + private ApplicationItem getConfigItem(String storage, + String applicationName, + String applicationVersion, + String applicationVersionRevision, + String configId) throws Exception { + Optional configItemOpt = + getApplicationRevision(storage, applicationName, applicationVersion, applicationVersionRevision) + .getItems().stream().filter(item -> + EntaxyApplication.ITEM_TYPE.CONFIG.equals(item.getType()) && + configId.equals(item.getId())).findFirst(); + if (configItemOpt.isEmpty()) { + throw new ItemNotFoundException(applicationName, applicationVersion, configId); + } + + return configItemOpt.get(); + } + + private ObjectConfigEditor getEditor(String configId, ApplicationItem configItem) throws Exception { + + Path temp = Files.createTempFile(configId, null); + File tempFile = temp.toFile().getAbsoluteFile(); + tempFile.getParentFile().mkdirs(); + + ObjectConfigEditor editor; + try (InputStream is = configItem.getInputStream()) { + Files.copy(is, tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING); + + editor = ObjectConfigEditor.create(tempFile); + editor.loadCurrent(configItem.getId()); + editor.setPid(configId); + } catch (Exception e) { + FileUtils.deleteQuietly(tempFile); + throw e; + } + + return editor; + } + + private EntaxyApplication getApplication(String storage, String applicationName) { + return applicationManager.getStorage(storage).getApplication(applicationName); + } + + private EntaxyApplicationVersion getApplicationVersion(String storage, + String applicationName, + String applicationVersion) { + return getApplication(storage, applicationName).getVersion(applicationVersion); + } + + private EntaxyApplicationRevision getApplicationRevision(String storage, + String applicationName, + String applicationVersion, + String applicationVersionRevision) throws Exception { + return getApplicationVersion(storage, applicationName, applicationVersion) + .getRevision(applicationVersionRevision); + } +} diff --git a/platform/integration/applications/application-management/src/main/java/ru/entaxy/platform/integration/applications/management/impl/ProjectsMBeanImpl.java b/platform/integration/applications/application-management/src/main/java/ru/entaxy/platform/integration/applications/management/impl/ProjectsMBeanImpl.java new file mode 100644 index 00000000..0cfe5309 --- /dev/null +++ b/platform/integration/applications/application-management/src/main/java/ru/entaxy/platform/integration/applications/management/impl/ProjectsMBeanImpl.java @@ -0,0 +1,505 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-management + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.management.impl; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Base64; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import javax.management.DynamicMBean; +import javax.management.MBeanRegistration; +import javax.management.NotCompliantMBeanException; +import javax.ws.rs.NotFoundException; + +import org.apache.commons.io.IOUtils; +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.ServiceScope; + +import ru.entaxy.esb.platform.base.management.core.ManagementCore; +import ru.entaxy.esb.platform.base.management.core.api.AnnotatedMBean; +import ru.entaxy.esb.resources.EntaxyResource; +import ru.entaxy.esb.resources.EntaxyResourceService; +import ru.entaxy.platform.base.objects.EntaxyObject; +import ru.entaxy.platform.base.support.CommonUtils; +import ru.entaxy.platform.base.support.JSONUtils; +import ru.entaxy.platform.core.artifact.service.ArtifactService; +import ru.entaxy.platform.integration.applications.ApplicationManager; +import ru.entaxy.platform.integration.applications.ApplicationProjectItem; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProjectVersion; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationRequirement; +import ru.entaxy.platform.integration.applications.impl.ServiceHelper; +import ru.entaxy.platform.integration.applications.impl.project.ApplicationProjectItemImpl; +import ru.entaxy.platform.integration.applications.item.project.EntaxyObjectItem; +import ru.entaxy.platform.integration.applications.management.ProjectsMBean; +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject; +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObjectService; + +@Component( + service = {DynamicMBean.class, MBeanRegistration.class, ProjectsMBean.class}, + property = {ManagementCore.JMX_OBJECTNAME + "=" + ProjectsMBean.Q_MAIN_MODULE_S}, + scope = ServiceScope.SINGLETON, + immediate = true +) +public class ProjectsMBeanImpl extends AnnotatedMBean implements ProjectsMBean { + + @Reference(cardinality = ReferenceCardinality.MANDATORY) + public ApplicationManager applicationManager; + + @Reference(cardinality = ReferenceCardinality.MANDATORY) + EntaxyRuntimeObjectService entaxyRuntimeObjectService; + + @Reference(cardinality = ReferenceCardinality.MANDATORY) + EntaxyResourceService entaxyResourceService; + + @Reference(cardinality = ReferenceCardinality.MANDATORY) + ArtifactService artifactService; + + public ProjectsMBeanImpl() throws NotCompliantMBeanException { + super(ProjectsMBean.class); + } + + @Override + public String readAsTree() { + final String TITLE = "title"; + final String CHILDREN = "children"; + + List> projectStorages = new ArrayList<>(); + applicationManager.getActiveStorages().forEach(storage -> { + + Map projectStorage = new HashMap<>(); + projectStorage.put(TITLE, storage.getName()); + projectStorage.put(CHILDREN, storage.getProjects().stream().map(project -> { + Map projectMap = new HashMap<>(); + projectMap.put(TITLE, project.getName()); + projectMap.put(CHILDREN, project.getVersions().stream().map(version -> { + Map versionMap = new HashMap<>(); + versionMap.put(TITLE, version.getVersionNumber()); + + if (version.isBuildAvailable()) { + Map buildInfo = new HashMap<>(1); + List> buildInfoList = new ArrayList<>(1); + buildInfo.put(TITLE, "build info"); + buildInfoList.add(buildInfo); + versionMap.put(CHILDREN, buildInfoList); + } + return versionMap; + }).collect(Collectors.toList())); + return projectMap; + }).collect(Collectors.toList())); + + projectStorages.add(projectStorage); + }); + + return JSONUtils.GSON.toJson(projectStorages); + } + + @Override + public List> listProjectItems(String storage, String projectName, String projectVersion) { + + return getProjectVersion(storage, projectName, projectVersion) + .getItems().stream().map(item -> { + checkState(item); + Map itemMap = new HashMap<>(); + itemMap.put("status", getStatus(item)); + itemMap.put("id", item.getId()); + itemMap.put("type", item.getType().toString()); + itemMap.put("scope", item.getScope().toString()); + itemMap.put("required", item.isRequired()); + itemMap.put("ignored", item.isIgnored()); + itemMap.put("deleted", item.isDeleted()); + if (EntaxyApplication.ITEM_TYPE.OBJECT.equals(item.getType()) && !item.isDeleted()) { + itemMap.put("displayName", ((EntaxyObjectItem) item).getObject().getDisplayName()); + itemMap.put("runtimeType", ((EntaxyObjectItem) item).getObject().getType()); + } + return itemMap; + }).collect(Collectors.toList()); + } + + private void checkState(ApplicationProjectItem item) { + switch (item.getType()) { + case CONFIG: + case OBJECT: + EntaxyRuntimeObject runtimeObject = ServiceHelper.getInstance().getEntaxyRuntimeObjectService() + .getRuntimeObject(item.getId()); + if (runtimeObject == null) + ((ApplicationProjectItemImpl)item).setDeleted(true); + break; + + case RESOURCE: + EntaxyResource entaxyResource = + ServiceHelper.getInstance().getEntaxyResourceService().getResource(item.getId()); + if (entaxyResource == null || !entaxyResource.exists()) + ((ApplicationProjectItemImpl)item).setDeleted(true); + break; + + default: + break; + } + } + + private enum STATUS { + INCLUDED, + IGNORED, + REQUIRED, + GHOST, + DELETED + } + + @Override + public List readProjectItemStatuses() { + return Arrays.stream(STATUS.values()).map(status -> status.toString()).collect(Collectors.toList()); + } + + // copied from application-shell + private String getStatus(ApplicationProjectItem item) { + if (item.isDeleted()) { + return STATUS.DELETED.toString(); + } + String status = STATUS.INCLUDED.toString(); + if (item.isGhost()) { + status = STATUS.GHOST.toString(); + } + if (item.isRequired()) { + if (item.isIgnored()) { + status = STATUS.IGNORED.toString(); + } else { + status = STATUS.REQUIRED.toString(); + } + } + return status; + } + + @Override + public void createProject(String projectName, String storage, String initialVersion) throws Exception { + String version = CommonUtils.isValid(initialVersion) ? initialVersion : "1.0.0"; + applicationManager.createProject(storage, projectName, version); + } + + @Override + public void removeProject(String storage, String projectName) throws Exception { + applicationManager.getStorage(storage).removeProject(getProject(storage, projectName)); + } + + @Override + public List> addObject(String storage, String projectName, String projectVersion, String objectId) { + EntaxyRuntimeObject object = entaxyRuntimeObjectService.getRuntimeObject(objectId); + + getProjectVersion(storage, projectName, projectVersion) + .addObject(object); + + return getRelatedObjects(object); + } + + @Override + public List> listObjects() { + return entaxyRuntimeObjectService.getObjects().stream().map(object -> { + return objectIntoMap(object); + }).collect(Collectors.toList()); + } + + @Override + public List> getRelatedObjects(String objectId) { + EntaxyRuntimeObject object = entaxyRuntimeObjectService.getRuntimeObject(objectId); + return getRelatedObjects(object); + } + + private List> getRelatedObjects(EntaxyRuntimeObject object) { + return object.getSubordRelations().stream().filter(relation -> { + return EntaxyObject.OBJECT_RELATION.AGGREGATION.equals(relation.getType()) && + !relation.getTarget().isColocatedWith(object); + }).map(relation -> { + EntaxyRuntimeObject relatedObject = relation.getTarget(); + return objectIntoMap(relatedObject); + }).collect(Collectors.toList()); + } + + private Map objectIntoMap(EntaxyRuntimeObject object) { + Map objectMap = new HashMap<>(); + objectMap.put("fullId", object.getObjectFullId()); + objectMap.put("displayName", object.getDisplayName()); + objectMap.put("type", object.getType()); + return objectMap; + } + + @Override + public void addResource(String storage, String projectName, String projectVersion, + String location) throws Exception { + addResource( + getProjectVersion(storage, projectName, projectVersion), + entaxyResourceService.getResource(location)); + } + + private void addResource(EntaxyApplicationProjectVersion version, EntaxyResource resource) + throws NotFoundException { + if (resource != null) { + if (resource.isFolder()) { + for(EntaxyResource res : entaxyResourceService.getResources(resource.getURL())) { + addResource(version, res); + } + } else { + version.addResource(resource); + } + } else { + throw new NotFoundException("Cannot find the resource located at " + resource.getURL()); + } + } + + @Override + public void addItem(String storage, String projectName, String projectVersion, String itemId) throws Exception { + ApplicationProjectItem projectItem = getProjectItem(storage, projectName, projectVersion, itemId); + if (projectItem != null) { + getProjectVersion(storage, projectName, projectVersion).addItem(projectItem); + } + } + + @Override + public void ignoreItem(String storage, String projectName, String projectVersion, String itemId) throws Exception { + ApplicationProjectItem projectItem = getProjectItem(storage, projectName, projectVersion, itemId); + if (projectItem != null) { + getProjectVersion(storage, projectName, projectVersion).ignoreItem(projectItem); + } + } + + @Override + public void removeItem(String storage, String projectName, String projectVersion, String itemId) throws Exception { + ApplicationProjectItem projectItem = getProjectItem(storage, projectName, projectVersion, itemId); + if (projectItem != null) { + getProjectVersion(storage, projectName, projectVersion).removeItem(projectItem); + } + } + + @Override + public Map> removeItems(String storage, String projectName, String projectVersion, List itemIds) + throws Exception { + EntaxyApplicationProjectVersion version = getProjectVersion(storage, projectName, projectVersion); + + List items = version.getItems().stream() + .filter(item -> itemIds.contains(item.getId())).collect(Collectors.toList()); + + List itemsToRemove = new ArrayList<>(); + Map> itemsImpossibleToRemove = new HashMap<>(); + + for (ApplicationProjectItem item : items) { + List requiredBy = item.getRequiredBy(); + if (requiredBy.isEmpty()) { + itemsToRemove.add(item); + } else { + List requiredLeft = requiredBy.stream() + .filter(requiredByItem -> !itemIds.contains(requiredByItem.getId())) + .collect(Collectors.toList()); + if (requiredLeft.isEmpty()) { + itemsToRemove.add(item); + } else { + itemsImpossibleToRemove.put(item, requiredLeft); + } + } + } + + List itemIdsToRemove = itemsToRemove.stream() + .map(itemToRemove -> itemToRemove.getId()).collect(Collectors.toList()); + + do { + for (ApplicationProjectItem itemToRemove : itemsToRemove) { + version.removeItem(itemToRemove); + } + itemsToRemove = version.getItems().stream() + .filter(item -> itemIdsToRemove.contains(item.getId())).collect(Collectors.toList()); + } while (itemsToRemove.size() > 0); + + if (itemsImpossibleToRemove.size() > 0) { + Map> result = new HashMap<>(); + for (ApplicationProjectItem itemToRemove : itemsImpossibleToRemove.keySet()) { + if (itemIds.contains(itemToRemove.getId())) { + version.removeItem(itemToRemove); + } + result.put(getIdOrDisplayName(itemToRemove), + itemsImpossibleToRemove.get(itemToRemove).stream() + .map(item -> getIdOrDisplayName(item)).collect(Collectors.toList())); + } + return result; + } + + return new HashMap<>(); + } + + private String getIdOrDisplayName(ApplicationProjectItem item) { + String displayName = ""; + if (EntaxyApplication.ITEM_TYPE.OBJECT.equals(item.getType())) { + displayName = ((EntaxyObjectItem) item).getObject().getDisplayName(); + } + return CommonUtils.isValid(displayName) ? displayName : item.getId(); + } + + @Override + public void createVersion(String storage, String projectName, String createdVersion, String prototypeVersion) + throws Exception { + if (CommonUtils.isValid(prototypeVersion)) { + getProject(storage, projectName).createVersion(createdVersion, prototypeVersion); + } else { + getProject(storage, projectName).createVersion(createdVersion); + } + } + + @Override + public void removeVersion(String storage, String projectName, String versionToRemove) { + getProject(storage, projectName).removeVersion(versionToRemove); + } + + @Override + public void saveProjectVersion(String storage, String projectName, String projectVersion) { + getProjectVersion(storage, projectName, projectVersion).save(); + } + + @Override + public void buildProjectVersion(String storage, String projectName, String projectVersion) throws Exception { + getProjectVersion(storage, projectName, projectVersion).build(); + } + + @Override + public List> listBuiltProjectItems(String storage, String projectName, String projectVersion) { + return getProjectVersion(storage, projectName, projectVersion).getBuildInfo().getItems().stream().map(item -> { + Map itemMap = new HashMap<>(); + itemMap.put("id", item.getId()); + itemMap.put("type", item.getType().toString()); + itemMap.put("component", item.getComponentId()); + return itemMap; + }).collect(Collectors.toList()); + } + + @Override + public List> listBuiltProjectRequirements(String storage, + String projectName, + String projectVersion) { + return getProjectVersion(storage, projectName, projectVersion).getBuildInfo().getRequirements() + .stream().map(requirement -> { + Map requirementMap = new HashMap<>(); + requirementMap.put("id", requirement.getId()); + requirementMap.put("type", requirement.getType().toString()); + requirementMap.put("scope", requirement.getScope().toString()); + requirementMap.put("status", checkRequirement(requirement)); + return requirementMap; + }).collect(Collectors.toList()); + } + + // copied from application-shell + private boolean checkRequirement(ApplicationRequirement requirement) { + switch (requirement.type) { + case OBJECT: + EntaxyRuntimeObject runtimeObject = entaxyRuntimeObjectService.getRuntimeObject(requirement.id); + return runtimeObject != null && !runtimeObject.isGhost(); + case RESOURCE: + EntaxyResource entaxyResource = entaxyResourceService.getResource(requirement.id); + return entaxyResource.exists(); + case BUNDLE: + case CONFIG: + // TODO implement + return true; + default: + return true; + } + } + + @Override + public List> listBuiltProjectComponents(String storage, + String projectName, + String projectVersion) { + return getProjectVersion(storage, projectName, projectVersion).getBuildInfo().getComponents() + .stream().map(component -> { + Map componentMap = new HashMap<>(); + componentMap.put("id", component.getId()); + componentMap.put("type", component.getType().toString()); + componentMap.put("priority", String.valueOf(component.getPriority())); + return componentMap; + }).collect(Collectors.toList()); + } + + @Override + public String readMavenUrl(String storage, String projectName, String projectVersion) { + EntaxyApplicationProjectVersion version = getProjectVersion(storage, projectName, projectVersion); + if (version.isBuildAvailable()) { + return version.getBuildInfo().getMavenUrl(); + } else { + return null; + } + } + + @Override + public List listRepositories() { + return artifactService.getRepositories().stream() + .map(repository -> repository.getName()).collect(Collectors.toList()); + } + + @Override + public void exportToRepository(String storage, String projectName, String projectVersion, String repositoryName) + throws Exception { + applicationManager.exportToRepository(getProjectVersion(storage, projectName, projectVersion), repositoryName); + } + + @Override + public String exportToFile(String storage, String projectName, String projectVersion) throws Exception { + try (InputStream is = getProjectVersion(storage, projectName, projectVersion) + .getBuildUrl().openConnection().getInputStream()) { + return Base64.getEncoder().encodeToString(readFromStream(is)); + } + } + + private byte[] readFromStream(InputStream stream) throws IOException { + try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { + IOUtils.copy(stream, baos); + return baos.toByteArray(); + } catch (IOException e) { + throw e; + } + } + + private EntaxyApplicationProject getProject(String storage, String projectName) { + return applicationManager.getStorage(storage).getProject(projectName); + } + + private EntaxyApplicationProjectVersion getProjectVersion(String storage, + String projectName, + String projectVersion) { + return getProject(storage, projectName).getVersion(projectVersion); + } + + private ApplicationProjectItem getProjectItem( + String storage, String projectName, String projectVersion, String itemId) { + + return getProjectVersion(storage, projectName, projectVersion).getItems() + .stream().filter(item -> item.getId().equals(itemId)).findFirst().orElse(null); + } +} diff --git a/platform/integration/applications/application-shell/LICENSE.txt b/platform/integration/applications/application-shell/LICENSE.txt new file mode 100644 index 00000000..4ae94b75 --- /dev/null +++ b/platform/integration/applications/application-shell/LICENSE.txt @@ -0,0 +1,175 @@ + ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ + +Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой) +версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего +Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН +7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова, +д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу +https://www.emdev.ru/about (далее - Компания). + +Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями» +(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения, +Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в +настоящем документе, в противном случае, он должен не использовать или не получать доступ +к Программному обеспечению. + + 1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ + +a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии +или редакции, исключительные права на которую принадлежат Правообладателю. +b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные +права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ +для ЭВМ № 2021610848 от 19.01.2021 года. +c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта +https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО. +d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также +личные неимущественные права авторов произведений на результат интеллектуальной деятельности. +e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование +ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка +включает предоставление Пользователю неисключительного права использования ПО, в том числе +получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение +патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается +Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается +для каждого Пользователя индивидуально в Сертификате. +f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром), +подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное +обеспечение в ограниченном объёме и на определённый период времени. +g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО, +предоставленных Пользователю согласно условиям Подписки. +h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного +обеспечения. +i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий +из одного или нескольких файлов, который может быть прочтён человеком. +j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля +программы, полученный в результате обработки исходного кода, еще не связанный в полную программу. +Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый +продукт. +k) Некоммерческое использование – индивидуальное личное использование Пользователем программного +обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации +возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая +выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения. + + 2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ + +2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного +обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом +воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения +в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ. +2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит +неисключительный характер. +2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию, +лицензия на ограниченное использование Программного обеспечения. +2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования +имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан +обратиться в службу поддержки Правообладателя по адресу: https://entaxy.ru/ для изменения +вида лицензии с Базовой бесплатной версии на Подписки. +2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для +пробного использования программного обеспечения – не ограничен. +2.6. Использование Пользователем настоящего программного обеспечения в целях разработки, +модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю, +без разрешения Правообладателя не допускается. + + 3. АВТОРСКОЕ ПРАВО. + +3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение +и любые его копии принадлежат Правообладателю. +3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента, +к которому можно получить доступ с помощью Программного обеспечения, является собственностью +соответствующего владельца контента и защищается применимым законодательством об авторском +праве или другими законами и договорами об интеллектуальной собственности. +3.3. Условия использования Программного обеспечения. +Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь +придерживается следующих условий: +3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять +какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании +Программного обеспечения или на нем. +3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать, +расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать +Программное обеспечение. +3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования +ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне. +3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено +использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам. + + 4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС» + +4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю +на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с +использованием Пользователем: +4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в +Программное обеспечение; +4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями +настоящего соглашения; +4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием, +или данными, не предоставленными Пользователю Правообладателем; +4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем. + + +5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ +ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ +И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ +ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ +И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ +ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО. + + 6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ. +НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ +ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ, +ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ; +ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ. +ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ +ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ; +КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ +ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ. + + 7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ: +Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия +(включая, но не ограничиваясь) по: +-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код) + Программного обеспечения; +-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный +код Программного обеспечения, за исключением тех изменений, которые вносятся средствами, +включёнными в Программное обеспечение и описанными непосредственно в документации к нему; +-созданию условий для использования Программного обеспечения лицами, не имеющими прав на +использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство +третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа +к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку; +-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию). + + 8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА. + +8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из +лицензионных продуктов, используемых на законных основаниях, а +именно https://entaxy.ru/libs/licenses/root-aggregated.deps. +8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть +совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения. +8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться +Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения, +содержащих все изменения и дополнения программного обеспечения. + + 9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ. + +9.1. Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым +программным обеспечением. +9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно +с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм +«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public. +9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий +пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя, +прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер +ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства +Российской Федерации. + + 10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ. + +10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет +право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб, +недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий +пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере +2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения +исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy). +10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое +законодательство – Российской Федерации. +10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным, +остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать +исполнять свои обязанности в соответствии с этими положениями. diff --git a/platform/integration/applications/application-shell/pom.xml b/platform/integration/applications/application-shell/pom.xml new file mode 100644 index 00000000..cff0e896 --- /dev/null +++ b/platform/integration/applications/application-shell/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + ru.entaxy.platform.integration + applications + 1.11.0 + + ru.entaxy.platform.integration.applications + application-shell + bundle + ENTAXY :: PLATFORM :: INTEGRATION :: APPLICATIONS :: SHELL + ENTAXY :: PLATFORM :: INTEGRATION :: APPLICATIONS :: SHELL + + + none + + ru.entaxy.platform.integration.applications.shell* + + + + + + org.apache.karaf.shell + org.apache.karaf.shell.core + ${karaf.version} + + + ru.entaxy.esb.platform.runtime.base + base-support + ${project.version} + + + ru.entaxy.platform.integration.applications + application-api + ${project.version} + + + ru.entaxy.esb.platform.runtime.core + object-runtime-core + ${project.version} + + + org.apache.karaf.config + org.apache.karaf.config.core + ${karaf.version} + + + org.apache.felix + org.apache.felix.configadmin + ${felix.configadmin.version} + + + ru.entaxy.esb.platform.runtime.core.objects-implementations.config-implementation + config-runtime + ${project.version} + + + commons-io + commons-io + ${commons-io.version} + + + + diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/ApplicationManagerCommandSupport.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/ApplicationManagerCommandSupport.java new file mode 100644 index 00000000..efe2eaf5 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/ApplicationManagerCommandSupport.java @@ -0,0 +1,41 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell; + +import org.apache.karaf.shell.api.action.Action; +import org.apache.karaf.shell.api.action.lifecycle.Reference; +import org.apache.karaf.shell.api.console.Session; + +import ru.entaxy.platform.integration.applications.ApplicationManager; + +public abstract class ApplicationManagerCommandSupport implements Action { + + @Reference + public ApplicationManager applicationManager; + + @Reference + public Session session; +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/ApplicationShell.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/ApplicationShell.java new file mode 100644 index 00000000..d11abeb2 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/ApplicationShell.java @@ -0,0 +1,122 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell; + +import java.util.function.Function; + +import org.apache.karaf.shell.support.ansi.SimpleAnsi; + +import ru.entaxy.platform.base.support.karaf.shell.ShellTableExt; + +public class ApplicationShell { + + public static final String COMMAND_SCOPE = "entaxy"; + + public static final String COMMAND_APP_NAME_PREFIX = "app-"; + + public static final String COMMAND_PROJECT_NAME_PREFIX = "project-"; + + public static String projectCommandName(String name) { + return COMMAND_PROJECT_NAME_PREFIX.concat("-").concat(name); + } + + public static final String PROJECT_KEY = "ApplicationShell.project"; + + public static final String PROJECT_VERSION_KEY = "ApplicationShell.projectVersion"; + + public static final String APPLICATION_KEY = "ApplicationShell.application"; + + public static final String APPLICATION_VERSION_KEY = "ApplicationShell.applicationVersion"; + + public static final String APPLICATION_REVISION_KEY = "ApplicationShell.applicationRevision"; + + public static final String APPLICATION_CONFIG_KEY = "ApplicationShell.applicationConfig"; + + // Welocme color + public static String WLC = "\u001B[36m"; + // OK color: High Intensity Foreground Color: Green + public static String OKC = SimpleAnsi.COLOR_GREEN; + // WARN color: High Intensity Foreground Color: Yellow + public static String WARNC = SimpleAnsi.COLOR_YELLOW; + // CRITICAL color: High Intensity Foreground Color: Red + public static String CRT = SimpleAnsi.COLOR_RED + SimpleAnsi.INTENSITY_BOLD; + // reset colors + public static String NOR = "\33[0m"; + + public static String COLOR_REQUIRED = CRT; + public static String COLOR_INCLUDED = OKC + SimpleAnsi.INTENSITY_BOLD; + public static String COLOR_IGNORED = SimpleAnsi.COLOR_BLUE + SimpleAnsi.INTENSITY_BOLD; + public static String COLOR_GHOST = WARNC + SimpleAnsi.INTENSITY_BOLD; + + public static String COLOR_GRAY = "\33[38;2;100;100;100m" + SimpleAnsi.INTENSITY_BOLD; + + public static String COLOR_RESET = NOR + SimpleAnsi.INTENSITY_NORMAL; + + public static String colRequired(String data) { + return COLOR_REQUIRED + data + COLOR_RESET; + } + + public static String colIncluded(String data) { + return COLOR_INCLUDED + data + COLOR_RESET; + } + + public static String colIgnored(String data) { + return COLOR_IGNORED + data + COLOR_RESET; + } + + public static String colGhost(String data) { + return COLOR_GHOST + data + COLOR_RESET; + } + + public static Function normalColorProvider = + (str -> SimpleAnsi.RESET + SimpleAnsi.INTENSITY_NORMAL); + + public static Function normalColorProviderExt = + (cellData -> SimpleAnsi.RESET + SimpleAnsi.INTENSITY_NORMAL); + + public static Function itemStatusColorProvider = (str -> { + if ("+".equals(str)) + return COLOR_INCLUDED; + else if ("-".equals(str)) + return COLOR_IGNORED; + else if ("!".equals(str)) + return COLOR_REQUIRED; + else if ("?".equals(str)) + return COLOR_GHOST; + else + return ""; + }); + + public static Function requirementStatusColorProvider = (str -> { + if ("V".equals(str)) + return COLOR_INCLUDED; + else if ("X".equals(str)) + return COLOR_REQUIRED; + else + return ""; + }); + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/FeatureCapabilityHelper.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/FeatureCapabilityHelper.java new file mode 100644 index 00000000..d9073748 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/FeatureCapabilityHelper.java @@ -0,0 +1,69 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell; + +import java.util.List; + +import org.apache.karaf.features.Capability; +import org.apache.karaf.features.Feature; + +import ru.entaxy.platform.base.support.osgi.bundle.CapabilityDescriptorImpl; +import ru.entaxy.platform.base.support.osgi.bundle.CapabilityHelper; + +/** + * @deprecated use {@link ru.entaxy.platform.base.support.osgi.feature.FeatureCapabilityHelper} + * instead + */ +@Deprecated +public class FeatureCapabilityHelper extends CapabilityHelper { + + protected Feature feature; + + public FeatureCapabilityHelper(Feature feature) { + super(); + setMultipleNamespacesSupported(true); + this.feature = feature; + load(); + } + + @Override + protected void load() { + super.load(); + List featureCapabilities = feature.getCapabilities(); + for (Capability c : featureCapabilities) { + String[] caps = c.getValue().split(","); + for (String cap : caps) + try { + CapabilityDescriptorImpl descriptor = parseCapability(cap); + if (descriptor != null) + addProvidedCapability(descriptor); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/StorageAwareCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/StorageAwareCommand.java new file mode 100644 index 00000000..6e9717c3 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/StorageAwareCommand.java @@ -0,0 +1,52 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell; + +import org.apache.karaf.shell.api.action.Argument; +import org.apache.karaf.shell.api.action.Completion; + +import ru.entaxy.platform.integration.applications.ApplicationStorage; +import ru.entaxy.platform.integration.applications.shell.completers.StorageCompleter; + +public abstract class StorageAwareCommand extends ApplicationManagerCommandSupport { + + @Argument(name = "storage", required = true) + @Completion(caseSensitive = false, value = StorageCompleter.class) + public String storage; + + public ApplicationStorage applicationStorage; + + @Override + public Object execute() throws Exception { + applicationStorage = applicationManager.getStorage(storage); + if (applicationStorage == null) + throw new IllegalArgumentException("Storage not found: " + storage); + doExecute(); + return null; + } + + protected abstract void doExecute(); +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/StorageDisableCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/StorageDisableCommand.java new file mode 100644 index 00000000..6548fc41 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/StorageDisableCommand.java @@ -0,0 +1,40 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +@Service +@Command(name = "app-storage-disable", scope = ApplicationShell.COMMAND_SCOPE) +public class StorageDisableCommand extends StorageAwareCommand { + + @Override + protected void doExecute() { + applicationStorage.disable(); + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/StorageEnableCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/StorageEnableCommand.java new file mode 100644 index 00000000..b329cdfc --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/StorageEnableCommand.java @@ -0,0 +1,40 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +@Service +@Command(name = "app-storage-enable", scope = ApplicationShell.COMMAND_SCOPE) +public class StorageEnableCommand extends StorageAwareCommand { + + @Override + protected void doExecute() { + applicationStorage.enable(); + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/StorageListCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/StorageListCommand.java new file mode 100644 index 00000000..807fd8d6 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/StorageListCommand.java @@ -0,0 +1,80 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.Option; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.base.support.karaf.shell.ShellTableFixed; +import ru.entaxy.platform.integration.applications.ApplicationStorage; + +@Service +@Command(name = "app-storage-list", scope = ApplicationShell.COMMAND_SCOPE) +public class StorageListCommand extends ApplicationManagerCommandSupport { + + @Option(name = "-d", aliases = {"--show-disabled"}, required = false, description = "Show disabled storage also") + boolean showDisabled = false; + + @Override + public Object execute() throws Exception { + + List storages = + showDisabled ? applicationManager.getAllStorages() : applicationManager.getActiveStorages(); + + Collections.sort(storages, new Comparator() { + @Override + public int compare(ApplicationStorage o1, ApplicationStorage o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + + ShellTableFixed table = new ShellTableFixed(); + table.column("Name"); + table.column("Type"); + table.column("Enabled"); + table.column("Info"); + + for (ApplicationStorage storage : storages) { + String storageInfo = storage.getInfo().entrySet().stream() + .map(entry -> entry.getKey().concat(": ") + .concat(entry.getValue() == null ? "" : entry.getValue().toString())) + .collect(Collectors.joining("\n")); + table.addRow().addContent(storage.getName(), storage.getType(), storage.isEnabled() ? "*" : "", + storageInfo); + } + + table.print(System.out); + + return null; + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationCheckBundleCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationCheckBundleCommand.java new file mode 100644 index 00000000..f1128958 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationCheckBundleCommand.java @@ -0,0 +1,94 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.application; + +import java.util.List; + +import org.apache.karaf.bundle.core.BundleService; +import org.apache.karaf.features.Feature; +import org.apache.karaf.shell.api.action.Argument; +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.lifecycle.Reference; +import org.apache.karaf.shell.api.action.lifecycle.Service; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; + +import ru.entaxy.platform.base.support.CommonUtils; +import ru.entaxy.platform.base.support.karaf.shell.ShellTableExt; +import ru.entaxy.platform.base.support.osgi.bundle.CapabilityDescriptor; +import ru.entaxy.platform.base.support.osgi.feature.FeatureCapabilityHelper; +import ru.entaxy.platform.base.support.osgi.feature.FeaturesUtils.FeaturesHelper; +import ru.entaxy.platform.integration.applications.shell.ApplicationManagerCommandSupport; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +@Service +@Command(name = "app-bundle-check", scope = ApplicationShell.COMMAND_SCOPE) +public class ApplicationCheckBundleCommand extends ApplicationManagerCommandSupport { + + protected final static String APP_NAMESPACE = "entaxy.application"; + + @Reference + BundleContext bundleContext; + + @Argument(required = true) + long bundleId; + + @Reference + BundleService bundleService; + + @Override + public Object execute() throws Exception { + + Bundle b = bundleContext.getBundle(bundleId); + List features = FeaturesHelper.create(bundleContext).withCapabilityNamespace(APP_NAMESPACE) + .containingBundle(b).installedOnly().find(); + + ShellTableExt shellTable = new ShellTableExt(); + shellTable.column("Application"); + shellTable.column("Version"); + shellTable.column("Revision"); + + for (Feature feature : features) { + FeatureCapabilityHelper capabilityHelper = new FeatureCapabilityHelper(feature); + List descriptors = capabilityHelper.getProvidedCapabilities(APP_NAMESPACE); + for (CapabilityDescriptor descriptor : descriptors) { + String name = descriptor.getAttributes().getOrDefault("name", "").toString(); + if (!CommonUtils.isValid(name)) + continue; + String version = descriptor.getAttributes().getOrDefault("version", "").toString(); + String revision = descriptor.getAttributes().getOrDefault("revision", "").toString(); + + shellTable.addRow().addContent(name, version, revision); + } + } + + // print output + shellTable.print(System.out); + + return null; + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationImportFromFile.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationImportFromFile.java new file mode 100644 index 00000000..54afd4d0 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationImportFromFile.java @@ -0,0 +1,53 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.application; + +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 ru.entaxy.platform.integration.applications.shell.ApplicationShell; +import ru.entaxy.platform.integration.applications.shell.StorageAwareCommand; + +@Service +@Command(name = "app-import-file", scope = ApplicationShell.COMMAND_SCOPE) +public class ApplicationImportFromFile extends StorageAwareCommand { + + @Argument(required = true, index = 1) + String filePath; + + @Override + protected void doExecute() { + try { + applicationManager.importApplicationFromFile(storage, filePath); + } catch (Exception e) { + // print error + System.err.println("ERROR: " + e.getMessage()); + e.printStackTrace(); + } + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationImportFromRepository.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationImportFromRepository.java new file mode 100644 index 00000000..9acd89c2 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationImportFromRepository.java @@ -0,0 +1,53 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.application; + +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 ru.entaxy.platform.integration.applications.shell.ApplicationShell; +import ru.entaxy.platform.integration.applications.shell.StorageAwareCommand; + +@Service +@Command(name = "app-import-repository", scope = ApplicationShell.COMMAND_SCOPE) +public class ApplicationImportFromRepository extends StorageAwareCommand { + + @Argument(required = true, index = 1) + String mavenUrl; + + @Override + protected void doExecute() { + try { + applicationManager.importApplicationFromRepository(storage, mavenUrl); + } catch (Exception e) { + // print error + System.err.println("ERROR: " + e.getMessage()); + e.printStackTrace(); + } + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationListCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationListCommand.java new file mode 100644 index 00000000..1a9b89c3 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationListCommand.java @@ -0,0 +1,137 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.application; + +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.karaf.features.FeaturesService; +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.lifecycle.Reference; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.base.support.CommonUtils; +import ru.entaxy.platform.base.support.karaf.shell.ShellTableFixed; +import ru.entaxy.platform.base.support.osgi.bundle.CapabilityDescriptor; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationVersion; +import ru.entaxy.platform.integration.applications.shell.ApplicationManagerCommandSupport; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; +import ru.entaxy.platform.integration.applications.shell.FeatureCapabilityHelper; + +@Service +@Command(name = "app-list", scope = ApplicationShell.COMMAND_SCOPE) +public class ApplicationListCommand extends ApplicationManagerCommandSupport { + + protected final static String APP_NAMESPACE = "entaxy.application"; + + @Reference + FeaturesService featuresService; + + @Override + public Object execute() throws Exception { + ShellTableFixed table = new ShellTableFixed(); + table.column("Name"); + table.column("Storage"); + table.column("Versions"); + table.column("Last revision").alignCenter(); + table.column("Installed revision").alignCenter(); + + List apps = applicationManager.getApplications(); + Collections.sort(apps, new Comparator() { + + @Override + public int compare(EntaxyApplication o1, EntaxyApplication o2) { + String storage1 = o1.getStorage().getName(); + String storage2 = o2.getStorage().getName(); + if (!storage1.equals(storage2)) + return storage1.compareTo(storage2); + + return o1.getName().compareTo(o2.getName()); + } + + }); + + for (EntaxyApplication app : apps) { + List versions = app.getVersions(); + Collections.sort(versions, new Comparator() { + + @Override + public int compare(EntaxyApplicationVersion o1, EntaxyApplicationVersion o2) { + return o1.compareTo(o2); + } + + }); + String versionsValue = versions.stream().map(v -> v.getVersionNumber()).collect(Collectors.joining("\n")); + String lastRevisionsValue = versions.stream().map(v -> v.getLastRevision().getRevisionNumber() + "") + .collect(Collectors.joining("\n")); + String installedRevisionsValue = versions.stream().map(v -> getInstalledRevisionValue(v)) + .collect(Collectors.joining("\n"));; + + table.addRow().addContent(app.getName(), app.getStorage() == null ? "" : app.getStorage().getName(), + versionsValue, lastRevisionsValue, installedRevisionsValue); + } + + // print output + table.print(System.out); + + return null; + } + + protected String getInstalledRevisionValue(EntaxyApplicationVersion version) { + try { + List helpers = Arrays.asList(featuresService.listInstalledFeatures()).stream() + .map(f -> new FeatureCapabilityHelper(f)) + .filter(h -> h.isCapabilityProvided(APP_NAMESPACE)) + .collect(Collectors.toList()); + + for (FeatureCapabilityHelper helper : helpers) { + List descriptors = helper.getProvidedCapabilities(APP_NAMESPACE); + for (CapabilityDescriptor descriptor : descriptors) { + String nameValue = descriptor.getAttributes().getOrDefault("name", "").toString(); + String versionValue = descriptor.getAttributes().getOrDefault("version", "").toString(); + if (version.getApplication().getName().equals(nameValue) + && version.getVersionNumber().equals(versionValue)) { + String revision = descriptor.getAttributes().getOrDefault("revision", "").toString(); + if (CommonUtils.isValid(revision)) + return revision; + } + + } + + } + + } catch (Exception ignore) { + // NOOP + ignore.printStackTrace(); + } + return ""; + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationManageCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationManageCommand.java new file mode 100644 index 00000000..345217f3 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationManageCommand.java @@ -0,0 +1,114 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.application; + +import org.apache.karaf.shell.api.action.Argument; +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.Completion; +import org.apache.karaf.shell.api.action.Option; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.integration.applications.ApplicationStorage; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationVersion; +import ru.entaxy.platform.integration.applications.shell.ApplicationManagerCommandSupport; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; +import ru.entaxy.platform.integration.applications.shell.completers.ApplicationCompleter; + +@Service +@Command(name = "app-manage", scope = ApplicationShell.COMMAND_SCOPE) +public class ApplicationManageCommand extends ApplicationManagerCommandSupport { + + @Argument + @Completion(value = ApplicationCompleter.class) + String application; + + @Option(name = "-f", aliases = {"--force-cancel"}) + boolean forceCancel = false; + + @Override + public Object execute() throws Exception { + if (session.get(ApplicationShell.APPLICATION_KEY) != null) { + if (forceCancel) { + try { + EntaxyApplicationVersion version = + (EntaxyApplicationVersion) session.get(ApplicationShell.APPLICATION_VERSION_KEY); + } catch (Exception ignore) { + + } + try { + EntaxyApplication application = + (EntaxyApplication) session.get(ApplicationShell.APPLICATION_KEY); + } catch (Exception ignore) { + + } + session.put(ApplicationShell.APPLICATION_KEY, null); + session.put(ApplicationShell.APPLICATION_VERSION_KEY, null); + } else { + // print error + System.err.println("Other application is being managed, please commit or cancel"); + return null; + } + } + + String[] data = application.split("@"); + + if (data.length < 2) { + // print error + System.err.println("Incorrect application specified"); + return null; + } + + String storageName = data[1]; + ApplicationStorage storage = applicationManager.getStorage(storageName); + if (storage == null) { + // print error + System.err.println("Incorrect storage specified: [" + storageName + "]"); + return null; + } + + if (!storage.isEnabled()) { + // print error + System.err.println("Storage is disabled: [" + storageName + "]"); + return null; + } + + String appName = data[0]; + EntaxyApplication app = storage.getApplication(appName); + if (app == null) { + // print error + System.err.println(String.format("Application [%s] not found in storage [%s]", appName, storageName)); + return null; + } + + session.put(ApplicationShell.APPLICATION_KEY, app); + session.put(ApplicationShell.APPLICATION_VERSION_KEY, null); + session.put(ApplicationShell.APPLICATION_REVISION_KEY, null); + + return null; + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationRemoveCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationRemoveCommand.java new file mode 100644 index 00000000..528dcf49 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationRemoveCommand.java @@ -0,0 +1,61 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.application; + +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 ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.exceptions.ProjectNotFoundException; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; +import ru.entaxy.platform.integration.applications.shell.StorageAwareCommand; + +@Service +@Command(name = "app-remove", scope = ApplicationShell.COMMAND_SCOPE) +public class ApplicationRemoveCommand extends StorageAwareCommand { + + @Argument(name = "applicationName", required = true, index = 1) + String applicationName; + + @Override + protected void doExecute() { + try { + EntaxyApplication app = applicationStorage.getApplication(applicationName); + if (app != null) { + applicationStorage.removeApplication(app); + System.out.println("Removed successfully"); + } else { + throw new ProjectNotFoundException(applicationName); + } + } catch (Exception e) { + // output error + System.err.println("ERROR: " + e.getMessage()); + e.printStackTrace(); + } + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationVersionManageCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationVersionManageCommand.java new file mode 100644 index 00000000..afe846bf --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationVersionManageCommand.java @@ -0,0 +1,57 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.application; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationVersion; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +@Service +@Command(name = "app-version-manage", scope = ApplicationShell.COMMAND_SCOPE) +public class ApplicationVersionManageCommand extends ApplicationVersionSupport { + + @Override + protected void doExecute(EntaxyApplication application) { + if (session.get(ApplicationShell.APPLICATION_VERSION_KEY) != null) { + // print error + System.err.println("Another version is being managed, please cancel or commit"); + return; + } + + EntaxyApplicationVersion version = application.getVersion(versionNumber); + if (version == null) { + System.err.println("Version not found"); + return; + } + + session.put(ApplicationShell.APPLICATION_VERSION_KEY, version); + + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationVersionRemoveCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationVersionRemoveCommand.java new file mode 100644 index 00000000..128c2c7a --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationVersionRemoveCommand.java @@ -0,0 +1,43 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.application; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +@Service +@Command(name = "app-version-remove", scope = ApplicationShell.COMMAND_SCOPE) +public class ApplicationVersionRemoveCommand extends ApplicationVersionSupport { + + @Override + protected void doExecute(EntaxyApplication application) { + application.removeVersion(versionNumber); + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationVersionSupport.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationVersionSupport.java new file mode 100644 index 00000000..c8eb7680 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ApplicationVersionSupport.java @@ -0,0 +1,39 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.application; + +import org.apache.karaf.shell.api.action.Argument; +import org.apache.karaf.shell.api.action.Completion; + +import ru.entaxy.platform.integration.applications.shell.completers.ApplicationVersionCompleter; + +public abstract class ApplicationVersionSupport extends ManagedApplicationCommand { + + @Argument(required = true) + @Completion(value = ApplicationVersionCompleter.class) + String versionNumber; + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ConfigCancelCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ConfigCancelCommand.java new file mode 100644 index 00000000..36e87c9b --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ConfigCancelCommand.java @@ -0,0 +1,50 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.application; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationRevision; +import ru.entaxy.platform.integration.applications.EntaxyApplicationVersion; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; +import ru.entaxy.platform.config.runtime.ObjectConfigEditor; + +@Service +@Command(name = "app-revision-config-cancel", scope = ApplicationShell.COMMAND_SCOPE) +public class ConfigCancelCommand extends ManagedApplicationConfigCommand { + + @Override + protected void doExecute(EntaxyApplication application, EntaxyApplicationVersion version, + EntaxyApplicationRevision revision, ObjectConfigEditor editor) { + + editor.clear(); + session.put(ApplicationShell.APPLICATION_CONFIG_KEY, null); + + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ConfigCommitCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ConfigCommitCommand.java new file mode 100644 index 00000000..02ee07e5 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ConfigCommitCommand.java @@ -0,0 +1,85 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.application; + +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.Optional; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.integration.applications.ApplicationItem; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplication.ITEM_TYPE; +import ru.entaxy.platform.integration.applications.EntaxyApplicationRevision; +import ru.entaxy.platform.integration.applications.EntaxyApplicationVersion; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; +import ru.entaxy.platform.config.runtime.ObjectConfigEditor; + +@Service +@Command(name = "app-revision-config-commit", scope = ApplicationShell.COMMAND_SCOPE) +public class ConfigCommitCommand extends ManagedApplicationConfigCommand { + + @Override + protected void doExecute(EntaxyApplication application, EntaxyApplicationVersion version, + EntaxyApplicationRevision revision, ObjectConfigEditor editor) { + + Optional configItemOpt = revision.getItems().stream() + .filter(item -> item.getType().equals(ITEM_TYPE.CONFIG) && editor.getPid().equals(item.getId())) + .findFirst(); + if (configItemOpt.isEmpty()) { + // output error + System.err.println("ERROR: config [" + editor.getPid() + "] not found"); + return; + } + + ApplicationItem configItem = configItemOpt.get(); + + try { + editor.save(); + } catch (Exception e) { + // output error + System.err.println("ERROR: failed saving config [" + editor.getPid() + "], see exception below"); + e.printStackTrace(); + return; + } + + try (InputStream is = new FileInputStream(editor.getConfigFile())) { + configItem.update(is); + } catch (Exception e) { + // output error + System.err.println("ERROR: failed saving config [" + editor.getPid() + "], see exception below"); + e.printStackTrace(); + return; + } + + editor.clear(); + session.put(ApplicationShell.APPLICATION_CONFIG_KEY, null); + + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ConfigEditCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ConfigEditCommand.java new file mode 100644 index 00000000..8b368626 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ConfigEditCommand.java @@ -0,0 +1,122 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.application; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.Optional; + +import org.apache.karaf.shell.api.action.Argument; +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.Completion; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.integration.applications.ApplicationItem; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplication.ITEM_TYPE; +import ru.entaxy.platform.integration.applications.EntaxyApplicationRevision; +import ru.entaxy.platform.integration.applications.EntaxyApplicationVersion; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; +import ru.entaxy.platform.config.runtime.ObjectConfigEditor; +import ru.entaxy.platform.integration.applications.shell.completers.ConfigCompleter; + +@Service +@Command(name = "app-revision-config-edit", scope = ApplicationShell.COMMAND_SCOPE) +public class ConfigEditCommand extends ManagedApplicationRevisionCommand { + + @Argument(required = true) + @Completion(value = ConfigCompleter.class) + String configId; + + @Override + protected void doExecute(EntaxyApplication application, EntaxyApplicationVersion version, + EntaxyApplicationRevision revision) { + + ObjectConfigEditor editor = (ObjectConfigEditor) session.get(ApplicationShell.APPLICATION_CONFIG_KEY); + + if (editor != null) { + // print error + System.err.println("ERROR: another config is being edited, please commit or cancel it first"); + return; + } + + Optional configItemOpt = revision.getItems().stream() + .filter(item -> item.getType().equals(ITEM_TYPE.CONFIG) && configId.equals(item.getId())).findFirst(); + if (configItemOpt.isEmpty()) { + // output error + System.err.println("ERROR: config [" + configId + "] not found"); + return; + } + + ApplicationItem configItem = configItemOpt.get(); + + File tempFile = null; + + try { + Path temp = Files.createTempFile(configId, null); + tempFile = temp.toFile().getAbsoluteFile(); + tempFile.getParentFile().mkdirs(); + } catch (IOException e) { + // output error + System.err.println("ERROR: can't create temp file, see exception below:\n"); + e.printStackTrace(); + return; + } + + try (InputStream is = configItem.getInputStream()) { + Files.copy(is, tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING); + } catch (IOException e) { + // output error + System.err.println("ERROR: can't write to temp file, see exception below:\n"); + e.printStackTrace(); + return; + } + + try { + editor = ObjectConfigEditor.create(tempFile); + } catch (IOException e) { + System.err.println("ERROR: can't create config editor, see exception below:\n"); + e.printStackTrace(); + return; + } + + try { + editor.loadCurrent(configItem.getId()); + } catch (Exception e) { + System.err.println("WARN: can't create config editor, see exception below:\n"); + e.printStackTrace(); + } + + editor.setPid(configId); + + session.put(ApplicationShell.APPLICATION_CONFIG_KEY, editor); + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ConfigListCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ConfigListCommand.java new file mode 100644 index 00000000..a7000f4e --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ConfigListCommand.java @@ -0,0 +1,61 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.application; + +import java.util.stream.Collectors; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.base.support.karaf.shell.ShellTableFixed; +import ru.entaxy.platform.integration.applications.ApplicationItem; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplication.ITEM_TYPE; +import ru.entaxy.platform.integration.applications.EntaxyApplicationRevision; +import ru.entaxy.platform.integration.applications.EntaxyApplicationVersion; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +@Service +@Command(name = "app-revision-config-list", scope = ApplicationShell.COMMAND_SCOPE) +public class ConfigListCommand extends RevisionSupport { + + @Override + protected void doExecute(EntaxyApplication application, EntaxyApplicationVersion version, + EntaxyApplicationRevision revision) { + + ShellTableFixed table = new ShellTableFixed(); + table.column("Id"); + table.column("Location"); + + for (ApplicationItem item : revision.getItems().stream().filter(it -> it.getType().equals(ITEM_TYPE.CONFIG)) + .collect(Collectors.toList())) { + table.addRow().addContent(item.getId(), item.getLocation()); + } + + table.print(System.out); + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ConfigPrintCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ConfigPrintCommand.java new file mode 100644 index 00000000..5ce7ff0e --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ConfigPrintCommand.java @@ -0,0 +1,139 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.application; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.Optional; + +import org.apache.karaf.shell.api.action.Argument; +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.Option; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.base.support.karaf.shell.ShellTableFixed; +import ru.entaxy.platform.integration.applications.ApplicationItem; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplication.ITEM_TYPE; +import ru.entaxy.platform.integration.applications.EntaxyApplicationRevision; +import ru.entaxy.platform.integration.applications.EntaxyApplicationVersion; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; +import ru.entaxy.platform.config.runtime.ObjectConfigEditor; +import ru.entaxy.platform.config.runtime.ObjectConfigEditor.ConfigProperty; + +@Service +@Command(name = "app-revision-config-print", scope = ApplicationShell.COMMAND_SCOPE) +public class ConfigPrintCommand extends RevisionSupport { + + @Argument(required = true) + String configId; + + @Option(name = "-s", aliases = {"--show-system-properties"}) + boolean showSystemProperties = false; + + @Override + protected void doExecute(EntaxyApplication application, EntaxyApplicationVersion version, + EntaxyApplicationRevision revision) { + + Optional configItemOpt = revision.getItems().stream() + .filter(item -> item.getType().equals(ITEM_TYPE.CONFIG) && configId.equals(item.getId())).findFirst(); + if (configItemOpt.isEmpty()) { + // output error + System.err.println("ERROR: config [" + configId + "] not found"); + return; + } + + ApplicationItem configItem = configItemOpt.get(); + + File tempFile = null; + + try { + Path temp = Files.createTempFile(configId, null); + tempFile = temp.toFile().getAbsoluteFile(); + tempFile.getParentFile().mkdirs(); + } catch (IOException e) { + // output error + System.err.println("ERROR: can't create temp file, see exception below:\n"); + e.printStackTrace(); + return; + } + + try (InputStream is = configItem.getInputStream()) { + Files.copy(is, tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING); + } catch (IOException e) { + // output error + System.err.println("ERROR: can't write to temp file, see exception below:\n"); + e.printStackTrace(); + return; + } + + ObjectConfigEditor editor = null; + + try { + editor = ObjectConfigEditor.create(tempFile); + } catch (IOException e) { + System.err.println("ERROR: can't create config editor, see exception below:\n"); + e.printStackTrace(); + return; + } + + try { + editor.loadCurrent(configItem.getId()); + } catch (Exception e) { + System.err.println("WARN: can't create config editor, see exception below:\n"); + e.printStackTrace(); + } + + ShellTableFixed table = new ShellTableFixed(); + table.column("Name"); + table.column("Display Name"); + table.column("Is system"); + table.column("Type"); + table.column("Value"); + table.column("Current Value"); + + for (String name : editor.getPropertiesNames()) { + ConfigProperty property = editor.getAsConfigProperty(name); + if (property.hint.isInternal() && !showSystemProperties) + continue; + table.addRow().addContent( + name, + property.hint.getDisplayName(), + property.hint.isInternal(), + property.hint.getType(), + property.configValue == null ? "" : property.configValue.toString(), + property.currentValue == null ? "" : property.currentValue.toString()); + + } + + table.print(System.out); + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ConfigSetPropertyCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ConfigSetPropertyCommand.java new file mode 100644 index 00000000..d95ef56a --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ConfigSetPropertyCommand.java @@ -0,0 +1,76 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.application; + +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 ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationRevision; +import ru.entaxy.platform.integration.applications.EntaxyApplicationVersion; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; +import ru.entaxy.platform.config.runtime.ObjectConfigEditor; +import ru.entaxy.platform.config.runtime.ObjectConfigEditor.ConfigProperty; + +@Service +@Command(name = "app-revision-config-set", scope = ApplicationShell.COMMAND_SCOPE) +public class ConfigSetPropertyCommand extends ManagedApplicationConfigCommand { + + @Argument(required = true, index = 0) + String propertyName; + + @Argument(required = true, index = 1) + String propertyValue; + + @Override + protected void doExecute(EntaxyApplication application, EntaxyApplicationVersion version, + EntaxyApplicationRevision revision, ObjectConfigEditor editor) { + + ConfigProperty property = editor.getAsConfigProperty(propertyName); + if (property == null) { + // output error + System.err.println("ERROR: property [" + propertyName + "] not found"); + return; + } + + if (property.hint.isInternal()) { + // output error + System.err.println("ERROR: property [" + propertyName + "] is system, it can't be updated"); + return; + } + + try { + editor.setValue(propertyName, propertyValue); + } catch (Exception e) { + // output error + System.err.println("ERROR: setting property [" + propertyName + "], see exception below"); + e.printStackTrace(); + return; + } + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ConfigStatusCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ConfigStatusCommand.java new file mode 100644 index 00000000..3cfb7296 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ConfigStatusCommand.java @@ -0,0 +1,151 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.application; + +import java.util.function.Function; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.Option; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.base.support.karaf.shell.ShellTableExt; +import ru.entaxy.platform.config.runtime.ObjectConfig.ConfigFieldHint; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationRevision; +import ru.entaxy.platform.integration.applications.EntaxyApplicationVersion; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; +import ru.entaxy.platform.config.runtime.ObjectConfigEditor; +import ru.entaxy.platform.config.runtime.ObjectConfigEditor.ConfigProperty; + +@Service +@Command(name = "app-revision-config-status", scope = ApplicationShell.COMMAND_SCOPE) +public class ConfigStatusCommand extends ManagedApplicationConfigCommand { + + @Option(name = "-s", aliases = {"--show-system-properties"}) + boolean showSystemProperties = false; + + ConfigFieldHint currentHint = null; + + @Override + protected void doExecute(EntaxyApplication application, EntaxyApplicationVersion version, + EntaxyApplicationRevision revision, ObjectConfigEditor editor) { + + Function isSystemColorProvider = (str -> { + if (currentHint == null) + return ApplicationShell.COLOR_RESET; + if (currentHint.isInternal()) + return ApplicationShell.COLOR_GRAY; + return ApplicationShell.COLOR_RESET; + }); + + Function isSystemColorProviderExt = (cellData -> { + + if (cellData.dataObject == null) + return ApplicationShell.COLOR_RESET; + + if (!(cellData.dataObject instanceof ConfigProperty)) + return ApplicationShell.COLOR_RESET; + + ConfigProperty configProperty = (ConfigProperty) cellData.dataObject; + + if (configProperty.hint == null) + return ApplicationShell.COLOR_RESET; + if (configProperty.hint.isInternal()) + return ApplicationShell.COLOR_GRAY; + return ApplicationShell.COLOR_RESET; + }); + + Function isNewValueProviderExt = (cellData -> { + + if (cellData.dataObject == null) + return ApplicationShell.COLOR_RESET; + + if (!(cellData.dataObject instanceof ConfigProperty)) + return ApplicationShell.COLOR_RESET; + + ConfigProperty configProperty = (ConfigProperty) cellData.dataObject; + + if (configProperty.currentValue == null) + return ApplicationShell.COLOR_INCLUDED; + return ApplicationShell.COLOR_RESET; + }); + + Function isAbsentValueProviderExt = (cellData -> { + + if (cellData.dataObject == null) + return ApplicationShell.COLOR_RESET; + + if (!(cellData.dataObject instanceof ConfigProperty)) + return ApplicationShell.COLOR_RESET; + + ConfigProperty configProperty = (ConfigProperty) cellData.dataObject; + + if (configProperty.configValue == null) + return ApplicationShell.COLOR_REQUIRED; + return ApplicationShell.COLOR_RESET; + }); + + Function isModifiedColorProvider = (cellData -> { + if (cellData.dataObject == null) + return ApplicationShell.COLOR_RESET; + return ApplicationShell.COLOR_IGNORED; + }); + + ShellTableExt table = new ShellTableExt(); + table.column("Name").colorProviderExt(isSystemColorProviderExt); + table.column("Display Name").colorProvider(ApplicationShell.normalColorProvider); + table.column("Is system"); + table.column("Type"); + table.column("Imported Value").colorProviderExt(isNewValueProviderExt); + table.column("Modified Value").colorProviderExt(isModifiedColorProvider); + table.column("Local Value").colorProviderExt(isAbsentValueProviderExt); + + for (String name : editor.getPropertiesNames()) { + ConfigProperty property = editor.getAsConfigProperty(name); + currentHint = property.hint; + if (property.hint.isInternal() && !showSystemProperties) + continue; + table.addRow(property).addContent( + name, + property.hint.getDisplayName(), + property.hint.isInternal(), + property.hint.getType(), + property.configValue == null ? "" : property.configValue.toString(), + property.modifiedValue == null ? "" : property.modifiedValue.toString(), + property.currentValue == null ? "" : property.currentValue.toString()); + + } + + // output data + System.out.println("PID:\t" + editor.getPid()); + System.out.println("Modified:\t" + editor.isDirty()); + System.out.println("Temp file:\t" + editor.getConfigFile().getAbsolutePath()); + System.out.println("\n\tPROPERTIES:"); + table.print(System.out); + + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ManagedApplicationCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ManagedApplicationCommand.java new file mode 100644 index 00000000..a4bbbdf1 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ManagedApplicationCommand.java @@ -0,0 +1,48 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.application; + +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.shell.ApplicationManagerCommandSupport; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +public abstract class ManagedApplicationCommand extends ApplicationManagerCommandSupport { + + @Override + public Object execute() throws Exception { + if (session.get(ApplicationShell.APPLICATION_KEY) == null) { + // print error + System.err.println("No application is being managed"); + return null; + } + EntaxyApplication app = (EntaxyApplication) session.get(ApplicationShell.APPLICATION_KEY); + doExecute(app); + return null; + } + + protected abstract void doExecute(EntaxyApplication application); + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ManagedApplicationConfigCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ManagedApplicationConfigCommand.java new file mode 100644 index 00000000..be912d1c --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ManagedApplicationConfigCommand.java @@ -0,0 +1,51 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.application; + +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationRevision; +import ru.entaxy.platform.integration.applications.EntaxyApplicationVersion; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; +import ru.entaxy.platform.config.runtime.ObjectConfigEditor; + +public abstract class ManagedApplicationConfigCommand extends ManagedApplicationRevisionCommand { + + @Override + protected void doExecute(EntaxyApplication application, EntaxyApplicationVersion version, + EntaxyApplicationRevision revision) { + ObjectConfigEditor editor = + (ObjectConfigEditor) session.get(ApplicationShell.APPLICATION_CONFIG_KEY); + if (editor == null) { + // print error + System.err.println("No config is being edited"); + return; + } + doExecute(application, version, revision, editor); + } + + protected abstract void doExecute(EntaxyApplication application, EntaxyApplicationVersion version, + EntaxyApplicationRevision revision, ObjectConfigEditor editor); +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ManagedApplicationRevisionCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ManagedApplicationRevisionCommand.java new file mode 100644 index 00000000..726d47e5 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ManagedApplicationRevisionCommand.java @@ -0,0 +1,49 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.application; + +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationRevision; +import ru.entaxy.platform.integration.applications.EntaxyApplicationVersion; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +public abstract class ManagedApplicationRevisionCommand extends ManagedApplicationVersionCommand { + + @Override + protected void doExecute(EntaxyApplication application, EntaxyApplicationVersion version) { + EntaxyApplicationRevision revision = + (EntaxyApplicationRevision) session.get(ApplicationShell.APPLICATION_REVISION_KEY); + if (revision == null) { + // print error + System.err.println("No revision is being managed"); + return; + } + doExecute(application, version, revision); + } + + protected abstract void doExecute(EntaxyApplication application, EntaxyApplicationVersion version, + EntaxyApplicationRevision revision); +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ManagedApplicationVersionCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ManagedApplicationVersionCommand.java new file mode 100644 index 00000000..1c73df29 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/ManagedApplicationVersionCommand.java @@ -0,0 +1,47 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.application; + +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationVersion; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +public abstract class ManagedApplicationVersionCommand extends ManagedApplicationCommand { + + @Override + protected void doExecute(EntaxyApplication application) { + EntaxyApplicationVersion version = + (EntaxyApplicationVersion) session.get(ApplicationShell.APPLICATION_VERSION_KEY); + if (version == null) { + // print error + System.err.println("No version is being managed"); + return; + } + doExecute(application, version); + } + + protected abstract void doExecute(EntaxyApplication application, EntaxyApplicationVersion version); +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionConfigureCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionConfigureCommand.java new file mode 100644 index 00000000..d6917143 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionConfigureCommand.java @@ -0,0 +1,54 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.application; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationRevision; +import ru.entaxy.platform.integration.applications.EntaxyApplicationVersion; +import ru.entaxy.platform.integration.applications.exceptions.RevisionException; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +@Service +@Command(name = "app-revision-configure", scope = ApplicationShell.COMMAND_SCOPE) +public class RevisionConfigureCommand extends RevisionSupport { + + @Override + protected void doExecute(EntaxyApplication application, EntaxyApplicationVersion version, + EntaxyApplicationRevision revision) { + try { + revision.configure(); + session.put(ApplicationShell.APPLICATION_REVISION_KEY, revision); + printRevision(revision); + } catch (RevisionException e) { + // output error + System.err.println("ERROR: " + e.getMessage()); + } + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionCreateCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionCreateCommand.java new file mode 100644 index 00000000..f9d261c9 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionCreateCommand.java @@ -0,0 +1,85 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.application; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.Option; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.base.support.CommonUtils; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationRevision; +import ru.entaxy.platform.integration.applications.EntaxyApplicationVersion; +import ru.entaxy.platform.integration.applications.exceptions.ApplicationVersionException; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +@Service +@Command(name = "app-revision-create", scope = ApplicationShell.COMMAND_SCOPE) +public class RevisionCreateCommand extends ManagedApplicationVersionCommand { + + @Option(name = "-r", aliases = {"--from-revision"}, required = false) + String fromRevision; + + @Override + protected void doExecute(EntaxyApplication application, EntaxyApplicationVersion version) { + + int sourceRevision = -1; + + if (CommonUtils.isValid(fromRevision)) + try { + sourceRevision = Integer.parseInt(fromRevision); + } catch (Exception e) { + // print error + System.err.println("Invalid source revision number: " + fromRevision); + return; + } + + EntaxyApplicationRevision revision = null; + + try { + if (sourceRevision < 0) + revision = version.createRevision(); + else + revision = version.createRevision(sourceRevision); + } catch (ApplicationVersionException e) { + // print error + System.err.println("Error creating revision: " + e.getMessage()); + e.printStackTrace(); + } + + if (revision == null) { + // print error + System.err.println("Error creating revision: revision is null"); + return; + } + + // print result + System.out.println(String.format("Created revision %d with status %s", revision.getRevisionNumber(), + revision.getStatus())); + + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionDeployCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionDeployCommand.java new file mode 100644 index 00000000..18784f5d --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionDeployCommand.java @@ -0,0 +1,53 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.application; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationRevision; +import ru.entaxy.platform.integration.applications.EntaxyApplicationVersion; +import ru.entaxy.platform.integration.applications.exceptions.RevisionException; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +@Service +@Command(name = "app-revision-deploy", scope = ApplicationShell.COMMAND_SCOPE) +public class RevisionDeployCommand extends RevisionSupport { + + @Override + protected void doExecute(EntaxyApplication application, EntaxyApplicationVersion version, + EntaxyApplicationRevision revision) { + try { + revision.deploy(); + printRevision(revision); + } catch (RevisionException e) { + // output error + System.err.println("ERROR: " + e.getMessage()); + } + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionDoneCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionDoneCommand.java new file mode 100644 index 00000000..33e07f37 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionDoneCommand.java @@ -0,0 +1,49 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.application; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationRevision; +import ru.entaxy.platform.integration.applications.EntaxyApplicationVersion; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +@Service +@Command(name = "app-revision-done", scope = ApplicationShell.COMMAND_SCOPE) +public class RevisionDoneCommand extends ManagedApplicationRevisionCommand { + + @Override + protected void doExecute(EntaxyApplication application, EntaxyApplicationVersion version, + EntaxyApplicationRevision revision) { + + + session.put(ApplicationShell.APPLICATION_REVISION_KEY, null); + session.put(ApplicationShell.APPLICATION_CONFIG_KEY, null); + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionInfoCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionInfoCommand.java new file mode 100644 index 00000000..d0494f9c --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionInfoCommand.java @@ -0,0 +1,138 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.application; + +import java.util.Comparator; +import java.util.stream.Collectors; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.lifecycle.Reference; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.esb.resources.EntaxyResource; +import ru.entaxy.esb.resources.EntaxyResourceService; +import ru.entaxy.platform.base.support.karaf.shell.ShellTableFixed; +import ru.entaxy.platform.integration.applications.ApplicationItem; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationRevision; +import ru.entaxy.platform.integration.applications.EntaxyApplicationVersion; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationDescriptor; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationRequirement; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject; +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObjectService; + +@Service +@Command(name = "app-revision-info", scope = ApplicationShell.COMMAND_SCOPE) +public class RevisionInfoCommand extends RevisionSupport { + + @Reference + EntaxyRuntimeObjectService entaxyRuntimeObjectService; + + @Reference + EntaxyResourceService entaxyResourceService; + + @Override + protected void doExecute(EntaxyApplication application, EntaxyApplicationVersion version, + EntaxyApplicationRevision revision) { + + System.out.println(""); + // output main revision info + String data = "Application : ".concat(application.getName()).concat("\n") + .concat("Group : ").concat(version.getDescriptor().group).concat("\n") + .concat("Version : ").concat(version.getVersionNumber()).concat("\n") + .concat("Revision : ").concat(revision.getRevisionNumber() + "").concat("\n") + .concat("Status : ").concat(revision.getStatus().name()).concat("\n") + .concat("Revisionable : ") + .concat(revision.getItems().stream().filter(item -> item.isRevisionable()).count() > 0 ? "true" + : "false") + .concat("\n") + .concat("Editable : ") + .concat(revision.getItems().stream().filter(item -> item.isEditable()).count() > 0 ? "true" : "false"); + System.out.println(data); + + // output items + System.out.println("\n\tITEMS"); + ShellTableFixed itemsTable = new ShellTableFixed(); + itemsTable.column("Id"); + itemsTable.column("Type"); + itemsTable.column("Revisionable").alignCenter(); + itemsTable.column("Editable").alignCenter(); + + for (ApplicationItem item : revision.getItems().stream().sorted(new Comparator() { + + @Override + public int compare(ApplicationItem o1, ApplicationItem o2) { + return o1.getType().name().compareTo(o2.getType().name()); + } + }).collect(Collectors.toList())) { + + itemsTable.addRow().addContent(item.getId(), item.getType().name(), item.isRevisionable() ? "*" : "", + item.isEditable() ? "*" : ""); + + } + + itemsTable.print(System.out); + + // output requirements + ApplicationDescriptor applicationDescriptor = revision.getDescriptor(); + System.out.println("\n\tREQUIREMENTS"); + ShellTableFixed requirementsTable = new ShellTableFixed(); + requirementsTable.column("Id").colorProvider(ApplicationShell.normalColorProvider); + requirementsTable.column("Type").colorProvider(ApplicationShell.normalColorProvider); + requirementsTable.column("Scope").colorProvider(ApplicationShell.normalColorProvider); + requirementsTable.column("Status").colorProvider(ApplicationShell.requirementStatusColorProvider).alignCenter(); + + for (ApplicationRequirement req : applicationDescriptor.requirements) { + requirementsTable.addRow().addContent( + req.id, + req.type.name(), + req.scope.name(), + checkRequirement(req) ? "V" : "X"); + } + + requirementsTable.print(System.out); + + System.out.println(""); + } + + protected boolean checkRequirement(ApplicationRequirement requirement) { + switch (requirement.type) { + case OBJECT: + EntaxyRuntimeObject runtimeObject = entaxyRuntimeObjectService.getRuntimeObject(requirement.id); + return runtimeObject != null && !runtimeObject.isGhost(); + case RESOURCE: + EntaxyResource entaxyResource = entaxyResourceService.getResource(requirement.id); + return entaxyResource.exists(); + case BUNDLE: + case CONFIG: + // TODO implement + return true; + default: + return true; + } + } +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionInstallCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionInstallCommand.java new file mode 100644 index 00000000..9b3dd667 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionInstallCommand.java @@ -0,0 +1,62 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.application; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.Option; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationRevision; +import ru.entaxy.platform.integration.applications.EntaxyApplicationVersion; +import ru.entaxy.platform.integration.applications.exceptions.RevisionException; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +@Service +@Command(name = "app-revision-install", scope = ApplicationShell.COMMAND_SCOPE) +public class RevisionInstallCommand extends RevisionSupport { + + @Option(name = "-d", aliases = {"--dev-mode"}, required = false) + boolean devMode = false; + + @Override + protected void doExecute(EntaxyApplication application, EntaxyApplicationVersion version, + EntaxyApplicationRevision revision) { + try { + revision.install(devMode); + if (devMode) { + // outout to console + System.out.println( + " === WARNING ===\n\tAplication was installed in development mode\nRevision status WAS NOT CHANGED\n"); + } + printRevision(revision); + } catch (RevisionException e) { + // output error + System.err.println("ERROR: " + e.getMessage()); + } + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionListCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionListCommand.java new file mode 100644 index 00000000..4238d114 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionListCommand.java @@ -0,0 +1,73 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.application; + +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.base.support.karaf.shell.ShellTableFixed; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationRevision; +import ru.entaxy.platform.integration.applications.EntaxyApplicationVersion; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +@Service +@Command(name = "app-revision-list", scope = ApplicationShell.COMMAND_SCOPE) +public class RevisionListCommand extends ManagedApplicationVersionCommand { + + @Override + protected void doExecute(EntaxyApplication application, EntaxyApplicationVersion version) { + + ShellTableFixed table = new ShellTableFixed(); + table.column("Number").alignCenter(); + table.column("Status"); + + List revisions = + version.getRevisions().stream().sorted(new Comparator() { + + @Override + public int compare(EntaxyApplicationRevision o1, EntaxyApplicationRevision o2) { + if (o1.getRevisionNumber() > o2.getRevisionNumber()) + return 1; + return -1; + } + }) + .collect(Collectors.toList()); + + for (EntaxyApplicationRevision revision : revisions) { + table.addRow().addContent(revision.getRevisionNumber(), revision.getStatus()); + } + + // output + table.print(System.out); + + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionSupport.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionSupport.java new file mode 100644 index 00000000..db5f2c28 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionSupport.java @@ -0,0 +1,66 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.application; + +import org.apache.karaf.shell.api.action.Option; + +import ru.entaxy.platform.base.support.CommonUtils; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationRevision; +import ru.entaxy.platform.integration.applications.EntaxyApplicationVersion; + +public abstract class RevisionSupport extends ManagedApplicationVersionCommand { + + @Option(name = "-r", aliases = {"--revision"}) + public String revisionNumber; + + @Override + protected void doExecute(EntaxyApplication application, EntaxyApplicationVersion version) { + int revisionNum = version.getLastRevision().getRevisionNumber(); + if (CommonUtils.isValid(revisionNumber)) + try { + revisionNum = Integer.parseInt(revisionNumber); + } catch (Exception e) { + + // print error + System.err.println("Invalid revision number: " + revisionNumber); + return; + } + + EntaxyApplicationRevision revision = version.getRevision(revisionNum); + doExecute(application, version, revision); + } + + protected void printRevision(EntaxyApplicationRevision revision) { + // output + System.out.println( + String.format("Revision: %d; status: %s", revision.getRevisionNumber(), revision.getStatus().name())); + } + + protected abstract void doExecute(EntaxyApplication application, EntaxyApplicationVersion version, + EntaxyApplicationRevision revision); + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionUninstallCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionUninstallCommand.java new file mode 100644 index 00000000..bed8a864 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/application/RevisionUninstallCommand.java @@ -0,0 +1,52 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.application; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.lifecycle.Service; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationRevision; +import ru.entaxy.platform.integration.applications.EntaxyApplicationVersion; +import ru.entaxy.platform.integration.applications.exceptions.RevisionException; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +@Service +@Command(name = "app-revision-uninstall", scope = ApplicationShell.COMMAND_SCOPE) +public class RevisionUninstallCommand extends RevisionSupport { + + @Override + protected void doExecute(EntaxyApplication application, EntaxyApplicationVersion version, + EntaxyApplicationRevision revision) { + try { + revision.uninstall(); + printRevision(revision); + } catch (RevisionException e) { + // output error + System.err.println("ERROR: " + e.getMessage()); + } + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/ApplicationCompleter.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/ApplicationCompleter.java new file mode 100644 index 00000000..297066d3 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/ApplicationCompleter.java @@ -0,0 +1,58 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.completers; + +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.karaf.shell.api.action.lifecycle.Reference; +import org.apache.karaf.shell.api.action.lifecycle.Service; +import org.apache.karaf.shell.api.console.CommandLine; +import org.apache.karaf.shell.api.console.Completer; +import org.apache.karaf.shell.api.console.Session; + +import ru.entaxy.platform.integration.applications.ApplicationManager; + +@Service +public class ApplicationCompleter implements Completer { + + @Reference + ApplicationManager applicationManager; + + @Override + public int complete(Session session, CommandLine commandLine, List candidates) { + candidates.addAll( + applicationManager.getApplications().stream() + .filter(app -> app.getStorage() != null) + .map(app -> app.getName().concat("@") + .concat(app.getStorage().getName())) + .collect(Collectors.toList())); + return 0; + } + + + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/ApplicationVersionCompleter.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/ApplicationVersionCompleter.java new file mode 100644 index 00000000..04da1917 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/ApplicationVersionCompleter.java @@ -0,0 +1,51 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.completers; + +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.karaf.shell.api.action.lifecycle.Service; +import org.apache.karaf.shell.api.console.CommandLine; +import org.apache.karaf.shell.api.console.Completer; +import org.apache.karaf.shell.api.console.Session; + +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +@Service +public class ApplicationVersionCompleter implements Completer { + + @Override + public int complete(Session session, CommandLine commandLine, List candidates) { + EntaxyApplication app = (EntaxyApplication) session.get(ApplicationShell.APPLICATION_KEY); + if (app == null) + return 0; + candidates.addAll(app.getVersions().stream().map(v -> v.getVersionNumber()).collect(Collectors.toList())); + return 0; + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/ConfigCompleter.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/ConfigCompleter.java new file mode 100644 index 00000000..aef4b0b1 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/ConfigCompleter.java @@ -0,0 +1,57 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.completers; + +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.karaf.shell.api.action.lifecycle.Service; +import org.apache.karaf.shell.api.console.CommandLine; +import org.apache.karaf.shell.api.console.Completer; +import org.apache.karaf.shell.api.console.Session; + +import ru.entaxy.platform.integration.applications.EntaxyApplication.ITEM_TYPE; +import ru.entaxy.platform.integration.applications.EntaxyApplicationRevision; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +@Service +public class ConfigCompleter implements Completer { + + @Override + public int complete(Session session, CommandLine commandLine, List candidates) { + EntaxyApplicationRevision revision = + (EntaxyApplicationRevision) session.get(ApplicationShell.APPLICATION_REVISION_KEY); + if (revision == null) + return 0; + + candidates.addAll( + revision.getItems().stream().filter(item -> item.getType().equals(ITEM_TYPE.CONFIG)) + .map(item -> item.getId()).collect(Collectors.toList())); + + return 0; + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/EntaxyRuntimeObjectCompleter.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/EntaxyRuntimeObjectCompleter.java new file mode 100644 index 00000000..5d79ae07 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/EntaxyRuntimeObjectCompleter.java @@ -0,0 +1,55 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.completers; + +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.karaf.shell.api.action.lifecycle.Reference; +import org.apache.karaf.shell.api.action.lifecycle.Service; +import org.apache.karaf.shell.api.console.CommandLine; +import org.apache.karaf.shell.api.console.Completer; +import org.apache.karaf.shell.api.console.Session; + +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObjectService; + +@Service +public class EntaxyRuntimeObjectCompleter implements Completer { + + @Reference + EntaxyRuntimeObjectService entaxyRuntimeObjectService; + + @Override + public int complete(Session session, CommandLine commandLine, List candidates) { + candidates.addAll(entaxyRuntimeObjectService.getObjects().stream() + .filter(obj -> !obj.isGhost()) + .map(obj -> obj.getObjectFullId()) + .collect(Collectors.toList())); + + return 0; + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/ProjectCompleter.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/ProjectCompleter.java new file mode 100644 index 00000000..0ad205e4 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/ProjectCompleter.java @@ -0,0 +1,58 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.completers; + +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.karaf.shell.api.action.lifecycle.Reference; +import org.apache.karaf.shell.api.action.lifecycle.Service; +import org.apache.karaf.shell.api.console.CommandLine; +import org.apache.karaf.shell.api.console.Completer; +import org.apache.karaf.shell.api.console.Session; + +import ru.entaxy.platform.integration.applications.ApplicationManager; + +@Service +public class ProjectCompleter implements Completer { + + @Reference + ApplicationManager applicationManager; + + @Override + public int complete(Session session, CommandLine commandLine, List candidates) { + candidates.addAll( + applicationManager.getProjects().stream() + .filter(app -> app.getStorage() != null) + .map(app -> app.getName().concat("@") + .concat(app.getStorage().getName())) + .collect(Collectors.toList())); + return 0; + } + + + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/ProjectItemCompleter.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/ProjectItemCompleter.java new file mode 100644 index 00000000..7bfd344d --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/ProjectItemCompleter.java @@ -0,0 +1,53 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.completers; + +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.karaf.shell.api.action.lifecycle.Service; +import org.apache.karaf.shell.api.console.CommandLine; +import org.apache.karaf.shell.api.console.Completer; +import org.apache.karaf.shell.api.console.Session; + +import ru.entaxy.platform.integration.applications.EntaxyApplicationProjectVersion; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +@Service +public class ProjectItemCompleter implements Completer { + + @Override + public int complete(Session session, CommandLine commandLine, List candidates) { + EntaxyApplicationProjectVersion version = (EntaxyApplicationProjectVersion) session.get(ApplicationShell.PROJECT_VERSION_KEY); + if (version == null) + return 0; + + candidates.addAll(version.getItems().stream().map(item -> item.getId()).collect(Collectors.toList())); + + return 0; + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/ProjectVersionCompleter.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/ProjectVersionCompleter.java new file mode 100644 index 00000000..73c4240b --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/ProjectVersionCompleter.java @@ -0,0 +1,51 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.completers; + +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.karaf.shell.api.action.lifecycle.Service; +import org.apache.karaf.shell.api.console.CommandLine; +import org.apache.karaf.shell.api.console.Completer; +import org.apache.karaf.shell.api.console.Session; + +import ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +@Service +public class ProjectVersionCompleter implements Completer { + + @Override + public int complete(Session session, CommandLine commandLine, List candidates) { + EntaxyApplicationProject app = (EntaxyApplicationProject) session.get(ApplicationShell.PROJECT_KEY); + if (app == null) + return 0; + candidates.addAll(app.getVersions().stream().map(v -> v.getVersionNumber()).collect(Collectors.toList())); + return 0; + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/RepositoryNameCompleter.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/RepositoryNameCompleter.java new file mode 100644 index 00000000..2a46e9c2 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/RepositoryNameCompleter.java @@ -0,0 +1,52 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.completers; + +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.karaf.shell.api.action.lifecycle.Reference; +import org.apache.karaf.shell.api.action.lifecycle.Service; +import org.apache.karaf.shell.api.console.CommandLine; +import org.apache.karaf.shell.api.console.Completer; +import org.apache.karaf.shell.api.console.Session; + +import ru.entaxy.platform.core.artifact.service.ArtifactService; + +@Service +public class RepositoryNameCompleter implements Completer { + + @Reference + ArtifactService artifactService; + + @Override + public int complete(Session session, CommandLine commandLine, List candidates) { + candidates.addAll( + artifactService.getRepositories().stream().map(repo -> repo.getName()).collect(Collectors.toList())); + return 0; + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/RevisionCompleter.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/RevisionCompleter.java new file mode 100644 index 00000000..44fa2382 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/RevisionCompleter.java @@ -0,0 +1,55 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.completers; + +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.karaf.shell.api.action.lifecycle.Service; +import org.apache.karaf.shell.api.console.CommandLine; +import org.apache.karaf.shell.api.console.Completer; +import org.apache.karaf.shell.api.console.Session; + +import ru.entaxy.platform.integration.applications.EntaxyApplicationVersion; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +@Service +public class RevisionCompleter implements Completer { + + @Override + public int complete(Session session, CommandLine commandLine, List candidates) { + EntaxyApplicationVersion version = + (EntaxyApplicationVersion) session.get(ApplicationShell.APPLICATION_VERSION_KEY); + if (version == null) + return 0; + + candidates.addAll( + version.getRevisions().stream().map(rev -> rev.getRevisionNumber() + "").collect(Collectors.toList())); + + return 0; + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/StorageCompleter.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/StorageCompleter.java new file mode 100644 index 00000000..9b559189 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/completers/StorageCompleter.java @@ -0,0 +1,52 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.completers; + +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.karaf.shell.api.action.lifecycle.Reference; +import org.apache.karaf.shell.api.action.lifecycle.Service; +import org.apache.karaf.shell.api.console.CommandLine; +import org.apache.karaf.shell.api.console.Completer; +import org.apache.karaf.shell.api.console.Session; + +import ru.entaxy.platform.integration.applications.ApplicationManager; + +@Service +public class StorageCompleter implements Completer { + + @Reference + ApplicationManager applicationManager; + + @Override + public int complete(Session session, CommandLine commandLine, List candidates) { + candidates.addAll( + applicationManager.getAllStorages().stream().map(s -> s.getName()).collect(Collectors.toList())); + return 0; + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ItemAddCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ItemAddCommand.java new file mode 100644 index 00000000..19dd5036 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ItemAddCommand.java @@ -0,0 +1,48 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.project; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.integration.applications.ApplicationProjectItem; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProjectVersion; +import ru.entaxy.platform.integration.applications.exceptions.ProjectException; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +@Service +@Command(name = "project-item-add", scope = ApplicationShell.COMMAND_SCOPE) +public class ItemAddCommand extends ItemAwareCommand { + + @Override + protected void processItem(EntaxyApplicationProject application, EntaxyApplicationProjectVersion version, + ApplicationProjectItem item) + throws ProjectException { + version.addItem(item); + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ItemAwareCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ItemAwareCommand.java new file mode 100644 index 00000000..cd3b1bd8 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ItemAwareCommand.java @@ -0,0 +1,67 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.project; + +import java.util.Optional; + +import org.apache.karaf.shell.api.action.Argument; +import org.apache.karaf.shell.api.action.Completion; + +import ru.entaxy.platform.integration.applications.ApplicationProjectItem; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProjectVersion; +import ru.entaxy.platform.integration.applications.exceptions.ProjectException; +import ru.entaxy.platform.integration.applications.shell.completers.ProjectItemCompleter; + +public abstract class ItemAwareCommand extends ManagedVersionCommand { + + @Argument(index = 0, required = true) + @Completion(value = ProjectItemCompleter.class) + String itemId; + + @Override + protected void doExecute(EntaxyApplicationProject application, EntaxyApplicationProjectVersion version) { + + Optional optItem = + version.getItems().stream().filter(item -> item.getId().equals(itemId)).findFirst(); + if (!optItem.isPresent()) { + // print error + System.err.println(String.format("Item [%s] not found in managed version", itemId)); + return; + } + try { + processItem(application, version, optItem.get()); + } catch (ProjectException e) { + // output exception + e.printStackTrace(); + } + + } + + protected abstract void processItem(EntaxyApplicationProject application, EntaxyApplicationProjectVersion version, + ApplicationProjectItem item) throws ProjectException; + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ItemIgnoreCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ItemIgnoreCommand.java new file mode 100644 index 00000000..e0b50fe8 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ItemIgnoreCommand.java @@ -0,0 +1,48 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.project; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.integration.applications.ApplicationProjectItem; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProjectVersion; +import ru.entaxy.platform.integration.applications.exceptions.ProjectException; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +@Service +@Command(name = "project-item-ignore", scope = ApplicationShell.COMMAND_SCOPE) +public class ItemIgnoreCommand extends ItemAwareCommand { + + @Override + protected void processItem(EntaxyApplicationProject application, EntaxyApplicationProjectVersion version, + ApplicationProjectItem item) + throws ProjectException { + version.ignoreItem(item); + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ItemRemoveCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ItemRemoveCommand.java new file mode 100644 index 00000000..33717de5 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ItemRemoveCommand.java @@ -0,0 +1,48 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.project; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.integration.applications.ApplicationProjectItem; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProjectVersion; +import ru.entaxy.platform.integration.applications.exceptions.ProjectException; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +@Service +@Command(name = "project-item-remove", scope = ApplicationShell.COMMAND_SCOPE) +public class ItemRemoveCommand extends ItemAwareCommand { + + @Override + protected void processItem(EntaxyApplicationProject application, EntaxyApplicationProjectVersion version, + ApplicationProjectItem item) + throws ProjectException { + version.removeItem(item); + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ManagedProjectCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ManagedProjectCommand.java new file mode 100644 index 00000000..75b0a62a --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ManagedProjectCommand.java @@ -0,0 +1,48 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.project; + +import ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.shell.ApplicationManagerCommandSupport; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +public abstract class ManagedProjectCommand extends ApplicationManagerCommandSupport { + + @Override + public Object execute() throws Exception { + if (session.get(ApplicationShell.PROJECT_KEY) == null) { + // print error + System.err.println("No application is being managed"); + return null; + } + EntaxyApplicationProject app = (EntaxyApplicationProject) session.get(ApplicationShell.PROJECT_KEY); + doExecute(app); + return null; + } + + protected abstract void doExecute(EntaxyApplicationProject application); + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ManagedVersionCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ManagedVersionCommand.java new file mode 100644 index 00000000..8984ecc3 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ManagedVersionCommand.java @@ -0,0 +1,46 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.project; + +import ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProjectVersion; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +public abstract class ManagedVersionCommand extends ManagedProjectCommand { + + @Override + protected void doExecute(EntaxyApplicationProject application) { + EntaxyApplicationProjectVersion version = (EntaxyApplicationProjectVersion) session.get(ApplicationShell.PROJECT_VERSION_KEY); + if (version == null) { + // print error + System.err.println("No version is being managed"); + return; + } + doExecute(application, version); + } + + protected abstract void doExecute(EntaxyApplicationProject application, EntaxyApplicationProjectVersion version); +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ProjectCancelCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ProjectCancelCommand.java new file mode 100644 index 00000000..7909a13e --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ProjectCancelCommand.java @@ -0,0 +1,48 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.project; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.Option; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +@Service +@Command(name = "project-cancel", scope = ApplicationShell.COMMAND_SCOPE) +public class ProjectCancelCommand extends ManagedProjectCommand { + + @Option(name = "-f", aliases = {"--force-version-cancel"}) + boolean forceVersionCancel = true; + + @Override + protected void doExecute(EntaxyApplicationProject application) { + session.put(ApplicationShell.PROJECT_KEY, null); + session.put(ApplicationShell.PROJECT_VERSION_KEY, null); + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ProjectCommitCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ProjectCommitCommand.java new file mode 100644 index 00000000..c67256bb --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ProjectCommitCommand.java @@ -0,0 +1,63 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.project; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.Option; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProjectVersion; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +@Service +@Command(name = "project-commit", scope = ApplicationShell.COMMAND_SCOPE) +public class ProjectCommitCommand extends ManagedProjectCommand { + + @Option(name = "-f", aliases = {"--force-version-commit"}) + boolean forceVersionCommit = true; + + @Option(name = "-s", aliases = {"--stop-managing"}) + boolean stopManaging = true; + + @Override + protected void doExecute(EntaxyApplicationProject application) { + application.save(); + EntaxyApplicationProjectVersion version = + (EntaxyApplicationProjectVersion) session.get(ApplicationShell.PROJECT_VERSION_KEY); + if (version != null) { + if (forceVersionCommit) + version.save(); + else + version.disgard(); + } + if (stopManaging) { + session.put(ApplicationShell.PROJECT_KEY, null); + session.put(ApplicationShell.PROJECT_VERSION_KEY, null); + } + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ProjectCreateCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ProjectCreateCommand.java new file mode 100644 index 00000000..07e3e46e --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ProjectCreateCommand.java @@ -0,0 +1,61 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.project; + +import org.apache.karaf.shell.api.action.Argument; +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.Option; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; +import ru.entaxy.platform.integration.applications.shell.StorageAwareCommand; + +@Service +@Command(name = "project-create", scope = ApplicationShell.COMMAND_SCOPE) +public class ProjectCreateCommand extends StorageAwareCommand { + + @Option(name = "-v", aliases = {"--version"}, description = "Initial version for new application") + String initialVersion = "1.0.0"; + + @Argument(name = "applicationName", required = true, index = 1) + String applicationName; + + @Override + protected void doExecute() { + try { + EntaxyApplicationProject app = applicationManager.createProject(storage, applicationName, initialVersion); + if (app != null) { + // output + System.out.println("Created successfully"); + } + } catch (Exception e) { + // output to console + e.printStackTrace(); + } + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ProjectCurrentCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ProjectCurrentCommand.java new file mode 100644 index 00000000..91b4407d --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ProjectCurrentCommand.java @@ -0,0 +1,73 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.project; + +import org.apache.karaf.shell.api.action.Action; +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.lifecycle.Reference; +import org.apache.karaf.shell.api.action.lifecycle.Service; +import org.apache.karaf.shell.api.console.Session; + +import ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProjectVersion; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +@Service +@Command(name = "project-current", scope = ApplicationShell.COMMAND_SCOPE) +public class ProjectCurrentCommand implements Action { + + @Reference + Session session; + + @Override + public Object execute() throws Exception { + if (session.get(ApplicationShell.PROJECT_KEY) == null) { + // output + System.out.println("No application is being managed"); + return null; + } + + String application = ""; + String storage = "unknown"; + String version = "none"; + + EntaxyApplicationProject app = (EntaxyApplicationProject) session.get(ApplicationShell.PROJECT_KEY); + application = app.getName(); + storage = app.getStorage().getName(); + + EntaxyApplicationProjectVersion vers = (EntaxyApplicationProjectVersion) session.get(ApplicationShell.PROJECT_VERSION_KEY); + if (vers != null) + version = vers.getVersionNumber(); + + // output + + System.out.println( + String.format("Application: [%s]\nStorage: [%s]\nVersion: [%s]", application, storage, version)); + + return null; + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ProjectListCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ProjectListCommand.java new file mode 100644 index 00000000..20415896 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ProjectListCommand.java @@ -0,0 +1,90 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.project; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.base.support.karaf.shell.ShellTableFixed; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProjectVersion; +import ru.entaxy.platform.integration.applications.shell.ApplicationManagerCommandSupport; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +@Service +@Command(name = "project-list", scope = ApplicationShell.COMMAND_SCOPE) +public class ProjectListCommand extends ApplicationManagerCommandSupport { + + @Override + public Object execute() throws Exception { + ShellTableFixed table = new ShellTableFixed(); + table.column("Name"); + table.column("Storage"); + table.column("Versions"); + + List apps = applicationManager.getProjects(); + Collections.sort(apps, new Comparator() { + + @Override + public int compare(EntaxyApplicationProject o1, EntaxyApplicationProject o2) { + String storage1 = o1.getStorage().getName(); + String storage2 = o2.getStorage().getName(); + if (!storage1.equals(storage2)) + return storage1.compareTo(storage2); + + return o1.getName().compareTo(o2.getName()); + } + + }); + + for (EntaxyApplicationProject app : apps) { + List versions = app.getVersions(); + Collections.sort(versions, new Comparator() { + + @Override + public int compare(EntaxyApplicationProjectVersion o1, EntaxyApplicationProjectVersion o2) { + return o1.compareTo(o2); + } + + }); + String versionsValue = versions.stream().map(v -> v.getVersionNumber()).collect(Collectors.joining("\n")); + + table.addRow().addContent(app.getName(), app.getStorage() == null ? "" : app.getStorage().getName(), + versionsValue); + } + + // print output + table.print(System.out); + + return null; + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ProjectManageCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ProjectManageCommand.java new file mode 100644 index 00000000..619ccea5 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ProjectManageCommand.java @@ -0,0 +1,116 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.project; + +import org.apache.karaf.shell.api.action.Argument; +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.Completion; +import org.apache.karaf.shell.api.action.Option; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.integration.applications.ApplicationStorage; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProjectVersion; +import ru.entaxy.platform.integration.applications.shell.ApplicationManagerCommandSupport; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; +import ru.entaxy.platform.integration.applications.shell.completers.ProjectCompleter; + +@Service +@Command(name = "project-manage", scope = ApplicationShell.COMMAND_SCOPE) +public class ProjectManageCommand extends ApplicationManagerCommandSupport { + + @Argument + @Completion(value = ProjectCompleter.class) + String application; + + @Option(name = "-f", aliases = {"--force-cancel"}) + boolean forceCancel = false; + + @Override + public Object execute() throws Exception { + if (session.get(ApplicationShell.PROJECT_KEY) != null) { + if (forceCancel) { + try { + EntaxyApplicationProjectVersion version = + (EntaxyApplicationProjectVersion) session.get(ApplicationShell.PROJECT_VERSION_KEY); + if (version != null) + version.disgard(); + } catch (Exception ignore) { + + } + try { + EntaxyApplicationProject application = + (EntaxyApplicationProject) session.get(ApplicationShell.PROJECT_KEY); + if (application != null) + application.disgard(); + } catch (Exception ignore) { + + } + session.put(ApplicationShell.PROJECT_KEY, null); + session.put(ApplicationShell.PROJECT_VERSION_KEY, null); + } else { + // print error + System.err.println("Other application is being managed, please commit or cancel"); + return null; + } + } + + String[] data = application.split("@"); + + if (data.length < 2) { + // print error + System.err.println("Incorrect application specified"); + return null; + } + + String storageName = data[1]; + ApplicationStorage storage = applicationManager.getStorage(storageName); + if (storage == null) { + // print error + System.err.println("Incorrect storage specified: [" + storageName + "]"); + return null; + } + + if (!storage.isEnabled()) { + // print error + System.err.println("Storage is disabled: [" + storageName + "]"); + return null; + } + + String appName = data[0]; + EntaxyApplicationProject app = storage.getProject(appName); + if (app == null) { + // print error + System.err.println(String.format("Application [%s] not found in storage [%s]", appName, storageName)); + return null; + } + + session.put(ApplicationShell.PROJECT_KEY, app); + + return null; + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ProjectRemoveCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ProjectRemoveCommand.java new file mode 100644 index 00000000..4343a856 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/ProjectRemoveCommand.java @@ -0,0 +1,61 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.project; + +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 ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.exceptions.ProjectNotFoundException; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; +import ru.entaxy.platform.integration.applications.shell.StorageAwareCommand; + +@Service +@Command(name = "project-remove", scope = ApplicationShell.COMMAND_SCOPE) +public class ProjectRemoveCommand extends StorageAwareCommand { + + @Argument(name = "projectName", required = true, index = 1) + String projectName; + + @Override + protected void doExecute() { + try { + EntaxyApplicationProject project = applicationStorage.getProject(projectName); + if (project != null) { + applicationStorage.removeProject(project); + System.out.println("Removed successfully"); + } else { + throw new ProjectNotFoundException(projectName); + } + } catch (Exception e) { + // output error + System.err.println("ERROR: " + e.getMessage()); + e.printStackTrace(); + } + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionAddObject.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionAddObject.java new file mode 100644 index 00000000..4f1d7eb7 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionAddObject.java @@ -0,0 +1,61 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.project; + +import org.apache.karaf.shell.api.action.Argument; +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.Completion; +import org.apache.karaf.shell.api.action.lifecycle.Reference; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.integration.applications.ApplicationProjectItem; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProjectVersion; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; +import ru.entaxy.platform.integration.applications.shell.completers.EntaxyRuntimeObjectCompleter; +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObjectService; + +@Service +@Command(name = "project-version-add-object", scope = ApplicationShell.COMMAND_SCOPE) +public class VersionAddObject extends ManagedVersionCommand { + + @Argument(required = true) + @Completion(value = EntaxyRuntimeObjectCompleter.class) + String objectId; + + @Reference + EntaxyRuntimeObjectService entaxyRuntimeObjectService; + + @Override + protected void doExecute(EntaxyApplicationProject application, EntaxyApplicationProjectVersion version) { + + ApplicationProjectItem item = version.addObject(entaxyRuntimeObjectService.getRuntimeObject(objectId)); + if (item != null) + // print output + System.out.println("Item is added"); + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionAddResource.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionAddResource.java new file mode 100644 index 00000000..b8433ced --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionAddResource.java @@ -0,0 +1,64 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.project; + +import org.apache.karaf.shell.api.action.Argument; +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.lifecycle.Reference; +import org.apache.karaf.shell.api.action.lifecycle.Service; +import ru.entaxy.esb.resources.EntaxyResource; +import ru.entaxy.esb.resources.EntaxyResourceService; +import ru.entaxy.platform.integration.applications.ApplicationProjectItem; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProjectVersion; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +@Service +@Command(name = "project-version-add-resource", scope = ApplicationShell.COMMAND_SCOPE) +public class VersionAddResource extends ManagedVersionCommand { + + @Argument(required = true) + String location; + + @Reference + EntaxyResourceService entaxyResourceService; + + @Override + protected void doExecute(EntaxyApplicationProject application, EntaxyApplicationProjectVersion version) { + + EntaxyResource resource = entaxyResourceService.getResource(location); + + if (resource != null) { + ApplicationProjectItem item = version.addResource(resource); + if (item != null) + // print output + System.out.println("Item is added"); + } else { + System.err.println("Cannot find the resource located at " + location); + } + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionBuildCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionBuildCommand.java new file mode 100644 index 00000000..49155ca4 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionBuildCommand.java @@ -0,0 +1,56 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.project; + +import java.net.URL; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProjectVersion; +import ru.entaxy.platform.integration.applications.exceptions.ProjectVersionException; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +@Service +@Command(name = "project-version-build", scope = ApplicationShell.COMMAND_SCOPE) +public class VersionBuildCommand extends ManagedVersionCommand { + + @Override + protected void doExecute(EntaxyApplicationProject application, EntaxyApplicationProjectVersion version) { + try { + URL result = version.build(); + // print output + System.out.println("Result URL: ".concat(result == null ? "" : result.toString())); + } catch (ProjectVersionException e) { + // print error + System.err.println("ERROR: " + e.getMessage()); + e.printStackTrace(System.err); + } + + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionBuildInfoCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionBuildInfoCommand.java new file mode 100644 index 00000000..514b71dc --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionBuildInfoCommand.java @@ -0,0 +1,171 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.project; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.lifecycle.Reference; +import org.apache.karaf.shell.api.action.lifecycle.Service; +import org.apache.karaf.shell.support.ansi.SimpleAnsi; + +import ru.entaxy.esb.resources.EntaxyResource; +import ru.entaxy.esb.resources.EntaxyResourceService; +import ru.entaxy.platform.base.support.CommonUtils; +import ru.entaxy.platform.base.support.karaf.shell.ShellTableFixed; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProjectVersion; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationComponent; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationContentItem; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationDescriptor; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationRequirement; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject; +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObjectService; + +@Service +@Command(name = "project-version-build-info", scope = ApplicationShell.COMMAND_SCOPE) +public class VersionBuildInfoCommand extends ManagedVersionCommand { + + @Reference + EntaxyRuntimeObjectService entaxyRuntimeObjectService; + + @Reference + EntaxyResourceService entaxyResourceService; + + @Override + protected void doExecute(EntaxyApplicationProject application, EntaxyApplicationProjectVersion version) { + + if (!version.isBuildAvailable()) { + // print output + System.out.println("Build is not available"); + return; + } + + ApplicationDescriptor applicationDescriptor = version.getBuildInfo(); + + // output main data + String mainData = "\n" + .concat("Application : ").concat(applicationDescriptor.name).concat("\n") + .concat("Group : ").concat(applicationDescriptor.group).concat("\n") + .concat("Version : ").concat(applicationDescriptor.version).concat("\n") + .concat("Build by : ").concat(CommonUtils.getValid(applicationDescriptor.buildBy, "")).concat("\n") + .concat("Built on : ").concat(applicationDescriptor.buildOn).concat("\n") + .concat("Maven : ").concat(applicationDescriptor.mavenUrl).concat("\n") + .concat("Asset : ").concat(applicationDescriptor.mavenAsset).concat("\n"); + System.out.println(mainData); + + // output features location info + System.out.println(SimpleAnsi.RESET + SimpleAnsi.INTENSITY_NORMAL + "\n\t--- FEATURE REPO:"); + if (applicationDescriptor.features == null) { + System.out.println(":: NOT FOUND"); + } else { + String featuresData = + (" INTERNAL : ").concat(applicationDescriptor.features.internalLocation).concat("\n") + .concat(" ").concat("MAVEN : ").concat(applicationDescriptor.features.mavenLocation) + .concat("\n") + .concat(" ").concat("TARGET : ") + .concat(applicationDescriptor.features.getFullTargetLocation()); + System.out.println(featuresData); + + } + + // output items + System.out.println("\n\t--- ITEMS:"); + ShellTableFixed itemsTable = new ShellTableFixed(); + itemsTable.column("Id"); + itemsTable.column("Type"); + itemsTable.column("Component"); + + for (ApplicationContentItem item : applicationDescriptor.items) { + itemsTable.addRow().addContent(item.id, item.type.name(), item.componentId); + } + + itemsTable.print(System.out); + + // output requirements + System.out.println("\n\t--- REQUIREMENTS:"); + ShellTableFixed requirementsTable = new ShellTableFixed(); + requirementsTable.column("Id").colorProvider(ApplicationShell.normalColorProvider); + requirementsTable.column("Type").colorProvider(ApplicationShell.normalColorProvider); + requirementsTable.column("Scope").colorProvider(ApplicationShell.normalColorProvider); + requirementsTable.column("Status").colorProvider(ApplicationShell.requirementStatusColorProvider).alignCenter(); + + for (ApplicationRequirement req : applicationDescriptor.requirements) { + requirementsTable.addRow().addContent( + req.id, + req.type.name(), + req.scope.name(), + checkRequirement(req) ? "V" : "X"); + } + + requirementsTable.print(System.out); + + // output components + System.out.println(SimpleAnsi.RESET + SimpleAnsi.INTENSITY_NORMAL + "\n\t--- COMPONENTS:"); +/* ShellTableFixed componentsTable = new ShellTableFixed(); +componentsTable.column("Id"); +componentsTable.column("Type"); +componentsTable.column("Priority"); +componentsTable.column("Internal location"); +componentsTable.column("Maven location"); +*/ + for (ApplicationComponent component : applicationDescriptor.components) { +/* componentsTable.addRow().addContent( + component.id, + component.type.name(), + component.priority, + component.internalLocation, + component.mavenLocation); +*/ + String componentData = component.id.concat("\n") + .concat("\t").concat("TYPE : ").concat(component.type.name()).concat("\n") + .concat("\t").concat("PRIORITY : ").concat(component.priority + "").concat("\n") + .concat("\t").concat("INTERNAL : ").concat(component.internalLocation).concat("\n") + .concat("\t").concat("MAVEN : ").concat(component.mavenLocation).concat("\n") + .concat("\t").concat("TARGET : ").concat(component.getFullTargetLocation()); + System.out.println(componentData); + } + // componentsTable.print(System.out); + + } + + protected boolean checkRequirement(ApplicationRequirement requirement) { + switch (requirement.type) { + case OBJECT: + EntaxyRuntimeObject runtimeObject = entaxyRuntimeObjectService.getRuntimeObject(requirement.id); + return runtimeObject != null && !runtimeObject.isGhost(); + case RESOURCE: + EntaxyResource entaxyResource = entaxyResourceService.getResource(requirement.id); + return entaxyResource.exists(); + case BUNDLE: + case CONFIG: + // TODO implement + return true; + default: + return true; + } + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionCancelCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionCancelCommand.java new file mode 100644 index 00000000..9973d31d --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionCancelCommand.java @@ -0,0 +1,44 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.project; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProjectVersion; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +@Service +@Command(name = "project-version-cancel", scope = ApplicationShell.COMMAND_SCOPE) +public class VersionCancelCommand extends ManagedVersionCommand { + + @Override + protected void doExecute(EntaxyApplicationProject application, EntaxyApplicationProjectVersion version) { + session.put(ApplicationShell.PROJECT_VERSION_KEY, null); + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionCommitCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionCommitCommand.java new file mode 100644 index 00000000..eeac6b7b --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionCommitCommand.java @@ -0,0 +1,45 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.project; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProjectVersion; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +@Service +@Command(name = "project-version-commit", scope = ApplicationShell.COMMAND_SCOPE) +public class VersionCommitCommand extends ManagedVersionCommand { + + @Override + protected void doExecute(EntaxyApplicationProject application, EntaxyApplicationProjectVersion version) { + version.save(); + session.put(ApplicationShell.PROJECT_VERSION_KEY, null); + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionCreateCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionCreateCommand.java new file mode 100644 index 00000000..b9f7d940 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionCreateCommand.java @@ -0,0 +1,65 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.project; + +import org.apache.karaf.shell.api.action.Argument; +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.Completion; +import org.apache.karaf.shell.api.action.Option; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.base.support.CommonUtils; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.exceptions.ProjectVersionException; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; +import ru.entaxy.platform.integration.applications.shell.completers.ProjectVersionCompleter; + +@Service +@Command(name = "project-version-create", scope = ApplicationShell.COMMAND_SCOPE) +public class VersionCreateCommand extends ManagedProjectCommand { + + @Option(name = "-f", aliases = {"--from-version"}) + @Completion(value = ProjectVersionCompleter.class) + String fromVersion; + + @Argument(required = true) + String versionNumber; + + @Override + protected void doExecute(EntaxyApplicationProject application) { + try { + if (CommonUtils.isValid(fromVersion)) + application.createVersion(versionNumber, fromVersion); + else + application.createVersion(versionNumber); + } catch (ProjectVersionException e) { + // print error + System.err.println("ERROR: " + e.getMessage()); + e.printStackTrace(System.err); + } + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionExportToFileCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionExportToFileCommand.java new file mode 100644 index 00000000..1718c2cb --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionExportToFileCommand.java @@ -0,0 +1,58 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.project; + +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 ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProjectVersion; +import ru.entaxy.platform.integration.applications.exceptions.ProjectVersionException; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +@Service +@Command(name = "project-version-export-file", scope = ApplicationShell.COMMAND_SCOPE) +public class VersionExportToFileCommand extends ManagedVersionCommand { + + @Argument(required = true) + String filePath; + + @Override + protected void doExecute(EntaxyApplicationProject application, EntaxyApplicationProjectVersion version) { + try { + applicationManager.exportToFile(version, filePath); + // print output + System.out.println("Successfully exported"); + } catch (ProjectVersionException e) { + // print error + System.err.println("Error: " + e.getMessage()); + e.printStackTrace(System.err); + } + + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionExportToRepositoryCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionExportToRepositoryCommand.java new file mode 100644 index 00000000..ecbe74a5 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionExportToRepositoryCommand.java @@ -0,0 +1,61 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.project; + +import org.apache.karaf.shell.api.action.Argument; +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.Completion; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProjectVersion; +import ru.entaxy.platform.integration.applications.exceptions.ProjectVersionException; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; +import ru.entaxy.platform.integration.applications.shell.completers.RepositoryNameCompleter; + +@Service +@Command(name = "project-version-export-repository", scope = ApplicationShell.COMMAND_SCOPE) +public class VersionExportToRepositoryCommand extends ManagedVersionCommand { + + @Argument(required = true) + @Completion(value = RepositoryNameCompleter.class) + String repositoryName; + + @Override + protected void doExecute(EntaxyApplicationProject application, EntaxyApplicationProjectVersion version) { + try { + applicationManager.exportToRepository(version, repositoryName); + // print output + System.out.println("Successfully exported"); + } catch (ProjectVersionException e) { + // print error + System.err.println("Error: " + e.getMessage()); + e.printStackTrace(System.err); + } + + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionItemListCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionItemListCommand.java new file mode 100644 index 00000000..48eccac4 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionItemListCommand.java @@ -0,0 +1,86 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.project; + +import java.util.List; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.base.support.karaf.shell.ShellTableFixed; +import ru.entaxy.platform.integration.applications.ApplicationProjectItem; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProjectVersion; +import ru.entaxy.platform.integration.applications.item.project.EntaxyBundleItem; +import ru.entaxy.platform.integration.applications.item.project.EntaxyConfigItem; +import ru.entaxy.platform.integration.applications.item.project.EntaxyObjectItem; +import ru.entaxy.platform.integration.applications.item.project.EntaxyResourceItem; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; + +@Service +@Command(name = "project-version-items", scope = ApplicationShell.COMMAND_SCOPE) +public class VersionItemListCommand extends ManagedVersionCommand { + + @Override + protected void doExecute(EntaxyApplicationProject application, EntaxyApplicationProjectVersion version) { + List items = version.getItems(); + + ShellTableFixed table = new ShellTableFixed(); + table.column("Status").colorProvider(ApplicationShell.itemStatusColorProvider).alignCenter(); + table.column("Id").colorProvider(ApplicationShell.normalColorProvider); + table.column("Type").colorProvider(ApplicationShell.normalColorProvider); + table.column("Scope").colorProvider(ApplicationShell.normalColorProvider); + table.column("Required").colorProvider(ApplicationShell.normalColorProvider); + table.column("Ignored").colorProvider(ApplicationShell.normalColorProvider); + + for (ApplicationProjectItem item : items) { + String status = "+"; + if (item.isGhost()) + status = "?"; + if (item.isRequired()) + if (item.isIgnored()) + status = "-"; + else + status = "!"; + + String type = EntaxyConfigItem.class.isInstance(item) ? "config" + : EntaxyObjectItem.class.isInstance(item) ? "object" + : EntaxyBundleItem.class.isInstance(item) ? "bundle" + : EntaxyResourceItem.class.isInstance(item) ? "resource" : "unknown"; + + table.addRow().addContent(status, item.getId(), type, + item.getScope().name(), + item.isRequired() ? "*" : "", + item.isIgnored() ? "*" : ""); + + + } + + table.print(System.out); + + } + +} diff --git a/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionManageCommand.java b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionManageCommand.java new file mode 100644 index 00000000..5b694722 --- /dev/null +++ b/platform/integration/applications/application-shell/src/main/java/ru/entaxy/platform/integration/applications/shell/project/VersionManageCommand.java @@ -0,0 +1,64 @@ +/*- + * ~~~~~~licensing~~~~~~ + * application-shell + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.shell.project; + +import org.apache.karaf.shell.api.action.Argument; +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.Completion; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProjectVersion; +import ru.entaxy.platform.integration.applications.shell.ApplicationShell; +import ru.entaxy.platform.integration.applications.shell.completers.ProjectVersionCompleter; + +@Service +@Command(name = "project-version-manage", scope = ApplicationShell.COMMAND_SCOPE) +public class VersionManageCommand extends ManagedProjectCommand { + + @Argument(required = true) + @Completion(value = ProjectVersionCompleter.class) + String versionNumber; + + @Override + protected void doExecute(EntaxyApplicationProject application) { + if (session.get(ApplicationShell.PROJECT_VERSION_KEY) != null) { + // print error + System.err.println("Another version is being managed, please cancel or commit"); + return; + } + + EntaxyApplicationProjectVersion version = application.getVersion(versionNumber); + if (version == null) { + System.err.println("Version not found"); + return; + } + + session.put(ApplicationShell.PROJECT_VERSION_KEY, version); + + } + +} diff --git a/platform/integration/applications/pom.xml b/platform/integration/applications/pom.xml new file mode 100644 index 00000000..02289ed0 --- /dev/null +++ b/platform/integration/applications/pom.xml @@ -0,0 +1,34 @@ + + + 4.0.0 + + ru.entaxy.platform + integration + 1.11.0 + + ru.entaxy.platform.integration + applications + pom + ENTAXY :: PLATFORM :: INTEGRATION :: APPLICATIONS + ENTAXY :: PLATFORM :: INTEGRATION :: APPLICATIONS + + + + org.osgi + org.osgi.service.component.annotations + + + ru.entaxy.esb.platform.runtime.base + base-support + ${project.version} + + + + + application-api + application-impl + resource-based-storage + application-shell + application-management + + diff --git a/platform/integration/applications/resource-based-storage/LICENSE.txt b/platform/integration/applications/resource-based-storage/LICENSE.txt new file mode 100644 index 00000000..4ae94b75 --- /dev/null +++ b/platform/integration/applications/resource-based-storage/LICENSE.txt @@ -0,0 +1,175 @@ + ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ + +Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой) +версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего +Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН +7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова, +д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу +https://www.emdev.ru/about (далее - Компания). + +Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями» +(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения, +Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в +настоящем документе, в противном случае, он должен не использовать или не получать доступ +к Программному обеспечению. + + 1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ + +a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии +или редакции, исключительные права на которую принадлежат Правообладателю. +b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные +права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ +для ЭВМ № 2021610848 от 19.01.2021 года. +c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта +https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО. +d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также +личные неимущественные права авторов произведений на результат интеллектуальной деятельности. +e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование +ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка +включает предоставление Пользователю неисключительного права использования ПО, в том числе +получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение +патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается +Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается +для каждого Пользователя индивидуально в Сертификате. +f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром), +подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное +обеспечение в ограниченном объёме и на определённый период времени. +g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО, +предоставленных Пользователю согласно условиям Подписки. +h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного +обеспечения. +i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий +из одного или нескольких файлов, который может быть прочтён человеком. +j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля +программы, полученный в результате обработки исходного кода, еще не связанный в полную программу. +Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый +продукт. +k) Некоммерческое использование – индивидуальное личное использование Пользователем программного +обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации +возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая +выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения. + + 2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ + +2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного +обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом +воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения +в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ. +2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит +неисключительный характер. +2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию, +лицензия на ограниченное использование Программного обеспечения. +2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования +имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан +обратиться в службу поддержки Правообладателя по адресу: https://entaxy.ru/ для изменения +вида лицензии с Базовой бесплатной версии на Подписки. +2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для +пробного использования программного обеспечения – не ограничен. +2.6. Использование Пользователем настоящего программного обеспечения в целях разработки, +модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю, +без разрешения Правообладателя не допускается. + + 3. АВТОРСКОЕ ПРАВО. + +3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение +и любые его копии принадлежат Правообладателю. +3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента, +к которому можно получить доступ с помощью Программного обеспечения, является собственностью +соответствующего владельца контента и защищается применимым законодательством об авторском +праве или другими законами и договорами об интеллектуальной собственности. +3.3. Условия использования Программного обеспечения. +Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь +придерживается следующих условий: +3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять +какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании +Программного обеспечения или на нем. +3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать, +расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать +Программное обеспечение. +3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования +ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне. +3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено +использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам. + + 4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС» + +4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю +на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с +использованием Пользователем: +4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в +Программное обеспечение; +4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями +настоящего соглашения; +4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием, +или данными, не предоставленными Пользователю Правообладателем; +4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем. + + +5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ +ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ +И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ +ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ +И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ +ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО. + + 6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ. +НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ +ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ, +ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ; +ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ. +ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ +ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ; +КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ +ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ. + + 7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ: +Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия +(включая, но не ограничиваясь) по: +-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код) + Программного обеспечения; +-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный +код Программного обеспечения, за исключением тех изменений, которые вносятся средствами, +включёнными в Программное обеспечение и описанными непосредственно в документации к нему; +-созданию условий для использования Программного обеспечения лицами, не имеющими прав на +использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство +третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа +к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку; +-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию). + + 8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА. + +8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из +лицензионных продуктов, используемых на законных основаниях, а +именно https://entaxy.ru/libs/licenses/root-aggregated.deps. +8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть +совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения. +8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться +Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения, +содержащих все изменения и дополнения программного обеспечения. + + 9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ. + +9.1. Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым +программным обеспечением. +9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно +с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм +«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public. +9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий +пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя, +прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер +ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства +Российской Федерации. + + 10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ. + +10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет +право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб, +недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий +пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере +2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения +исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy). +10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое +законодательство – Российской Федерации. +10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным, +остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать +исполнять свои обязанности в соответствии с этими положениями. diff --git a/platform/integration/applications/resource-based-storage/pom.xml b/platform/integration/applications/resource-based-storage/pom.xml new file mode 100644 index 00000000..de19df17 --- /dev/null +++ b/platform/integration/applications/resource-based-storage/pom.xml @@ -0,0 +1,54 @@ + + 4.0.0 + + ru.entaxy.platform.integration + applications + 1.11.0 + + ru.entaxy.platform.integration.applications + resource-based-storage + bundle + ENTAXY :: PLATFORM :: INTEGRATION :: APPLICATIONS :: RESOURCE BASED STORAGE + ENTAXY :: PLATFORM :: INTEGRATION :: APPLICATIONS :: RESOURCE BASED STORAGE + + + + ru.entaxy.platform.integration.applications.storage.resource + + + ru.entaxy.platform.integration.applications.storage.resource.impl, + ru.entaxy.platform.integration.applications.storage.resource.impl.application, + ru.entaxy.platform.integration.applications.storage.resource.impl.project, + ru.entaxy.platform.integration.applications.storage.resource.internal + + + + + + ru.entaxy.esb.platform.runtime.base.resources + resources-api + ${project.version} + + + ru.entaxy.platform.integration.applications + application-api + ${project.version} + + + ru.entaxy.platform.integration.applications + application-impl + ${project.version} + + + com.google.code.gson + gson + + + commons-io + commons-io + ${commons-io.version} + + + + + diff --git a/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/ResourceBasedStorage.java b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/ResourceBasedStorage.java new file mode 100644 index 00000000..954f2fb8 --- /dev/null +++ b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/ResourceBasedStorage.java @@ -0,0 +1,210 @@ +/*- + * ~~~~~~licensing~~~~~~ + * resource-based-storage + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.storage.resource; + +import java.util.List; +import java.util.stream.Collectors; + +import ru.entaxy.esb.resources.EntaxyResource; +import ru.entaxy.esb.resources.EntaxyResourceMetadata; +import ru.entaxy.esb.resources.EntaxyResourceService; +import ru.entaxy.platform.base.support.CommonUtils; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.exceptions.ApplicationException; +import ru.entaxy.platform.integration.applications.exceptions.ApplicationNotFoundException; +import ru.entaxy.platform.integration.applications.exceptions.ProjectAlreadyExistsException; +import ru.entaxy.platform.integration.applications.exceptions.ProjectException; +import ru.entaxy.platform.integration.applications.exceptions.ProjectNotFoundException; +import ru.entaxy.platform.integration.applications.exceptions.StorageException; +import ru.entaxy.platform.integration.applications.storage.AbstractApplicationStorage; +import ru.entaxy.platform.integration.applications.storage.resource.impl.ResourceContext; +import ru.entaxy.platform.integration.applications.storage.resource.impl.StorageComponent; +import ru.entaxy.platform.integration.applications.storage.resource.impl.application.ApplicationComponent; +import ru.entaxy.platform.integration.applications.storage.resource.impl.project.ProjectComponent; + +public class ResourceBasedStorage extends AbstractApplicationStorage { + + protected String resourceProvider; + protected String path; + + protected EntaxyResourceService entaxyResourceService; + + protected EntaxyResource rootResourceFolder; + protected EntaxyResourceMetadata rootResourceFolderMetadata; + protected EntaxyResourceMetadata.MetadataSection rootMetaStorageSection; + + protected String rootResourceFolderUrl; + + boolean isInited = false; + + protected StorageComponent storageComponent; + + protected ResourceContext rootResourceContext; + + protected interface RootMetaProps { + String PROP_ENABLED = "enabled"; + } + + public String getResourceProvider() { + return resourceProvider; + } + + public void setResourceProvider(String resourceProvider) { + this.resourceProvider = resourceProvider; + updateResourceFolderUrl(); + setInfo("provider", this.resourceProvider); + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + updateResourceFolderUrl(); + setInfo("path", this.path); + } + + protected void updateResourceFolderUrl() { + this.rootResourceFolderUrl = + CommonUtils.getValid(resourceProvider, "").concat(":").concat(CommonUtils.getValid(path, "")); + } + + public void setEntaxyResourceService(EntaxyResourceService entaxyResourceService) { + this.entaxyResourceService = entaxyResourceService; + } + + public void init() { + rootResourceContext = new ResourceContext(); + rootResourceContext.setEntaxyResourceService(entaxyResourceService); + rootResourceContext.setRootResourceFolderUrl(rootResourceFolderUrl); + rootResourceContext.init(); + storageComponent = new StorageComponent(rootResourceContext, name); + storageComponent.init(); + isInited = true; + } + + @Override + public void setEnabled(boolean isEnabled) { + super.setEnabled(isEnabled); + if (!isInited) + return; + rootMetaStorageSection.getContent().remove(RootMetaProps.PROP_ENABLED); + rootMetaStorageSection.getContent().addProperty(RootMetaProps.PROP_ENABLED, isEnabled()); + rootResourceFolderMetadata.update(); + } + + protected String getApplicationUrl(String applicationName) { + return rootResourceFolderUrl.concat("/").concat(applicationName); + } + + protected boolean projectExists(String projectName) { + return storageComponent.projectExists(projectName); + } + + protected boolean applicationExists(String applicationName) { + return storageComponent.applicationExists(applicationName); + } + + /* ApplicationStorage implementation */ + + @Override + public String getType() { + return "resource"; + } + + @Override + public List getProjects() { + return storageComponent.getProjects().stream().map(cmp -> cmp.storage(this)) + .map(cmp -> (EntaxyApplicationProject) cmp).collect(Collectors.toList()); + } + + @Override + public void addProject(EntaxyApplicationProject project) throws ProjectException, StorageException { + if (projectExists(project.getName())) + throw new ProjectAlreadyExistsException(project.getName()); + storageComponent.addProject(project); + } + + @Override + public void removeProject(EntaxyApplicationProject project) + throws ProjectException, StorageException { + if (project == null) + throw new ProjectNotFoundException("Unknown"); + if (!projectExists(project.getName())) + throw new ProjectNotFoundException(project.getName()); + storageComponent.removeProject(project); + } + + @Override + public EntaxyApplicationProject createProject(String applicationName) + throws ProjectException, StorageException { + if (projectExists(applicationName)) + throw new ProjectAlreadyExistsException(applicationName); + return storageComponent.createProject(applicationName).storage(this); + } + + @Override + public EntaxyApplicationProject getProject(String applicationName) { + ProjectComponent comp = storageComponent.getProject(applicationName); + if (comp == null) + return null; + return comp.storage(this); + } + + @Override + public List getApplications() { + return storageComponent.getApplications().stream().map(cmp -> cmp.storage(this)) + .map(cmp -> (EntaxyApplication) cmp).collect(Collectors.toList()); + } + + @Override + public EntaxyApplication getApplication(String applicationName) { + ApplicationComponent comp = storageComponent.getApplication(applicationName); + if (comp == null) + return null; + return comp.storage(this); + } + + @Override + public void removeApplication(EntaxyApplication application) throws ApplicationException, StorageException { + if (application == null) + throw new ApplicationNotFoundException("unknown"); + if (!applicationExists(application.getName())) + throw new ApplicationNotFoundException(application.getName()); + storageComponent.removeApplication(application); + } + + @Override + public EntaxyApplication createApplication(ApplicationImportContent content) + throws ApplicationException, StorageException { + return storageComponent.createApplication(content); + } + + + +} diff --git a/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/AbstractResourceComponent.java b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/AbstractResourceComponent.java new file mode 100644 index 00000000..87fbef40 --- /dev/null +++ b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/AbstractResourceComponent.java @@ -0,0 +1,185 @@ +/*- + * ~~~~~~licensing~~~~~~ + * resource-based-storage + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.storage.resource.impl; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; + +import ru.entaxy.esb.resources.EntaxyResource; +import ru.entaxy.esb.resources.EntaxyResourceMetadata; +import ru.entaxy.platform.base.support.JSONUtils; + +public abstract class AbstractResourceComponent { + + private static final Logger log = LoggerFactory.getLogger(AbstractResourceComponent.class); + + protected static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); + + protected ResourceContext resourceContext; + + // protected EntaxyResourceService entaxyResourceService; + + // protected EntaxyResource rootResourceFolder; + protected EntaxyResourceMetadata rootResourceFolderMetadata; + + protected EntaxyResource rootResource; + + // protected String rootResourceFolderUrl; + protected String rootResourceUrl; + + protected boolean isInited = false; + + protected T dataObject; + + protected abstract Class getDataObjectClass(); + + protected abstract String getRootResourceName(); + + protected abstract T createDataObject(); + + /* + protected AbstractResourceComponent(EntaxyResourceService entaxyResourceService) { + super(); + setEntaxyResourceService(entaxyResourceService); + } + */ + + protected AbstractResourceComponent(ResourceContext resourceContext) { + super(); + this.resourceContext = resourceContext; + this.resourceContext.init(); + } + + + protected T loadDataObject(JsonObject jsonObject) { + return GSON.fromJson(jsonObject, getDataObjectClass()); + }; + + protected void initializeRootResource() throws Exception { + dataObject = createDataObject(); + updateRootResource(); + } + + protected void initializeDataObject() throws Exception { + try (InputStream is = rootResource.getInputStream()) { + String data = new String(is.readAllBytes()); + dataObject = GSON.fromJson(JSONUtils.getJsonRootObject(data), getDataObjectClass()); + } + } + + protected void updateRootResource() throws Exception { + JsonObject jsonObject = GSON.toJsonTree(dataObject).getAsJsonObject(); + String data = GSON.toJson(jsonObject); + try (ByteArrayInputStream bis = new ByteArrayInputStream(data.getBytes())) { + rootResource.save(bis); + } catch (Exception e) { + throw e; + } + } + + protected EntaxyResource getResource(String relPath) { + /* + String targetUrl = rootResourceFolderUrl; + if (rootResourceFolderUrl.charAt(rootResourceFolderUrl.length() - 1) != '/') + targetUrl = targetUrl.concat("/"); + if (relPath.charAt(0) == '/') + targetUrl = targetUrl.concat(relPath.substring(1)); + else + targetUrl = targetUrl.concat(relPath); + EntaxyResource result = entaxyResourceService.getResource(targetUrl); + return result; + */ + return resourceContext.getResource(relPath); + } + + public void init() { + + // rootResourceFolder = entaxyResourceService.getResource(rootResourceFolderUrl); + + // rootResource = entaxyResourceService + // .getResource(rootResourceFolder.getURL().concat("/").concat(getRootResourceName())); + rootResource = resourceContext.getResource(getRootResourceName()); + if (!rootResource.exists()) { + try { + initializeRootResource(); + } catch (Exception ignore) { + + } + } else { + try { + initializeDataObject(); + } catch (Exception e) { + log.error("Error reading data from [" + rootResource.getURL() + "]", e); + return; + } + } + + rootResourceFolderMetadata = resourceContext.getRootResourceFolder().getMetadata(true); + + isInited = true; + + } + + public ResourceContext getResourceContext() { + return resourceContext; + } + + public void save() { + + } + + public void delete() { + if (!isInited) + return; + resourceContext.getRootResourceFolder().delete(); + } + + /* + public void setEntaxyResourceService(EntaxyResourceService entaxyResourceService) { + this.entaxyResourceService = entaxyResourceService; + } + */ + + public String getRootResourceFolderUrl() { + return resourceContext.getRootResourceFolderUrl(); + } + + /* + public void setRootResourceFolderUrl(String rootResourceFolderUrl) { + this.rootResourceFolderUrl = rootResourceFolderUrl; + } + */ + + public abstract String getComponentKey(); + +} diff --git a/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/AbstractResourceComponentWithChildren.java b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/AbstractResourceComponentWithChildren.java new file mode 100644 index 00000000..d3d5d8e7 --- /dev/null +++ b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/AbstractResourceComponentWithChildren.java @@ -0,0 +1,109 @@ +/*- + * ~~~~~~licensing~~~~~~ + * resource-based-storage + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.storage.resource.impl; + +import java.util.List; + +public abstract class AbstractResourceComponentWithChildren> + extends AbstractResourceComponent { + + + final protected ComponentCache childrenCache = new ComponentCache<>(); + + final protected Object childrenCacheLock = new Object(); + + /* + protected AbstractResourceComponentWithChildren(EntaxyResourceService entaxyResourceService) { + super(entaxyResourceService); + } + */ + + protected AbstractResourceComponentWithChildren(ResourceContext resourceContext) { + super(resourceContext); + } + + @Override + public void init() { + super.init(); + initChildrenCache(); + } + + protected void initChildrenCache() { + synchronized (childrenCacheLock) { + for (String key : getChildrenKeyList()) { + try { + C component = loadChild(key); + if (component == null) + continue; + childrenCache.put(component); + } catch (Exception e) { + handleChildLoadException(key, e); + } + } + } + } + + protected C loadChild(String key) throws Exception { + C component = createChildComponent(key); + if (component == null) + return null; + component.init(); + return component; + } + + protected C createNewChild(String key) throws Exception { + C component = createChildComponent(key); + component.init(); + synchronized (childrenCacheLock) { + addChildKey(key); + updateRootResource(); + childrenCache.put(component); + } + return component; + } + + protected void removeChild(String key) throws Exception { + synchronized (childrenCacheLock) { + C component = childrenCache.get(key); + if (component == null) + return; + component.delete(); + childrenCache.remove(key); + removeChildKey(key); + updateRootResource(); + } + } + + protected abstract C createChildComponent(String key) throws Exception; + + protected abstract List getChildrenKeyList(); + + protected abstract void addChildKey(String key); + + protected abstract void removeChildKey(String key); + + protected abstract void handleChildLoadException(String key, Exception e); +} diff --git a/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/ApplicationStorageComponent.java b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/ApplicationStorageComponent.java new file mode 100644 index 00000000..7b132aad --- /dev/null +++ b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/ApplicationStorageComponent.java @@ -0,0 +1,246 @@ +/*- + * ~~~~~~licensing~~~~~~ + * resource-based-storage + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.storage.resource.impl; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ru.entaxy.platform.integration.applications.ApplicationStorage.ApplicationImportContent; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationVersion; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationDescriptor; +import ru.entaxy.platform.integration.applications.exceptions.ApplicationCausedException; +import ru.entaxy.platform.integration.applications.exceptions.ApplicationException; +import ru.entaxy.platform.integration.applications.exceptions.ApplicationImportCausedException; +import ru.entaxy.platform.integration.applications.exceptions.ApplicationVersionAlreadyExists; +import ru.entaxy.platform.integration.applications.exceptions.StorageException; +import ru.entaxy.platform.integration.applications.impl.ExportImportHelper.ApplicationImporter; +import ru.entaxy.platform.integration.applications.impl.StorageApplicationContentAdapter; +import ru.entaxy.platform.integration.applications.impl.StorageImportAdapter; +import ru.entaxy.platform.integration.applications.storage.resource.impl.application.ApplicationComponent; +import ru.entaxy.platform.integration.applications.storage.resource.impl.application.ApplicationVersionComponent; + +public class ApplicationStorageComponent extends AbstractResourceComponent + implements StorageImportAdapter { + + private static final Logger LOG = LoggerFactory.getLogger(ApplicationStorageComponent.class); + + final protected Map applicationCache = new HashMap<>(); + + protected Object applicationCacheLock = new Object(); + + /* + public ApplicationStorageComponent(EntaxyResourceService entaxyResourceService, String parentRootUrl) { + super(entaxyResourceService); + this.rootResourceFolderUrl = parentRootUrl.concat("/").concat("applications"); + } + */ + + public ApplicationStorageComponent(ResourceContext parentResourceContext) { + super(parentResourceContext.subcontext("applications")); + } + + @Override + protected Class getDataObjectClass() { + return ApplicationStorageData.class; + } + + @Override + protected String getRootResourceName() { + return ".applications"; + } + + @Override + protected ApplicationStorageData createDataObject() { + return new ApplicationStorageData(); + } + + @Override + public String getComponentKey() { + return "applications"; + } + + @Override + public void init() { + super.init(); + initializeApplicationCache(); + } + + protected void initializeApplicationCache() { + synchronized (applicationCacheLock) { + if (dataObject.applications == null) + return; + for (String applicationName : dataObject.applications) { + ApplicationComponent comp = loadApplication(applicationName); + if (comp != null) + applicationCache.put(comp.getName(), comp); + } + } + } + + protected ApplicationComponent loadApplication(String applicationName) { + try { + ApplicationComponent component = + new ApplicationComponent(resourceContext, applicationName); + component.init(); + return component; + } catch (Exception e) { + LOG.error("Error loading application [" + applicationName + "]", e); + } + return null; + } + + public boolean applicationExists(String applicationName) { + return dataObject.hasApplication(applicationName); + } + + public List getApplications() { + return new ArrayList<>(applicationCache.values()); + } + + public ApplicationComponent getApplication(String applicationName) { + return applicationCache.get(applicationName); + } + + protected ApplicationComponent getOrCreateApplication(String applicationName) + throws ApplicationException, StorageException { + ApplicationComponent result = getApplication(applicationName); + if (result != null) + return result; + result = createApplication(applicationName); + return result; + } + + public void addApplication(EntaxyApplication application) throws ApplicationException, StorageException { + // TODO Auto-generated method stub + + } + + public void removeApplication(EntaxyApplication application) + throws ApplicationException, StorageException { + synchronized (applicationCacheLock) { + String applicationName = application.getName(); + ApplicationComponent comp = applicationCache.get(applicationName); + if (comp == null) + return; + comp.delete(); + applicationCache.remove(applicationName); + dataObject.removeApplication(applicationName); + try { + updateRootResource(); + } catch (Exception e) { + LOG.error("Error removing application [" + applicationName + "]", e); + } + } + } + + protected ApplicationComponent createApplication(String applicationName) + throws ApplicationException, StorageException { + try { + ApplicationComponent component = + new ApplicationComponent(resourceContext, applicationName); + component.init(); + synchronized (applicationCacheLock) { + dataObject.addApplication(applicationName); + updateRootResource(); + applicationCache.put(component.getName(), component); + } + return component; + } catch (Exception e) { + LOG.error("Error creating application [" + applicationName + "]", e); + } + return null; + } + + public ApplicationComponent createApplication(ApplicationImportContent importContent) + throws ApplicationException, StorageException { + + ApplicationImporter applicationImporter = new ApplicationImporter(this); + String applicationName = "unknown"; + try { + applicationImporter.executeImport(importContent); + return getApplication(applicationImporter.getApplicationDescriptor().name); + } catch (ApplicationException ae) { + throw ae; + } catch (StorageException se) { + throw se; + } catch (Exception e) { + throw new ApplicationImportCausedException(applicationName, e); + } + } + + // StorageImportAdapter implementation + + @Override + public void checkDescriptor(ApplicationDescriptor applicationDescriptor) + throws ApplicationException, StorageException { + String applicationName = applicationDescriptor.name; + String applicationVersion = applicationDescriptor.version; + ApplicationComponent appComponent = getApplication(applicationName); + if (appComponent == null) + return; + if (appComponent.hasVersion(applicationVersion)) + throw new ApplicationVersionAlreadyExists(applicationName, applicationVersion); + } + + @Override + public StorageApplicationContentAdapter getContentAdapter(String applicationName, + ApplicationDescriptor applicationDescriptor) throws ApplicationException, StorageException { + String applicationVersion = applicationDescriptor.version; + + ApplicationComponent applicationComponent = getOrCreateApplication(applicationName); + try { + if (applicationComponent.hasVersion(applicationVersion)) + throw new ApplicationVersionAlreadyExists(applicationName, applicationVersion); + ApplicationVersionComponent versionComponent = + applicationComponent.createVersion(applicationVersion); + versionComponent.setDescriptor(applicationDescriptor); + versionComponent.init(); + versionComponent.save(); + return versionComponent.adapt(); + } catch (ApplicationException | StorageException rethrow) { + throw rethrow; + } catch (Exception e) { + throw new ApplicationCausedException(applicationName, e); + } + + } + + @Override + public EntaxyApplicationVersion getVersion(String applicationName, String version) + throws ApplicationException, StorageException { + ApplicationComponent appComp = getApplication(applicationName); + if (appComp == null) + return null; + return appComp.getVersion(version); + } + +} diff --git a/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/ApplicationStorageData.java b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/ApplicationStorageData.java new file mode 100644 index 00000000..54a64063 --- /dev/null +++ b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/ApplicationStorageData.java @@ -0,0 +1,52 @@ +/*- + * ~~~~~~licensing~~~~~~ + * resource-based-storage + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.storage.resource.impl; + +import java.util.ArrayList; +import java.util.List; + +public class ApplicationStorageData { + + List applications; + + public void addApplication(String applicationName) { + if (applications == null) + applications = new ArrayList<>(); + applications.add(applicationName); + } + + public void removeApplication(String applicationName) { + if (applications != null) + applications.remove(applicationName); + } + + public boolean hasApplication(String applicationName) { + if (applications == null) + return false; + return applications.contains(applicationName); + } + +} diff --git a/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/ComponentCache.java b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/ComponentCache.java new file mode 100644 index 00000000..fef3be88 --- /dev/null +++ b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/ComponentCache.java @@ -0,0 +1,107 @@ +/*- + * ~~~~~~licensing~~~~~~ + * resource-based-storage + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.storage.resource.impl; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +public class ComponentCache> implements Map { + + final protected Map cache = new HashMap<>(); + + synchronized public T put(T value) { + return cache.put(value.getComponentKey(), value); + } + + public boolean has(T value) { + return cache.containsKey(value.getComponentKey()); + } + + @Override + public int size() { + return cache.size(); + } + + @Override + public boolean isEmpty() { + return cache.isEmpty(); + } + + @Override + public boolean containsKey(Object key) { + return cache.containsKey(key); + } + + @Override + public boolean containsValue(Object value) { + return cache.containsValue(value); + } + + @Override + public T get(Object key) { + return cache.get(key); + } + + @Override + synchronized public T put(String key, T value) { + return cache.put(key, value); + } + + @Override + synchronized public T remove(Object key) { + return cache.remove(key); + } + + @Override + synchronized public void putAll(Map m) { + cache.putAll(m); + } + + @Override + synchronized public void clear() { + cache.clear(); + } + + @Override + public Set keySet() { + return cache.keySet(); + } + + @Override + public Collection values() { + return cache.values(); + } + + @Override + public Set> entrySet() { + return cache.entrySet(); + } + + + +} diff --git a/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/ProjectStorageComponent.java b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/ProjectStorageComponent.java new file mode 100644 index 00000000..1a5328b2 --- /dev/null +++ b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/ProjectStorageComponent.java @@ -0,0 +1,164 @@ +/*- + * ~~~~~~licensing~~~~~~ + * resource-based-storage + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.storage.resource.impl; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.exceptions.ProjectException; +import ru.entaxy.platform.integration.applications.exceptions.StorageException; +import ru.entaxy.platform.integration.applications.storage.resource.impl.project.ProjectComponent; + +public class ProjectStorageComponent extends AbstractResourceComponent { + + private static final Logger LOG = LoggerFactory.getLogger(ProjectStorageComponent.class); + + final protected Map projectCache = new HashMap<>(); + + protected Object projectCacheLock = new Object(); + + /* + public ProjectStorageComponent(EntaxyResourceService entaxyResourceService, String parentRootUrl) { + super(entaxyResourceService); + this.rootResourceFolderUrl = parentRootUrl.concat("/").concat("projects"); + } + */ + + public ProjectStorageComponent(ResourceContext parentResourceContext) { + super(parentResourceContext.subcontext("projects")); + } + + @Override + protected Class getDataObjectClass() { + return ProjectStorageData.class; + } + + @Override + protected String getRootResourceName() { + return ".projects"; + } + + @Override + protected ProjectStorageData createDataObject() { + return new ProjectStorageData(); + } + + @Override + public String getComponentKey() { + return "projects"; + } + + @Override + public void init() { + super.init(); + initializeProjectCache(); + } + + protected void initializeProjectCache() { + synchronized (projectCacheLock) { + if (dataObject.projects == null) + return; + for (String projectName : dataObject.projects) { + ProjectComponent comp = loadProject(projectName); + if (comp != null) + projectCache.put(comp.getName(), comp); + } + } + } + + protected ProjectComponent loadProject(String projectName) { + try { + ProjectComponent component = + new ProjectComponent(resourceContext, projectName); + component.init(); + return component; + } catch (Exception e) { + LOG.error("Error creating project [" + projectName + "]", e); + } + return null; + } + + public boolean projectExists(String projectName) { + return dataObject.hasProject(projectName); + } + + public List getProjects() { + return new ArrayList<>(projectCache.values()); + } + + public ProjectComponent getProject(String projectName) { + return projectCache.get(projectName); + } + + public void addProject(EntaxyApplicationProject project) throws ProjectException, StorageException { + // TODO Auto-generated method stub + + } + + public void removeProject(EntaxyApplicationProject project) + throws ProjectException, StorageException { + synchronized (projectCacheLock) { + String projectName = project.getName(); + ProjectComponent comp = projectCache.get(projectName); + if (comp == null) + return; + comp.delete(); + projectCache.remove(projectName); + dataObject.removeProject(projectName); + try { + updateRootResource(); + } catch (Exception e) { + LOG.error("Error removing project [" + projectName + "]", e); + } + } + } + + public ProjectComponent createProject(String projectName) + throws ProjectException, StorageException { + try { + ProjectComponent component = + new ProjectComponent(resourceContext, projectName); + component.init(); + synchronized (projectCacheLock) { + dataObject.addProject(component.getName()); + updateRootResource(); + projectCache.put(component.getName(), component); + } + return component; + } catch (Exception e) { + LOG.error("Error creating project [" + projectName + "]", e); + } + return null; + } + + +} diff --git a/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/ProjectStorageData.java b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/ProjectStorageData.java new file mode 100644 index 00000000..aaf59661 --- /dev/null +++ b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/ProjectStorageData.java @@ -0,0 +1,52 @@ +/*- + * ~~~~~~licensing~~~~~~ + * resource-based-storage + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.storage.resource.impl; + +import java.util.ArrayList; +import java.util.List; + +public class ProjectStorageData { + + List projects; + + public void addProject(String projectName) { + if (projects == null) + projects = new ArrayList<>(); + projects.add(projectName); + } + + public void removeProject(String projectName) { + if (projects != null) + projects.remove(projectName); + } + + public boolean hasProject(String projectName) { + if (projects == null) + return false; + return projects.contains(projectName); + } + +} diff --git a/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/ResourceContext.java b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/ResourceContext.java new file mode 100644 index 00000000..da62f71f --- /dev/null +++ b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/ResourceContext.java @@ -0,0 +1,98 @@ +/*- + * ~~~~~~licensing~~~~~~ + * resource-based-storage + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.storage.resource.impl; + +import ru.entaxy.esb.resources.EntaxyResource; +import ru.entaxy.esb.resources.EntaxyResourceService; + +public class ResourceContext { + + protected EntaxyResourceService entaxyResourceService; + + protected EntaxyResource rootResourceFolder; + + protected String rootResourceFolderUrl; + + protected ResourceContext parent = null; + + public ResourceContext() { + super(); + } + + public ResourceContext(ResourceContext parent) { + super(); + this.parent = parent; + } + + public void init() { + EntaxyResourceService resourceService = getEntaxyResourceService(); + if (resourceService != null) + this.rootResourceFolder = resourceService.getResource(rootResourceFolderUrl); + } + + public EntaxyResourceService getEntaxyResourceService() { + if (entaxyResourceService != null) + return entaxyResourceService; + if (parent != null) + return parent.getEntaxyResourceService(); + return null; + } + + public void setEntaxyResourceService(EntaxyResourceService entaxyResourceService) { + this.entaxyResourceService = entaxyResourceService; + } + + public EntaxyResource getRootResourceFolder() { + return rootResourceFolder; + } + + public String getRootResourceFolderUrl() { + return rootResourceFolderUrl; + } + + public void setRootResourceFolderUrl(String rootResourceFolderUrl) { + this.rootResourceFolderUrl = rootResourceFolderUrl; + } + + public EntaxyResource getResource(String relPath) { + String targetUrl = rootResourceFolderUrl; + if (rootResourceFolderUrl.charAt(rootResourceFolderUrl.length() - 1) != '/') + targetUrl = targetUrl.concat("/"); + if (relPath.charAt(0) == '/') + targetUrl = targetUrl.concat(relPath.substring(1)); + else + targetUrl = targetUrl.concat(relPath); + EntaxyResource result = getEntaxyResourceService().getResource(targetUrl); + return result; + } + + public ResourceContext subcontext(String subPath) { + ResourceContext result = new ResourceContext(this); + result.setRootResourceFolderUrl(rootResourceFolderUrl.concat("/").concat(subPath)); + return result; + } + +} diff --git a/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/StorageComponent.java b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/StorageComponent.java new file mode 100644 index 00000000..df5da676 --- /dev/null +++ b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/StorageComponent.java @@ -0,0 +1,154 @@ +/*- + * ~~~~~~licensing~~~~~~ + * resource-based-storage + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.storage.resource.impl; + +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ru.entaxy.platform.integration.applications.ApplicationStorage.ApplicationImportContent; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.exceptions.ApplicationException; +import ru.entaxy.platform.integration.applications.exceptions.ProjectException; +import ru.entaxy.platform.integration.applications.exceptions.StorageException; +import ru.entaxy.platform.integration.applications.storage.resource.impl.application.ApplicationComponent; +import ru.entaxy.platform.integration.applications.storage.resource.impl.project.ProjectComponent; + +public class StorageComponent extends AbstractResourceComponent { + + private static final Logger log = LoggerFactory.getLogger(StorageComponent.class); + + String storageName; + + protected ProjectStorageComponent projectStorageComponent; + + protected ApplicationStorageComponent applicationStorageComponent; + + /* + public StorageComponent(EntaxyResourceService entaxyResourceService, String storageName, String rootFolderUrl) { + super(entaxyResourceService); + this.storageName = storageName; + this.rootResourceFolderUrl = rootFolderUrl; + projectStorageComponent = new ProjectStorageComponent(entaxyResourceService, rootResourceFolderUrl); + applicationStorageComponent = new ApplicationStorageComponent(entaxyResourceService, rootResourceFolderUrl); + } + */ + + public StorageComponent(ResourceContext resourceContext, String storageName) { + super(resourceContext); + this.storageName = storageName; + projectStorageComponent = new ProjectStorageComponent(resourceContext); + applicationStorageComponent = new ApplicationStorageComponent(resourceContext); + } + + @Override + public String getComponentKey() { + return storageName; + } + + @Override + public void init() { + super.init(); + projectStorageComponent.init(); + applicationStorageComponent.init(); + } + + @Override + protected Class getDataObjectClass() { + return StorageData.class; + } + + @Override + protected String getRootResourceName() { + return ".storage"; + } + + @Override + protected StorageData createDataObject() { + return new StorageData(storageName); + } + + public boolean applicationExists(String applicationName) { + return applicationStorageComponent.applicationExists(applicationName); + } + + public List getApplications() { + return applicationStorageComponent.getApplications(); + } + + public ApplicationComponent getApplication(String applicationName) { + return applicationStorageComponent.getApplication(applicationName); + } + + public void addApplication(EntaxyApplication application) throws ApplicationException, StorageException { + applicationStorageComponent.addApplication(application); + } + + public void removeApplication(EntaxyApplication application) + throws ApplicationException, StorageException { + applicationStorageComponent.removeApplication(application); + } + + public ApplicationComponent createApplication(String applicationName) + throws ApplicationException, StorageException { + return applicationStorageComponent.createApplication(applicationName); + } + + public ApplicationComponent createApplication(ApplicationImportContent importContent) + throws ApplicationException, StorageException { + return applicationStorageComponent.createApplication(importContent); + } + + public boolean projectExists(String projectName) { + return projectStorageComponent.projectExists(projectName); + } + + public List getProjects() { + return projectStorageComponent.getProjects(); + } + + public ProjectComponent getProject(String projectName) { + return projectStorageComponent.getProject(projectName); + } + + public void addProject(EntaxyApplicationProject project) throws ProjectException, StorageException { + projectStorageComponent.addProject(project); + } + + public void removeProject(EntaxyApplicationProject project) + throws ProjectException, StorageException { + projectStorageComponent.removeProject(project); + } + + public ProjectComponent createProject(String projectName) + throws ProjectException, StorageException { + return projectStorageComponent.createProject(projectName); + } + + +} diff --git a/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/StorageData.java b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/StorageData.java new file mode 100644 index 00000000..e660105e --- /dev/null +++ b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/StorageData.java @@ -0,0 +1,37 @@ +/*- + * ~~~~~~licensing~~~~~~ + * resource-based-storage + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.storage.resource.impl; + +public class StorageData { + + boolean enabled = true; + String name; + + public StorageData(String name) { + this.name = name; + } + +} diff --git a/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/ApplicationComponent.java b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/ApplicationComponent.java new file mode 100644 index 00000000..97a9ca14 --- /dev/null +++ b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/ApplicationComponent.java @@ -0,0 +1,173 @@ +/*- + * ~~~~~~licensing~~~~~~ + * resource-based-storage + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.storage.resource.impl.application; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ru.entaxy.platform.integration.applications.ApplicationStorage; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationVersion; +import ru.entaxy.platform.integration.applications.exceptions.ApplicationVersionAlreadyExists; +import ru.entaxy.platform.integration.applications.storage.resource.impl.AbstractResourceComponentWithChildren; +import ru.entaxy.platform.integration.applications.storage.resource.impl.ResourceContext; + +public class ApplicationComponent + extends AbstractResourceComponentWithChildren + implements EntaxyApplication { + + private static final Logger log = LoggerFactory.getLogger(ApplicationComponent.class); + + protected String applicationName; + + protected ApplicationStorage applicationStorage; + + /* + public ApplicationComponent(EntaxyResourceService resourceService, String applicationName, String parentRootUrl) { + super(resourceService); + setEntaxyResourceService(resourceService); + this.applicationName = applicationName; + this.rootResourceFolderUrl = parentRootUrl.concat("/").concat(applicationName); + } + */ + + public ApplicationComponent(ResourceContext resourceContext, String applicationName) { + super(resourceContext.subcontext(applicationName)); + this.applicationName = applicationName; + } + + @Override + protected Class getDataObjectClass() { + return ApplicationData.class; + } + + @Override + protected String getRootResourceName() { + return ".application"; + } + + @Override + protected ApplicationData createDataObject() { + return new ApplicationData(applicationName); + } + + @Override + public String getComponentKey() { + return applicationName; + } + + @Override + protected ApplicationVersionComponent createChildComponent(String key) throws Exception { + return new ApplicationVersionComponent(resourceContext, key, this); + } + + @Override + protected List getChildrenKeyList() { + if (dataObject.versions == null) + return Collections.emptyList(); + return new ArrayList<>(dataObject.versions.keySet()); + } + + @Override + protected void addChildKey(String key) { + dataObject.addVersion(key, Calendar.getInstance().getTimeInMillis() + ""); + } + + @Override + protected void removeChildKey(String key) { + dataObject.removeVersion(key); + } + + @Override + protected void handleChildLoadException(String key, Exception e) { + log.error("Error loading version [" + key + "]", e); + } + + public ApplicationVersionComponent createVersion(String versionNumber) throws Exception { + if (hasVersion(versionNumber)) + throw new ApplicationVersionAlreadyExists(applicationName, versionNumber); + ApplicationVersionComponent result = createChildComponent(versionNumber); + synchronized (childrenCacheLock) { + dataObject.addVersion(versionNumber); + updateRootResource(); + childrenCache.put(result); + } + return result; + } + + public ApplicationComponent storage(ApplicationStorage storage) { + this.applicationStorage = storage; + return this; + } + + public boolean hasVersion(String versionNumber) { + return dataObject.hasVersion(versionNumber); + } + + /* EntaxyApplication implementation */ + + @Override + public String getName() { + return applicationName; + } + + @Override + public ApplicationStorage getStorage() { + return this.applicationStorage; + } + + @Override + public List getVersions() { + return new ArrayList<>(childrenCache.values()); + } + + @Override + public EntaxyApplicationVersion getLatestVersion() { + return childrenCache.get(dataObject.getLatestVersion()); + } + + @Override + public EntaxyApplicationVersion getVersion(String version) { + return childrenCache.get(version); + } + + @Override + public void removeVersion(String version) { + try { + removeChild(version); + } catch (Exception e) { + log.error("Error removing version [" + version + "]", e); + } + } + + + +} diff --git a/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/ApplicationData.java b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/ApplicationData.java new file mode 100644 index 00000000..061e3c2f --- /dev/null +++ b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/ApplicationData.java @@ -0,0 +1,79 @@ +/*- + * ~~~~~~licensing~~~~~~ + * resource-based-storage + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.storage.resource.impl.application; + +import java.util.Calendar; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Optional; + +public class ApplicationData { + String name; + + Map versions; + + public ApplicationData(String name) { + this.name = name; + } + + public boolean hasVersion(String versionNumber) { + return versions != null && versions.containsKey(versionNumber); + } + + public void addVersion(String version) { + addVersion(version, Calendar.getInstance().getTimeInMillis() + ""); + } + + public void addVersion(String version, String timestamp) { + if (versions == null) + versions = new HashMap<>(); + if (!versions.containsKey(version)) + versions.put(version, timestamp); + } + + public void removeVersion(String version) { + if (versions == null) + return; + versions.remove(version); + } + + public String getLatestVersion() { + Optional> latest = + versions.entrySet().stream().sorted(new Comparator>() { + + @Override + public int compare(Entry o1, Entry o2) { + // reverse order + return -1 * o1.getValue().compareTo(o2.getValue()); + } + }).findFirst(); + if (!latest.isPresent()) + return null; + return latest.get().getKey(); + } +} diff --git a/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/ApplicationVersionComponent.java b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/ApplicationVersionComponent.java new file mode 100644 index 00000000..2df06d36 --- /dev/null +++ b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/ApplicationVersionComponent.java @@ -0,0 +1,282 @@ +/*- + * ~~~~~~licensing~~~~~~ + * resource-based-storage + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.storage.resource.impl.application; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.apache.commons.io.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gson.JsonElement; + +import ru.entaxy.esb.resources.EntaxyResource; +import ru.entaxy.platform.integration.applications.ApplicationContent; +import ru.entaxy.platform.integration.applications.ApplicationItem; +import ru.entaxy.platform.integration.applications.ApplicationResource; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationRevision; +import ru.entaxy.platform.integration.applications.EntaxyApplicationVersion; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationDescriptor; +import ru.entaxy.platform.integration.applications.exceptions.ApplicationVersionCausedException; +import ru.entaxy.platform.integration.applications.exceptions.ApplicationVersionException; +import ru.entaxy.platform.integration.applications.impl.StorageApplicationContentAdapter; +import ru.entaxy.platform.integration.applications.impl.StorageItemAdapter; +import ru.entaxy.platform.integration.applications.storage.resource.impl.AbstractResourceComponentWithChildren; +import ru.entaxy.platform.integration.applications.storage.resource.impl.ResourceContext; + +public class ApplicationVersionComponent + extends AbstractResourceComponentWithChildren + implements EntaxyApplicationVersion { + + private static final Logger log = LoggerFactory.getLogger(ApplicationVersionComponent.class); + + protected String versionNumber; + + protected ApplicationComponent applicationComponent; + + protected ResourceApplicationContent applicationContent; + + /* + public ApplicationVersionComponent(EntaxyResourceService resourceService, String versionNumber, + String parentRootUrl, ApplicationComponent applicationComponent) { + super(resourceService); + setEntaxyResourceService(resourceService); + this.versionNumber = versionNumber; + this.rootResourceFolderUrl = parentRootUrl.concat("/").concat(versionNumber); + this.applicationComponent = applicationComponent; + this.applicationContent = new ResourceApplicationContent(new ApplicationDescriptor()); + } + */ + + public ApplicationVersionComponent(ResourceContext parentResourceContext, String versionNumber, + ApplicationComponent applicationComponent) { + super(parentResourceContext.subcontext(versionNumber)); + this.versionNumber = versionNumber; + this.applicationComponent = applicationComponent; + this.applicationContent = ResourceApplicationContent.fromContext(this.resourceContext.subcontext(".content")); + } + + @Override + protected Class getDataObjectClass() { + return ApplicationVersionData.class; + } + + @Override + protected String getRootResourceName() { + return ".version"; + } + + @Override + protected ApplicationVersionData createDataObject() { + return new ApplicationVersionData(versionNumber); + } + + @Override + public String getComponentKey() { + return versionNumber; + } + + @Override + protected RevisionComponent createChildComponent(String key) throws Exception { + // return new RevisionComponent(entaxyResourceService, this, key); + return new RevisionComponent(resourceContext, this, key); + } + + @Override + protected List getChildrenKeyList() { + if (dataObject.revisions == null) + return Collections.emptyList(); + return dataObject.getRevisionKeys(); + } + + @Override + protected void addChildKey(String key) { + dataObject.addRevision(key, Calendar.getInstance().getTimeInMillis() + ""); + } + + @Override + protected void removeChildKey(String key) { + dataObject.removeRevision(key); + } + + @Override + protected void handleChildLoadException(String key, Exception e) { + log.error("Error loading revision [" + key + "]", e); + } + + @Override + public void save() { + if (applicationContent != null && applicationContent.getDescriptor() != null) { + JsonElement je = GSON.toJsonTree(applicationContent.getDescriptor()); + EntaxyResource descriptorResource = + applicationContent.getResourceContext().getResource(EntaxyApplication.DESCRIPTOR_NAME); + try (InputStream is = IOUtils.toInputStream(je.toString())) { + descriptorResource.save(is); + } catch (IOException e) { + log.error("Error saving descriptor to [" + descriptorResource.getURL() + "]", e); + } + } + super.save(); + } + + public void setDescriptor(ApplicationDescriptor applicationDescriptor) { + this.applicationContent.setDescriptor(applicationDescriptor); + } + + /* EntaxyApplicationVersion implementation */ + + @Override + public String getVersionNumber() { + return versionNumber; + } + + @Override + public List getRevisions() { + return childrenCache.values().stream().collect(Collectors.toList()); + } + + @Override + public EntaxyApplicationRevision getLastRevision() { + try { + return getRevision(dataObject.getLastRevision()); + } catch (Exception e) { + return null; + } + } + + @Override + public EntaxyApplicationRevision getRevision(int revision) { + return childrenCache.get(revision + ""); + } + + @Override + public EntaxyApplicationRevision createRevision(int fromRevision) + throws ApplicationVersionException { + RevisionComponent revisionComponent; + try { + int last = dataObject.getLastRevision(); + int revisionNumber = -1; + ApplicationContent source = null; + if (last == -1) { + revisionNumber = 0; + source = this; + + } else { + revisionNumber = last + 1; + int sourceRevision = fromRevision; + if (sourceRevision < 0) + sourceRevision = last; + RevisionComponent sourceComponent = childrenCache.get(sourceRevision + ""); + source = sourceComponent; + } + if (revisionNumber < 0) + throw new InstantiationException("Failed defining new revision number"); + + ApplicationDescriptor sourceDescriptor = source.getDescriptor(); + + revisionComponent = createChildComponent(revisionNumber + ""); + revisionComponent.init(); + revisionComponent.setDescriptor(sourceDescriptor); + revisionComponent.save(); + StorageApplicationContentAdapter adapted = revisionComponent.adapt(); + + ApplicationDescriptor revisionDescriptor = revisionComponent.getDescriptor(); + + // we copy only items, not resources + Map itemMap = + source.getItems().stream().collect(Collectors.toMap(item -> item.getLocation(), item -> item)); + List components = + new ArrayList<>(); + components.add(revisionDescriptor.getFeatures()); + components.addAll(revisionDescriptor.getComponents()); + + for (ru.entaxy.platform.integration.applications.descriptor.ApplicationComponent component : components) { + if (!itemMap.containsKey(component.getInternalLocation())) + continue; + StorageItemAdapter itemAdapter = adapted.createItem(component); + try (InputStream is = itemMap.get(component.getInternalLocation()).getInputStream()) { + itemAdapter.write(is); + } + } + + revisionComponent.save(); + + // finalize + + synchronized (childrenCacheLock) { + dataObject.addRevision(revisionNumber, Calendar.getInstance().getTimeInMillis() + ""); + updateRootResource(); + childrenCache.put(revisionComponent); + } + + } catch (ApplicationVersionException rethrow) { + throw rethrow; + } catch (Exception e) { + throw new ApplicationVersionCausedException(applicationComponent.getName(), e, versionNumber); + } + + return revisionComponent; + } + + public StorageApplicationContentAdapter adapt() { + return applicationContent; + } + + protected ApplicationDescriptor createCopy(ApplicationDescriptor origin) throws Exception { + return GSON.fromJson(GSON.toJsonTree(origin, ApplicationDescriptor.class).deepCopy(), + ApplicationDescriptor.class); + } + + @Override + public EntaxyApplication getApplication() { + return applicationComponent; + } + + @Override + public ApplicationDescriptor getDescriptor() { + return applicationContent.getDescriptor(); + } + + @Override + public List getItems() { + return applicationContent.getItems(); + } + + @Override + public List getResources() { + return applicationContent.getResources(); + } + + +} diff --git a/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/ApplicationVersionData.java b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/ApplicationVersionData.java new file mode 100644 index 00000000..fc970ad7 --- /dev/null +++ b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/ApplicationVersionData.java @@ -0,0 +1,94 @@ +/*- + * ~~~~~~licensing~~~~~~ + * resource-based-storage + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.storage.resource.impl.application; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Optional; + +public class ApplicationVersionData { + + String versionNumber; + + Map revisions; + + public ApplicationVersionData(String versionNumber) { + this.versionNumber = versionNumber; + } + + public void addRevision(int revisionNumber, String timestamp) { + addRevision(revisionNumber + "", timestamp); + } + + public void addRevision(String revisionNumber, String timestamp) { + if (revisions == null) + revisions = new HashMap<>(); + if (!revisions.containsKey(revisionNumber)) + revisions.put(revisionNumber, timestamp); + } + + public void removeRevision(int revisionNumber) { + removeRevision(revisionNumber + ""); + } + + public void removeRevision(String revisionNumber) { + if (revisions == null) + return; + revisions.remove(revisionNumber); + } + + public String getLatestRevision() { + Optional> latest = + revisions.entrySet().stream().sorted(new Comparator>() { + + @Override + public int compare(Entry o1, Entry o2) { + // reverse order + return -1 * o1.getValue().compareTo(o2.getValue()); + } + }).findFirst(); + if (!latest.isPresent()) + return null; + return latest.get().getKey(); + } + + public int getLastRevision() { + if (revisions == null || revisions.isEmpty()) + return -1; + return revisions.keySet().stream().mapToInt(v -> Integer.parseInt(v)).max().orElse(-1); + } + + public List getRevisionKeys() { + if (revisions == null) + return Collections.emptyList(); + return new ArrayList<>(revisions.keySet()); + } +} diff --git a/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/ResourceApplicationContent.java b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/ResourceApplicationContent.java new file mode 100644 index 00000000..2fe426cc --- /dev/null +++ b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/ResourceApplicationContent.java @@ -0,0 +1,141 @@ +/*- + * ~~~~~~licensing~~~~~~ + * resource-based-storage + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.storage.resource.impl.application; + +import java.io.InputStream; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import ru.entaxy.esb.resources.EntaxyResource; +import ru.entaxy.platform.base.support.JSONUtils; +import ru.entaxy.platform.integration.applications.ApplicationResource; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationComponent; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationDescriptor; +import ru.entaxy.platform.integration.applications.impl.StorageApplicationContentAdapter; +import ru.entaxy.platform.integration.applications.impl.StorageItemAdapter; +import ru.entaxy.platform.integration.applications.impl.application.ApplicationContentImpl; +import ru.entaxy.platform.integration.applications.impl.application.ApplicationItemImpl; +import ru.entaxy.platform.integration.applications.storage.resource.impl.ResourceContext; + +public class ResourceApplicationContent extends ApplicationContentImpl implements StorageApplicationContentAdapter { + + private static final Logger LOG = LoggerFactory.getLogger(ResourceApplicationContent.class); + + private static Gson GSON = new GsonBuilder().setPrettyPrinting().create(); + + protected boolean isDirty = false; + + public static ResourceApplicationContent fromContext(ResourceContext resourceContext) { + + // check descriptor + ApplicationDescriptor applicationDescriptor = null; + EntaxyResource descriptorResource = resourceContext.getResource(EntaxyApplication.DESCRIPTOR_NAME); + if (descriptorResource.exists()) { + // try (InputStream is = descriptorResource.getInputStream()) { + try { + applicationDescriptor = GSON.fromJson(JSONUtils.getJsonRootObject(descriptorResource.getAsString()), + ApplicationDescriptor.class); + } catch (Exception ignore) { + LOG.error("Error reading descriptor [" + descriptorResource.getURL() + "]", ignore); + } + } + + if (applicationDescriptor == null) + return new ResourceApplicationContent(new ApplicationDescriptor(), resourceContext); + + ResourceApplicationContent result = new ResourceApplicationContent(applicationDescriptor, resourceContext); + try { + result.readDescriptor(); + } catch (Exception ignore) { + LOG.error("Error processing descriptor [" + descriptorResource.getURL() + "]", ignore); + return new ResourceApplicationContent(new ApplicationDescriptor(), resourceContext); + } + return result; + + + } + + protected ResourceContext resourceContext; + + public ResourceApplicationContent(ApplicationDescriptor descriptor, ResourceContext resourceContext) { + super(descriptor); + this.resourceContext = resourceContext; + } + + public void readDescriptor() throws Exception { + createItem(descriptor.features); + + for (ApplicationComponent comp : descriptor.getComponents()) + createItem(comp); + } + + public ResourceContext getResourceContext() { + return resourceContext; + } + + public boolean isDirty() { + return isDirty; + } + + protected void setDirty(boolean isDirty) { + this.isDirty = isDirty; + } + + public void save() { + setDirty(false); + } + + @Override + public StorageItemAdapter createItem(ApplicationComponent applicationComponent) throws Exception { + ResourceApplicationItem item = new ResourceApplicationItem(applicationComponent, resourceContext); + this.items.put(item.getLocation(), item); + setDirty(true); + return item; + } + + @Override + public ApplicationResource createResource(String location, InputStream inputStream) throws Exception { + ResourceApplicationResource res = new ResourceApplicationResource(resourceContext, location); + res.write(inputStream); + this.resources.put(location, res); + setDirty(true); + return res; + } + + @Override + public StorageItemAdapter getItemAdapter(String location) throws Exception { + ApplicationItemImpl item = this.items.get(location); + if (item instanceof ResourceApplicationItem) + return (ResourceApplicationItem) item; + return null; + } + +} diff --git a/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/ResourceApplicationItem.java b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/ResourceApplicationItem.java new file mode 100644 index 00000000..06ea74b9 --- /dev/null +++ b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/ResourceApplicationItem.java @@ -0,0 +1,58 @@ +/*- + * ~~~~~~licensing~~~~~~ + * resource-based-storage + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.storage.resource.impl.application; + +import java.io.InputStream; + +import ru.entaxy.esb.resources.EntaxyResource; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationComponent; +import ru.entaxy.platform.integration.applications.impl.StorageItemAdapter; +import ru.entaxy.platform.integration.applications.impl.application.ApplicationItemImpl; +import ru.entaxy.platform.integration.applications.storage.resource.impl.ResourceContext; + +public class ResourceApplicationItem extends ApplicationItemImpl implements StorageItemAdapter { + + protected ResourceContext resourceContext; + + public ResourceApplicationItem(ApplicationComponent applicationComponent, ResourceContext resourceContext) { + super(applicationComponent, null); + this.resourceContext = resourceContext; + this.itemAdapter = this; + } + + @Override + public InputStream getInputStream() { + EntaxyResource resource = resourceContext.getResource(getLocation()); + return resource.getInputStream(); + } + + @Override + public void write(InputStream source) throws Exception { + EntaxyResource resource = resourceContext.getResource(getLocation()); + resource.save(source); + } + +} diff --git a/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/ResourceApplicationResource.java b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/ResourceApplicationResource.java new file mode 100644 index 00000000..f64d6c1b --- /dev/null +++ b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/ResourceApplicationResource.java @@ -0,0 +1,50 @@ +/*- + * ~~~~~~licensing~~~~~~ + * resource-based-storage + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.storage.resource.impl.application; + +import java.io.InputStream; + +import ru.entaxy.esb.resources.EntaxyResource; +import ru.entaxy.platform.integration.applications.impl.application.ApplicationResourceImpl; +import ru.entaxy.platform.integration.applications.storage.resource.impl.ResourceContext; + +public class ResourceApplicationResource extends ApplicationResourceImpl { + + protected ResourceContext resourceContext; + + protected String location; + + public ResourceApplicationResource(ResourceContext resourceContext, String location) { + super(); + this.resourceContext = resourceContext; + this.location = location; + } + + public void write(InputStream source) { + EntaxyResource resource = resourceContext.getResource(location); + resource.save(source); + } +} diff --git a/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/RevisionComponent.java b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/RevisionComponent.java new file mode 100644 index 00000000..fcd7374c --- /dev/null +++ b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/RevisionComponent.java @@ -0,0 +1,279 @@ +/*- + * ~~~~~~licensing~~~~~~ + * resource-based-storage + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.storage.resource.impl.application; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.commons.io.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gson.JsonElement; + +import ru.entaxy.esb.resources.EntaxyResource; +import ru.entaxy.platform.core.artifact.ArtifactCoordinates; +import ru.entaxy.platform.integration.applications.ApplicationItem; +import ru.entaxy.platform.integration.applications.ApplicationResource; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationRevision; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationComponent; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationDescriptor; +import ru.entaxy.platform.integration.applications.exceptions.RevisionException; +import ru.entaxy.platform.integration.applications.impl.StorageApplicationContentAdapter; +import ru.entaxy.platform.integration.applications.impl.application.RevisionHelper; +import ru.entaxy.platform.integration.applications.storage.resource.impl.AbstractResourceComponent; +import ru.entaxy.platform.integration.applications.storage.resource.impl.ResourceContext; + +public class RevisionComponent extends AbstractResourceComponent + implements EntaxyApplicationRevision, RevisionHelper.RevisionHelperAdapter { + + private static final Logger LOG = LoggerFactory.getLogger(RevisionComponent.class); + + int revisionNumber; + + ApplicationVersionComponent versionComponent; + + ResourceApplicationContent applicationContent; + + final String CONTENT_RESOURCE_NAME = "version.content"; + + // REVISION_STATUS status = REVISION_STATUS.NEW; + + /* + public RevisionComponent(EntaxyResourceService entaxyResourceService, + ApplicationVersionComponent versionComponent, + String revisionNumber) { + super(entaxyResourceService); + this.revisionNumber = revisionNumber; + this.versionComponent = versionComponent; + this.rootResourceFolderUrl = + versionComponent.getRootResourceFolderUrl().concat("/").concat(this.revisionNumber); + applicationContent.getProperties().put(STANDARD_PROPERTIES.APPLICATION, versionComponent.getVersionNumber()); + applicationContent.getProperties().put(STANDARD_PROPERTIES.VERSION, revisionNumber); + + // buildComponent = new BuildComponent(entaxyResourceService, rootResourceFolderUrl); + } + */ + + public RevisionComponent(ResourceContext resourceContext, + ApplicationVersionComponent versionComponent, + int revisionNumber) { + super(resourceContext.subcontext(revisionNumber + "")); + this.revisionNumber = revisionNumber; + this.versionComponent = versionComponent; + applicationContent = ResourceApplicationContent.fromContext(this.resourceContext.subcontext(".content")); + } + + public RevisionComponent(ResourceContext resourceContext, + ApplicationVersionComponent versionComponent, + String revisionNumber) { + this(resourceContext, versionComponent, Integer.parseInt(revisionNumber)); + } + + @Override + protected Class getDataObjectClass() { + return RevisionData.class; + } + + @Override + protected String getRootResourceName() { + return ".revision"; + } + + @Override + protected RevisionData createDataObject() { + return new RevisionData(this.revisionNumber + ""); + } + + @Override + public String getComponentKey() { + return revisionNumber + ""; + } + + @Override + public void init() { + super.init(); + initContent(); + } + + + @Override + public void save() { + if (applicationContent != null) + if (applicationContent.isDirty) { + if (revisionNumber > 0) { + try { + RevisionHelper helper = new RevisionHelper(applicationContent, this); + helper.update(); + } catch (Exception e) { + LOG.error("ERROR saving revision", e); + return; + } + } + applicationContent.save(); + } + if (applicationContent != null && applicationContent.getDescriptor() != null) { + JsonElement je = GSON.toJsonTree(applicationContent.getDescriptor()); + EntaxyResource descriptorResource = + applicationContent.getResourceContext().getResource(EntaxyApplication.DESCRIPTOR_NAME); + try (InputStream is = IOUtils.toInputStream(je.toString())) { + descriptorResource.save(is); + } catch (IOException e) { + LOG.error("Error saving descriptor to [" + descriptorResource.getURL() + "]", e); + } + } + super.save(); + } + + protected void initContent() {} + + public StorageApplicationContentAdapter adapt() { + return applicationContent; + } + + public void setDescriptor(ApplicationDescriptor applicationDescriptor) { + try { + this.applicationContent.setDescriptor(createCopy(applicationDescriptor)); + } catch (Exception e) { + LOG.error("Error setting descriptor", e); + return; + } + } + + protected ApplicationDescriptor createCopy(ApplicationDescriptor origin) throws Exception { + return GSON.fromJson(GSON.toJsonTree(origin, ApplicationDescriptor.class).deepCopy(), + ApplicationDescriptor.class); + } + + protected void changeDescriptorComponentsVersion() { + List components = new ArrayList<>(); + components.add(applicationContent.getDescriptor().features); + + components.addAll(applicationContent.getDescriptor().getComponents()); + + List revisionableIds = applicationContent.getItems().stream().filter(item -> item.isRevisionable()) + .map(item -> item.getId()).collect(Collectors.toList()); + + for (ApplicationComponent component : components) { + + if (!revisionableIds.contains(component.id)) + continue; + + ArtifactCoordinates coordinates = ArtifactCoordinates.fromUrl(component.mavenLocation); + coordinates.qualifier(String.format("REV_%03d", revisionNumber)); + component.mavenLocation = coordinates.toMavenString(); + coordinates = ArtifactCoordinates.fromUrl(component.targetLocation); + coordinates.qualifier(String.format("REV_%03d", revisionNumber)); + component.targetLocation = coordinates.toMavenString(); + } + + } + + /* EntaxyApplicationRevision implementation */ + + + @Override + public int getRevisionNumber() { + return revisionNumber; + } + + @Override + public REVISION_STATUS getStatus() { + return dataObject.getStatus(); + } + + @Override + public void configure() throws RevisionException { + RevisionHelper helper = new RevisionHelper(applicationContent, this); + helper.configure(); + } + + @Override + public void deploy() throws RevisionException { + RevisionHelper helper = new RevisionHelper(applicationContent, this); + helper.deploy(); + } + + @Override + public void install() throws RevisionException { + RevisionHelper helper = new RevisionHelper(applicationContent, this); + helper.install(); + } + + @Override + public void installDev() throws RevisionException { + RevisionHelper helper = new RevisionHelper(applicationContent, this); + helper.installDev(); + } + + @Override + public void uninstall() throws RevisionException { + RevisionHelper helper = new RevisionHelper(applicationContent, this); + helper.uninstall(); + } + + @Override + public ApplicationDescriptor getDescriptor() { + return applicationContent.getDescriptor(); + } + + @Override + public List getItems() { + return applicationContent.getItems(); + } + + @Override + public List getResources() { + return applicationContent.getResources(); + } + + // RevisionHelper.RevisionHelperAdapter implementation + + @Override + public REVISION_STATUS getCurrentStatus() { + return getStatus(); + } + + @Override + public void updateStatus(REVISION_STATUS newStatus) { + this.dataObject.status = newStatus; + try { + updateRootResource(); + } catch (Exception e) { + LOG.error("Error updating root resource", e); + } + } + + @Override + public void writeItem(String location, InputStream inputStream) throws Exception { + applicationContent.getItemAdapter(location).write(inputStream); + } + +} diff --git a/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/RevisionData.java b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/RevisionData.java new file mode 100644 index 00000000..d20ab208 --- /dev/null +++ b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/application/RevisionData.java @@ -0,0 +1,45 @@ +/*- + * ~~~~~~licensing~~~~~~ + * resource-based-storage + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.storage.resource.impl.application; + +import ru.entaxy.platform.integration.applications.EntaxyApplicationRevision.REVISION_STATUS; + +public class RevisionData { + + int revisionNumber; + + REVISION_STATUS status; + + public RevisionData(String revisionNumber) { + this.revisionNumber = Integer.parseInt(revisionNumber); + } + + public REVISION_STATUS getStatus() { + if (status == null) + return REVISION_STATUS.NEW; + return status; + } +} diff --git a/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/project/BuildComponent.java b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/project/BuildComponent.java new file mode 100644 index 00000000..78203677 --- /dev/null +++ b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/project/BuildComponent.java @@ -0,0 +1,154 @@ +/*- + * ~~~~~~licensing~~~~~~ + * resource-based-storage + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.storage.resource.impl.project; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gson.JsonElement; + +import ru.entaxy.esb.resources.EntaxyResource; +import ru.entaxy.platform.base.support.CommonUtils; +import ru.entaxy.platform.base.support.JSONUtils; +import ru.entaxy.platform.core.artifact.ArtifactCoordinates; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationDescriptor; +import ru.entaxy.platform.integration.applications.storage.resource.impl.AbstractResourceComponent; +import ru.entaxy.platform.integration.applications.storage.resource.impl.ResourceContext; + +public class BuildComponent extends AbstractResourceComponent { + + private static final Logger LOG = LoggerFactory.getLogger(BuildComponent.class); + + protected EntaxyResource buildResource; + protected EntaxyResource descriptorResource; + + protected ApplicationDescriptor applicationDescriptor; + + /* + protected BuildComponent(EntaxyResourceService entaxyResourceService, String parentRootUrl) { + super(entaxyResourceService); + this.rootResourceFolderUrl = parentRootUrl.concat("/").concat(".build"); + } + */ + + protected BuildComponent(ResourceContext parentResourceContext) { + super(parentResourceContext.subcontext(".build")); + } + + @Override + protected Class getDataObjectClass() { + return BuildData.class; + } + + @Override + protected String getRootResourceName() { + return "build-info"; + } + + @Override + protected BuildData createDataObject() { + return new BuildData(); + } + + @Override + public String getComponentKey() { + return "build"; + } + + @Override + public void init() { + super.init(); + descriptorResource = getResource("descriptor.json"); + refresh(); + } + + public void refresh() { + if (CommonUtils.isValid(dataObject.name)) { + buildResource = getResource(dataObject.name); + if (descriptorResource.exists()) + applicationDescriptor = GSON.fromJson(JSONUtils.getJsonRootObject(descriptorResource.getAsString()), + ApplicationDescriptor.class); + } + } + + public void updateBuild(URL resultUrl, ApplicationDescriptor descriptor, ArtifactCoordinates coordinates) { + + if (isBuildAvailable()) + buildResource.delete(); + + dataObject.artifactId = coordinates.getArtifactId(); + dataObject.groupId = coordinates.getGroupId(); + dataObject.version = coordinates.getVersion(); + dataObject.name = coordinates.toAssetName(); + try { + updateRootResource(); + } catch (Exception e) { + LOG.error("Error updateing root resource", e); + return; + } + + applicationDescriptor = null; + + // (re)init resources + refresh(); + + JsonElement descriptorJe = GSON.toJsonTree(descriptor, ApplicationDescriptor.class); + String descriptorJson = descriptorJe.toString(); + try (InputStream is = new ByteArrayInputStream(descriptorJson.getBytes())) { + descriptorResource.save(is); + } catch (IOException e) { + LOG.error("Error saving resource [" + descriptorResource.getURL() + "]", e); + } + + try (InputStream is = resultUrl.openStream()) { + buildResource.save(is); + } catch (IOException e) { + LOG.error("Error saving resource [" + descriptorResource.getURL() + "]", e); + } + + applicationDescriptor = GSON.fromJson(descriptorJe, + ApplicationDescriptor.class); + + } + + public boolean isBuildAvailable() { + return buildResource != null && buildResource.exists(); + } + + public EntaxyResource getBuildResource() { + return buildResource; + } + + public ApplicationDescriptor getApplicationDescriptor() { + return applicationDescriptor; + } + +} diff --git a/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/project/BuildData.java b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/project/BuildData.java new file mode 100644 index 00000000..4216069a --- /dev/null +++ b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/project/BuildData.java @@ -0,0 +1,39 @@ +/*- + * ~~~~~~licensing~~~~~~ + * resource-based-storage + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.storage.resource.impl.project; + +public class BuildData { + + String groupId; + String artifactId; + String version; + + String name; + + String builtBy; + String builtOn; + +} diff --git a/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/project/ProjectComponent.java b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/project/ProjectComponent.java new file mode 100644 index 00000000..e04a41bc --- /dev/null +++ b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/project/ProjectComponent.java @@ -0,0 +1,254 @@ +/*- + * ~~~~~~licensing~~~~~~ + * resource-based-storage + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.storage.resource.impl.project; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ru.entaxy.platform.base.support.CommonUtils; +import ru.entaxy.platform.integration.applications.ApplicationProjectContent.STANDARD_PROPERTIES; +import ru.entaxy.platform.integration.applications.ApplicationProjectInfo; +import ru.entaxy.platform.integration.applications.ApplicationStorage; +import ru.entaxy.platform.integration.applications.EntaxyApplication; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProjectVersion; +import ru.entaxy.platform.integration.applications.exceptions.ProjectVersionCausedException; +import ru.entaxy.platform.integration.applications.exceptions.ProjectVersionException; +import ru.entaxy.platform.integration.applications.exceptions.ProjectVersionNotFoundException; +import ru.entaxy.platform.integration.applications.storage.resource.impl.AbstractResourceComponentWithChildren; +import ru.entaxy.platform.integration.applications.storage.resource.impl.ResourceContext; + +public class ProjectComponent extends AbstractResourceComponentWithChildren + implements EntaxyApplicationProject { + + private static final Logger log = LoggerFactory.getLogger(ProjectComponent.class); + + protected static String extractProjectName(String projectFullName) { + int index = projectFullName.indexOf('/'); + if (index < 0) + return projectFullName; + return projectFullName.substring(index + 1); + } + + protected String projectName; + + protected String group; + + protected ApplicationStorage applicationStorage; + + /* + public ProjectComponent(EntaxyResourceService resourceService, String projectName, String parentRootUrl) { + super(resourceService); + setEntaxyResourceService(resourceService); + this.projectName = projectName; + this.rootResourceFolderUrl = parentRootUrl.concat("/").concat(projectName); + } + */ + + public ProjectComponent(ResourceContext parentResourceContext, String projectFullName) { + super(parentResourceContext.subcontext(extractProjectName(projectFullName))); + setProjectName(projectFullName); + } + + protected void setProjectName(String projectFullName) { + int index = projectFullName.indexOf('/'); + if (index > 0) { + this.projectName = projectFullName.substring(index + 1); + setGroup(projectFullName.substring(0, index)); + } else { + this.projectName = projectFullName; + setGroup(null); + } + } + + protected void setGroup(String group) { + if (!CommonUtils.isValid(group)) + this.group = EntaxyApplication.DEFAULT_GROUP_ID; + else + this.group = group; + } + + @Override + public void init() { + super.init(); + this.group = dataObject.group; + } + + @Override + protected Class getDataObjectClass() { + return ProjectData.class; + } + + @Override + protected String getRootResourceName() { + return ".project"; + } + + @Override + protected ProjectData createDataObject() { + return new ProjectData(projectName, group); + } + + @Override + public String getComponentKey() { + return projectName; + } + + @Override + protected ProjectVersionComponent createChildComponent(String key) throws Exception { + return new ProjectVersionComponent(resourceContext, this, key); + } + + @Override + protected List getChildrenKeyList() { + if (dataObject.versions == null) + return Collections.emptyList(); + return new ArrayList<>(dataObject.versions.keySet()); + } + + @Override + protected void addChildKey(String key) { + dataObject.addVersion(key, Calendar.getInstance().getTimeInMillis() + ""); + } + + @Override + protected void removeChildKey(String key) { + dataObject.removeVersion(key); + } + + @Override + protected void handleChildLoadException(String key, Exception e) { + log.error("Error loading version [" + key + "]", e); + } + + public ProjectComponent storage(ApplicationStorage storage) { + this.applicationStorage = storage; + return this; + } + + /* EntaxyApplicationProject implementation */ + + @Override + public String getName() { + return projectName; + } + + @Override + public String getGroup() { + return group; + } + + @Override + public ApplicationStorage getStorage() { + return this.applicationStorage; + } + + @Override + public void save() { + // TODO Auto-generated method stub + + } + + @Override + public void disgard() { + // TODO Auto-generated method stub + + } + + @Override + public List getVersions() { + return new ArrayList<>(childrenCache.values()); + } + + @Override + public EntaxyApplicationProjectVersion getLatestVersion() { + String latest = dataObject.getLatestVersion(); + if (latest == null) + return null; + return getVersion(latest); + } + + @Override + public EntaxyApplicationProjectVersion getVersion(String version) { + return childrenCache.get(version); + } + + @Override + public EntaxyApplicationProjectVersion createVersion(String version) throws ProjectVersionException { + try { + return createNewChild(version); + } catch (Exception e) { + log.error("Error creating version [" + version + "]", e); + if (e instanceof ProjectVersionException) + throw (ProjectVersionException) e; + throw new ProjectVersionCausedException(projectName, version, e); + } + } + + @Override + public EntaxyApplicationProjectVersion createVersion(String version, String fromVersion) + throws ProjectVersionException { + ProjectVersionComponent sourceVersion = childrenCache.get(fromVersion); + if (sourceVersion == null) + throw new ProjectVersionNotFoundException(projectName, fromVersion); + try { + ProjectVersionComponent newVersion = createNewChild(version); + newVersion.updateFromString(sourceVersion.getAsJsonString()); + newVersion.getProperties().put(STANDARD_PROPERTIES.CREATED_ON, + Calendar.getInstance().getTimeInMillis() + ""); + newVersion.save(); + } catch (Exception e) { + log.error("Error creating version [" + version + "]", e); + if (e instanceof ProjectVersionException) + throw (ProjectVersionException) e; + throw new ProjectVersionCausedException(projectName, version, e); + } + return null; + } + + @Override + public void removeVersion(String version) { + try { + removeChild(version); + } catch (Exception e) { + log.error("Error removing version [" + version + "]", e); + } + } + + @Override + public ApplicationProjectInfo getInfo() { + // TODO Auto-generated method stub + return null; + } + + + +} diff --git a/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/project/ProjectData.java b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/project/ProjectData.java new file mode 100644 index 00000000..93d51ee2 --- /dev/null +++ b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/project/ProjectData.java @@ -0,0 +1,73 @@ +/*- + * ~~~~~~licensing~~~~~~ + * resource-based-storage + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.storage.resource.impl.project; + +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Optional; + +public class ProjectData { + + String name; + String group; + + Map versions; + + public ProjectData(String name, String group) { + this.name = name; + this.group = group; + } + + public void addVersion(String version, String timestamp) { + if (versions == null) + versions = new HashMap<>(); + if (!versions.containsKey(version)) + versions.put(version, timestamp); + } + + public void removeVersion(String version) { + if (versions == null) + return; + versions.remove(version); + } + + public String getLatestVersion() { + Optional> latest = + versions.entrySet().stream().sorted(new Comparator>() { + + @Override + public int compare(Entry o1, Entry o2) { + // reverse order + return -1 * o1.getValue().compareTo(o2.getValue()); + } + }).findFirst(); + if (!latest.isPresent()) + return null; + return latest.get().getKey(); + } +} diff --git a/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/project/ProjectVersionComponent.java b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/project/ProjectVersionComponent.java new file mode 100644 index 00000000..3f39f867 --- /dev/null +++ b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/project/ProjectVersionComponent.java @@ -0,0 +1,332 @@ +/*- + * ~~~~~~licensing~~~~~~ + * resource-based-storage + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.storage.resource.impl.project; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.List; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ru.entaxy.esb.resources.EntaxyResource; +import ru.entaxy.esb.resources.EntaxyResourceURLFactory; +import ru.entaxy.platform.integration.applications.ApplicationProjectItem; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProject; +import ru.entaxy.platform.integration.applications.EntaxyApplicationProjectVersion; +import ru.entaxy.platform.integration.applications.descriptor.ApplicationDescriptor; +import ru.entaxy.platform.integration.applications.exceptions.ItemException; +import ru.entaxy.platform.integration.applications.exceptions.ProjectVersionException; +import ru.entaxy.platform.integration.applications.exceptions.ProjectVersionIsDirtyException; +import ru.entaxy.platform.integration.applications.exceptions.ProjectVersionNotConsistentException; +import ru.entaxy.platform.integration.applications.impl.build.ApplicationBuilder; +import ru.entaxy.platform.integration.applications.impl.project.ApplicationProjectContentImpl; +import ru.entaxy.platform.integration.applications.storage.resource.impl.AbstractResourceComponent; +import ru.entaxy.platform.integration.applications.storage.resource.impl.ResourceContext; +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject; +import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObjectResource; + +public class ProjectVersionComponent extends AbstractResourceComponent + implements EntaxyApplicationProjectVersion { + + private static final Logger LOG = LoggerFactory.getLogger(ProjectVersionComponent.class); + + String versionNumber; + + ProjectComponent applicationComponent; + + ApplicationProjectContentImpl applicationContent = new ApplicationProjectContentImpl(); + + EntaxyResource contentResource; + + BuildComponent buildComponent; + + final String CONTENT_RESOURCE_NAME = "version.content"; + + VERSION_STATUS status = VERSION_STATUS.NEW; + + private boolean isDirty = false; + + protected void setDirty(boolean isDirty) { + this.isDirty = isDirty; + } + + /* + public ProjectVersionComponent(EntaxyResourceService entaxyResourceService, ProjectComponent applicationComponent, + String versionNumber) { + super(entaxyResourceService); + this.versionNumber = versionNumber; + this.applicationComponent = applicationComponent; + this.rootResourceFolderUrl = + applicationComponent.getRootResourceFolderUrl().concat("/").concat(this.versionNumber); + applicationContent.getProperties().put(STANDARD_PROPERTIES.APPLICATION, applicationComponent.getName()); + applicationContent.getProperties().put(STANDARD_PROPERTIES.VERSION, versionNumber); + + buildComponent = new BuildComponent(entaxyResourceService, rootResourceFolderUrl); + } + */ + + public ProjectVersionComponent(ResourceContext parentResourceContext, ProjectComponent applicationComponent, + String versionNumber) { + super(parentResourceContext.subcontext(versionNumber)); + this.versionNumber = versionNumber; + this.applicationComponent = applicationComponent; + applicationContent.getProperties().put(STANDARD_PROPERTIES.APPLICATION, applicationComponent.getName()); + applicationContent.getProperties().put(STANDARD_PROPERTIES.GROUP, applicationComponent.getGroup()); + applicationContent.getProperties().put(STANDARD_PROPERTIES.VERSION, versionNumber); + + buildComponent = new BuildComponent(resourceContext); + } + + @Override + protected Class getDataObjectClass() { + return ProjectVersionData.class; + } + + @Override + protected String getRootResourceName() { + return ".version"; + } + + @Override + protected ProjectVersionData createDataObject() { + return new ProjectVersionData(this.versionNumber, this.status.toString()); + } + + @Override + public String getComponentKey() { + return versionNumber; + } + + @Override + protected void initializeDataObject() throws Exception { + // TODO Auto-generated method stub + super.initializeDataObject(); + this.status = VERSION_STATUS.valueOf(dataObject.status); + } + + @Override + public void init() { + super.init(); + initContent(); + buildComponent.init(); + } + + protected void initContent() { + if (contentResource == null) { + contentResource = getResource(CONTENT_RESOURCE_NAME); + if (!contentResource.exists()) { + save(); + } else { + applicationContent.unmarshall(contentResource.getAsString()); + } + } + } + + public String getAsJsonString() { + return applicationContent.marshall(); + } + + public void updateFromString(String jsonData) { + applicationContent.unmarshall(jsonData); + applicationContent.getProperties().put(STANDARD_PROPERTIES.APPLICATION, applicationComponent.getName()); + applicationContent.getProperties().put(STANDARD_PROPERTIES.GROUP, applicationComponent.getGroup()); + applicationContent.getProperties().put(STANDARD_PROPERTIES.VERSION, versionNumber); + } + + /* EntaxyApplicationProjectVersion implementation */ + + @Override + public void disgard() { + applicationContent.unmarshall(contentResource.getAsString()); + } + + @Override + public void save() { + String data = applicationContent.marshall(); + try (ByteArrayInputStream bis = new ByteArrayInputStream(data.getBytes())) { + contentResource.save(bis); + setDirty(false); + } catch (IOException e) { + LOG.error("Error saving resource [" + contentResource.getURL() + "]", e); + } + } + + @Override + public String getVersionNumber() { + return versionNumber; + } + + @Override + public List getItems() { + return applicationContent.getItems(); + } + + @Override + public List getItems(Class itemClass) { + return applicationContent.getItems(itemClass); + } + + @Override + public void addItem(ApplicationProjectItem item) throws ItemException { + try { + applicationContent.addItem(item); + setDirty(true); + } catch (ItemException e) { + e.setVersionNumber(versionNumber); + e.setApplicationName(this.applicationComponent.getName()); + throw e; + } + } + + @Override + public void ignoreItem(ApplicationProjectItem item) throws ItemException { + try { + applicationContent.ignoreItem(item); + setDirty(true); + } catch (ItemException e) { + e.setVersionNumber(versionNumber); + e.setApplicationName(this.applicationComponent.getName()); + throw e; + } + } + + @Override + public void removeItem(ApplicationProjectItem item) throws ItemException { + try { + applicationContent.removeItem(item); + setDirty(true); + } catch (ItemException e) { + e.setVersionNumber(versionNumber); + e.setApplicationName(this.applicationComponent.getName()); + throw e; + } + } + + @Override + public EntaxyApplicationProject getApplication() { + return this.applicationComponent; + } + + @Override + public ApplicationProjectItem addObject(EntaxyRuntimeObject runtimeObject) { + setDirty(true); + return applicationContent.addObject(runtimeObject); + } + + @Override + public ApplicationProjectItem addResource(EntaxyRuntimeObjectResource runtimeObjectResource) { + setDirty(true); + return applicationContent.addResource(runtimeObjectResource); + } + + @Override + public ApplicationProjectItem addResource(EntaxyResource entaxyResource) { + setDirty(true); + return applicationContent.addResource(entaxyResource); + } + + @Override + public Map getProperties() { + return applicationContent.getProperties(); + } + + @Override + public VERSION_STATUS getStatus() { + return status; + } + + @Override + public URL build() throws ProjectVersionException { + if (!isConsistent()) + throw new ProjectVersionNotConsistentException(applicationComponent.getName(), versionNumber); + if (isDirty()) + throw new ProjectVersionIsDirtyException(applicationComponent.getName(), versionNumber); + ApplicationBuilder builder = new ApplicationBuilder(applicationContent); + builder.getCoordinates() + .groupId(applicationComponent.getGroup()) + .artifactId(applicationComponent.getName()) + .version(versionNumber); + URL result = builder.build(); + buildComponent.updateBuild(result, builder.getDescriptor(), builder.getCoordinates()); + builder.clear(); + if (isBuildAvailable()) { + status = VERSION_STATUS.BUILT; + dataObject.status = status.toString(); + try { + updateRootResource(); + } catch (Exception e) { + LOG.error("Error updating root resource for project [" + applicationComponent.getName() + + "] version [" + versionNumber + "]", e); + } + try { + return EntaxyResourceURLFactory.getGlobalUrl(buildComponent.getBuildResource()); + } catch (MalformedURLException e) { + LOG.error("Error creating URL for [" + buildComponent.getBuildResource().getURL() + "]", e); + return null; + } + } + return null; + } + + @Override + public InputStream getBuild() { + if (!isBuildAvailable()) + return null; + return buildComponent.getBuildResource().getInputStream(); + } + + @Override + public URL getBuildUrl() { + if (!isBuildAvailable()) + return null; + try { + return EntaxyResourceURLFactory.getGlobalUrl(buildComponent.getBuildResource()); + } catch (MalformedURLException e) { + LOG.error("Error getting global URL for resource [" + buildComponent.getBuildResource().getURL() + "]", e); + return null; + } + } + + @Override + public boolean isBuildAvailable() { + return buildComponent.isBuildAvailable(); + } + + @Override + public ApplicationDescriptor getBuildInfo() { + return buildComponent.getApplicationDescriptor(); + } + + @Override + public boolean isDirty() { + return isDirty; + } +} diff --git a/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/project/ProjectVersionData.java b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/project/ProjectVersionData.java new file mode 100644 index 00000000..1d9a514f --- /dev/null +++ b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/impl/project/ProjectVersionData.java @@ -0,0 +1,37 @@ +/*- + * ~~~~~~licensing~~~~~~ + * resource-based-storage + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.storage.resource.impl.project; + +public class ProjectVersionData { + + String versionNumber; + String status; + + public ProjectVersionData(String versionNumber, String status) { + this.versionNumber = versionNumber; + this.status = status; + } +} diff --git a/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/internal/DefaultApplicationStorage.java b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/internal/DefaultApplicationStorage.java new file mode 100644 index 00000000..eb29195f --- /dev/null +++ b/platform/integration/applications/resource-based-storage/src/main/java/ru/entaxy/platform/integration/applications/storage/resource/internal/DefaultApplicationStorage.java @@ -0,0 +1,61 @@ +/*- + * ~~~~~~licensing~~~~~~ + * resource-based-storage + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.integration.applications.storage.resource.internal; + +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.component.annotations.ReferenceCardinality; + +import ru.entaxy.esb.resources.EntaxyResourceService; +import ru.entaxy.platform.integration.applications.ApplicationStorage; +import ru.entaxy.platform.integration.applications.storage.ApplicationStorageInfo; +import ru.entaxy.platform.integration.applications.storage.resource.ResourceBasedStorage; + +@Component(service = ApplicationStorage.class, immediate = true) +@ApplicationStorageInfo(name = "default") +public class DefaultApplicationStorage extends ResourceBasedStorage { + + public DefaultApplicationStorage() { + super(); + setResourceProvider("entaxy-file-internal"); + setPath(".applications"); + } + + @Reference(cardinality = ReferenceCardinality.MANDATORY, unbind = "unbindResourceService") + public void bindResourceService(EntaxyResourceService resourceService) { + this.entaxyResourceService = resourceService; + } + + public void unbindResourceService(EntaxyResourceService resourceService) { + this.entaxyResourceService = null; + } + + @Activate + public void activate() { + init(); + } +} diff --git a/platform/integration/applications/src/main/features/features.xml b/platform/integration/applications/src/main/features/features.xml new file mode 100644 index 00000000..ea199b1c --- /dev/null +++ b/platform/integration/applications/src/main/features/features.xml @@ -0,0 +1,40 @@ + + + + + + + mvn:ru.entaxy.platform.integration.applications/application-api/${project.version} + mvn:ru.entaxy.platform.integration.applications/application-impl/${project.version} + mvn:ru.entaxy.platform.integration.applications/resource-based-storage/${project.version} + mvn:ru.entaxy.platform.integration.applications/application-shell/${project.version} + mvn:ru.entaxy.platform.integration.applications/application-management/${project.version} + + + diff --git a/platform/integration/pom.xml b/platform/integration/pom.xml new file mode 100644 index 00000000..7107e705 --- /dev/null +++ b/platform/integration/pom.xml @@ -0,0 +1,16 @@ + + 4.0.0 + + platform + ru.entaxy.esb + 1.11.0 + + ru.entaxy.platform + integration + pom + ENTAXY :: PLATFORM :: INTEGRATION + ENTAXY :: PLATFORM :: INTEGRATION + + applications + + diff --git a/platform/pom.xml b/platform/pom.xml index 893a4059..f701b59c 100644 --- a/platform/pom.xml +++ b/platform/pom.xml @@ -3,7 +3,7 @@ root ru.entaxy.esb - 1.10.0 + 1.11.0 4.0.0 diff --git a/platform/runtime/base/base-extensions-support/LICENSE.txt b/platform/runtime/base/base-extensions-support/LICENSE.txt new file mode 100644 index 00000000..4ae94b75 --- /dev/null +++ b/platform/runtime/base/base-extensions-support/LICENSE.txt @@ -0,0 +1,175 @@ + ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ + +Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой) +версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего +Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН +7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова, +д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу +https://www.emdev.ru/about (далее - Компания). + +Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями» +(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения, +Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в +настоящем документе, в противном случае, он должен не использовать или не получать доступ +к Программному обеспечению. + + 1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ + +a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии +или редакции, исключительные права на которую принадлежат Правообладателю. +b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные +права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ +для ЭВМ № 2021610848 от 19.01.2021 года. +c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта +https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО. +d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также +личные неимущественные права авторов произведений на результат интеллектуальной деятельности. +e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование +ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка +включает предоставление Пользователю неисключительного права использования ПО, в том числе +получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение +патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается +Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается +для каждого Пользователя индивидуально в Сертификате. +f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром), +подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное +обеспечение в ограниченном объёме и на определённый период времени. +g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО, +предоставленных Пользователю согласно условиям Подписки. +h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного +обеспечения. +i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий +из одного или нескольких файлов, который может быть прочтён человеком. +j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля +программы, полученный в результате обработки исходного кода, еще не связанный в полную программу. +Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый +продукт. +k) Некоммерческое использование – индивидуальное личное использование Пользователем программного +обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации +возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая +выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения. + + 2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ + +2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного +обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом +воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения +в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ. +2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит +неисключительный характер. +2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию, +лицензия на ограниченное использование Программного обеспечения. +2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования +имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан +обратиться в службу поддержки Правообладателя по адресу: https://entaxy.ru/ для изменения +вида лицензии с Базовой бесплатной версии на Подписки. +2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для +пробного использования программного обеспечения – не ограничен. +2.6. Использование Пользователем настоящего программного обеспечения в целях разработки, +модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю, +без разрешения Правообладателя не допускается. + + 3. АВТОРСКОЕ ПРАВО. + +3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение +и любые его копии принадлежат Правообладателю. +3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента, +к которому можно получить доступ с помощью Программного обеспечения, является собственностью +соответствующего владельца контента и защищается применимым законодательством об авторском +праве или другими законами и договорами об интеллектуальной собственности. +3.3. Условия использования Программного обеспечения. +Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь +придерживается следующих условий: +3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять +какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании +Программного обеспечения или на нем. +3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать, +расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать +Программное обеспечение. +3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования +ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне. +3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено +использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам. + + 4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС» + +4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю +на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с +использованием Пользователем: +4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в +Программное обеспечение; +4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями +настоящего соглашения; +4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием, +или данными, не предоставленными Пользователю Правообладателем; +4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем. + + +5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ +ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ +И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ +ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ +И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ +ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО. + + 6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ. +НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ +ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ, +ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ; +ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ. +ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ +ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ; +КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ +ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ. + + 7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ: +Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия +(включая, но не ограничиваясь) по: +-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код) + Программного обеспечения; +-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный +код Программного обеспечения, за исключением тех изменений, которые вносятся средствами, +включёнными в Программное обеспечение и описанными непосредственно в документации к нему; +-созданию условий для использования Программного обеспечения лицами, не имеющими прав на +использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство +третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа +к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку; +-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию). + + 8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА. + +8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из +лицензионных продуктов, используемых на законных основаниях, а +именно https://entaxy.ru/libs/licenses/root-aggregated.deps. +8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть +совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения. +8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться +Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения, +содержащих все изменения и дополнения программного обеспечения. + + 9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ. + +9.1. Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым +программным обеспечением. +9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно +с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм +«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public. +9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий +пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя, +прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер +ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства +Российской Федерации. + + 10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ. + +10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет +право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб, +недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий +пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере +2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения +исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy). +10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое +законодательство – Российской Федерации. +10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным, +остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать +исполнять свои обязанности в соответствии с этими положениями. diff --git a/platform/runtime/base/base-extensions-support/pom.xml b/platform/runtime/base/base-extensions-support/pom.xml new file mode 100644 index 00000000..f17a58ed --- /dev/null +++ b/platform/runtime/base/base-extensions-support/pom.xml @@ -0,0 +1,46 @@ + + 4.0.0 + + ru.entaxy.esb.platform.runtime + base + 1.11.0 + + ru.entaxy.esb.platform.runtime.base + base-extensions-support + bundle + ENTAXY :: PLATFORM :: BASE :: EXTENSIONS SUPPORT + ENTAXY :: PLATFORM :: BASE :: EXTENSIONS SUPPORT + + + + ru.entaxy.esb.platform.runtime.base.extensions.api + + + ru.entaxy.esb.platform.runtime.base.extensions.impl, + ru.entaxy.esb.platform.runtime.base.extensions.shell + + none + + + + + org.osgi + org.osgi.service.component.annotations + + + org.apache.felix + org.apache.felix.scr + + + ru.entaxy.esb.platform.runtime.base + base-support + ${project.version} + + + org.apache.karaf.shell + org.apache.karaf.shell.core + ${karaf.version} + + + + diff --git a/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/api/EntaxyExtendable.java b/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/api/EntaxyExtendable.java new file mode 100644 index 00000000..893e9076 --- /dev/null +++ b/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/api/EntaxyExtendable.java @@ -0,0 +1,42 @@ +/*- + * ~~~~~~licensing~~~~~~ + * base-extensions-support + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.platform.runtime.base.extensions.api; + +import java.util.List; +import java.util.UUID; + +public interface EntaxyExtendable extends EntaxyExtensionsProvider { + + default String getExtendableId() { + if (this.getClass().isAnnotationPresent(Extendable.class)) + return this.getClass().getAnnotation(Extendable.class).value(); + return UUID.randomUUID().toString(); + } + + void addExtension(EntaxyExtension entaxyExtension); + void removeExtension(EntaxyExtension entaxyExtension); + +} diff --git a/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/api/EntaxyExtension.java b/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/api/EntaxyExtension.java new file mode 100644 index 00000000..52a778a7 --- /dev/null +++ b/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/api/EntaxyExtension.java @@ -0,0 +1,39 @@ +/*- + * ~~~~~~licensing~~~~~~ + * base-extensions-support + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.platform.runtime.base.extensions.api; + +import java.net.URL; +import java.util.Map; + +public interface EntaxyExtension { + + long getBundleId(); + Map getResources(); + + Map getCustomData(); + + String getTargetExtendableId(); +} diff --git a/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/api/EntaxyExtensionService.java b/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/api/EntaxyExtensionService.java new file mode 100644 index 00000000..80e9ed8c --- /dev/null +++ b/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/api/EntaxyExtensionService.java @@ -0,0 +1,40 @@ +/*- + * ~~~~~~licensing~~~~~~ + * base-extensions-support + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.platform.runtime.base.extensions.api; + +import java.util.List; + +public interface EntaxyExtensionService { + + String HEADER_EXTENSIONS_PROVIDER = "Entaxy-Extensions-Provider"; + String HEADER_EXTENSIONS_LOCATION = "Entaxy-Extensions-Location"; + + String DEFAULT_EXTENSIONS_LOCATION = "ru/entaxy/extensions"; + + List getExtensions(); + + List getExtendables(); +} diff --git a/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/api/EntaxyExtensionsAware.java b/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/api/EntaxyExtensionsAware.java new file mode 100644 index 00000000..1aa6231a --- /dev/null +++ b/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/api/EntaxyExtensionsAware.java @@ -0,0 +1,40 @@ +/*- + * ~~~~~~licensing~~~~~~ + * base-extensions-support + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.platform.runtime.base.extensions.api; + +import java.util.List; + +public interface EntaxyExtensionsAware { + + void addExtension(EntaxyExtension entaxyExtension); + default void addExtensions(List entaxyExtensions) { + for (EntaxyExtension extension: entaxyExtensions) + addExtension(extension); + }; + + void removeExtension(EntaxyExtension entaxyExtension); + +} diff --git a/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/api/EntaxyExtensionsProvider.java b/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/api/EntaxyExtensionsProvider.java new file mode 100644 index 00000000..56de3ffb --- /dev/null +++ b/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/api/EntaxyExtensionsProvider.java @@ -0,0 +1,34 @@ +/*- + * ~~~~~~licensing~~~~~~ + * base-extensions-support + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.platform.runtime.base.extensions.api; + +import java.util.List; + +public interface EntaxyExtensionsProvider { + + List getExtensions(); + +} diff --git a/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/api/Extendable.java b/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/api/Extendable.java new file mode 100644 index 00000000..4a1771cd --- /dev/null +++ b/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/api/Extendable.java @@ -0,0 +1,38 @@ +/*- + * ~~~~~~licensing~~~~~~ + * base-extensions-support + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.platform.runtime.base.extensions.api; + +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +@Retention(RUNTIME) +@Target(TYPE) +public @interface Extendable { + String value(); +} diff --git a/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/impl/EntaxyExtensionImpl.java b/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/impl/EntaxyExtensionImpl.java new file mode 100644 index 00000000..b5572155 --- /dev/null +++ b/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/impl/EntaxyExtensionImpl.java @@ -0,0 +1,73 @@ +/*- + * ~~~~~~licensing~~~~~~ + * base-extensions-support + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.platform.runtime.base.extensions.impl; + +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +import org.osgi.framework.Bundle; + +import ru.entaxy.esb.platform.runtime.base.extensions.api.EntaxyExtension; + +public class EntaxyExtensionImpl implements EntaxyExtension { + + protected Bundle bundle; + + protected String targetId; + + protected final Map customData = new HashMap<>(); + + protected final Map resources = new HashMap<>(); + + public EntaxyExtensionImpl(Bundle b, String target) { + this.bundle = b; + this.targetId = target; + } + + @Override + public long getBundleId() { + return bundle==null + ?-1 + :bundle.getBundleId(); + } + + @Override + public Map getResources() { + return resources; + } + + @Override + public Map getCustomData() { + return customData; + } + + @Override + public String getTargetExtendableId() { + return targetId; + } + +} diff --git a/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/impl/EntaxyExtensionServiceImpl.java b/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/impl/EntaxyExtensionServiceImpl.java new file mode 100644 index 00000000..89fa5aca --- /dev/null +++ b/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/impl/EntaxyExtensionServiceImpl.java @@ -0,0 +1,212 @@ +/*- + * ~~~~~~licensing~~~~~~ + * base-extensions-support + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.platform.runtime.base.extensions.impl; + +import java.net.URL; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.BundleEvent; +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.service.component.annotations.Reference; +import org.osgi.service.component.annotations.ReferenceCardinality; +import org.osgi.service.component.annotations.ReferencePolicyOption; +import org.osgi.util.tracker.BundleTracker; + +import ru.entaxy.esb.platform.runtime.base.extensions.api.EntaxyExtendable; +import ru.entaxy.esb.platform.runtime.base.extensions.api.EntaxyExtension; +import ru.entaxy.esb.platform.runtime.base.extensions.api.EntaxyExtensionService; +import ru.entaxy.platform.base.support.CommonUtils; +import ru.entaxy.platform.base.support.osgi.tracker.BundleTrackerCustomizerListener; +import ru.entaxy.platform.base.support.osgi.tracker.BundleTrackerUtils; +import ru.entaxy.platform.base.support.osgi.tracker.UniformBundleTrackerCustomizer; +import ru.entaxy.platform.base.support.osgi.tracker.filter.BundleHeaderFilter; + +@Component(service = EntaxyExtensionService.class, immediate = true) +public class EntaxyExtensionServiceImpl + extends UniformBundleTrackerCustomizer> + implements EntaxyExtensionService, + BundleTrackerCustomizerListener> { + + protected BundleContext bundleContext; + + protected Map extendables = new HashMap<>(); + + protected Object extensionsLock = new Object(); + + protected final Map> extensions = new HashMap<>(); + + protected BundleTracker> extensionTracker; + + @Activate + public void activate(ComponentContext componentContext) { + this.bundleContext = componentContext.getBundleContext(); + extensionTracker = BundleTrackerUtils.>createBuilder() + .bundleContext(this.bundleContext) + .addFilter( + (new BundleHeaderFilter()).header(HEADER_EXTENSIONS_PROVIDER)) + .customizer(this.listener(this)) + .bundleState(Bundle.INSTALLED | Bundle.RESOLVED | Bundle.ACTIVE) + .get(); + extensionTracker.open(); + + } + + @Deactivate + public void deactivate() { + extensionTracker.close(); + } + + @Reference(cardinality = ReferenceCardinality.MULTIPLE, policyOption = ReferencePolicyOption.GREEDY, + unbind = "removeExtendable") + public void addExtendable(EntaxyExtendable entaxyExtendable) { + synchronized (extensionsLock) { + String extendableId = entaxyExtendable.getExtendableId(); + extendables.put(extendableId, entaxyExtendable); + if (extensions.containsKey(extendableId)) + for (EntaxyExtension extension : extensions.get(extendableId)) + entaxyExtendable.addExtension(extension); + } + } + + public void removeExtendable(EntaxyExtendable entaxyExtendable) { + extendables.remove(entaxyExtendable.getExtendableId()); + } + + @Override + public void added(List managedObject) { + synchronized (extensionsLock) { + for (EntaxyExtension extension : managedObject) { + String targetId = extension.getTargetExtendableId(); + extensions.putIfAbsent(targetId, new ArrayList<>()); + + extensions.get(targetId).add(extension); + if (extendables.containsKey(targetId)) + extendables.get(targetId).addExtension(extension); + } + } + } + + @Override + public void modified(List ignore) {} + + @Override + public void removed(List managedObject) { + synchronized (extensionsLock) { + for (EntaxyExtension extension : managedObject) { + String targetId = extension.getTargetExtendableId(); + if (extendables.containsKey(targetId)) + extendables.get(targetId).removeExtension(extension); + + if (extensions.containsKey(targetId)) + extensions.get(targetId).remove(extension); + } + } + } + + @Override + protected List createManagedObject(Bundle bundle, BundleEvent event, + Map> filterResults) { + String resourceLocation = + CommonUtils.getValid(bundle.getHeaders().get(HEADER_EXTENSIONS_LOCATION), DEFAULT_EXTENSIONS_LOCATION); + Enumeration entries = bundle.findEntries(resourceLocation, "*.*", true); + + Map localExtensions = new HashMap<>(); + + if (entries != null) + while (entries.hasMoreElements()) { + URL entry = entries.nextElement(); + if (entry.toString().endsWith("/")) + continue; + + String localPath = entry.toString(); + localPath = localPath.substring(localPath.indexOf(resourceLocation) + resourceLocation.length() + 1); + + String resourceName = localPath.substring(localPath.lastIndexOf("/") + 1); + + String path = localPath.lastIndexOf("/") >= 0 + ? localPath.substring(0, localPath.lastIndexOf("/")) + : ""; + int splitIndex = path.indexOf("/"); + String target = splitIndex > 0 + ? path.substring(0, splitIndex) + : ""; + + if (splitIndex > 0) + path = path.substring(splitIndex + 1); + + if (!CommonUtils.isValid(target) || !CommonUtils.isValid(resourceName)) + continue; + + if (!localExtensions.containsKey(target)) + localExtensions.put(target, new EntaxyExtensionImpl(bundle, target)); + + localExtensions.get(target).getResources().put(path + "/" + resourceName, entry); + + } + + return localExtensions.values().stream().collect(Collectors.toList()); + } + + @Override + public List getExtensions() { + final List result = new ArrayList<>(); + extensions.values().forEach(arr -> result.addAll(arr)); + Collections.sort(result, new Comparator() { + + @Override + public int compare(EntaxyExtension o1, EntaxyExtension o2) { + int res = o1.getTargetExtendableId().compareTo(o2.getTargetExtendableId()); + if (res != 0) + return res; + if (o1.getBundleId() < o2.getBundleId()) + return -1; + if (o1.getBundleId() > o2.getBundleId()) + return 1; + return 0; + } + }); + return result; + } + + @Override + public List getExtendables() { + return extendables.values().stream().collect(Collectors.toList()); + } + + +} diff --git a/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/shell/EntaxyExtensionServiceSupport.java b/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/shell/EntaxyExtensionServiceSupport.java new file mode 100644 index 00000000..ed92b883 --- /dev/null +++ b/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/shell/EntaxyExtensionServiceSupport.java @@ -0,0 +1,38 @@ +/*- + * ~~~~~~licensing~~~~~~ + * base-extensions-support + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.platform.runtime.base.extensions.shell; + +import org.apache.karaf.shell.api.action.Action; +import org.apache.karaf.shell.api.action.lifecycle.Reference; + +import ru.entaxy.esb.platform.runtime.base.extensions.api.EntaxyExtensionService; + +public abstract class EntaxyExtensionServiceSupport implements Action { + + @Reference + EntaxyExtensionService extensionService; + +} diff --git a/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/shell/ExtendablesList.java b/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/shell/ExtendablesList.java new file mode 100644 index 00000000..f108a114 --- /dev/null +++ b/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/shell/ExtendablesList.java @@ -0,0 +1,53 @@ +/*- + * ~~~~~~licensing~~~~~~ + * base-extensions-support + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.platform.runtime.base.extensions.shell; + +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.esb.platform.runtime.base.extensions.api.EntaxyExtendable; + +@Service +@Command(scope = "entaxy", name = "extendables-list") +public class ExtendablesList extends EntaxyExtensionServiceSupport { + + @Override + public Object execute() throws Exception { + + ShellTable table = new ShellTable(); + + table.column("Extendable id"); + + for (EntaxyExtendable ext: extensionService.getExtendables()) + table.addRow().addContent(ext.getExtendableId()); + + table.print(System.out); + + return null; + } + +} diff --git a/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/shell/ExtensionsList.java b/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/shell/ExtensionsList.java new file mode 100644 index 00000000..0d83549e --- /dev/null +++ b/platform/runtime/base/base-extensions-support/src/main/java/ru/entaxy/esb/platform/runtime/base/extensions/shell/ExtensionsList.java @@ -0,0 +1,79 @@ +/*- + * ~~~~~~licensing~~~~~~ + * base-extensions-support + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.platform.runtime.base.extensions.shell; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.Option; +import org.apache.karaf.shell.api.action.lifecycle.Service; +import org.apache.karaf.shell.support.table.ShellTable; + +import ru.entaxy.esb.platform.runtime.base.extensions.api.EntaxyExtension; + +@Service +@Command(scope = "entaxy", name = "extension-list") +public class ExtensionsList extends EntaxyExtensionServiceSupport { + + @Option(name = "-r", multiValued = false) + boolean showResources; + + @Override + public Object execute() throws Exception { + ShellTable shellTable = new ShellTable(); + + shellTable.column("Target"); + shellTable.column("Bundle"); + + if (showResources) { + shellTable.column("Resource"); + shellTable.column("Resource URL"); + } + + List list = extensionService.getExtensions(); + for (EntaxyExtension ext: list) + if (!showResources) + shellTable.addRow().addContent(ext.getTargetExtendableId(), ext.getBundleId()); + else { + List resources = new ArrayList<>(ext.getResources().keySet()); + Collections.sort(resources); + for (String resource: resources) { + shellTable.addRow().addContent( + ext.getTargetExtendableId(), + ext.getBundleId(), + resource, + ext.getResources().get(resource).toString()); + } + } + + shellTable.print(System.out); + + return null; + } + +} diff --git a/platform/runtime/base/base-support/pom.xml b/platform/runtime/base/base-support/pom.xml index d1016596..a227fd69 100644 --- a/platform/runtime/base/base-support/pom.xml +++ b/platform/runtime/base/base-support/pom.xml @@ -3,7 +3,7 @@ ru.entaxy.esb.platform.runtime base - 1.10.0 + 1.11.0 ru.entaxy.esb.platform.runtime.base base-support diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/CommonUtils.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/CommonUtils.java index 10c815a6..e8a1220c 100644 --- a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/CommonUtils.java +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/CommonUtils.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * base-support * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/DependencySorter.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/DependencySorter.java index cfecf87c..21a96d5a 100644 --- a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/DependencySorter.java +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/DependencySorter.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/FileUtils.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/FileUtils.java index 3cf7909f..7dc80e2d 100644 --- a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/FileUtils.java +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/FileUtils.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * base-support * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/SimpleFileWatcher.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/SimpleFileWatcher.java new file mode 100644 index 00000000..03eb959a --- /dev/null +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/SimpleFileWatcher.java @@ -0,0 +1,211 @@ +/*- + * ~~~~~~licensing~~~~~~ + * base-support + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.base.support; + +import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE; +import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE; +import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY; + +import java.io.IOException; +import java.nio.file.FileSystems; +import java.nio.file.FileVisitResult; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.WatchEvent; +import java.nio.file.WatchKey; +import java.nio.file.WatchService; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.HashMap; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SimpleFileWatcher implements Runnable { + + public static interface WatcherCallback { + + default void directoryCreated(WatchEvent event, Path directory) {}; + + default void directoryModified(WatchEvent event, Path directory) {}; + + default void directoryDeleted(WatchEvent event, Path directory) {}; + + default void fileCreated(WatchEvent event, Path directory) {}; + + default void fileModified(WatchEvent event, Path directory) {}; + + default void fileDeleted(WatchEvent event, Path directory) {}; + + } + + private static final Logger LOG = LoggerFactory.getLogger(SimpleFileWatcher.class); + + protected static final WatcherCallback NULL_CALLBACK = new WatcherCallback() {}; + + protected final WatchService watchService; + protected final Map keys; + + protected WatcherCallback watcherCallback = null; + + /** + * Creates a WatchService and registers the given directory + */ + public SimpleFileWatcher(Path dir) throws IOException { + this.watchService = FileSystems.getDefault().newWatchService(); + this.keys = new HashMap(); + + walkAndRegisterDirectories(dir); + } + + /** + * Register the given directory with the WatchService; This function will be called by + * FileVisitor + */ + private void registerDirectory(Path dir) throws IOException { + WatchKey key = dir.register(watchService, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); + keys.put(key, dir); + } + + /** + * Register the given directory, and all its sub-directories, with the WatchService. + */ + private void walkAndRegisterDirectories(final Path start) throws IOException { + // register directory and sub-directories + Files.walkFileTree(start, new SimpleFileVisitor() { + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { + registerDirectory(dir); + return FileVisitResult.CONTINUE; + } + }); + } + + public void setWatcherCallback(WatcherCallback watcherCallback) { + this.watcherCallback = watcherCallback; + } + + protected WatcherCallback getActiveCallback() { + return watcherCallback == null ? NULL_CALLBACK : watcherCallback; + } + + /** + * Process all events for keys queued to the watchService + */ + @Override + public void run() { + + WatchKey key = null; + try { + while ((key = watchService.take()) != null) { + + Path dir = keys.get(key); + if (dir == null) { + System.err.println("WatchKey not recognized!!"); + continue; + } + + for (WatchEvent event : key.pollEvents()) { + @SuppressWarnings("rawtypes") + WatchEvent.Kind kind = event.kind(); + + // Context for directory entry event is the file name of entry + @SuppressWarnings("unchecked") + Path name = ((WatchEvent) event).context(); + Path child = dir.resolve(name); + + // print out event + LOG.debug("{}: {}\n", event.kind().name(), child); + + // if directory is created, and watching recursively, then register it and its + // sub-directories + + if (kind == ENTRY_CREATE) { + try { + if (Files.isDirectory(child)) { + walkAndRegisterDirectories(child); + getActiveCallback().directoryCreated(event, dir); + } else { + LOG.debug("FOUND FILE: {}", child.toString()); + getActiveCallback().fileCreated(event, dir); + } + } catch (Exception x) { + LOG.error(String.format("FAILED processing event [%s] for [%s]", kind, child.toString()), + x); + } + } else if (kind == ENTRY_MODIFY) { + try { + if (Files.isDirectory(child)) { + getActiveCallback().directoryModified(event, dir); + } else { + getActiveCallback().fileModified(event, dir); + } + } catch (Exception x) { + LOG.error(String.format("FAILED processing event [%s] for [%s]", kind, child.toString()), + x); + } + } else if (kind == ENTRY_DELETE) { + try { + if (Files.isDirectory(child)) { + getActiveCallback().directoryDeleted(event, dir); + } else { + getActiveCallback().fileDeleted(event, dir); + } + } catch (Exception x) { + LOG.error(String.format("FAILED processing event [%s] for [%s]", kind, child.toString()), + x); + } + } + } + + // reset key and remove from set if directory no longer accessible + boolean valid = key.reset(); + if (!valid) { + keys.remove(key); + + // all directories are inaccessible + if (keys.isEmpty()) { + break; + } + } + } + } catch (InterruptedException ignore) { + // NOOP + } + } + + public void close() { + try { + for (WatchKey key : keys.keySet()) + key.cancel(); + this.watchService.close(); + } catch (IOException e) { + LOG.error("FAILED closing SimpleFileWatcher", e); + } + } + +} diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/karaf/shell/AnsiColumnExt.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/karaf/shell/AnsiColumnExt.java new file mode 100644 index 00000000..3f8fa464 --- /dev/null +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/karaf/shell/AnsiColumnExt.java @@ -0,0 +1,96 @@ +/*- + * ~~~~~~licensing~~~~~~ + * base-support + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You 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. + */ +package ru.entaxy.platform.base.support.karaf.shell; + +import org.jline.utils.AttributedStringBuilder; + +/** + * Colored support for column. + */ +public class AnsiColumnExt extends ColExt { + + private int color; + private boolean bold; + + public AnsiColumnExt(String header, int color, boolean bold) { + super(header); + this.color = color; + this.bold = bold; + } + + public String getContent(ShellTableExt.CellData cellData) { + String in = super.getContent(cellData); + + AttributedStringBuilder sb = new AttributedStringBuilder(); + sb.style(sb.style().foreground(color)); + + if (bold) + sb.style(sb.style().bold()); + + sb.append(in); + + if (bold) + sb.style(sb.style().boldOff()); + + sb.style(sb.style().foregroundOff()); + + return sb.toAnsi(); + } + + @Override + @Deprecated + public String getContent(String content) { + String in = super.getContent(content); + + AttributedStringBuilder sb = new AttributedStringBuilder(); + sb.style(sb.style().foreground(color)); + + if (bold) + sb.style(sb.style().bold()); + + sb.append(in); + + if (bold) + sb.style(sb.style().boldOff()); + + sb.style(sb.style().foregroundOff()); + + return sb.toAnsi(); + } + +} diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/karaf/shell/ColExt.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/karaf/shell/ColExt.java new file mode 100644 index 00000000..8dc48a48 --- /dev/null +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/karaf/shell/ColExt.java @@ -0,0 +1,381 @@ +/*- + * ~~~~~~licensing~~~~~~ + * base-support + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You 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. + */ +package ru.entaxy.platform.base.support.karaf.shell; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.function.Function; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import org.apache.karaf.shell.support.ansi.SimpleAnsi; + +/** + * Column definition. + */ +public class ColExt { + // This is kept here only for backwards compatibility + // and is used in cyan(boolean) method + private static final Function COLOR_CYAN = + (cellContent) -> SimpleAnsi.COLOR_CYAN; + + Function colorProvider; + + Function colorProviderExt; + + protected ShellTableExt ownerTable = null; + + /** + * Column header. + */ + private String header; + + /** + * Maximum size of this column. The default -1 means the column may grow indefinitely + */ + int maxSize = -1; + + int size = 0; + + boolean wrap; + boolean bold; + boolean cyan; + + Boolean splitLists = null; + + /** + * Alignment + */ + private HAlignExt align = HAlignExt.left; + + public ColExt(String header) { + this.header = header; + } + + public ColExt align(HAlignExt align) { + this.align = align; + return this; + } + + public ColExt alignLeft() { + this.align = HAlignExt.left; + return this; + } + + public ColExt alignRight() { + this.align = HAlignExt.right; + return this; + } + + public ColExt alignCenter() { + this.align = HAlignExt.center; + return this; + } + + public ColExt maxSize(int maxSize) { + this.maxSize = maxSize; + return this; + } + + public ColExt splitLists() { + return splitLists(true); + } + + public ColExt splitLists(boolean value) { + this.splitLists = value; + return this; + } + + public ColExt wrap() { + return wrap(true); + } + + public ColExt wrap(boolean wrap) { + this.wrap = wrap; + return this; + } + + public ColExt bold() { + return bold(true); + } + + public ColExt bold(boolean bold) { + this.bold = bold; + return this; + } + + public ColExt cyan() { + return cyan(true); + } + + public ColExt cyan(boolean cyan) { + if (cyan) + colorProvider(COLOR_CYAN); + + // Only remove colorProvider if argument is false and + // member equals COLOR_CYAN + else if (this.colorProvider == COLOR_CYAN) + colorProvider(null); + + return this; + } + + public int getSize() { + return size; + } + + public ColExt colorProvider(Function colorProvider) { + this.colorProvider = colorProvider; + return this; + } + + public ColExt colorProviderExt(Function colorProvider) { + this.colorProviderExt = colorProvider; + return this; + } + + protected void updateSize(int cellSize) { + if (this.size <= cellSize) { + this.size = getClippedSize(cellSize); + } + } + + private int getClippedSize(int cellSize) { + return this.maxSize == -1 ? cellSize : Math.min(cellSize, this.maxSize); + } + + /* + String format(Object cellData) { + if (cellData == null) { + cellData = ""; + } + String fullContent = String.format("%s", cellData); + if (fullContent.length() == 0) { + return ""; + } + String finalContent = cut(fullContent, getClippedSize(fullContent.length())); + updateSize(finalContent.length()); + return finalContent; + } + */ + + protected boolean isSplitLists() { + if (this.splitLists != null) + return this.splitLists; + if (ownerTable != null) + return ownerTable.isSplitLists(); + return false; + } + + /* + @ENTAXY_FIX: + when calculating cell size we must take into account not LENGTH, but WIDTH of the data + 'cause data may contain "\n" so the LENGTH of data won't be equal to it's WIDTH + */ + @SuppressWarnings("unchecked") + public String format(Object cellData) { + if (cellData == null) { + cellData = ""; + } + + String fullContent = String.format("%s", cellData); + + if (isSplitLists() && (cellData instanceof List)) { + fullContent = (String) ((List) cellData).stream().map(v -> v == null ? "" : v.toString()) + .collect(Collectors.joining("\n")); + } + + if (fullContent.length() == 0) { + return ""; + } + String finalContent = cut(fullContent, getClippedSize(fullContent.length())); + + int finalContentWidth = 0; + for (String s : Arrays.asList(finalContent.split("\n"))) + finalContentWidth = Math.max(finalContentWidth, s.length()); + + updateSize(finalContentWidth); + return finalContent; + } + + String getHeader() { + return header; + } + + String getContent(ShellTableExt.CellData cellData) { + + String content = cellData.cellContent; + + List lines = new ArrayList<>(); + lines.addAll(Arrays.asList(content.split("\n"))); + if (wrap) { + List wrapped = new ArrayList<>(); + for (String line : lines) { + wrapped.addAll(wrap(line)); + } + lines = wrapped; + } + + String color = null; + if (colorProviderExt != null) { + color = colorProviderExt.apply(cellData); + } else if (colorProvider != null) { + color = colorProvider.apply(content); + } + + StringBuilder sb = new StringBuilder(); + for (String line : lines) { + if (sb.length() > 0) { + sb.append("\n"); + } + line = this.align.position(cut(line, size), this.size); + if (bold) { + line = SimpleAnsi.INTENSITY_BOLD + line + SimpleAnsi.INTENSITY_NORMAL; + } + + if (color != null) + sb.append(color); + + sb.append(line); + + if (color != null) + sb.append(SimpleAnsi.COLOR_DEFAULT); + } + return sb.toString(); + } + + @Deprecated + String getContent(String content) { + List lines = new ArrayList<>(); + lines.addAll(Arrays.asList(content.split("\n"))); + if (wrap) { + List wrapped = new ArrayList<>(); + for (String line : lines) { + wrapped.addAll(wrap(line)); + } + lines = wrapped; + } + + String color = null; + if (colorProvider != null) { + color = colorProvider.apply(content); + } + + StringBuilder sb = new StringBuilder(); + for (String line : lines) { + if (sb.length() > 0) { + sb.append("\n"); + } + line = this.align.position(cut(line, size), this.size); + if (bold) { + line = SimpleAnsi.INTENSITY_BOLD + line + SimpleAnsi.INTENSITY_NORMAL; + } + + if (color != null) + sb.append(color); + + sb.append(line); + + if (color != null) + sb.append(SimpleAnsi.COLOR_DEFAULT); + } + return sb.toString(); + } + + /* + protected String cut(String content, int size) { + if (content.length() <= size) { + return content; + } else { + return content.substring(0, Math.max(0, size - 1)); + } + } + */ + + protected String cut0(String content, int size) { + if (content.length() <= size) { + return content; + } else { + return content.substring(0, Math.max(0, size - 1)); + } + } + + protected String cut(String content, int size) { + if (content.length() <= size) { + return content; + } else { + + String[] contentSplitted = content.split("\n"); + for (int i = 0; i < contentSplitted.length; i++) + contentSplitted[i] = cut0(contentSplitted[i], size); + + if (contentSplitted.length == 1) + return contentSplitted[0]; + + return Arrays.asList(contentSplitted).stream().collect(Collectors.joining("\n")); + } + } + + protected List wrap(String str) { + List result = new ArrayList<>(); + Pattern wrap = Pattern.compile("(\\S\\S{" + size + ",}|.{1," + size + "})(\\s+|$)"); + int cur = 0; + while (cur >= 0) { + int lst = str.indexOf('\n', cur); + String s = (lst >= 0) ? str.substring(cur, lst) : str.substring(cur); + if (s.length() == 0) { + result.add(s); + } else { + Matcher m = wrap.matcher(s); + while (m.find()) { + result.add(m.group()); + } + } + if (lst >= 0) { + cur = lst + 1; + } else { + break; + } + } + return result; + } + + +} diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/karaf/shell/HAlignExt.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/karaf/shell/HAlignExt.java new file mode 100644 index 00000000..dca2d983 --- /dev/null +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/karaf/shell/HAlignExt.java @@ -0,0 +1,93 @@ +/*- + * ~~~~~~licensing~~~~~~ + * base-support + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You 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. + */ +package ru.entaxy.platform.base.support.karaf.shell; + +import static ru.entaxy.platform.base.support.karaf.shell.StringUtil.length; +import static ru.entaxy.platform.base.support.karaf.shell.StringUtil.repeat; + +/** + * Enumeration type which contains all possible horizontal alignments. + */ +public enum HAlignExt { + + /** + * Center align. + */ + center { + @Override + public String position(String text, int colWidth) { + int width = colWidth - length(text); + text = repeat(" ", width / 2) + text + repeat(" ", width / 2); + if (length(text) < colWidth) { + // if colWidth is odd we add space at the end. + text += " "; + } + return text; + } + }, + + /** + * Left align. + */ + left { + @Override + public String position(String text, int colWidth) { + return text + repeat(" ", colWidth - length(text)); + } + }, + + /** + * Right align. + */ + right { + @Override + public String position(String text, int colWidth) { + return repeat(" ", colWidth - length(text)) + text; + } + }; + + /** + * Calculate text position. + * + * @param text the text to align. + * @param colWidth the column width. + * @return the string at the given position. + */ + public abstract String position(String text, int colWidth); + +} diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/karaf/shell/RowExt.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/karaf/shell/RowExt.java new file mode 100644 index 00000000..73c67cf4 --- /dev/null +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/karaf/shell/RowExt.java @@ -0,0 +1,132 @@ +/*- + * ~~~~~~licensing~~~~~~ + * base-support + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You 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. + */ +package ru.entaxy.platform.base.support.karaf.shell; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class RowExt { + + protected List data; + protected List content; + + protected Object dataObject = null; + + RowExt() { + data = new ArrayList<>(); + content = new ArrayList<>(); + } + + RowExt(Object dataObject) { + data = new ArrayList<>(); + content = new ArrayList<>(); + this.dataObject = dataObject; + } + + RowExt(List cols) { + this(); + for (ColExt col : cols) { + data.add(col.getHeader()); + } + } + + public void addContent(List data) { + this.data = data; + } + + public void addContent(Object... cellDataAr) { + data.addAll(Arrays.asList(cellDataAr)); + } + + void formatContent(List cols) { + content.clear(); + int c = 0; + for (ColExt col : cols) { + content.add(col.format(data.get(c))); + c++; + } + } + + String getContent(List cols, String separator) { + if (cols.size() != content.size()) { + throw new RuntimeException("Number of columns and number of content elements do not match"); + } + + List contents = new ArrayList<>(); + int lines = 0; + for (int col = 0; col < cols.size(); col++) { + // String[] cnt = cols.get(col).getContent(content.get(col)).split("\n"); + String[] cnt = cols.get(col).getContent(new ShellTableExt.CellData(dataObject, content.get(col))).split("\n"); + lines = Math.max(lines, cnt.length); + contents.add(cnt); + } + StringBuilder st = new StringBuilder(); + for (int line = 0; line < lines; line++) { + if (line > 0) { + st.append("\n"); + } + StringBuilder st2 = new StringBuilder(); + for (int col = 0; col < cols.size(); col++) { + String[] strings = contents.get(col); + if (col > 0) { + st2.append(separator); + } + if (line < strings.length) { + st2.append(strings[line]); + } else { + st2.append(StringUtil.repeat(" ", cols.get(col).getSize())); + } + } + while (st2.charAt(st2.length() - 1) == ' ') { + st2.setLength(st2.length() - 1); + } + st.append(st2); + } + return st.toString(); + } + + public Object getDataObject() { + return dataObject; + } + + public void setDataObject(Object dataObject) { + this.dataObject = dataObject; + } + +} diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/karaf/shell/ShellTableColFixed.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/karaf/shell/ShellTableColFixed.java new file mode 100644 index 00000000..274ca4a9 --- /dev/null +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/karaf/shell/ShellTableColFixed.java @@ -0,0 +1,90 @@ +/*- + * ~~~~~~licensing~~~~~~ + * platform-manager-core + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.base.support.karaf.shell; + +import java.util.Arrays; +import java.util.stream.Collectors; + +import org.apache.karaf.shell.support.table.Col; + +public class ShellTableColFixed extends Col { + + protected int maxSizeLocal = -1; + + public ShellTableColFixed(String header) { + super(header); + } + + @Override + protected String cut(String content, int size) { + if (content.length() <= size) { + return content; + } else { + + String[] contentSplitted = content.split("\n"); + for (int i=0; i cols = new ArrayList<>(); + private List rows = new ArrayList<>(); + private boolean showHeaders = true; + private String separator = DEFAULT_SEPARATOR; + private int size; + private String emptyTableText; + private boolean forceAscii; + + private boolean splitLists = false; + + public ShellTableExt() { + + } + + public ShellTableExt noHeaders() { + this.showHeaders = false; + return this; + } + + public ShellTableExt separator(String separator) { + this.separator = separator; + return this; + } + + public ShellTableExt size(int size) { + this.size = size; + return this; + } + + public boolean isSplitLists() { + return splitLists; + } + + public ShellTableExt splitLists() { + return splitLists(true); + } + + public ShellTableExt splitLists(boolean value) { + this.splitLists = value; + return this; + } + + public ShellTableExt column(ColExt colunmn) { + cols.add(colunmn); + colunmn.ownerTable = this; + return this; + } + + public ColExt column(String header) { + ColExt col = new ColExt(header); + col.ownerTable = this; + cols.add(col); + return col; + } + + public RowExt addRow() { + RowExt row = new RowExt(); + rows.add(row); + return row; + } + + public RowExt addRow(Object dataObject) { + RowExt row = addRow(); + row.setDataObject(dataObject); + return row; + } + + public ShellTableExt forceAscii() { + forceAscii = true; + return this; + } + + /** + * Set text to display if there are no rows in the table. + * + * @param text the text to display when the table is empty. + * @return the shell table. + */ + public ShellTableExt emptyTableText(String text) { + this.emptyTableText = text; + return this; + } + + public void print(PrintStream out) { + print(out, true); + } + + public void print(PrintStream out, boolean format) { + print(out, null, format); + } + + public void print(PrintStream out, Charset charset, boolean format) { + boolean unicode = supportsUnicode(out, charset); + String separator = unicode ? this.separator : DEFAULT_SEPARATOR_ASCII; + + // "normal" table rendering, with borders + RowExt headerRow = new RowExt(cols); + headerRow.formatContent(cols); + for (RowExt row : rows) { + row.formatContent(cols); + } + + if (size > 0) { + adjustSize(); + } + + if (format && showHeaders) { + String headerLine = headerRow.getContent(cols, separator); + out.println(headerLine); + int iCol = 0; + for (ColExt col : cols) { + if (iCol++ == 0) { + out.print(underline(col.getSize(), false, unicode)); + } else { + out.print(underline(col.getSize() + 3, true, unicode)); + } + iCol++; + } + out.println(); + } + + for (RowExt row : rows) { + if (!format) { + if (separator == null || separator.equals(DEFAULT_SEPARATOR)) + out.println(row.getContent(cols, DEFAULT_SEPARATOR_NO_FORMAT)); + else + out.println(row.getContent(cols, separator)); + } else { + out.println(row.getContent(cols, separator)); + } + } + + if (format && rows.size() == 0 && emptyTableText != null) { + out.println(emptyTableText); + } + } + + private boolean supportsUnicode(PrintStream out, Charset charset) { + if (forceAscii) { + return false; + } + if (charset == null) { + charset = getEncoding(out); + } + if (charset == null) { + return false; + } + CharsetEncoder encoder = charset.newEncoder(); + return encoder.canEncode(separator) + && encoder.canEncode(SEP_HORIZONTAL) + && encoder.canEncode(SEP_CROSS); + } + + private Charset getEncoding(PrintStream ps) { + if (ps.getClass() == ThreadPrintStream.class) { + try { + return ((Terminal) Job.Utils.current().session().get(".jline.terminal")).encoding(); + } catch (Throwable t) { + // ignore + } + try { + ps = (PrintStream) ps.getClass().getMethod("getCurrent").invoke(ps); + } catch (Throwable t) { + // ignore + } + } + try { + Field f = ps.getClass().getDeclaredField("charOut"); + f.setAccessible(true); + OutputStreamWriter osw = (OutputStreamWriter) f.get(ps); + return Charset.forName(osw.getEncoding()); + } catch (Throwable t) { + // ignore + } + return null; + } + + private void adjustSize() { + int currentSize = 0; + for (ColExt col : cols) { + currentSize += col.size + separator.length(); + } + currentSize -= separator.length(); + int sizeToGrow = size - currentSize; + + for (int i = cols.size() - 1; i >= 0; i--) { + ColExt col = cols.get(i); + if (col.maxSize == -1) { + col.size = Math.max(0, col.size + sizeToGrow); + return; + } + } + + } + + private String underline(int length, boolean crossAtBeg, boolean supported) { + char[] exmarks = new char[length]; + Arrays.fill(exmarks, supported ? SEP_HORIZONTAL : SEP_HORIZONTAL_ASCII); + if (crossAtBeg) { + exmarks[1] = supported ? SEP_CROSS : SEP_CROSS_ASCII; + } + return new String(exmarks); + } + + public static class CellData { + public Object dataObject; + public String cellContent; + + public CellData(Object dataObject, String cellContent) { + this.dataObject = dataObject; + this.cellContent = cellContent; + } + + } + +} diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/karaf/shell/ShellTableFixed.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/karaf/shell/ShellTableFixed.java new file mode 100644 index 00000000..ce199fad --- /dev/null +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/karaf/shell/ShellTableFixed.java @@ -0,0 +1,48 @@ +/*- + * ~~~~~~licensing~~~~~~ + * platform-manager-core + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.base.support.karaf.shell; + +import org.apache.karaf.shell.support.table.ShellTable; + +/** + * @deprecated use {@link ru.entaxy.platform.base.support.karaf.shell.ShellTableExt} instead + */ +@Deprecated +public class ShellTableFixed extends ShellTable { + + @Override + public ShellTableColFixed column(String header) { + ShellTableColFixed col = new ShellTableColFixed(header); + column(col); + return col; + } + + public ShellTableFixed column(ShellTableColFixed colunmn) { + super.column(colunmn); + return this; + } + +} diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/karaf/shell/StringUtil.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/karaf/shell/StringUtil.java new file mode 100644 index 00000000..b5a613a8 --- /dev/null +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/karaf/shell/StringUtil.java @@ -0,0 +1,68 @@ +/*- + * ~~~~~~licensing~~~~~~ + * base-support + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You 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. + */ +package ru.entaxy.platform.base.support.karaf.shell; + +public class StringUtil { + + /** + * Returns length of the string. + * + * @param string String. + * @return Length. + */ + public static int length(String string) { + return string == null ? 0 : string.length(); + } + + /** + * Utility method to repeat string. + * + * @param string String to repeat. + * @param times Number of times. + * @return Repeat string. + */ + public static String repeat(String string, int times) { + if (times <= 0) { + return ""; + } else if (times % 2 == 0) { + return repeat(string + string, times / 2); + } else { + return string + repeat(string + string, times / 2); + } + } +} diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/BundleUtils.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/BundleUtils.java index da3f2d10..909663b1 100644 --- a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/BundleUtils.java +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/BundleUtils.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * base-support * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/OSGIUtils.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/OSGIUtils.java index 2c8914bf..4cd5142d 100644 --- a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/OSGIUtils.java +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/OSGIUtils.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * base-support * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/bundle/BundleCapabilityHelper.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/bundle/BundleCapabilityHelper.java index 7a7bc002..cd5c435a 100644 --- a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/bundle/BundleCapabilityHelper.java +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/bundle/BundleCapabilityHelper.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * base-support * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/bundle/CapabilityDescriptor.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/bundle/CapabilityDescriptor.java index 847fff95..7e0b7904 100644 --- a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/bundle/CapabilityDescriptor.java +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/bundle/CapabilityDescriptor.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/bundle/CapabilityDescriptorImpl.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/bundle/CapabilityDescriptorImpl.java index 5b4892b8..9f411702 100644 --- a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/bundle/CapabilityDescriptorImpl.java +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/bundle/CapabilityDescriptorImpl.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/bundle/CapabilityHelper.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/bundle/CapabilityHelper.java index 370e3e6e..26301e08 100644 --- a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/bundle/CapabilityHelper.java +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/bundle/CapabilityHelper.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/bundle/CapabilityTypeHelper.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/bundle/CapabilityTypeHelper.java index b76852d3..51cd0c65 100644 --- a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/bundle/CapabilityTypeHelper.java +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/bundle/CapabilityTypeHelper.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/feature/FeatureCapabilityHelper.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/feature/FeatureCapabilityHelper.java new file mode 100644 index 00000000..d0bf116c --- /dev/null +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/feature/FeatureCapabilityHelper.java @@ -0,0 +1,69 @@ +/*- + * ~~~~~~licensing~~~~~~ + * base-support + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.base.support.osgi.feature; + +import java.util.List; + +import org.apache.karaf.features.Capability; +import org.apache.karaf.features.Feature; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ru.entaxy.platform.base.support.osgi.bundle.CapabilityDescriptorImpl; +import ru.entaxy.platform.base.support.osgi.bundle.CapabilityHelper; + +public class FeatureCapabilityHelper extends CapabilityHelper { + + private static final Logger LOG = LoggerFactory.getLogger(FeatureCapabilityHelper.class); + + protected Feature feature; + + public FeatureCapabilityHelper(Feature feature) { + super(); + setMultipleNamespacesSupported(true); + this.feature = feature; + load(); + } + + @Override + protected void load() { + super.load(); + List featureCapabilities = feature.getCapabilities(); + for (Capability c : featureCapabilities) { + String[] caps = c.getValue().split(","); + for (String cap : caps) + try { + CapabilityDescriptorImpl descriptor = parseCapability(cap); + if (descriptor != null) + addProvidedCapability(descriptor); + } catch (Exception e) { + LOG.error(String.format("Error parsing capability [%s] for feature [%s/%s]", cap, feature.getName(), + feature.getVersion()), e); + } + } + } + +} diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/feature/FeaturesUtils.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/feature/FeaturesUtils.java new file mode 100644 index 00000000..bdf29200 --- /dev/null +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/feature/FeaturesUtils.java @@ -0,0 +1,164 @@ +/*- + * ~~~~~~licensing~~~~~~ + * base-support + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.base.support.osgi.feature; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.karaf.bundle.core.BundleService; +import org.apache.karaf.features.Feature; +import org.apache.karaf.features.FeaturesService; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.ServiceReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ru.entaxy.platform.base.support.CommonUtils; + +public class FeaturesUtils { + + public static class FeaturesHelper { + + private static final Logger LOG = LoggerFactory.getLogger(FeaturesUtils.FeaturesHelper.class); + + public static FeaturesHelper create() { + return new FeaturesHelper(); + } + + public static FeaturesHelper create(BundleContext bundleContext) { + return create().bundleContext(bundleContext); + } + + protected BundleContext bundleContext = FrameworkUtil.getBundle(FeaturesUtils.class).getBundleContext(); + + protected String capabilityNamespace = null; + + protected boolean installedOnly = false; + + protected Bundle bundle = null; + + protected FeaturesHelper() { + super(); + } + + public List find() throws Exception { + + + ServiceReference ref = bundleContext.getServiceReference(FeaturesService.class); + FeaturesService featuresService = bundleContext.getService(ref); + + Feature[] featureArray = + isInstalledOnly() ? featuresService.listInstalledFeatures() : featuresService.listFeatures(); + + List features = Arrays.asList(featureArray); + + if (bundle != null) { + + ServiceReference ref0 = bundleContext.getServiceReference(BundleService.class); + BundleService bundleService = bundleContext.getService(ref0); + final String location = bundleService.getInfo(bundle).getUpdateLocation(); + bundleContext.ungetService(ref0); + + features = features.stream().filter( + f -> (f.getBundles().stream().filter(bi -> bi.getLocation().equals(location)) + .count() > 0)) + .collect(Collectors.toList()); + } + + if (CommonUtils.isValid(capabilityNamespace)) { + features = features.stream() + .filter(f -> (new FeatureCapabilityHelper(f).isCapabilityProvided(capabilityNamespace))) + .collect(Collectors.toList()); + } + + bundleContext.ungetService(ref); + + return features; + } + + public FeaturesUtils.FeaturesHelper bundleContext(BundleContext BundleContextValue) { + this.setBundleContext(BundleContextValue); + return this; + } + + public FeaturesUtils.FeaturesHelper withCapabilityNamespace(String capabilityNamespaceValue) { + this.setCapabilityNamespace(capabilityNamespaceValue); + return this; + }; + + public FeaturesUtils.FeaturesHelper installedOnly() { + this.setInstalledOnly(true); + return this; + }; + + public FeaturesUtils.FeaturesHelper installedOnly(boolean InstalledOnlyValue) { + this.setInstalledOnly(InstalledOnlyValue); + return this; + }; + + public FeaturesUtils.FeaturesHelper containingBundle(Bundle bundleValue) { + this.setBundle(bundleValue); + return this; + }; + + public BundleContext getBundleContext() { + return bundleContext; + } + + public void setBundleContext(BundleContext bundleContext) { + this.bundleContext = bundleContext; + } + + public String getCapabilityNamespace() { + return capabilityNamespace; + } + + public void setCapabilityNamespace(String capabilityNamespace) { + this.capabilityNamespace = capabilityNamespace; + } + + public boolean isInstalledOnly() { + return installedOnly; + } + + public void setInstalledOnly(boolean installedOnly) { + this.installedOnly = installedOnly; + } + + public Bundle getBundle() { + return bundle; + } + + public void setBundle(Bundle bundle) { + this.bundle = bundle; + }; + + } + +} diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/service/CommonNamedReferenceListener.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/service/CommonNamedReferenceListener.java index 72858643..cdebb91c 100644 --- a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/service/CommonNamedReferenceListener.java +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/service/CommonNamedReferenceListener.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * system-commons * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/service/CommonReferenceListener.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/service/CommonReferenceListener.java index 5c77310f..05a013ba 100644 --- a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/service/CommonReferenceListener.java +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/service/CommonReferenceListener.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * system-commons * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/service/NamedReferenceListener.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/service/NamedReferenceListener.java index a594d102..08171a23 100644 --- a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/service/NamedReferenceListener.java +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/service/NamedReferenceListener.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * system-commons * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/service/ReferenceListener.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/service/ReferenceListener.java index b12b8f33..8f12c138 100644 --- a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/service/ReferenceListener.java +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/service/ReferenceListener.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * system-commons * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/BundleContextAware.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/BundleContextAware.java index b7bc6ecf..c21d1961 100644 --- a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/BundleContextAware.java +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/BundleContextAware.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * profile-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/BundleFilter.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/BundleFilter.java index 2b25d6ad..a794a5eb 100644 --- a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/BundleFilter.java +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/BundleFilter.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * profile-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/BundleTrackerCustomizerListener.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/BundleTrackerCustomizerListener.java index 4c15881d..ff8cab75 100644 --- a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/BundleTrackerCustomizerListener.java +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/BundleTrackerCustomizerListener.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * profile-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/BundleTrackerUtils.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/BundleTrackerUtils.java index d6113aba..da4ab94e 100644 --- a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/BundleTrackerUtils.java +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/BundleTrackerUtils.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * profile-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/UniformBundleTrackerCustomizer.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/UniformBundleTrackerCustomizer.java index 8fa3d1f6..fce252e6 100644 --- a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/UniformBundleTrackerCustomizer.java +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/UniformBundleTrackerCustomizer.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * profile-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/filter/AbstractBundleFilter.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/filter/AbstractBundleFilter.java index f4f66756..583292d7 100644 --- a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/filter/AbstractBundleFilter.java +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/filter/AbstractBundleFilter.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * base-support * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/filter/BundleCapabilityFilter.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/filter/BundleCapabilityFilter.java index 519bc2b1..c8cf4324 100644 --- a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/filter/BundleCapabilityFilter.java +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/filter/BundleCapabilityFilter.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * profile-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/filter/BundleHeaderFilter.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/filter/BundleHeaderFilter.java index 070c8542..1ea5dd48 100644 --- a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/filter/BundleHeaderFilter.java +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/osgi/tracker/filter/BundleHeaderFilter.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * base-support * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/xml/CommonXMLUtils.java b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/xml/CommonXMLUtils.java index a22b7d73..f7599f0a 100644 --- a/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/xml/CommonXMLUtils.java +++ b/platform/runtime/base/base-support/src/main/java/ru/entaxy/platform/base/support/xml/CommonXMLUtils.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * base-support * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/branding/pom.xml b/platform/runtime/base/branding/pom.xml index 48344038..c08c2870 100644 --- a/platform/runtime/base/branding/pom.xml +++ b/platform/runtime/base/branding/pom.xml @@ -3,7 +3,7 @@ ru.entaxy.esb.platform.runtime base - 1.10.0 + 1.11.0 4.0.0 diff --git a/platform/runtime/base/branding/src/main/cfg/branding.properties b/platform/runtime/base/branding/src/main/cfg/branding.properties index 0a8c8527..75c5dfea 100644 --- a/platform/runtime/base/branding/src/main/cfg/branding.properties +++ b/platform/runtime/base/branding/src/main/cfg/branding.properties @@ -2,7 +2,7 @@ # ~~~~~~licensing~~~~~~ # branding # ========== -# Copyright (C) 2020 - 2024 EmDev LLC +# Copyright (C) 2020 - 2025 EmDev LLC # ========== # You may not use this file except in accordance with the License Terms of the Copyright # Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/cellar-extensions/LICENSE.txt b/platform/runtime/base/cellar-extensions/LICENSE.txt new file mode 100644 index 00000000..4ae94b75 --- /dev/null +++ b/platform/runtime/base/cellar-extensions/LICENSE.txt @@ -0,0 +1,175 @@ + ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ + +Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой) +версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего +Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН +7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова, +д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу +https://www.emdev.ru/about (далее - Компания). + +Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями» +(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения, +Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в +настоящем документе, в противном случае, он должен не использовать или не получать доступ +к Программному обеспечению. + + 1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ + +a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии +или редакции, исключительные права на которую принадлежат Правообладателю. +b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные +права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ +для ЭВМ № 2021610848 от 19.01.2021 года. +c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта +https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО. +d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также +личные неимущественные права авторов произведений на результат интеллектуальной деятельности. +e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование +ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка +включает предоставление Пользователю неисключительного права использования ПО, в том числе +получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение +патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается +Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается +для каждого Пользователя индивидуально в Сертификате. +f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром), +подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное +обеспечение в ограниченном объёме и на определённый период времени. +g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО, +предоставленных Пользователю согласно условиям Подписки. +h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного +обеспечения. +i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий +из одного или нескольких файлов, который может быть прочтён человеком. +j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля +программы, полученный в результате обработки исходного кода, еще не связанный в полную программу. +Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый +продукт. +k) Некоммерческое использование – индивидуальное личное использование Пользователем программного +обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации +возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая +выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения. + + 2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ + +2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного +обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом +воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения +в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ. +2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит +неисключительный характер. +2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию, +лицензия на ограниченное использование Программного обеспечения. +2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования +имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан +обратиться в службу поддержки Правообладателя по адресу: https://entaxy.ru/ для изменения +вида лицензии с Базовой бесплатной версии на Подписки. +2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для +пробного использования программного обеспечения – не ограничен. +2.6. Использование Пользователем настоящего программного обеспечения в целях разработки, +модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю, +без разрешения Правообладателя не допускается. + + 3. АВТОРСКОЕ ПРАВО. + +3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение +и любые его копии принадлежат Правообладателю. +3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента, +к которому можно получить доступ с помощью Программного обеспечения, является собственностью +соответствующего владельца контента и защищается применимым законодательством об авторском +праве или другими законами и договорами об интеллектуальной собственности. +3.3. Условия использования Программного обеспечения. +Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь +придерживается следующих условий: +3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять +какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании +Программного обеспечения или на нем. +3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать, +расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать +Программное обеспечение. +3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования +ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне. +3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено +использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам. + + 4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС» + +4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю +на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с +использованием Пользователем: +4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в +Программное обеспечение; +4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями +настоящего соглашения; +4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием, +или данными, не предоставленными Пользователю Правообладателем; +4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем. + + +5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ +ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ +И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ +ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ +И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ +ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО. + + 6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ. +НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ +ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ, +ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ; +ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ. +ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ +ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ; +КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ +ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ. + + 7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ: +Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия +(включая, но не ограничиваясь) по: +-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код) + Программного обеспечения; +-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный +код Программного обеспечения, за исключением тех изменений, которые вносятся средствами, +включёнными в Программное обеспечение и описанными непосредственно в документации к нему; +-созданию условий для использования Программного обеспечения лицами, не имеющими прав на +использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство +третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа +к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку; +-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию). + + 8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА. + +8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из +лицензионных продуктов, используемых на законных основаниях, а +именно https://entaxy.ru/libs/licenses/root-aggregated.deps. +8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть +совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения. +8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться +Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения, +содержащих все изменения и дополнения программного обеспечения. + + 9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ. + +9.1. Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым +программным обеспечением. +9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно +с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм +«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public. +9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий +пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя, +прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер +ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства +Российской Федерации. + + 10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ. + +10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет +право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб, +недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий +пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере +2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения +исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy). +10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое +законодательство – Российской Федерации. +10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным, +остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать +исполнять свои обязанности в соответствии с этими положениями. diff --git a/platform/runtime/base/cellar-extensions/pom.xml b/platform/runtime/base/cellar-extensions/pom.xml new file mode 100644 index 00000000..d8772e8f --- /dev/null +++ b/platform/runtime/base/cellar-extensions/pom.xml @@ -0,0 +1,89 @@ + + 4.0.0 + + ru.entaxy.esb.platform.runtime + base + 1.11.0 + + ru.entaxy.esb.platform.runtime.base + cellar-extensions + bundle + ENTAXY :: PLATFORM :: BASE :: CELLAR EXTENSIONS + ENTAXY :: PLATFORM :: BASE :: CELLAR EXTENSIONS + + + + ru.entaxy.platform.runtime.cellar.helper, + ru.entaxy.platform.runtime.cellar.sequence + + + org.apache.karaf.features.internal.model, + org.apache.felix.utils.version, + org.apache.felix.utils.properties, + org.apache.karaf.util, + ru.entaxy.platform.runtime.cellar.sequence.process, + ru.entaxy.platform.runtime.cellar.sequence.impl + + + + + + + org.apache.felix + org.apache.felix.configadmin + ${felix.configadmin.version} + + + + + + + org.apache.karaf.features + org.apache.karaf.features.core + ${karaf.version} + + + + ru.entaxy.esb.platform.runtime.base + base-support + ${project.version} + + + org.apache.karaf.shell + org.apache.karaf.shell.core + + + + + + org.apache.karaf + org.apache.karaf.util + + + org.apache.karaf.cellar + org.apache.karaf.cellar.core + ${cellar.version} + + + + org.apache.karaf.cellar + org.apache.karaf.cellar.event + ${cellar.version} + + + + org.apache.karaf.cellar + org.apache.karaf.cellar.features + ${cellar.version} + + + + + + diff --git a/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/helper/CellarFeaturesHelper.java b/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/helper/CellarFeaturesHelper.java new file mode 100644 index 00000000..fad859dc --- /dev/null +++ b/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/helper/CellarFeaturesHelper.java @@ -0,0 +1,738 @@ +/*- + * ~~~~~~licensing~~~~~~ + * cellar-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +/* + * 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. + */ +package ru.entaxy.platform.runtime.cellar.helper; + +import java.net.URI; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.management.openmbean.CompositeData; +import javax.management.openmbean.CompositeDataSupport; +import javax.management.openmbean.CompositeType; +import javax.management.openmbean.OpenType; +import javax.management.openmbean.SimpleType; +import javax.management.openmbean.TabularData; +import javax.management.openmbean.TabularDataSupport; +import javax.management.openmbean.TabularType; + +// import org.apache.karaf.cellar.bundle.BundleState; +import org.apache.karaf.cellar.core.CellarSupport; +import org.apache.karaf.cellar.core.ClusterManager; +import org.apache.karaf.cellar.core.Configurations; +import org.apache.karaf.cellar.core.Group; +import org.apache.karaf.cellar.core.GroupManager; +import org.apache.karaf.cellar.core.control.SwitchStatus; +import org.apache.karaf.cellar.core.event.EventProducer; +import org.apache.karaf.cellar.core.event.EventType; +import org.apache.karaf.cellar.features.ClusterFeaturesEvent; +import org.apache.karaf.cellar.features.ClusterRepositoryEvent; +import org.apache.karaf.cellar.features.Constants; +import org.apache.karaf.cellar.features.FeatureState; +import org.apache.karaf.cellar.features.management.CellarFeaturesMBean; +import org.apache.karaf.features.Feature; +import org.apache.karaf.features.FeatureEvent; +import org.apache.karaf.features.FeaturesService; +import org.apache.karaf.features.RepositoryEvent; +// import org.osgi.framework.BundleEvent; +import org.apache.karaf.features.internal.model.Features; +import org.apache.karaf.features.internal.model.JaxbUtil; +import org.osgi.service.cm.ConfigurationAdmin; + +/** + * Implementation of the Cellar Features MBean. + */ +public class CellarFeaturesHelper implements CellarFeaturesMBean { + + private ClusterManager clusterManager; + private GroupManager groupManager; + private EventProducer eventProducer; + private FeaturesService featuresService; + private ConfigurationAdmin configurationAdmin; + + public CellarFeaturesHelper() { + super(); + } + + public ClusterManager getClusterManager() { + return this.clusterManager; + } + + public void setClusterManager(ClusterManager clusterManager) { + this.clusterManager = clusterManager; + } + + public GroupManager getGroupManager() { + return this.groupManager; + } + + public void setGroupManager(GroupManager groupManager) { + this.groupManager = groupManager; + } + + public EventProducer getEventProducer() { + return eventProducer; + } + + public void setEventProducer(EventProducer eventProducer) { + this.eventProducer = eventProducer; + } + + public FeaturesService getFeaturesService() { + return featuresService; + } + + public void setFeaturesService(FeaturesService featuresService) { + this.featuresService = featuresService; + } + + public ConfigurationAdmin getConfigurationAdmin() { + return configurationAdmin; + } + + public void setConfigurationAdmin(ConfigurationAdmin configurationAdmin) { + this.configurationAdmin = configurationAdmin; + } + + @Override + public void installFeature(String groupName, String name, String version, boolean noRefresh, boolean noStart, + boolean noManage, boolean upgrade) throws Exception { + // check if the group exists + Group group = groupManager.findGroupByName(groupName); + if (group == null) { + throw new IllegalArgumentException("Cluster group " + groupName + " doesn't exist"); + } + + // check if the producer is ON + if (eventProducer.getSwitch().getStatus().equals(SwitchStatus.OFF)) { + throw new IllegalStateException("Cluster event producer is OFF"); + } + + // check if the feature is allowed outbound + CellarSupport support = new CellarSupport(); + support.setClusterManager(this.clusterManager); + support.setGroupManager(this.groupManager); + support.setConfigurationAdmin(this.configurationAdmin); + if (!support.isAllowed(group, Constants.CATEGORY, name, EventType.OUTBOUND)) { + throw new IllegalArgumentException( + "Feature " + name + " is blocked outbound for cluster group " + groupName); + } + + ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); + try { + + // get the features in the cluster group + Map clusterFeatures = + clusterManager.getMap(Constants.FEATURES_MAP + Configurations.SEPARATOR + groupName); + + // check if the feature exist + FeatureState feature = null; + String key = null; + + String targetKey = null; + + // collect features to remove if upgrade = true + List featuresToRemove = new ArrayList<>(); + + for (String k : clusterFeatures.keySet()) { + FeatureState state = clusterFeatures.get(k); + key = k; + if (version == null) { + if (state.getName().equals(name)) { + feature = state; + targetKey = key; + break; + } + } else { + if (state.getName().equals(name)) { + if (state.getVersion().equals(version)) { + feature = state; + targetKey = key; + if (!upgrade) + break; + } else if (upgrade) + featuresToRemove.add(key); + } + } + } + + if (feature == null) { + if (version == null) + throw new IllegalArgumentException( + "Feature " + name + " doesn't exist in cluster group " + groupName); + else + throw new IllegalArgumentException( + "Feature " + name + "/" + version + " doesn't exist in cluster group " + groupName); + } + + // update the cluster group + + // set previous features uninstalled if we upgrade + // actual uninstallation will be executed on end nodes + if (upgrade) { + for (String featureKey : featuresToRemove) { + FeatureState fs = clusterFeatures.get(featureKey); + fs.setInstalled(false); + clusterFeatures.put(featureKey, fs); + } + + } + + // set current feature installed + feature.setInstalled(true); + clusterFeatures.put(targetKey, feature); + } finally { + Thread.currentThread().setContextClassLoader(originalClassLoader); + } + + // broadcast the cluster event + ClusterFeaturesEvent event = new ClusterFeaturesEvent(name, version, noRefresh, noStart, noManage, upgrade, + FeatureEvent.EventType.FeatureInstalled); + event.setSourceGroup(group); + eventProducer.produce(event); + } + + @Override + public void installFeature(String groupName, String name, String version) throws Exception { + this.installFeature(groupName, name, version, false, false, false, false); + } + + @Override + public void installFeature(String groupName, String name) throws Exception { + this.installFeature(groupName, name, null); + } + + + @Override + public void installFeature(String groupName, String name, boolean noRefresh, boolean noStart, boolean noManage, + boolean upgrade) throws Exception { + this.installFeature(groupName, name, null, noRefresh, noStart, noManage, upgrade); + } + + @Override + public void uninstallFeature(String groupName, String name, String version) throws Exception { + this.uninstallFeature(groupName, name, version, false); + } + + @Override + public void uninstallFeature(String groupName, String name, String version, boolean noRefresh) throws Exception { + // check if the group exists + Group group = groupManager.findGroupByName(groupName); + if (group == null) { + throw new IllegalArgumentException("Cluster group " + groupName + " doesn't exist"); + } + + // check if the producer is ON + if (eventProducer.getSwitch().getStatus().equals(SwitchStatus.OFF)) { + throw new IllegalStateException("Cluster event producer is OFF"); + } + + // check if the feature is allowed outbound + CellarSupport support = new CellarSupport(); + support.setClusterManager(this.clusterManager); + support.setGroupManager(this.groupManager); + support.setConfigurationAdmin(this.configurationAdmin); + if (!support.isAllowed(group, Constants.CATEGORY, name, EventType.OUTBOUND)) { + throw new IllegalArgumentException( + "Feature " + name + " is blocked outbound for cluster group " + groupName); + } + + ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); + try { + + // get the features in the cluster group + Map clusterFeatures = + clusterManager.getMap(Constants.FEATURES_MAP + Configurations.SEPARATOR + groupName); + + // check if the feature exist + FeatureState feature = null; + String key = null; + for (String k : clusterFeatures.keySet()) { + FeatureState state = clusterFeatures.get(k); + key = k; + if (version == null) { + if (state.getName().equals(name)) { + feature = state; + break; + } + } else { + if (state.getName().equals(name) && state.getVersion().equals(version)) { + feature = state; + break; + } + } + } + + if (feature == null) { + if (version == null) + throw new IllegalArgumentException( + "Feature " + name + " doesn't exist in cluster group " + groupName); + else + throw new IllegalArgumentException( + "Feature " + name + "/" + version + " doesn't exist in cluster group " + groupName); + } + + // update the cluster group + feature.setInstalled(false); + clusterFeatures.put(key, feature); + } finally { + Thread.currentThread().setContextClassLoader(originalClassLoader); + } + + // broadcast the cluster event + ClusterFeaturesEvent event = new ClusterFeaturesEvent(name, version, noRefresh, false, false, false, + FeatureEvent.EventType.FeatureUninstalled); + event.setSourceGroup(group); + eventProducer.produce(event); + } + + @Override + public void uninstallFeature(String groupName, String name) throws Exception { + this.uninstallFeature(groupName, name, null, false); + } + + @Override + public void uninstallFeature(String groupName, String name, boolean noRefresh) throws Exception { + this.uninstallFeature(groupName, name, null, noRefresh); + } + + @Override + public TabularData getFeatures(String groupName) throws Exception { + + Group group = groupManager.findGroupByName(groupName); + if (group == null) { + throw new IllegalArgumentException("Cluster group " + groupName + " doesn't exist"); + } + + CellarSupport support = new CellarSupport(); + support.setClusterManager(clusterManager); + support.setGroupManager(groupManager); + support.setConfigurationAdmin(configurationAdmin); + + CompositeType featuresType = new CompositeType("Feature", "Karaf Cellar feature", + new String[] {"name", "version", "installed", "located", "blocked"}, + new String[] {"Name of the feature", "Version of the feature", + "Whether the feature is installed or not", + "Location of the feature (on the cluster or the local node)", + "Feature block policy"}, + new OpenType[] {SimpleType.STRING, SimpleType.STRING, SimpleType.BOOLEAN, SimpleType.STRING, + SimpleType.STRING}); + + TabularType tabularType = new TabularType("Features", "Table of all Karaf Cellar features", + featuresType, new String[] {"name", "version"}); + TabularData table = new TabularDataSupport(tabularType); + + ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); + try { + Map features = gatherFeatures(groupName); + if (features != null && !features.isEmpty()) { + for (ExtendedFeatureState feature : features.values()) { + + String located = ""; + boolean cluster = feature.isCluster(); + boolean local = feature.isLocal(); + if (cluster && local) + located = "cluster/local"; + if (cluster && !local) + located = "cluster"; + if (local && !cluster) + located = "local"; + + String blocked = ""; + boolean inbound = + support.isAllowed(group, Constants.CATEGORY, feature.getName(), EventType.INBOUND); + boolean outbound = + support.isAllowed(group, Constants.CATEGORY, feature.getName(), EventType.OUTBOUND); + if (!inbound && !outbound) + blocked = "in/out"; + if (!inbound && outbound) + blocked = "in"; + if (!outbound && inbound) + blocked = "out"; + + CompositeData data = new CompositeDataSupport(featuresType, + new String[] {"name", "version", "installed", "located", "blocked"}, + new Object[] {feature.getName(), feature.getVersion(), feature.getInstalled(), located, + blocked}); + table.put(data); + } + } + } finally { + Thread.currentThread().setContextClassLoader(originalClassLoader); + } + + return table; + } + + private Map gatherFeatures(String groupName) throws Exception { + Map features = new HashMap(); + + // get cluster features + Map clusterFeatures = + clusterManager.getMap(Constants.FEATURES_MAP + Configurations.SEPARATOR + groupName); + for (String key : clusterFeatures.keySet()) { + FeatureState state = clusterFeatures.get(key); + ExtendedFeatureState extendedState = new ExtendedFeatureState(); + extendedState.setName(state.getName()); + extendedState.setInstalled(state.getInstalled()); + extendedState.setVersion(state.getVersion()); + extendedState.setCluster(true); + extendedState.setLocal(true); + features.put(key, extendedState); + } + + // get local features + for (Feature feature : featuresService.listFeatures()) { + String key = feature.getName() + "/" + feature.getVersion(); + if (features.containsKey(key)) { + ExtendedFeatureState extendedState = features.get(key); + if (featuresService.isInstalled(feature)) + extendedState.setInstalled(true); + extendedState.setLocal(true); + } else { + ExtendedFeatureState extendedState = new ExtendedFeatureState(); + extendedState.setCluster(false); + extendedState.setLocal(true); + extendedState.setName(feature.getName()); + extendedState.setVersion(feature.getVersion()); + if (featuresService.isInstalled(feature)) + extendedState.setInstalled(true); + else + extendedState.setInstalled(false); + features.put(key, extendedState); + } + } + + return features; + } + + @Override + public List getRepositories(String groupName) throws Exception { + // check if the group exists + Group group = groupManager.findGroupByName(groupName); + if (group == null) { + throw new IllegalArgumentException("Cluster group " + groupName + " doesn't exist"); + } + + // get the features repositories in the cluster group + Map clusterRepositories = + clusterManager.getMap(Constants.REPOSITORIES_MAP + Configurations.SEPARATOR + groupName); + + List result = new ArrayList(); + for (String clusterRepository : clusterRepositories.keySet()) { + result.add(clusterRepository); + } + + return result; + } + + @Override + public void addRepository(String groupName, String nameOrUrl) throws Exception { + this.addRepository(groupName, nameOrUrl, null, false); + } + + @Override + public void addRepository(String groupName, String nameOrUrl, String version) throws Exception { + this.addRepository(groupName, nameOrUrl, version, false); + } + + @Override + public void addRepository(String groupName, String nameOrUrl, String version, boolean install) throws Exception { + // check if the group exists + Group group = groupManager.findGroupByName(groupName); + if (group == null) { + throw new IllegalArgumentException("Cluster group " + groupName + " doesn't exist"); + } + + // check if the event producer is ON + if (eventProducer.getSwitch().getStatus().equals(SwitchStatus.OFF)) { + throw new IllegalStateException("Cluster event producer is OFF"); + } + + ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); + try { + // get the features repositories in the cluster group + Map clusterRepositories = + clusterManager.getMap(Constants.REPOSITORIES_MAP + Configurations.SEPARATOR + groupName); + // get the features in the cluster group + Map clusterFeatures = + clusterManager.getMap(Constants.FEATURES_MAP + Configurations.SEPARATOR + groupName); + + URI uri = featuresService.getRepositoryUriFor(nameOrUrl, version); + if (uri == null) { + uri = new URI(nameOrUrl); + } + + // check if the URL is already registered + String name = null; + for (String repository : clusterRepositories.keySet()) { + if (repository.equals(uri)) { + name = clusterRepositories.get(repository); + break; + } + } + if (name == null) { + // parsing the features repository to get content + Features repository = JaxbUtil.unmarshal(uri.toASCIIString(), true); + + // update the cluster group + clusterRepositories.put(uri.toString(), repository.getName()); + + // update the features in the cluster group + for (Feature feature : repository.getFeature()) { + FeatureState state = new FeatureState(); + state.setName(feature.getName()); + state.setVersion(feature.getVersion()); + state.setInstalled(featuresService.isInstalled(feature)); + clusterFeatures.put(feature.getName() + "/" + feature.getVersion(), state); + } + + // broadcast the cluster event + ClusterRepositoryEvent event = + new ClusterRepositoryEvent(uri.toString(), RepositoryEvent.EventType.RepositoryAdded); + event.setInstall(install); + event.setSourceGroup(group); + event.setSourceNode(clusterManager.getNode()); + eventProducer.produce(event); + } else { + throw new IllegalArgumentException("Features repository URL " + uri + " already registered"); + } + } finally { + Thread.currentThread().setContextClassLoader(originalClassLoader); + } + } + + @Override + public void refreshRepository(String groupName, String nameOrUrl) throws Exception { + // check if the group exists + Group group = groupManager.findGroupByName(groupName); + if (group == null) { + throw new IllegalArgumentException("Cluster group " + groupName + " doesn't exist"); + } + + // check if the event producer is ON + if (eventProducer.getSwitch().getStatus().equals(SwitchStatus.OFF)) { + throw new IllegalStateException("Cluster event producer is OFF"); + } + + ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); + try { + String uri = null; + if (nameOrUrl != null) { + // get the cluster features repositories + Map clusterFeaturesRepositories = + clusterManager.getMap(Constants.REPOSITORIES_MAP + Configurations.SEPARATOR + groupName); + + for (Map.Entry entry : clusterFeaturesRepositories.entrySet()) { + if (entry.getKey().equals(nameOrUrl) || entry.getValue().equals(nameOrUrl)) { + uri = entry.getKey(); + break; + } + } + + if (uri == null) { + throw new IllegalArgumentException( + "Features repository " + nameOrUrl + " doesn't exist in cluster group " + groupName); + } + } + + // broadcast the cluster event + ClusterRepositoryEvent event = new ClusterRepositoryEvent(uri, RepositoryEvent.EventType.RepositoryAdded); + event.setRefresh(true); + event.setSourceGroup(group); + event.setSourceNode(clusterManager.getNode()); + eventProducer.produce(event); + } finally { + Thread.currentThread().setContextClassLoader(originalClassLoader); + } + } + + @Override + public void removeRepository(String groupName, String repository) throws Exception { + this.removeRepository(groupName, repository, false); + } + + @Override + public void removeRepository(String groupName, String repo, boolean uninstall) throws Exception { + // check if the group exists + Group group = groupManager.findGroupByName(groupName); + if (group == null) { + throw new IllegalArgumentException("Cluster group " + groupName + " doesn't exist"); + } + + // check if the event producer is ON + if (eventProducer.getSwitch().getStatus().equals(SwitchStatus.OFF)) { + throw new IllegalStateException("Cluster event producer is OFF"); + } + + // get the features repositories in the cluster group + Map clusterRepositories = + clusterManager.getMap(Constants.REPOSITORIES_MAP + Configurations.SEPARATOR + groupName); + // get the features in the cluster group + Map clusterFeatures = + clusterManager.getMap(Constants.FEATURES_MAP + Configurations.SEPARATOR + groupName); + + ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader(); + try { + Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); + + List urls = new ArrayList(); + Pattern pattern = Pattern.compile(repo); + for (String repositoryUrl : clusterRepositories.keySet()) { + String repositoryName = clusterRepositories.get(repositoryUrl); + if (repositoryName != null && !repositoryName.isEmpty()) { + // repository has name, try regex on the name + Matcher nameMatcher = pattern.matcher(repositoryName); + if (nameMatcher.matches()) { + urls.add(repositoryUrl); + } else { + // the name regex doesn't match, fallback to repository URI regex + Matcher uriMatcher = pattern.matcher(repositoryUrl); + if (uriMatcher.matches()) { + urls.add(repositoryUrl); + } + } + } else { + // the repository name is not defined, use repository URI regex + Matcher uriMatcher = pattern.matcher(repositoryUrl); + if (uriMatcher.matches()) { + urls.add(repositoryUrl); + } + } + } + + for (String url : urls) { + // looking for the URL in the list + boolean found = false; + for (String repository : clusterRepositories.keySet()) { + if (repository.equals(url)) { + found = true; + break; + } + } + if (found) { + Features repositoryModel = JaxbUtil.unmarshal(url, true); + + // update the features repositories in the cluster group + clusterRepositories.remove(url); + + // update the features in the cluster group + for (Feature feature : repositoryModel.getFeature()) { + clusterFeatures.remove(feature.getName() + "/" + feature.getVersion()); + } + + // broadcast a cluster event + ClusterRepositoryEvent event = + new ClusterRepositoryEvent(url, RepositoryEvent.EventType.RepositoryRemoved); + event.setUninstall(uninstall); + event.setSourceGroup(group); + event.setSourceNode(clusterManager.getNode()); + eventProducer.produce(event); + } else { + throw new IllegalArgumentException( + "Features repository URL " + url + " not found in cluster group " + groupName); + } + } + } finally { + Thread.currentThread().setContextClassLoader(originalClassLoader); + } + } + + @Override + public void block(String groupName, String featurePattern, boolean whitelist, boolean blacklist, boolean in, + boolean out) throws Exception { + + Group group = groupManager.findGroupByName(groupName); + if (group == null) { + throw new IllegalArgumentException("Cluster group " + groupName + " doesn't exist"); + } + + CellarSupport support = new CellarSupport(); + support.setClusterManager(clusterManager); + support.setGroupManager(groupManager); + support.setConfigurationAdmin(configurationAdmin); + + if (in) { + if (whitelist) + support.switchListEntry(Configurations.WHITELIST, groupName, Constants.CATEGORY, EventType.INBOUND, + featurePattern); + if (blacklist) + support.switchListEntry(Configurations.BLACKLIST, groupName, Constants.CATEGORY, EventType.INBOUND, + featurePattern); + } + if (out) { + if (whitelist) + support.switchListEntry(Configurations.WHITELIST, groupName, Constants.CATEGORY, EventType.OUTBOUND, + featurePattern); + if (blacklist) + support.switchListEntry(Configurations.BLACKLIST, groupName, Constants.CATEGORY, EventType.OUTBOUND, + featurePattern); + } + + } + + class ExtendedFeatureState extends FeatureState { + + private boolean cluster; + private boolean local; + + public boolean isCluster() { + return cluster; + } + + public void setCluster(boolean cluster) { + this.cluster = cluster; + } + + public boolean isLocal() { + return local; + } + + public void setLocal(boolean local) { + this.local = local; + } + } + +} diff --git a/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/helper/HelperFactory.java b/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/helper/HelperFactory.java new file mode 100644 index 00000000..79ec6d8c --- /dev/null +++ b/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/helper/HelperFactory.java @@ -0,0 +1,91 @@ +/*- + * ~~~~~~licensing~~~~~~ + * cellar-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.runtime.cellar.helper; + +import java.util.Collections; +import java.util.Map; + +import org.apache.karaf.cellar.core.ClusterManager; +import org.apache.karaf.cellar.core.GroupManager; +import org.apache.karaf.cellar.core.event.EventProducer; +import org.apache.karaf.cellar.features.management.CellarFeaturesMBean; +import org.apache.karaf.features.FeaturesService; +import org.osgi.service.cm.ConfigurationAdmin; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class HelperFactory { + + private static final Logger LOG = LoggerFactory.getLogger(HelperFactory.class); + + public static T createHelper(Class targetClass) { + + return createHelper(targetClass, Collections.emptyMap()); + + } + + public static T createHelper(Class targetClass, Map parameters) { + + if (CellarFeaturesMBean.class.equals(targetClass)) + return (T) createFeaturesHelper(parameters); + + return null; + + } + + + protected static CellarFeaturesHelper createFeaturesHelper(Map parameters) { + CellarFeaturesHelper result = new CellarFeaturesHelper(); + + if (parameters.containsKey(ClusterManager.class.getName())) + result.setClusterManager((ClusterManager) parameters.get(ClusterManager.class.getName())); + else if (Services.INSTANCE != null) + result.setClusterManager(Services.INSTANCE.clusterManager); + + if (parameters.containsKey(ConfigurationAdmin.class.getName())) + result.setConfigurationAdmin((ConfigurationAdmin) parameters.get(ConfigurationAdmin.class.getName())); + else if (Services.INSTANCE != null) + result.setConfigurationAdmin(Services.INSTANCE.configurationAdmin); + + if (parameters.containsKey(EventProducer.class.getName())) + result.setEventProducer((EventProducer) parameters.get(EventProducer.class.getName())); + else if (Services.INSTANCE != null) + result.setEventProducer(Services.INSTANCE.eventProducer); + + if (parameters.containsKey(FeaturesService.class.getName())) + result.setFeaturesService((FeaturesService) parameters.get(FeaturesService.class.getName())); + else if (Services.INSTANCE != null) + result.setFeaturesService(Services.INSTANCE.featuresService); + + if (parameters.containsKey(GroupManager.class.getName())) + result.setGroupManager((GroupManager) parameters.get(GroupManager.class.getName())); + else if (Services.INSTANCE != null) + result.setGroupManager(Services.INSTANCE.groupManager); + + return result; + } + +} diff --git a/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/helper/Services.java b/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/helper/Services.java new file mode 100644 index 00000000..694b2703 --- /dev/null +++ b/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/helper/Services.java @@ -0,0 +1,69 @@ +/*- + * ~~~~~~licensing~~~~~~ + * cellar-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.runtime.cellar.helper; + +import org.apache.karaf.cellar.core.ClusterManager; +import org.apache.karaf.cellar.core.GroupManager; +import org.apache.karaf.cellar.core.event.EventProducer; +import org.apache.karaf.features.FeaturesService; +import org.osgi.service.cm.ConfigurationAdmin; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Deactivate; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.component.annotations.ReferenceCardinality; +import org.osgi.service.component.annotations.ReferencePolicy; + +@Component(service = Services.class, immediate = true) +public class Services { + + public static Services INSTANCE = null; + + @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC) + public volatile ClusterManager clusterManager; + + @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC) + public volatile ConfigurationAdmin configurationAdmin; + + @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC) + public volatile EventProducer eventProducer; + + @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC) + public volatile FeaturesService featuresService; + + @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC) + public volatile GroupManager groupManager; + + @Activate + public void activate() { + INSTANCE = this; + } + + @Deactivate + public void deactivate() { + INSTANCE = null; + } +} diff --git a/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/CellarSequenceEvent.java b/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/CellarSequenceEvent.java new file mode 100644 index 00000000..d23d5d56 --- /dev/null +++ b/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/CellarSequenceEvent.java @@ -0,0 +1,56 @@ +/*- + * ~~~~~~licensing~~~~~~ + * cellar-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.runtime.cellar.sequence; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import org.apache.karaf.cellar.core.event.Event; + +public class CellarSequenceEvent extends Event implements Serializable { + + List sequence = new ArrayList<>(); + + boolean waitLast = true; + + public CellarSequenceEvent(String sequenceId) { + super(sequenceId); + } + + public List getSequence() { + return sequence; + } + + public boolean isWaitLast() { + return waitLast; + } + + public void setWaitLast(boolean waitLast) { + this.waitLast = waitLast; + } + +} diff --git a/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/CellarSequenceItemEvent.java b/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/CellarSequenceItemEvent.java new file mode 100644 index 00000000..db639863 --- /dev/null +++ b/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/CellarSequenceItemEvent.java @@ -0,0 +1,56 @@ +/*- + * ~~~~~~licensing~~~~~~ + * cellar-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.runtime.cellar.sequence; + +import org.apache.karaf.cellar.core.event.Event; + +public class CellarSequenceItemEvent extends Event { + + Event event; + + // -1 - infinite + // 0 - don't wait + // x - time in mills + int operationTimeout = -1; + + public CellarSequenceItemEvent(String id, Event event) { + super(id); + this.event = event; + } + + public Event getEvent() { + return event; + } + + public int getOperationTimeout() { + return operationTimeout; + } + + public void setOperationTimeout(int operationTimeout) { + this.operationTimeout = operationTimeout; + } + +} diff --git a/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/CellarSequenceManager.java b/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/CellarSequenceManager.java new file mode 100644 index 00000000..10bd889c --- /dev/null +++ b/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/CellarSequenceManager.java @@ -0,0 +1,38 @@ +/*- + * ~~~~~~licensing~~~~~~ + * cellar-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.runtime.cellar.sequence; + +public interface CellarSequenceManager { + + void releaseSequence(String sequenceId); + + void produceSequence(String sequenceId); + + T getSequencedHelper(String sequenceId, Class targetClass); + + SequenceBuilder getSequence(String sequenceId); + +} diff --git a/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/SequenceBuilder.java b/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/SequenceBuilder.java new file mode 100644 index 00000000..b9849e44 --- /dev/null +++ b/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/SequenceBuilder.java @@ -0,0 +1,60 @@ +/*- + * ~~~~~~licensing~~~~~~ + * cellar-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.runtime.cellar.sequence; + +import org.apache.karaf.cellar.core.control.BasicSwitch; +import org.apache.karaf.cellar.core.control.Switch; +import org.apache.karaf.cellar.core.event.Event; +import org.apache.karaf.cellar.core.event.EventProducer; + +public class SequenceBuilder implements EventProducer { + + protected CellarSequenceEvent cellarSequenceEvent; + + protected Switch eventSwitch = new BasicSwitch(getClass().getName()); + + public SequenceBuilder(String sequenceId) { + super(); + this.cellarSequenceEvent = new CellarSequenceEvent(sequenceId); + } + + public CellarSequenceEvent getEvent() { + return cellarSequenceEvent; + } + + @Override + public Switch getSwitch() { + return eventSwitch; + } + + @Override + public void produce(Event event) { + + cellarSequenceEvent.sequence.add(new CellarSequenceItemEvent(event.getId(), event)); + + } + +} diff --git a/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/SequenceEventHandler.java b/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/SequenceEventHandler.java new file mode 100644 index 00000000..09e9558c --- /dev/null +++ b/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/SequenceEventHandler.java @@ -0,0 +1,65 @@ +/*- + * ~~~~~~licensing~~~~~~ + * cellar-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.runtime.cellar.sequence; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import org.apache.karaf.cellar.core.control.BasicSwitch; +import org.apache.karaf.cellar.core.control.Switch; +import org.apache.karaf.cellar.core.event.EventHandler; +import org.osgi.service.component.annotations.Component; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ru.entaxy.platform.runtime.cellar.sequence.process.SequenceTask; + +@Component(service = EventHandler.class, immediate = true) +public class SequenceEventHandler implements EventHandler { + + private static final Logger LOG = LoggerFactory.getLogger(SequenceEventHandler.class); + + protected Switch eventSwitch = new BasicSwitch(getClass().getName()); + + protected ExecutorService threadPool = Executors.newCachedThreadPool(); + + @Override + public Class getType() { + return CellarSequenceEvent.class; + } + + @Override + public Switch getSwitch() { + return eventSwitch; + } + + @Override + public void handle(CellarSequenceEvent event) { + LOG.info("Received event: " + event.getId()); + threadPool.execute(new SequenceTask(event, Thread.currentThread().getContextClassLoader())); + } + +} diff --git a/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/impl/CellarSequenceManagerImpl.java b/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/impl/CellarSequenceManagerImpl.java new file mode 100644 index 00000000..1e1e877b --- /dev/null +++ b/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/impl/CellarSequenceManagerImpl.java @@ -0,0 +1,88 @@ +/*- + * ~~~~~~licensing~~~~~~ + * cellar-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.runtime.cellar.sequence.impl; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.karaf.cellar.core.event.EventProducer; +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 ru.entaxy.platform.runtime.cellar.helper.HelperFactory; +import ru.entaxy.platform.runtime.cellar.sequence.CellarSequenceManager; +import ru.entaxy.platform.runtime.cellar.sequence.SequenceBuilder; + +@Component(service = CellarSequenceManager.class, immediate = true) +public class CellarSequenceManagerImpl implements CellarSequenceManager { + + @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC) + protected volatile EventProducer eventProducer; + + protected final Map sequences = new HashMap<>(); + protected Object sequencesLock = new Object(); + + @Override + public T getSequencedHelper(String sequenceId, Class targetClass) { + + Map properties = new HashMap<>(); + properties.put(EventProducer.class.getName(), getSequenceBuilder(sequenceId)); + + return HelperFactory.createHelper(targetClass, properties); + + } + + @Override + public void produceSequence(String sequenceId) { + synchronized (sequencesLock) { + if (sequences.containsKey(sequenceId)) + eventProducer.produce(sequences.get(sequenceId).getEvent()); + } + } + + @Override + public void releaseSequence(String sequenceId) { + synchronized (sequencesLock) { + sequences.remove(sequenceId); + } + } + + @Override + public SequenceBuilder getSequence(String sequenceId) { + return getSequenceBuilder(sequenceId); + } + + protected SequenceBuilder getSequenceBuilder(String sequenceId) { + synchronized (sequencesLock) { + if (!sequences.containsKey(sequenceId)) + sequences.put(sequenceId, new SequenceBuilder(sequenceId)); + return sequences.get(sequenceId); + } + } + +} diff --git a/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/process/ChangeListener.java b/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/process/ChangeListener.java new file mode 100644 index 00000000..9ffc3435 --- /dev/null +++ b/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/process/ChangeListener.java @@ -0,0 +1,44 @@ +/*- + * ~~~~~~licensing~~~~~~ + * cellar-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.runtime.cellar.sequence.process; + +public interface ChangeListener { + + public interface CallBack { + void success(); + + default void fail() {}; + + default void timeout() {}; + } + + void setCallback(CallBack callBack); + + void register(); + + void unregister(); + +} diff --git a/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/process/ChangeListenerFactory.java b/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/process/ChangeListenerFactory.java new file mode 100644 index 00000000..8a6113d8 --- /dev/null +++ b/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/process/ChangeListenerFactory.java @@ -0,0 +1,143 @@ +/*- + * ~~~~~~licensing~~~~~~ + * cellar-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.runtime.cellar.sequence.process; + +import org.apache.karaf.cellar.core.event.Event; +import org.apache.karaf.cellar.features.ClusterFeaturesEvent; +import org.apache.karaf.cellar.features.ClusterRepositoryEvent; +import org.apache.karaf.features.FeatureEvent; +import org.apache.karaf.features.FeaturesListener; +import org.apache.karaf.features.RepositoryEvent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ru.entaxy.platform.runtime.cellar.helper.Services; + +public class ChangeListenerFactory { + + private static final Logger LOG = LoggerFactory.getLogger(ChangeListenerFactory.class); + + public static ChangeListener create(Event originEvent) { + + if (originEvent instanceof ClusterRepositoryEvent) { + return new RepositoryListener((ClusterRepositoryEvent) originEvent); + } + + if (originEvent instanceof ClusterFeaturesEvent) { + return new FeatureListener((ClusterFeaturesEvent) originEvent); + } + + return null; + } + + protected static abstract class AbstractChangeListener implements ChangeListener { + + protected CallBack callBack; + + protected T originEvent; + + public AbstractChangeListener(T event) { + super(); + this.originEvent = event; + } + + @Override + public void setCallback(CallBack callBack) { + this.callBack = callBack; + } + + } + + protected static class RepositoryListener extends AbstractChangeListener + implements FeaturesListener { + + public RepositoryListener(ClusterRepositoryEvent event) { + super(event); + } + + @Override + public void register() { + Services.INSTANCE.featuresService.registerListener(this); + + } + + @Override + public void unregister() { + Services.INSTANCE.featuresService.unregisterListener(this); + } + + @Override + public void featureEvent(FeatureEvent event) { + // ignore + } + + @Override + public void repositoryEvent(RepositoryEvent event) { + if (event.getRepository().getURI().toString().equals(originEvent.getId())) { + if (originEvent.getType().equals(event.getType())) { + LOG.debug("REPOSITORY EVENT for [{}]", originEvent.getId()); + callBack.success(); + } + } + } + + } + protected static class FeatureListener extends AbstractChangeListener + implements FeaturesListener { + + public FeatureListener(ClusterFeaturesEvent event) { + super(event); + } + + @Override + public void register() { + Services.INSTANCE.featuresService.registerListener(this); + + } + + @Override + public void unregister() { + Services.INSTANCE.featuresService.unregisterListener(this); + } + + @Override + public void featureEvent(FeatureEvent event) { + if (event.getFeature().getId().equals(originEvent.getId())) { + if (originEvent.getType().equals(event.getType())) { + LOG.debug("FEATURE EVENT for [{}]", originEvent.getId()); + callBack.success(); + } + } + } + + @Override + public void repositoryEvent(RepositoryEvent event) { + // ignore + } + + } + +} diff --git a/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/process/SequenceTask.java b/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/process/SequenceTask.java new file mode 100644 index 00000000..c6a3e190 --- /dev/null +++ b/platform/runtime/base/cellar-extensions/src/main/java/ru/entaxy/platform/runtime/cellar/sequence/process/SequenceTask.java @@ -0,0 +1,276 @@ +/*- + * ~~~~~~licensing~~~~~~ + * cellar-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.runtime.cellar.sequence.process; + +import java.util.ArrayDeque; +import java.util.Collections; +import java.util.concurrent.Callable; +import java.util.concurrent.CancellationException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import org.apache.karaf.cellar.core.event.Event; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ru.entaxy.platform.runtime.cellar.helper.Services; +import ru.entaxy.platform.runtime.cellar.sequence.CellarSequenceEvent; +import ru.entaxy.platform.runtime.cellar.sequence.CellarSequenceItemEvent; + +public class SequenceTask implements Runnable, ChangeListener.CallBack { + + private static final Logger LOG = LoggerFactory.getLogger(SequenceTask.class); + + protected enum EVENT_RESULT { + NONE, + SUCCESS, + ERROR, + TIMEOUT + } + + protected CellarSequenceEvent sequence; + + protected ArrayDeque events; + + protected Object eventsLock = new Object(); + + protected CellarSequenceItemEvent currentEvent; + + protected ChangeListener currentChangeListener; + + protected Object currentChangeListenerLock = new Object(); + + protected ExecutorService threadPool = Executors.newCachedThreadPool(); + + protected Future future; + + protected Object futureLock = new Object(); + + protected EVENT_RESULT currentResult; + + protected Object currentResultLock = new Object(); + + public SequenceTask(CellarSequenceEvent event, ClassLoader classLoader) { + super(); + this.sequence = event; + events = new ArrayDeque<>(this.sequence.getSequence()); + Thread.currentThread().setContextClassLoader(classLoader); + LOG.debug("\n--> CREATED SequenceTask for [{}]", sequence.getId()); + } + + protected void updateCurrentResult(EVENT_RESULT newResult) { + synchronized (currentResultLock) { + LOG.debug("\n--> CURRENT RESULT set to [{}]", newResult.name()); + this.currentResult = newResult; + } + } + + protected void resetResult() { + updateCurrentResult(EVENT_RESULT.NONE); + } + + @Override + public void run() { + + LOG.debug("\n--> RUNNING SequenceTask for [{}]", sequence.getId()); + + resetResult(); + + // global limit for operation = 5 min + long maxExecution = 300000; + long executionStep = 500; + + while (!events.isEmpty()) { + next(); + long executionPeriod = 0; + while (EVENT_RESULT.NONE.equals(currentResult) && (executionPeriod < maxExecution)) { + try { + LOG.debug("\n--> WAITING FOR RESULT [{}]", currentEvent == null ? "null" : currentEvent.getId()); + executionPeriod += executionStep; + Thread.sleep(executionStep); + } catch (InterruptedException e) { + LOG.debug("\n--> INTERRUPTED WAITING FOR RESULT [{}]", + currentEvent == null ? "null" : currentEvent.getId()); + updateCurrentResult(EVENT_RESULT.ERROR); + } + } + + // maxExecution reached + if (EVENT_RESULT.NONE.equals(currentResult)) { + LOG.debug("\n--> CURRENT RESULT is NONE for [{}]", + currentEvent == null ? "null" : currentEvent.getId()); + updateCurrentResult(EVENT_RESULT.ERROR); + } + + if (EVENT_RESULT.SUCCESS.equals(currentResult)) { + LOG.debug("\n--> CURRENT RESULT is SUCCESS for [{}]", + currentEvent == null ? "null" : currentEvent.getId()); + resetResult(); + } else { + LOG.debug("\n--> CURRENT RESULT is [{}] for [{}]", + currentResult == null ? "null" : currentResult.name(), + currentEvent == null ? "null" : currentEvent.getId()); + LOG.error("Failed processing sequence event"); + return; + } + } + + } + + protected boolean haveToWait() { + if (events.isEmpty() && !sequence.isWaitLast()) + return false; + return true; + } + + protected void next() { + synchronized (eventsLock) { + LOG.debug("\n--> NEXT event"); + currentEvent = null; + currentChangeListener = null; + + if (events.isEmpty()) + return; + + currentEvent = events.pop(); + LOG.debug("\n--> CURRENT event is [{}]", currentEvent == null ? "null" : currentEvent.getId()); + + if (haveToWait()) { + + LOG.debug("\n--> WILL WAIT for result for [{}]", currentEvent == null ? "null" : currentEvent.getId()); + + currentChangeListener = ChangeListenerFactory.create(currentEvent.getEvent()); + if (currentChangeListener == null) { + updateCurrentResult(EVENT_RESULT.ERROR); + return; + } + + currentChangeListener.setCallback(this); + currentChangeListener.register(); + + Callable task = new Callable() { + + @Override + public Object call() throws Exception { + Event eventToSend = currentEvent.getEvent(); + eventToSend.setDestination(Collections.singleton(Services.INSTANCE.clusterManager.getNode())); + + LOG.debug("\n--> EVENT SENT: [{}]:[{}]", eventToSend.getClass().getName(), eventToSend.getId()); + Services.INSTANCE.eventProducer.produce(eventToSend); + + // timeout for operation + // Thread.sleep(100000); + return null; + } + }; + + future = threadPool.submit(task); + try { + Object result = future.get(100, TimeUnit.SECONDS); + LOG.debug("\n--> RESULT RECEIVED for [{}]", currentEvent == null ? "null" : currentEvent.getId()); + } catch (TimeoutException timeoutEx) { + LOG.debug("\n--> TimeoutException for [{}]", currentEvent == null ? "null" : currentEvent.getId()); + updateCurrentResult(EVENT_RESULT.TIMEOUT); + unregisterChangeListener(); + } catch (InterruptedException ignore) { + // NOOP + LOG.debug("\n--> InterruptedException for [{}]", + currentEvent == null ? "null" : currentEvent.getId()); + } catch (CancellationException ignore) { + // NOOP + LOG.debug("\n--> CancellationException for [{}]", + currentEvent == null ? "null" : currentEvent.getId()); + } catch (Exception e) { + LOG.debug("\n--> Exception for [{}]", currentEvent == null ? "null" : currentEvent.getId()); + LOG.error("Exception on next event processing", e); + updateCurrentResult(EVENT_RESULT.ERROR); + unregisterChangeListener(); + } finally { + // unregisterChangeListener(); + } + } else { + LOG.debug("\n--> WILL NOT WAIT for result for [{}]", + currentEvent == null ? "null" : currentEvent.getId()); + + threadPool.execute(new Runnable() { + + @Override + public void run() { + Event eventToSend = currentEvent.getEvent(); + eventToSend.setDestination(Collections.singleton(Services.INSTANCE.clusterManager.getNode())); + Services.INSTANCE.eventProducer.produce(eventToSend); + LOG.debug("\n--> EVENT SENT: [{}]:[{}]", eventToSend.getClass().getName(), eventToSend.getId()); + } + }); + updateCurrentResult(EVENT_RESULT.SUCCESS); + } + } + } + + protected void unregisterChangeListener() { + synchronized (currentChangeListenerLock) { + if (currentChangeListener != null) + currentChangeListener.unregister(); + } + } + + @Override + public void success() { + LOG.debug("\n--> CALLED 'success' for [{}]", currentEvent == null ? "null" : currentEvent.getId()); + synchronized (futureLock) { + if (this.future != null) + future.cancel(true); + } + unregisterChangeListener(); + updateCurrentResult(EVENT_RESULT.SUCCESS); + } + + @Override + public void timeout() { + LOG.debug("\n--> CALLED 'timeout' for [{}]", currentEvent == null ? "null" : currentEvent.getId()); + synchronized (futureLock) { + if (this.future != null) + future.cancel(true); + } + unregisterChangeListener(); + updateCurrentResult(EVENT_RESULT.TIMEOUT); + } + + @Override + public void fail() { + LOG.debug("\n--> CALLED 'fail' for [{}]", currentEvent == null ? "null" : currentEvent.getId()); + synchronized (futureLock) { + if (this.future != null) + future.cancel(true); + } + unregisterChangeListener(); + updateCurrentResult(EVENT_RESULT.ERROR); + } + +} diff --git a/platform/runtime/base/config-extensions/pom.xml b/platform/runtime/base/config-extensions/pom.xml index 8c0fa10d..53d784b3 100644 --- a/platform/runtime/base/config-extensions/pom.xml +++ b/platform/runtime/base/config-extensions/pom.xml @@ -3,7 +3,7 @@ ru.entaxy.esb.platform.runtime base - 1.10.0 + 1.11.0 ru.entaxy.esb.platform.runtime.base config-extensions diff --git a/platform/runtime/base/config-extensions/src/main/java/ru/entaxy/platform/base/config/ConfigLookupConfigurationPlugin.java b/platform/runtime/base/config-extensions/src/main/java/ru/entaxy/platform/base/config/ConfigLookupConfigurationPlugin.java index d07116b1..aedcabf2 100644 --- a/platform/runtime/base/config-extensions/src/main/java/ru/entaxy/platform/base/config/ConfigLookupConfigurationPlugin.java +++ b/platform/runtime/base/config-extensions/src/main/java/ru/entaxy/platform/base/config/ConfigLookupConfigurationPlugin.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * config-plugin * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/config-extensions/src/main/java/ru/entaxy/platform/base/config/DefaultPropertiesProvider.java b/platform/runtime/base/config-extensions/src/main/java/ru/entaxy/platform/base/config/DefaultPropertiesProvider.java index 5d2e18d7..af4bf3d8 100644 --- a/platform/runtime/base/config-extensions/src/main/java/ru/entaxy/platform/base/config/DefaultPropertiesProvider.java +++ b/platform/runtime/base/config-extensions/src/main/java/ru/entaxy/platform/base/config/DefaultPropertiesProvider.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * configuration-test-1 * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/config-extensions/src/main/java/ru/entaxy/platform/base/config/DefaultPropertiesProviderWithImmutables.java b/platform/runtime/base/config-extensions/src/main/java/ru/entaxy/platform/base/config/DefaultPropertiesProviderWithImmutables.java index ffb3c68d..39aea5b0 100644 --- a/platform/runtime/base/config-extensions/src/main/java/ru/entaxy/platform/base/config/DefaultPropertiesProviderWithImmutables.java +++ b/platform/runtime/base/config-extensions/src/main/java/ru/entaxy/platform/base/config/DefaultPropertiesProviderWithImmutables.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * configuration-test-1 * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/config-extensions/src/main/java/ru/entaxy/platform/base/config/Immutables.java b/platform/runtime/base/config-extensions/src/main/java/ru/entaxy/platform/base/config/Immutables.java index 9e991324..52828364 100644 --- a/platform/runtime/base/config-extensions/src/main/java/ru/entaxy/platform/base/config/Immutables.java +++ b/platform/runtime/base/config-extensions/src/main/java/ru/entaxy/platform/base/config/Immutables.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * configuration-test-1 * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/config-extensions/src/main/java/ru/entaxy/platform/base/config/ImmutablesCollector.java b/platform/runtime/base/config-extensions/src/main/java/ru/entaxy/platform/base/config/ImmutablesCollector.java index 159715a8..8a509953 100644 --- a/platform/runtime/base/config-extensions/src/main/java/ru/entaxy/platform/base/config/ImmutablesCollector.java +++ b/platform/runtime/base/config-extensions/src/main/java/ru/entaxy/platform/base/config/ImmutablesCollector.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * configuration-test-1 * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/config-extensions/src/main/java/ru/entaxy/platform/base/config/ImmutablesConfigurationPlugin.java b/platform/runtime/base/config-extensions/src/main/java/ru/entaxy/platform/base/config/ImmutablesConfigurationPlugin.java index 46041976..28b321cc 100644 --- a/platform/runtime/base/config-extensions/src/main/java/ru/entaxy/platform/base/config/ImmutablesConfigurationPlugin.java +++ b/platform/runtime/base/config-extensions/src/main/java/ru/entaxy/platform/base/config/ImmutablesConfigurationPlugin.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * configuration-test-1 * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/config-extensions/src/main/java/ru/entaxy/platform/base/config/ImmutablesImpl.java b/platform/runtime/base/config-extensions/src/main/java/ru/entaxy/platform/base/config/ImmutablesImpl.java index 5c7567b5..5339a729 100644 --- a/platform/runtime/base/config-extensions/src/main/java/ru/entaxy/platform/base/config/ImmutablesImpl.java +++ b/platform/runtime/base/config-extensions/src/main/java/ru/entaxy/platform/base/config/ImmutablesImpl.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * configuration-test-1 * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/connecting/generator/common-templates-collection/pom.xml b/platform/runtime/base/connecting/generator/common-templates-collection/pom.xml index 24666422..dfa7f5cf 100644 --- a/platform/runtime/base/connecting/generator/common-templates-collection/pom.xml +++ b/platform/runtime/base/connecting/generator/common-templates-collection/pom.xml @@ -3,7 +3,7 @@ ru.entaxy.esb.platform.runtime.base.connecting generator - 1.10.0 + 1.11.0 ru.entaxy.esb.platform.runtime.base.connecting.generator common-templates-collection diff --git a/platform/runtime/base/connecting/generator/ftl-generator/pom.xml b/platform/runtime/base/connecting/generator/ftl-generator/pom.xml index 979c9301..6263af1f 100644 --- a/platform/runtime/base/connecting/generator/ftl-generator/pom.xml +++ b/platform/runtime/base/connecting/generator/ftl-generator/pom.xml @@ -4,7 +4,7 @@ ru.entaxy.esb.platform.runtime.base.connecting generator - 1.10.0 + 1.11.0 4.0.0 diff --git a/platform/runtime/base/connecting/generator/ftl-generator/src/main/java/ru/entaxy/esb/platform/runtime/base/connecting/generator/ftl/FTLGenerator.java b/platform/runtime/base/connecting/generator/ftl-generator/src/main/java/ru/entaxy/esb/platform/runtime/base/connecting/generator/ftl/FTLGenerator.java index c0edc524..02749454 100644 --- a/platform/runtime/base/connecting/generator/ftl-generator/src/main/java/ru/entaxy/esb/platform/runtime/base/connecting/generator/ftl/FTLGenerator.java +++ b/platform/runtime/base/connecting/generator/ftl-generator/src/main/java/ru/entaxy/esb/platform/runtime/base/connecting/generator/ftl/FTLGenerator.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * ftl-generator * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/connecting/generator/generator-api/pom.xml b/platform/runtime/base/connecting/generator/generator-api/pom.xml index 7dd1f889..f3285327 100644 --- a/platform/runtime/base/connecting/generator/generator-api/pom.xml +++ b/platform/runtime/base/connecting/generator/generator-api/pom.xml @@ -4,7 +4,7 @@ ru.entaxy.esb.platform.runtime.base.connecting generator - 1.10.0 + 1.11.0 4.0.0 diff --git a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/LegacyTemplate.java b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/LegacyTemplate.java new file mode 100644 index 00000000..b2f21770 --- /dev/null +++ b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/LegacyTemplate.java @@ -0,0 +1,43 @@ +/*- + * ~~~~~~licensing~~~~~~ + * generator-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.base.generator.template; + +import java.net.URL; +import java.util.Map; + +import org.osgi.framework.BundleContext; + +public interface LegacyTemplate { + String getTemplateName(); + + URL getTemplateLocation(); + + Map getParams(); + + void setBundleContext(BundleContext bundleContext); + + String getTemplateFileName(); +} diff --git a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/Template.java b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/Template.java index 5e8eb68d..6df1ec89 100644 --- a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/Template.java +++ b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/Template.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * generator-api * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/TemplateAwareGenerator.java b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/TemplateAwareGenerator.java index 81e98faf..4699b5e7 100644 --- a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/TemplateAwareGenerator.java +++ b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/TemplateAwareGenerator.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * generator-api * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/TemplateImpl.java b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/TemplateImpl.java index d32f7128..a4fb68a6 100644 --- a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/TemplateImpl.java +++ b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/TemplateImpl.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * generator-api * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/TemplateService.java b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/TemplateService.java index 2eb6b4bd..9676aa06 100644 --- a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/TemplateService.java +++ b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/TemplateService.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * generator-api * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/exception/TemplateNotFound.java b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/exception/TemplateNotFound.java new file mode 100644 index 00000000..338f804b --- /dev/null +++ b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/exception/TemplateNotFound.java @@ -0,0 +1,55 @@ +/*- + * ~~~~~~licensing~~~~~~ + * system-commons + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.base.generator.template.exception; + +public class TemplateNotFound extends RuntimeException { + + /** + * + */ + private static final long serialVersionUID = 1L; + + public TemplateNotFound() { + super(); + } + + public TemplateNotFound(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + + public TemplateNotFound(String message, Throwable cause) { + super(message, cause); + } + + public TemplateNotFound(String message) { + super(message); + } + + public TemplateNotFound(Throwable cause) { + super(cause); + } + +} diff --git a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/Activator.java b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/Activator.java index 1a642e0b..d71e1925 100644 --- a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/Activator.java +++ b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/Activator.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * generator-api * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/LegacyTemplateAdapter.java b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/LegacyTemplateAdapter.java index 66c5c42c..9b454208 100644 --- a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/LegacyTemplateAdapter.java +++ b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/LegacyTemplateAdapter.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * generator-api * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/ProvidedTemplate.java b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/ProvidedTemplate.java index 1fa4aa11..9506a654 100644 --- a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/ProvidedTemplate.java +++ b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/ProvidedTemplate.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * generator-api * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/TemplateBundleTracker.java b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/TemplateBundleTracker.java index 4e017cfb..62863e98 100644 --- a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/TemplateBundleTracker.java +++ b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/TemplateBundleTracker.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * generator-api * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/TemplateBundleTrackerCustomizer.java b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/TemplateBundleTrackerCustomizer.java index 99017d69..d141299f 100644 --- a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/TemplateBundleTrackerCustomizer.java +++ b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/TemplateBundleTrackerCustomizer.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * generator-api * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/TemplateMetadata.java b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/TemplateMetadata.java index 6f3d2e59..ea2c6fe5 100644 --- a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/TemplateMetadata.java +++ b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/TemplateMetadata.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * generator-api * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/TemplateProvider.java b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/TemplateProvider.java index b2b3b400..38ee6bd3 100644 --- a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/TemplateProvider.java +++ b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/TemplateProvider.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * generator-api * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/TemplateServiceImpl.java b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/TemplateServiceImpl.java index 9c601a48..c7cf266b 100644 --- a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/TemplateServiceImpl.java +++ b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/TemplateServiceImpl.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * generator-api * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/TemplateServiceURLResolver.java b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/TemplateServiceURLResolver.java index e65315a7..1517b983 100644 --- a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/TemplateServiceURLResolver.java +++ b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/base/generator/template/impl/TemplateServiceURLResolver.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * generator-api * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/esb/platform/runtime/base/connecting/generator/AbstractSelfPublishGenerator.java b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/esb/platform/runtime/base/connecting/generator/AbstractSelfPublishGenerator.java index 0974f939..ac9f08af 100644 --- a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/esb/platform/runtime/base/connecting/generator/AbstractSelfPublishGenerator.java +++ b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/esb/platform/runtime/base/connecting/generator/AbstractSelfPublishGenerator.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * generator-api * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/esb/platform/runtime/base/connecting/generator/Generated.java b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/esb/platform/runtime/base/connecting/generator/Generated.java index e33cebef..7cf38273 100644 --- a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/esb/platform/runtime/base/connecting/generator/Generated.java +++ b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/esb/platform/runtime/base/connecting/generator/Generated.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * generator-api * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/esb/platform/runtime/base/connecting/generator/Generator.java b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/esb/platform/runtime/base/connecting/generator/Generator.java index f2f4a13c..62e115c8 100644 --- a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/esb/platform/runtime/base/connecting/generator/Generator.java +++ b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/esb/platform/runtime/base/connecting/generator/Generator.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * generator-api * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/esb/platform/runtime/base/connecting/generator/GeneratorService.java b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/esb/platform/runtime/base/connecting/generator/GeneratorService.java index 9faca649..59af2a25 100644 --- a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/esb/platform/runtime/base/connecting/generator/GeneratorService.java +++ b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/esb/platform/runtime/base/connecting/generator/GeneratorService.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * generator-api * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/esb/platform/runtime/base/connecting/generator/impl/GeneratedImpl.java b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/esb/platform/runtime/base/connecting/generator/impl/GeneratedImpl.java index ed356910..a6c4e8b1 100644 --- a/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/esb/platform/runtime/base/connecting/generator/impl/GeneratedImpl.java +++ b/platform/runtime/base/connecting/generator/generator-api/src/main/java/ru/entaxy/esb/platform/runtime/base/connecting/generator/impl/GeneratedImpl.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * generator-api * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/connecting/generator/generator-factory/pom.xml b/platform/runtime/base/connecting/generator/generator-factory/pom.xml index 5ea6295d..ddd15199 100644 --- a/platform/runtime/base/connecting/generator/generator-factory/pom.xml +++ b/platform/runtime/base/connecting/generator/generator-factory/pom.xml @@ -4,7 +4,7 @@ ru.entaxy.esb.platform.runtime.base.connecting generator - 1.10.0 + 1.11.0 4.0.0 diff --git a/platform/runtime/base/connecting/generator/generator-factory/src/main/java/ru/entaxy/esb/platform/runtime/base/connecting/generator/factory/GeneratorFactory.java b/platform/runtime/base/connecting/generator/generator-factory/src/main/java/ru/entaxy/esb/platform/runtime/base/connecting/generator/factory/GeneratorFactory.java index a594b95d..e48c224a 100644 --- a/platform/runtime/base/connecting/generator/generator-factory/src/main/java/ru/entaxy/esb/platform/runtime/base/connecting/generator/factory/GeneratorFactory.java +++ b/platform/runtime/base/connecting/generator/generator-factory/src/main/java/ru/entaxy/esb/platform/runtime/base/connecting/generator/factory/GeneratorFactory.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * generator-factory * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/connecting/generator/pom.xml b/platform/runtime/base/connecting/generator/pom.xml index 645d4f4d..e87f70f3 100644 --- a/platform/runtime/base/connecting/generator/pom.xml +++ b/platform/runtime/base/connecting/generator/pom.xml @@ -4,7 +4,7 @@ ru.entaxy.esb.platform.runtime.base connecting - 1.10.0 + 1.11.0 4.0.0 diff --git a/platform/runtime/base/connecting/generator/template-service-shell/pom.xml b/platform/runtime/base/connecting/generator/template-service-shell/pom.xml index 0ad96e51..0d5b80f6 100644 --- a/platform/runtime/base/connecting/generator/template-service-shell/pom.xml +++ b/platform/runtime/base/connecting/generator/template-service-shell/pom.xml @@ -3,7 +3,7 @@ ru.entaxy.esb.platform.runtime.base.connecting generator - 1.10.0 + 1.11.0 ru.entaxy.esb.platform.runtime.base.connecting.generator template-service-shell diff --git a/platform/runtime/base/connecting/generator/template-service-shell/src/main/java/ru/entaxy/base/generator/template/shell/Generate.java b/platform/runtime/base/connecting/generator/template-service-shell/src/main/java/ru/entaxy/base/generator/template/shell/Generate.java index 8d8b1a87..33f3655f 100644 --- a/platform/runtime/base/connecting/generator/template-service-shell/src/main/java/ru/entaxy/base/generator/template/shell/Generate.java +++ b/platform/runtime/base/connecting/generator/template-service-shell/src/main/java/ru/entaxy/base/generator/template/shell/Generate.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * template-service-test * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/connecting/generator/template-service-shell/src/main/java/ru/entaxy/base/generator/template/shell/ListTemplates.java b/platform/runtime/base/connecting/generator/template-service-shell/src/main/java/ru/entaxy/base/generator/template/shell/ListTemplates.java index b24ee079..4972a990 100644 --- a/platform/runtime/base/connecting/generator/template-service-shell/src/main/java/ru/entaxy/base/generator/template/shell/ListTemplates.java +++ b/platform/runtime/base/connecting/generator/template-service-shell/src/main/java/ru/entaxy/base/generator/template/shell/ListTemplates.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * template-service-test * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/connecting/generator/template-service-shell/src/main/java/ru/entaxy/base/generator/template/shell/TemplateServiceSupport.java b/platform/runtime/base/connecting/generator/template-service-shell/src/main/java/ru/entaxy/base/generator/template/shell/TemplateServiceSupport.java index dfee4ac3..bb10af08 100644 --- a/platform/runtime/base/connecting/generator/template-service-shell/src/main/java/ru/entaxy/base/generator/template/shell/TemplateServiceSupport.java +++ b/platform/runtime/base/connecting/generator/template-service-shell/src/main/java/ru/entaxy/base/generator/template/shell/TemplateServiceSupport.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * template-service-test * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/connecting/pom.xml b/platform/runtime/base/connecting/pom.xml index f67244f8..ca6abd56 100644 --- a/platform/runtime/base/connecting/pom.xml +++ b/platform/runtime/base/connecting/pom.xml @@ -4,7 +4,7 @@ ru.entaxy.esb.platform.runtime base - 1.10.0 + 1.11.0 4.0.0 diff --git a/platform/runtime/base/logging/LICENSE.txt b/platform/runtime/base/logging/LICENSE.txt new file mode 100644 index 00000000..4ae94b75 --- /dev/null +++ b/platform/runtime/base/logging/LICENSE.txt @@ -0,0 +1,175 @@ + ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ + +Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой) +версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего +Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН +7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова, +д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу +https://www.emdev.ru/about (далее - Компания). + +Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями» +(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения, +Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в +настоящем документе, в противном случае, он должен не использовать или не получать доступ +к Программному обеспечению. + + 1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ + +a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии +или редакции, исключительные права на которую принадлежат Правообладателю. +b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные +права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ +для ЭВМ № 2021610848 от 19.01.2021 года. +c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта +https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО. +d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также +личные неимущественные права авторов произведений на результат интеллектуальной деятельности. +e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование +ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка +включает предоставление Пользователю неисключительного права использования ПО, в том числе +получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение +патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается +Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается +для каждого Пользователя индивидуально в Сертификате. +f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром), +подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное +обеспечение в ограниченном объёме и на определённый период времени. +g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО, +предоставленных Пользователю согласно условиям Подписки. +h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного +обеспечения. +i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий +из одного или нескольких файлов, который может быть прочтён человеком. +j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля +программы, полученный в результате обработки исходного кода, еще не связанный в полную программу. +Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый +продукт. +k) Некоммерческое использование – индивидуальное личное использование Пользователем программного +обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации +возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая +выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения. + + 2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ + +2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного +обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом +воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения +в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ. +2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит +неисключительный характер. +2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию, +лицензия на ограниченное использование Программного обеспечения. +2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования +имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан +обратиться в службу поддержки Правообладателя по адресу: https://entaxy.ru/ для изменения +вида лицензии с Базовой бесплатной версии на Подписки. +2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для +пробного использования программного обеспечения – не ограничен. +2.6. Использование Пользователем настоящего программного обеспечения в целях разработки, +модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю, +без разрешения Правообладателя не допускается. + + 3. АВТОРСКОЕ ПРАВО. + +3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение +и любые его копии принадлежат Правообладателю. +3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента, +к которому можно получить доступ с помощью Программного обеспечения, является собственностью +соответствующего владельца контента и защищается применимым законодательством об авторском +праве или другими законами и договорами об интеллектуальной собственности. +3.3. Условия использования Программного обеспечения. +Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь +придерживается следующих условий: +3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять +какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании +Программного обеспечения или на нем. +3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать, +расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать +Программное обеспечение. +3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования +ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне. +3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено +использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам. + + 4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС» + +4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю +на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с +использованием Пользователем: +4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в +Программное обеспечение; +4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями +настоящего соглашения; +4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием, +или данными, не предоставленными Пользователю Правообладателем; +4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем. + + +5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ +ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ +И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ +ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ +И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ +ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО. + + 6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ. +НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ +ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ, +ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ; +ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ. +ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ +ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ; +КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ +ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ. + + 7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ: +Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия +(включая, но не ограничиваясь) по: +-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код) + Программного обеспечения; +-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный +код Программного обеспечения, за исключением тех изменений, которые вносятся средствами, +включёнными в Программное обеспечение и описанными непосредственно в документации к нему; +-созданию условий для использования Программного обеспечения лицами, не имеющими прав на +использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство +третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа +к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку; +-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию). + + 8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА. + +8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из +лицензионных продуктов, используемых на законных основаниях, а +именно https://entaxy.ru/libs/licenses/root-aggregated.deps. +8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть +совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения. +8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться +Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения, +содержащих все изменения и дополнения программного обеспечения. + + 9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ. + +9.1. Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым +программным обеспечением. +9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно +с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм +«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public. +9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий +пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя, +прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер +ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства +Российской Федерации. + + 10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ. + +10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет +право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб, +недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий +пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере +2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения +исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy). +10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое +законодательство – Российской Федерации. +10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным, +остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать +исполнять свои обязанности в соответствии с этими положениями. diff --git a/platform/runtime/base/logging/cef-logger-layout/LICENSE.txt b/platform/runtime/base/logging/cef-logger-layout/LICENSE.txt new file mode 100644 index 00000000..4ae94b75 --- /dev/null +++ b/platform/runtime/base/logging/cef-logger-layout/LICENSE.txt @@ -0,0 +1,175 @@ + ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ + +Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой) +версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего +Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН +7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова, +д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу +https://www.emdev.ru/about (далее - Компания). + +Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями» +(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения, +Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в +настоящем документе, в противном случае, он должен не использовать или не получать доступ +к Программному обеспечению. + + 1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ + +a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии +или редакции, исключительные права на которую принадлежат Правообладателю. +b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные +права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ +для ЭВМ № 2021610848 от 19.01.2021 года. +c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта +https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО. +d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также +личные неимущественные права авторов произведений на результат интеллектуальной деятельности. +e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование +ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка +включает предоставление Пользователю неисключительного права использования ПО, в том числе +получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение +патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается +Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается +для каждого Пользователя индивидуально в Сертификате. +f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром), +подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное +обеспечение в ограниченном объёме и на определённый период времени. +g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО, +предоставленных Пользователю согласно условиям Подписки. +h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного +обеспечения. +i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий +из одного или нескольких файлов, который может быть прочтён человеком. +j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля +программы, полученный в результате обработки исходного кода, еще не связанный в полную программу. +Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый +продукт. +k) Некоммерческое использование – индивидуальное личное использование Пользователем программного +обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации +возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая +выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения. + + 2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ + +2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного +обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом +воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения +в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ. +2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит +неисключительный характер. +2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию, +лицензия на ограниченное использование Программного обеспечения. +2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования +имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан +обратиться в службу поддержки Правообладателя по адресу: https://entaxy.ru/ для изменения +вида лицензии с Базовой бесплатной версии на Подписки. +2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для +пробного использования программного обеспечения – не ограничен. +2.6. Использование Пользователем настоящего программного обеспечения в целях разработки, +модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю, +без разрешения Правообладателя не допускается. + + 3. АВТОРСКОЕ ПРАВО. + +3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение +и любые его копии принадлежат Правообладателю. +3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента, +к которому можно получить доступ с помощью Программного обеспечения, является собственностью +соответствующего владельца контента и защищается применимым законодательством об авторском +праве или другими законами и договорами об интеллектуальной собственности. +3.3. Условия использования Программного обеспечения. +Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь +придерживается следующих условий: +3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять +какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании +Программного обеспечения или на нем. +3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать, +расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать +Программное обеспечение. +3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования +ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне. +3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено +использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам. + + 4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС» + +4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю +на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с +использованием Пользователем: +4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в +Программное обеспечение; +4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями +настоящего соглашения; +4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием, +или данными, не предоставленными Пользователю Правообладателем; +4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем. + + +5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ +ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ +И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ +ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ +И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ +ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО. + + 6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ. +НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ +ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ, +ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ; +ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ. +ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ +ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ; +КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ +ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ. + + 7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ: +Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия +(включая, но не ограничиваясь) по: +-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код) + Программного обеспечения; +-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный +код Программного обеспечения, за исключением тех изменений, которые вносятся средствами, +включёнными в Программное обеспечение и описанными непосредственно в документации к нему; +-созданию условий для использования Программного обеспечения лицами, не имеющими прав на +использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство +третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа +к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку; +-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию). + + 8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА. + +8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из +лицензионных продуктов, используемых на законных основаниях, а +именно https://entaxy.ru/libs/licenses/root-aggregated.deps. +8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть +совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения. +8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться +Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения, +содержащих все изменения и дополнения программного обеспечения. + + 9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ. + +9.1. Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым +программным обеспечением. +9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно +с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм +«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public. +9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий +пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя, +прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер +ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства +Российской Федерации. + + 10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ. + +10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет +право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб, +недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий +пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере +2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения +исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy). +10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое +законодательство – Российской Федерации. +10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным, +остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать +исполнять свои обязанности в соответствии с этими положениями. diff --git a/platform/runtime/base/logging/cef-logger-layout/pom.xml b/platform/runtime/base/logging/cef-logger-layout/pom.xml new file mode 100644 index 00000000..52dd39d7 --- /dev/null +++ b/platform/runtime/base/logging/cef-logger-layout/pom.xml @@ -0,0 +1,102 @@ + + 4.0.0 + + ru.entaxy.platform + logging + 1.11.0 + + ru.entaxy.platform.logging + cef-logger-layout + bundle + ENTAXY :: LOGGING :: CEF LOGGER + ENTAXY :: LOGGING :: CEF LOGGER + + + ru.emdev.cef + !ru.emdev.cef + + + + + org.apache.logging.log4j + log4j-api + 2.13.2 + compile + + + org.apache.logging.log4j + log4j-core + 2.13.2 + compile + + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + + org.junit.jupiter + junit-jupiter + 5.8.1 + test + + + + org.mockito + mockito-all + 1.10.19 + test + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + log4j-plugin-processor + + compile + + process-classes + + only + + + org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor + + + + + + + + + + org.apache.felix + maven-bundle-plugin + true + + + org.ops4j.pax.logging.pax-logging-log4j2 + META-INF=${project.build.outputDirectory}/META-INF + * + + + + + + + + diff --git a/platform/runtime/base/logging/cef-logger-layout/src/main/java/ru/emdev/cef/AuditEvent.java b/platform/runtime/base/logging/cef-logger-layout/src/main/java/ru/emdev/cef/AuditEvent.java new file mode 100644 index 00000000..c1040d37 --- /dev/null +++ b/platform/runtime/base/logging/cef-logger-layout/src/main/java/ru/emdev/cef/AuditEvent.java @@ -0,0 +1,94 @@ +/*- + * ~~~~~~licensing~~~~~~ + * cef-logger-layout + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.emdev.cef; + +import static java.util.regex.Pattern.compile; + +import java.util.regex.Pattern; + +public enum AuditEvent { + APP_OWNER_UPDATED("app_owner_updated", "Owner of application updated", compile( + "(?^Successfully updated the owner of application ((?!from).*) from ((?!to).*) to (?.*).$)")), + COMMON_ACTION_RESULT("action", "Common action result", compile( + "^Initiator : (?[^|]*) \\| Action : (?[^|]*) \\| (?Target : ([^|]*) \\| Data : ([^|]*) \\| Result : (.*)$)")), + COMMON_ACTION_OUTCOME("action", "Common action outcome", compile( + "^Initiator=(?(?! Action).*) Action=(?(?! Target).*) (?Target=((?! Data).*) Data=((?! Outcome).*) Outcome=((?!Error=).*)$)")), + COMMON_ACTION_ERROR("action", "Common action error", compile( + "^Initiator=(?(?! Action).*) Action=(?(?! Target).*) (?Target=((?! Data).*) Data=((?! Outcome).*) Outcome=Failure Error=(.*)$)")), + COMMON_ACTION_CLAIMS("action", "Common action claims", compile( + "^Initiator : (?[^|]*) \\| Action : (?[^|]*) \\| (?Target : ([^|]*) \\| Claims : (.*)$)")), + SIGN_WRAPPING_ATTACK("attack", "Possible Signature Wrapping Attack", compile( + "(?^Signature do not confirm to SAML signature profile. Possible XML Signature Wrapping (?Attack)!$)")), + LOGGED_OUT("auth", "Logged out", compile( + "(?^'(?(?!@).*)@((?! ).*) \\[((?!]).*)]' logged out at (?((?! delegated).*))$)")), + LOGGED_OUT_DELEGATED("auth", "Logged out", compile( + "(?^'(?(?!@).*)@((?! ).*) \\[((?!]).*)]' logged out at (?((?! delegated).*)) delegated by (.*)$)")), + LOGIN_FAILED("auth", "Unauthorized login attempt", compile( + "(?^Login failed\\. Unauthorized login attempt '(?(?!\\[).*)\\[((?!]).*)]' at (?.*)$)")), + LOGIN("auth", "Login success", + compile("(?^'(?[^@]*)@([^ ]*) \\[((?!]).*)]' logged in at (?.*)$)")), + LOGIN_NULL_DOMAIN("auth", "Null domain login attempt", + compile("(?^User with null domain tried to login\\.$)")), + LOGIN_FROM_IP("auth", "Login success from ip", compile( + "(?^'(?(?!@).*)@((?! ).*) \\[((?!]).*)]' logged in at (?(?! from).*) from IP address (?.*)$)")), + JMX_AUTHENTICATED("auth", "User authenticated to JMX", compile( + "(?^User (?(?! successfully).*) successfully authenticated to perform JMX operations\\.$)")), + JMX_AUTHORIZED("auth", "User authorized to JMX", compile( + "(?^User : (?(?! successfully).*) successfully authorized to perform JMX operations\\.$)")), + JMX_UNAUTHORIZED("auth", "Unauthorized access attempt to JMX", compile( + "(?^Unauthorized access attempt to JMX operation\\. $)")), + USER_NOT_AUTHORIZED("auth", "Unauthorized attempt to read the resource", compile( + "(?^User (?(?! is).*) is not authorized to read the resource (.*)$)")), + CSRF_ATTACK_WITH_HEADER("attack", "Possible CSRF attack", compile( + "(?^Possible CSRF attack. Refer header : (.*)$)")), + CSRF_ATTACK_WITHOUT_HEADER("attack", "Possible CSRF attack", compile( + "(?^Possible CSRF attack. Request to '([^']*)' does not have a Referer header$)")), + THREAT_ATTACK("attack", "Threat detected", compile( + "(?^(.*)Threat detected in (.*)$)")); + + private final Pattern pattern; + private final String eventName; + private final String eventType; + + + AuditEvent(String eventType, String eventName, Pattern pattern) { + this.eventType = eventType; + this.eventName = eventName; + this.pattern = pattern; + } + + public Pattern getPattern() { + return pattern; + } + + public String getEventName() { + return eventName; + } + + public String getEventType() { + return eventType; + } +} diff --git a/platform/runtime/base/logging/cef-logger-layout/src/main/java/ru/emdev/cef/AuditLayout.java b/platform/runtime/base/logging/cef-logger-layout/src/main/java/ru/emdev/cef/AuditLayout.java new file mode 100644 index 00000000..734b031e --- /dev/null +++ b/platform/runtime/base/logging/cef-logger-layout/src/main/java/ru/emdev/cef/AuditLayout.java @@ -0,0 +1,410 @@ +/*- + * ~~~~~~licensing~~~~~~ + * cef-logger-layout + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.emdev.cef; + +import static java.util.Objects.nonNull; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.time.ZonedDateTime; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.layout.AbstractStringLayout; +import org.apache.logging.log4j.core.lookup.StrSubstitutor; +import org.apache.logging.log4j.message.Message; +import org.apache.logging.log4j.util.Strings; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class AuditLayout extends AbstractStringLayout { + /** + * Формат сообщения и версия + */ + public static final String CEF_VERSION = "cefVersion"; + + /** + * Производитель ПО + */ + public static final String VENDOR = "vendor"; + /** + * Имя компонента + */ + public static final String PRODUCT = "product"; + /** + * Версия компонента + */ + public static final String VERSION = "version"; + /** + * Версия компонента + */ + public static final String EVENT_TYPE = "typ"; + /** + * Название события + */ + public static final String EVENT_NAME = "eventName"; + /** + * Важность события + */ + public static final String SEVERITY = "severity"; + + public static final List HEADER_FIELDS = + Arrays.asList(CEF_VERSION, VENDOR, PRODUCT, VERSION, EVENT_TYPE, EVENT_NAME, SEVERITY); + /** + * Дополнительные поля + */ + public static final String EXTENSION = "extension"; + + /** + * IP пользователя + */ + public static final String EXT_SRC = "src"; + /** + * IP сервиса + */ + public static final String EXT_DST = "dst"; + + /** + * хост пользователя + */ + public static final String EXT_SHOST = "shost"; + + /** + * SID пользователя + */ + public static final String EXT_SUID = "suid"; + /** + * имя пользователя + */ + public static final String EXT_SOURCE_USER_NAME = "suser"; + /** + * описание события + */ + public static final String EXT_MSG = "msg"; + /** + * время события + */ + public static final String EXT_END = "end"; + + public static final List EXT_FIELDS = + Arrays.asList(EXT_SRC, EXT_DST, EXT_SHOST, EXT_SUID, EXT_SOURCE_USER_NAME, EXT_MSG, EXT_END); + + public static final List ALL_FIELDS = + Stream.concat(HEADER_FIELDS.stream(), EXT_FIELDS.stream()).collect(Collectors.toList()); + + public static final Map DEFAULTS = new HashMap() { + { + put(CEF_VERSION, "0"); + put(VENDOR, "EMDEV"); + put(PRODUCT, "ENTAXY"); + put(VERSION, "1.11.0"); + put(EVENT_TYPE, "common"); + put(EVENT_NAME, "common event"); + + put(EXT_SRC, ""); + put(EXT_DST, ""); + put(EXT_SHOST, ""); + put(EXT_SUID, ""); + put(EXT_SOURCE_USER_NAME, ""); + put(EXT_MSG, ""); + put(EXT_END, ""); + } + }; + + public static final Map SEVERITY_BY_EVENT_NAME = new HashMap() { + { + put("Add-User", "6"); + put("Delete-User", "8"); + put("Delete-User-Claim-Values", "8"); + put("Delete-User-Claim-Value", "8"); + put("Disable user account", "8"); + put("Enable user account", "6"); + put("bulk_user_import", "6"); + put("Remove local user account association with federated account", "6"); + put("Change-Password-by-User", "6"); + put("Change-Password-by-Administrator", "6"); + put("Login", "6"); + put("Login success", "6"); + put("LoginStepSuccess", "6"); + put("Login success from ip", "6"); + put("Unauthorized login attempt", "8"); + put("Null domain login attempt", "8"); + put("User authenticated to JMX", "6"); + put("User authorized to JMX", "6"); + put("Unauthorized access attempt to JMX", "8"); + put("Unauthorized attempt to read the resource", "8"); + put("DELETED", "8"); + put("PRODUCT_DELETED", "8"); + put("APIPRODUCT_DELETED", "8"); + put("APPLICATION_DELETED", "8"); + put("SUBSCRIPTION_DELETED", "8"); + put("Owner of application updated", "6"); + put("Possible Signature Wrapping Attack", "9"); + put("Possible CSRF attack", "9"); + put("Delete-Role", "8"); + put("delete", "8"); + put("Add-Role", "3"); + put("Update-Role-Name", "3"); + put("Update-Users-of-Role", "3"); + put("Update-Roles-of-User", "3"); + put("Threat detected", "9"); + } + }; + + + public static final String CEF_FORMAT = + "CEF:${" + CEF_VERSION + "}|${" + VENDOR + "}|${" + PRODUCT + "}|${" + VERSION + "}|${" + + EVENT_TYPE + "}|${" + EVENT_NAME + "}|${" + SEVERITY + "}|${" + EXTENSION + "}"; + + private static final ObjectMapper objectMapper = new ObjectMapper(); + private final String pattern; + public static final String ANY_NOT_WORD_SYMBOLS = "\\W"; + + public AuditLayout(String pattern) { + super(StandardCharsets.UTF_8); + this.pattern = pattern; + } + + @SuppressWarnings("unused") + // @PluginFactory + public static AuditLayout createLayout( + // @PluginAttribute(value = "pattern", defaultString = CEF_FORMAT) String pattern) { + String pattern) { + return new AuditLayout(pattern); + } + + @Override + public String toSerializable(LogEvent logEvent) { + return Optional.ofNullable(logEvent).map(LogEvent::getMessage).map(Message::getFormattedMessage) + .map(this::convert).orElse(null); + } + + public Map jsonMap(LogEvent logEvent) { + return Optional.ofNullable(logEvent).map(LogEvent::getMessage).map(Message::getFormattedMessage) + .map(this::asMap).orElse(Collections.emptyMap()); + } + + + private Map asMap(String message) { + final Map allFields = new HashMap<>(); + parseByRegexp(message, allFields); + if (allFields.isEmpty()) { + parseByJackson(message, allFields); + } + if (!allFields.isEmpty()) { + prepareAllFields(allFields); + + prepareExtension(allFields); + + prepareHeader(allFields); + + enhance(allFields); + } + return allFields; + } + + private String convert(String message) { + final Map allFields = asMap(message); + + parseByRegexp(message, allFields); + if (allFields.isEmpty()) { + parseByJackson(message, allFields); + } + + if (!allFields.isEmpty()) { + message = StrSubstitutor.replace(pattern, allFields); + } + return message + Strings.LINE_SEPARATOR; + } + + private void prepareAllFields(final Map allFields) { + ALL_FIELDS.forEach(field -> { + String value = allFields.get(field); + if (nonNull(value) && !value.isEmpty()) { + if (HEADER_FIELDS.contains(field)) { + value = value.replace("|", "\\|"); + } + if (EXT_FIELDS.contains(field)) { + value = value.replace("\\", "\\\\") + .replace("=", "\\=") + .replaceAll("\\n", " "); + + } + if (field.equals(EXT_SRC)) { + value = DnsResolver.tryResolve(value); + } + allFields.put(field, value); + } + }); + } + + private void prepareExtension(final Map allFields) { + StringBuilder extension = new StringBuilder(); + EXT_FIELDS.stream().filter(f -> !f.equals(EXT_END)).forEach(key -> { + String value1 = allFields.get(key); + if (nonNull(value1) && !value1.isEmpty()) { + extension.append(key).append("=").append(value1).append(" "); + } + }); + extension.append(EXT_END).append("=").append(ZonedDateTime.now().toInstant().toEpochMilli()); + + allFields.put(EXTENSION, extension.toString().trim()); + } + + private void prepareHeader(final Map allFields) { + HEADER_FIELDS.forEach(s -> { + String value = Optional.ofNullable(allFields.get(s)).orElse(DEFAULTS.get(s)); + allFields.put(s, value); + }); + } + + private void enhance(Map allFields) { + + final String eventName = allFields.get(EVENT_NAME); + + String severity = SEVERITY_BY_EVENT_NAME.keySet().stream() + .filter(s -> eventEquals(eventName, s)).findFirst().map(s -> { + allFields.put(EVENT_NAME, s); + return s; + }).map(SEVERITY_BY_EVENT_NAME::get).orElse("3"); + + allFields.put(SEVERITY, severity); + + + if (eventEquals(eventName, "Login") && nonNull(allFields.get(EXT_MSG))) { + String msq = allFields.get(EXT_MSG).toLowerCase(); + + if (msq.contains("result : success")) { + allFields.put(SEVERITY, "6"); + } else if (msq.contains("result : failed")) { + allFields.put(SEVERITY, "8"); + } + } + } + + private boolean eventEquals(String left, String right) { + if (left != null) { + left = left.replaceAll(ANY_NOT_WORD_SYMBOLS, ""); + left = left.toUpperCase(); + } + if (right != null) { + right = right.replaceAll(ANY_NOT_WORD_SYMBOLS, ""); + right = right.toUpperCase(); + } + return Objects.equals(left, right); + } + + private void parseByJackson(String message, Map reqFields) { + try { + JsonNode jsonNode = objectMapper.readTree(message); + if (jsonNode.isObject()) { + + String typ = Optional.ofNullable(jsonNode.get("typ")).map(JsonNode::asText).orElse(""); + + String action = + Optional.ofNullable(jsonNode.get("action")).map(JsonNode::asText).orElse(""); + + if (!typ.isEmpty() && !action.isEmpty()) { + reqFields.put(EVENT_TYPE, "API"); + if (!typ.equalsIgnoreCase("api")) { + action = typ + "_" + action; + } + } + if (!action.isEmpty()) { + reqFields.put(EVENT_NAME, action.toUpperCase()); + } + + Optional.ofNullable(jsonNode.get("performedBy")).map(JsonNode::asText) + .ifPresent(s -> reqFields.put(EXT_SOURCE_USER_NAME, s)); + + Optional.ofNullable(jsonNode.get("info")).map(JsonNode::toString) + .ifPresent(s -> reqFields.put(EXT_MSG, s)); + } + } catch (IOException ignore) { + // ignore + } + } + + public static void reverse(Object[] input) { + if (input == null || input.length == 0) { + return; + } + int i = 0; + int j = input.length - 1; + Object tmp; + while (j > i) { + tmp = input[j]; + input[j] = input[i]; + input[i] = tmp; + j--; + i++; + } + } + + private void parseByRegexp(String message, Map allFields) { + AuditEvent[] values = AuditEvent.values(); + reverse(values); + for (AuditEvent auditEvent : values) { + Pattern pattern = auditEvent.getPattern(); + Matcher matcher = pattern.matcher(message); + if (matcher.matches()) { + ALL_FIELDS.forEach(field -> { + String value = ""; + try { + value = matcher.group(field); + } catch (IllegalArgumentException ignored) { + } + if (!value.isEmpty()) { + allFields.put(field, value); + allFields.put(EVENT_TYPE, auditEvent.getEventType()); + if (Strings.isEmpty(allFields.get(EVENT_NAME))) { + allFields.put(EVENT_NAME, auditEvent.getEventName()); + } + } + if (allFields.containsKey(EXT_SRC)) { + allFields.replace(EXT_SRC, DnsResolver.tryResolve(allFields.get(EXT_SRC))); + } + }); + break; + } + } + } + + public void addOverrides(Map override) { + DEFAULTS.putAll(override); + } +} diff --git a/platform/runtime/base/logging/cef-logger-layout/src/main/java/ru/emdev/cef/CEFAppender.java b/platform/runtime/base/logging/cef-logger-layout/src/main/java/ru/emdev/cef/CEFAppender.java new file mode 100644 index 00000000..6613ee4c --- /dev/null +++ b/platform/runtime/base/logging/cef-logger-layout/src/main/java/ru/emdev/cef/CEFAppender.java @@ -0,0 +1,89 @@ +/*- + * ~~~~~~licensing~~~~~~ + * cef-logger-layout + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.emdev.cef; + +import org.apache.logging.log4j.core.Appender; +import org.apache.logging.log4j.core.Core; +import org.apache.logging.log4j.core.Filter; +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.appender.AbstractAppender; +import org.apache.logging.log4j.core.config.AppenderControl; +import org.apache.logging.log4j.core.config.Configuration; +import org.apache.logging.log4j.core.config.plugins.*; + +import java.util.ArrayList; +import java.util.List; + +@Plugin(name = "CEFAggregate", category = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE, printObject = true) +public class CEFAppender extends AbstractAppender { + + private final Configuration config; + private final String children; + private final List controls = new ArrayList<>(); + + private CEFAppender(String name, Filter filter, String children, Configuration config, Boolean ignoreExceptions) { + super(name, filter, null, ignoreExceptions, null); + this.config = config; + this.children = children; + } + + @Override + public void start() { + String[] refs = children.split(","); + for (String ref : refs) { + String cleaned = ref.trim(); + Appender appender = config.getAppender(cleaned); + if (appender != null) { + controls.add(new AppenderControl(appender, null, null)); + } + } + super.start(); + } + + @Override + public void append(LogEvent event) { + String formattedMessage = event.getMessage().getFormattedMessage(); + boolean skipMessage = formattedMessage.startsWith("GET /") || formattedMessage.startsWith("POST /"); + if (!skipMessage) { + for (AppenderControl control : controls) { + control.callAppender(event); + } + } + } + + @PluginFactory + public static CEFAppender createAppender( + @PluginAttribute("name") final String name, + @PluginAttribute("children") final String children, + @PluginElement("Filter") final Filter filter, + @PluginConfiguration final Configuration config + ) { + if (children == null) { + throw new IllegalArgumentException("`children` key cannot be null"); + } + return new CEFAppender(name, filter, children, config, false); + } +} diff --git a/platform/runtime/base/logging/cef-logger-layout/src/main/java/ru/emdev/cef/CEFLayout.java b/platform/runtime/base/logging/cef-logger-layout/src/main/java/ru/emdev/cef/CEFLayout.java new file mode 100644 index 00000000..26f7018e --- /dev/null +++ b/platform/runtime/base/logging/cef-logger-layout/src/main/java/ru/emdev/cef/CEFLayout.java @@ -0,0 +1,153 @@ +/*- + * ~~~~~~licensing~~~~~~ + * cef-logger-layout + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.emdev.cef; + +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +import org.apache.logging.log4j.core.Layout; +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.config.Node; +import org.apache.logging.log4j.core.config.plugins.Plugin; +import org.apache.logging.log4j.core.config.plugins.PluginAttribute; +import org.apache.logging.log4j.core.config.plugins.PluginFactory; +import org.apache.logging.log4j.core.layout.AbstractStringLayout; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +@Plugin(name = "CEFLayout", category = Node.CATEGORY, elementType = Layout.ELEMENT_TYPE, printObject = true) +public class CEFLayout extends AbstractStringLayout { + public static final String EMDEV_EVENTS = "isEmdevEvents"; + private final String header; + + private static final ObjectMapper mapper = new ObjectMapper(); + private final String separator; + + private final String format; + private final Map defaults; + private AuditLayout auditLayout; + + public CEFLayout(String version, String separator, String vendor, String product, + String productVersion, String format) { + super(Charset.defaultCharset()); + this.separator = separator; + this.format = format; + header = new StringBuilder() + .append("CEF:").append(version).append(separator) + .append(vendor).append(separator) + .append(product).append(separator) + .append(productVersion).toString(); + String pattern = + "CEF:${" + AuditLayout.CEF_VERSION + "}|${" + AuditLayout.VENDOR + "}|${" + AuditLayout.PRODUCT + "}|${" + + AuditLayout.VERSION + "}|${" + + AuditLayout.EVENT_TYPE + "}|${" + AuditLayout.EVENT_NAME + "}|${" + AuditLayout.SEVERITY + + "}|${" + AuditLayout.EXTENSION + "}"; + this.auditLayout = new AuditLayout(pattern); + Map overrides = new HashMap<>(); + overrides.put(AuditLayout.CEF_VERSION, version); + overrides.put(AuditLayout.VENDOR, vendor); + overrides.put(AuditLayout.PRODUCT, product); + overrides.put(AuditLayout.VERSION, productVersion); + this.defaults = new LinkedHashMap<>(overrides); + auditLayout.addOverrides(overrides); + } + + // test-only + void setAuditLayout(AuditLayout layout) { + this.auditLayout = layout; + } + + @Override + public String toSerializable(LogEvent event) { + String formattedMessage = event.getMessage().getFormattedMessage(); + String result = null; + if (formattedMessage != null) { + try { + result = tryProcessEmdevEvent(formattedMessage); + } catch (IOException e) { + + } + if (result == null) { + result = tryAlternate(event); + } + } + return result; + } + + private String tryAlternate(LogEvent event) { + String result = null; + if (format.equalsIgnoreCase("json")) { + Map parsedMessage = auditLayout.jsonMap(event); + try { + result = mapper.writeValueAsString(parsedMessage) + "\n"; + } catch (JsonProcessingException e) { + // pass + } + } else { + result = auditLayout.toSerializable(event); + } + return result; + } + + private String tryProcessEmdevEvent(String formattedMessage) throws IOException { + String result = null; + JsonNode jsonNode = mapper.readTree(formattedMessage); + JsonNode isEmdev = jsonNode.get(EMDEV_EVENTS); + boolean process = isEmdev != null && !isEmdev.isNull() && isEmdev.asBoolean(false); + if (process) { + CEFRecord record = CEFRecord.fromJson(jsonNode); + if (record.getSrc() != null) { + String resolvedAddress = DnsResolver.tryResolve(record.getSrc()); + if (resolvedAddress != null) { + record.setSrc(resolvedAddress); + } + } + if (this.format.equalsIgnoreCase("cef")) { + result = record.asString(header, separator) + "\n"; + } else if (format.equalsIgnoreCase("json")) { + Map jsonRecord = record.asJson(defaults); + result = mapper.writeValueAsString(jsonRecord) + "\n"; + } + } + return result; + } + + @PluginFactory + public static CEFLayout createCEFLayout( + @PluginAttribute(value = "version", defaultString = "0") String version, + @PluginAttribute(value = "separator", defaultString = "|") String separator, + @PluginAttribute(value = "vendor", defaultString = "EMDEV") String vendor, + @PluginAttribute(value = "product") String product, + @PluginAttribute(value = "productVersion") String productVersion, + @PluginAttribute(value = "format", defaultString = "cef") String format) { + return new CEFLayout(version, separator, vendor, product, productVersion, format); + } +} diff --git a/platform/runtime/base/logging/cef-logger-layout/src/main/java/ru/emdev/cef/CEFRecord.java b/platform/runtime/base/logging/cef-logger-layout/src/main/java/ru/emdev/cef/CEFRecord.java new file mode 100644 index 00000000..8efc4812 --- /dev/null +++ b/platform/runtime/base/logging/cef-logger-layout/src/main/java/ru/emdev/cef/CEFRecord.java @@ -0,0 +1,309 @@ +/*- + * ~~~~~~licensing~~~~~~ + * cef-logger-layout + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.emdev.cef; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.NullNode; + +import java.time.ZonedDateTime; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.function.BiConsumer; + + +public class CEFRecord { + public static final String SPACE = " "; + public static final String EQUALS = "="; + private String type; + private String performedBy; + private String action; + private String src; + private String dst; + private String shost; + private String suid; + private String suser; + private String msg; + private String cs1; + private String cs1Label; + private String severity; + private final long end; + private String outcome; + private String duser; + private String spriv; + + public CEFRecord() { + this.end = ZonedDateTime.now().toInstant().toEpochMilli(); + } + + public String getSrc() { + return src; + } + + public CEFRecord setSrc(String src) { + this.src = src; + return this; + } + + public String getDst() { + return dst; + } + + public CEFRecord setDst(String dst) { + this.dst = dst; + return this; + } + + public String getShost() { + return shost; + } + + public CEFRecord setShost(String shost) { + this.shost = shost; + return this; + } + + public String getSuid() { + return suid; + } + + public CEFRecord setSuid(String suid) { + this.suid = suid; + return this; + } + + public String getSuser() { + return suser; + } + + public CEFRecord setSuser(String suser) { + this.suser = suser; + return this; + } + + public String getMsg() { + return msg; + } + + public CEFRecord setMsg(String msg) { + this.msg = msg; + return this; + } + + public String getCs1() { + return cs1; + } + + public CEFRecord setCs1(String cs1) { + this.cs1 = cs1; + return this; + } + + public String getCs1Label() { + return cs1Label; + } + + public CEFRecord setCs1Label(String cs1Label) { + this.cs1Label = cs1Label; + return this; + } + + public long getEnd() { + return end; + } + + public String getType() { + return type; + } + + public CEFRecord setType(String type) { + this.type = type; + return this; + } + + public String getPerformedBy() { + return performedBy; + } + + public CEFRecord setPerformedBy(String performedBy) { + this.performedBy = performedBy; + return this; + } + + public String getAction() { + return action; + } + + public CEFRecord setAction(String action) { + this.action = action; + return this; + } + + public String getSeverity() { + return severity; + } + + public CEFRecord setSeverity(String severity) { + this.severity = severity; + return this; + } + + public static CEFRecord fromJson(JsonNode jsonNode) { + String type = safeGet(jsonNode, "typ").asText(""); + String action = safeGet(jsonNode, "action").asText(""); + String performedBy = safeGet(jsonNode, "performedBy").asText(""); + JsonNode info = safeGet(jsonNode, "info"); + String src = safeGet(info, "src").asText(""); + String shost = safeGet(info,"shost").asText(""); + String dst = safeGet(info, "dst").asText(""); + String suid = safeGet(info, "suid").asText(""); + String msg = safeGet(info, "msg").asText(""); + String suser = safeGet(info, "suser").asText(""); + String outcome = safeGet(info, "outcome").asText(""); + String severity = safeGet(info, "severity").asText("0"); + String duser = safeGet(info, "duser").asText(""); + String spriv = safeGet(info, "spriv").asText(""); + return new CEFRecord() + .setType(type) + .setAction(action) + .setPerformedBy(performedBy) + .setShost(shost) + .setSrc(src) + .setDst(dst) + .setSuid(suid) + .setMsg(msg) + .setSuser(suser) + .setSeverity(severity) + .setOutcome(outcome) + .setDuser(duser) + .setSpriv(spriv); + } + + private static JsonNode safeGet(JsonNode node, String path) { + JsonNode child = node.get(path); + if (child == null) { + return NullNode.getInstance(); + } else { + return child; + } + } + + public String asString(String header, String separator) { + final StringBuilder builder = new StringBuilder(header); + builder + .append(separator).append(type) //eventClassId + .append(separator).append(action) //name + .append(separator).append(severity).append(separator); + BiConsumer consumer = (key, value) -> builder.append(key).append(EQUALS).append(value).append(SPACE); + Processor p = new Processor(consumer); + p.process("src", src). + process("dst", dst). + process("shost", shost). + process("suid", suid). + process("suser", suser). + process("duser", duser). + process("spriv", spriv). + process("msg", msg.replaceAll("=", "\\\\=").replaceAll("\\n", " ")). + process("outcome", outcome). + process("end", end); + return builder.toString(); + } + + public Map asJson(Map defaults) { + final Map data = new LinkedHashMap<>(defaults); + Processor p = new Processor(data::put); + p.process("typ", type). + process("action", action). + process("severity", severity). + process("src", src). + process("dst", dst). + process("shost", shost). + process("suid", suid). + process("suser", suser). + process("duser", duser). + process("spriv", spriv). + process("msg", msg.replaceAll("\\n", " ")). + process("outcome", outcome). + process("cs1", cs1). + process("cs1Label", cs1Label). + process("end", end); + return data; + } + + private void acceptNotEmpty(String key, T value, BiConsumer consumer) { + if (value != null && notEmpty(String.valueOf(value))) { + consumer.accept(key, value); + } + } + + public CEFRecord setOutcome(String outcome) { + this.outcome = outcome; + return this; + } + + public String getOutcome() { + return outcome; + } + + public CEFRecord setDuser(String duser) { + this.duser = duser; + return this; + } + + public String getDuser() { + return duser; + } + + public CEFRecord setSpriv(String spriv) { + this.spriv = spriv; + return this; + } + + public String getSpriv() { + return spriv; + } + + static class Processor { + final BiConsumer consumer; + Processor(BiConsumer consumer) { + this.consumer = consumer; + } + + public Processor process(String key, Object value) { + acceptNotEmpty(key, value); + return this; + } + + private void acceptNotEmpty(String key, T value) { + if (value != null && notEmpty(String.valueOf(value))) { + consumer.accept(key, value); + } + } + + } + private static boolean notEmpty(String s) { + return s != null && s.trim().length() > 0; + } +} diff --git a/platform/runtime/base/logging/cef-logger-layout/src/main/java/ru/emdev/cef/DnsResolver.java b/platform/runtime/base/logging/cef-logger-layout/src/main/java/ru/emdev/cef/DnsResolver.java new file mode 100644 index 00000000..3d4c7fc9 --- /dev/null +++ b/platform/runtime/base/logging/cef-logger-layout/src/main/java/ru/emdev/cef/DnsResolver.java @@ -0,0 +1,45 @@ +/*- + * ~~~~~~licensing~~~~~~ + * cef-logger-layout + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.emdev.cef; + +import java.io.IOException; +import java.net.InetAddress; +import java.util.concurrent.ConcurrentHashMap; + +public class DnsResolver { + private final static ConcurrentHashMap dnsCache = new ConcurrentHashMap<>(1024); + + public static String tryResolve(String hostname) { + return dnsCache.computeIfAbsent(hostname, (s) -> { + try { + InetAddress addr = InetAddress.getByName(s); + return addr.getHostAddress(); + } catch (IOException e) { + return s; + } + }); + } +} diff --git a/platform/runtime/base/logging/cef-logger-layout/src/test/java/ru/emdev/cef/CEFRecordTest.java b/platform/runtime/base/logging/cef-logger-layout/src/test/java/ru/emdev/cef/CEFRecordTest.java new file mode 100644 index 00000000..a0797355 --- /dev/null +++ b/platform/runtime/base/logging/cef-logger-layout/src/test/java/ru/emdev/cef/CEFRecordTest.java @@ -0,0 +1,94 @@ +/*- + * ~~~~~~licensing~~~~~~ + * cef-logger-layout + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.emdev.cef; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.io.InputStream; + +import static org.junit.jupiter.api.Assertions.*; + +public class CEFRecordTest { + + private final static ObjectMapper mapper = new ObjectMapper(); + private final static String SEPARATOR = "|"; + private final static String HEADER = "CEF:0|VENDOR|PRODUCT|1.0.0"; + public static final int CEF_FIELD_COUNT = 8; + + @Test + public void cefRecordCanBeBuiltFromEmptyJson() { + JsonNode jsonNode = readResource("examples/empty.json"); + CEFRecord record = CEFRecord.fromJson(jsonNode); + assertNotNull(record); + assertNotEquals(0, record.getEnd()); + } + + @Test + public void cefRecordCanBeBuiltFromJsonWithouInfo() { + JsonNode jsonNode = readResource("examples/noinfo.json"); + CEFRecord record = CEFRecord.fromJson(jsonNode); + assertNotNull(record); + assertNotEquals(0, record.getEnd()); + assertEquals("type", record.getType()); + assertEquals("action", record.getAction()); + assertEquals("user", record.getPerformedBy()); + assertEquals("0", record.getSeverity()); + } + + @Test + public void testFormatting() { + JsonNode jsonNode = readResource("examples/almostFull.json"); + CEFRecord record = CEFRecord.fromJson(jsonNode); + assertNotNull(record); + assertEquals("10", record.getSeverity()); + assertEquals("", record.getSuser()); + assertEquals("", record.getSuid()); + String message = record.asString(HEADER, SEPARATOR); + String[] mainFields = message.split("\\|"); + assertEquals(CEF_FIELD_COUNT, mainFields.length); + assertEquals("type", mainFields[4]); + assertEquals("action", mainFields[5]); + assertEquals("10", mainFields[6]); + String[] secFields = mainFields[7].split("\\s"); + assertEquals(5, secFields.length); + assertEquals("src=127.0.0.1", secFields[0]); + assertEquals("dst=127.0.0.1:443", secFields[1]); + assertEquals("shost=localhost.localdomain", secFields[2]); + assertEquals("msg=CODE\\=400", secFields[3]); + assertTrue(secFields[4].matches("^end=\\d+$")); + } + + private static JsonNode readResource(String name) { + try (InputStream in = ClassLoader.getSystemResourceAsStream(name)){ + return mapper.readTree(in); + } catch (IOException e) { + return null; + } + } +} diff --git a/platform/runtime/base/logging/cef-logger-layout/src/test/java/ru/emdev/cef/ProcessingTest.java b/platform/runtime/base/logging/cef-logger-layout/src/test/java/ru/emdev/cef/ProcessingTest.java new file mode 100644 index 00000000..7ab3e084 --- /dev/null +++ b/platform/runtime/base/logging/cef-logger-layout/src/test/java/ru/emdev/cef/ProcessingTest.java @@ -0,0 +1,93 @@ +/*- + * ~~~~~~licensing~~~~~~ + * cef-logger-layout + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.emdev.cef; + + +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.message.Message; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.*; + +public class ProcessingTest { + + public static final String AUDIT_LOG_MARKER = "auditLog"; + private CEFLayout cefLayout; + private AuditLayout auditLayout; + + @BeforeEach + protected void setUp() { + cefLayout = new CEFLayout("", "|", "", "", "", "cef"); + auditLayout = Mockito.mock(AuditLayout.class); + Mockito.when(auditLayout.toSerializable(any())).thenReturn(AUDIT_LOG_MARKER); + cefLayout.setAuditLayout(auditLayout); + } + + @Test + public void testIsEmdevEvents() { + LogEvent emdevOne = createLogEvent("{\"isEmdevEvents\": \"true\"}"); + String message = cefLayout.toSerializable(emdevOne); + assertNotNull(message); + verify(auditLayout, never()).toSerializable(any()); + } + + @Test + public void testNotEmdevEvents() { + LogEvent emdevOne = createLogEvent("{\"isEmdevEvents\": \"false\"}"); + String message = cefLayout.toSerializable(emdevOne); + assertNotNull(message); + verify(auditLayout, times(1)).toSerializable(any()); + } + + @Test + public void testSkipJsonWithoutEmdevMarker() { + LogEvent emdevOne = createLogEvent("{}"); + String message = cefLayout.toSerializable(emdevOne); + assertNotNull(message); + verify(auditLayout, times(1)).toSerializable(any()); + } + + @Test + public void testSkipPlainText() { + LogEvent emdevOne = createLogEvent("Log message"); + String message = cefLayout.toSerializable(emdevOne); + assertNotNull(message); + verify(auditLayout, times(1)).toSerializable(any()); + } + + private static LogEvent createLogEvent(String message) { + LogEvent event = Mockito.mock(LogEvent.class); + Message logMessage = Mockito.mock(Message.class); + Mockito.when(logMessage.getFormattedMessage()).thenReturn(message); + Mockito.when(event.getMessage()).thenReturn(logMessage); + return event; + } + +} diff --git a/platform/runtime/base/logging/cef-logger-layout/src/test/resources/examples/almostFull.json b/platform/runtime/base/logging/cef-logger-layout/src/test/resources/examples/almostFull.json new file mode 100644 index 00000000..7fde695f --- /dev/null +++ b/platform/runtime/base/logging/cef-logger-layout/src/test/resources/examples/almostFull.json @@ -0,0 +1,12 @@ +{ + "typ": "type", + "action": "action", + "performedBy": "user", + "info" : { + "severity": 10, + "shost": "localhost.localdomain", + "src": "127.0.0.1", + "dst": "127.0.0.1:443", + "msg": "CODE=400" + } +} \ No newline at end of file diff --git a/platform/runtime/base/logging/cef-logger-layout/src/test/resources/examples/empty.json b/platform/runtime/base/logging/cef-logger-layout/src/test/resources/examples/empty.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/platform/runtime/base/logging/cef-logger-layout/src/test/resources/examples/empty.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/platform/runtime/base/logging/cef-logger-layout/src/test/resources/examples/noinfo.json b/platform/runtime/base/logging/cef-logger-layout/src/test/resources/examples/noinfo.json new file mode 100644 index 00000000..b7900cde --- /dev/null +++ b/platform/runtime/base/logging/cef-logger-layout/src/test/resources/examples/noinfo.json @@ -0,0 +1,5 @@ +{ + "typ": "type", + "action": "action", + "performedBy": "user" +} \ No newline at end of file diff --git a/platform/runtime/base/logging/cef-logger-layout/wso2/conf/deployment.toml b/platform/runtime/base/logging/cef-logger-layout/wso2/conf/deployment.toml new file mode 100644 index 00000000..19103bec --- /dev/null +++ b/platform/runtime/base/logging/cef-logger-layout/wso2/conf/deployment.toml @@ -0,0 +1,275 @@ +[server] +hostname = "localhost" +#offset=0 +base_path = "${carbon.protocol}://${carbon.host}:${carbon.management.port}" +#discard_empty_caches = false +server_role = "default" + +[super_admin] +username = "admin" +password = "admin" +create_admin_account = true + +[user_store] +type = "database_unique_id" + +[database.apim_db] +type = "h2" +url = "jdbc:h2:./repository/database/WSO2AM_DB;AUTO_SERVER=TRUE;DB_CLOSE_ON_EXIT=FALSE" +username = "wso2carbon" +password = "wso2carbon" + +[database.shared_db] +type = "h2" +url = "jdbc:h2:./repository/database/WSO2SHARED_DB;DB_CLOSE_ON_EXIT=FALSE" +username = "wso2carbon" +password = "wso2carbon" + +[keystore.tls] +file_name = "wso2carbon.jks" +type = "JKS" +password = "wso2carbon" +alias = "wso2carbon" +key_password = "wso2carbon" + +#[keystore.listener_profile] +#bind_address = "0.0.0.0" + +#[keystore.primary] +#file_name = "wso2carbon.jks" +#type = "JKS" +#password = "wso2carbon" +#alias = "wso2carbon" +#key_password = "wso2carbon" + +#[keystore.internal] +#file_name = "wso2carbon.jks" +#type = "JKS" +#password = "wso2carbon" +#alias = "wso2carbon" +#key_password = "wso2carbon" + +[[apim.gateway.environment]] +name = "Default" +type = "hybrid" +provider = "wso2" +display_in_api_console = true +description = "This is a hybrid gateway that handles both production and sandbox token traffic." +show_as_token_endpoint_url = true +service_url = "https://localhost:${mgt.transport.https.port}/services/" +username= "${admin.username}" +password= "${admin.password}" +ws_endpoint = "ws://localhost:9099" +wss_endpoint = "wss://localhost:8099" +http_endpoint = "http://localhost:${http.nio.port}" +https_endpoint = "https://localhost:${https.nio.port}" +websub_event_receiver_http_endpoint = "http://localhost:9021" +websub_event_receiver_https_endpoint = "https://localhost:8021" + +[apim.sync_runtime_artifacts.gateway] +gateway_labels =["Default"] + +#[apim.cache.gateway_token] +#enable = true +#expiry_time = "900s" + +#[apim.cache.resource] +#enable = true +#expiry_time = "900s" + +#[apim.cache.km_token] +#enable = false +#expiry_time = "15m" + +#[apim.cache.recent_apis] +#enable = false + +#[apim.cache.scopes] +#enable = true + +#[apim.cache.publisher_roles] +#enable = true + +#[apim.cache.jwt_claim] +#enable = true +#expiry_time = "15m" + +#[apim.cache.tags] +#expiry_time = "2m" + +[apim.analytics] +enable = false +auth_token = "" + +#[apim.key_manager] +#service_url = "https://localhost:${mgt.transport.https.port}/services/" +#username = "$ref{super_admin.username}" +#password = "$ref{super_admin.password}" +#pool.init_idle_capacity = 50 +#pool.max_idle = 100 +#key_validation_handler_type = "default" +#key_validation_handler_type = "custom" +#key_validation_handler_impl = "org.wso2.carbon.apimgt.keymgt.handlers.DefaultKeyValidationHandler" + +#[apim.idp] +#server_url = "https://localhost:${mgt.transport.https.port}" +#authorize_endpoint = "https://localhost:${mgt.transport.https.port}/oauth2/authorize" +#oidc_logout_endpoint = "https://localhost:${mgt.transport.https.port}/oidc/logout" +#oidc_check_session_endpoint = "https://localhost:${mgt.transport.https.port}/oidc/checksession" + +#[apim.jwt] +#enable = true +#encoding = "base64" # base64,base64url +#generator_impl = "org.wso2.carbon.apimgt.keymgt.token.JWTGenerator" +#claim_dialect = "http://wso2.org/claims" +#convert_dialect = false +#header = "X-JWT-Assertion" +#signing_algorithm = "SHA256withRSA" +#enable_user_claims = true +#claims_extractor_impl = "org.wso2.carbon.apimgt.impl.token.ExtendedDefaultClaimsRetriever" + +#[apim.oauth_config] +#enable_outbound_auth_header = false +#auth_header = "Authorization" +#revoke_endpoint = "https://localhost:${https.nio.port}/revoke" +#enable_token_encryption = false +#enable_token_hashing = false + +#[apim.devportal] +#url = "https://localhost:${mgt.transport.https.port}/devportal" +#enable_application_sharing = false +#if application_sharing_type, application_sharing_impl both defined priority goes to application_sharing_impl +#application_sharing_type = "default" #changed type, saml, default #todo: check the new config for rest api +#application_sharing_impl = "org.wso2.carbon.apimgt.impl.SAMLGroupIDExtractorImpl" +#display_multiple_versions = false +#display_deprecated_apis = false +#enable_comments = true +#enable_ratings = true +#enable_forum = true +#enable_anonymous_mode=true +#enable_cross_tenant_subscriptions = true +#default_reserved_username = "apim_reserved_user" + +[apim.cors] +allow_origins = "*" +allow_methods = ["GET","PUT","POST","DELETE","PATCH","OPTIONS"] +allow_headers = ["authorization","Access-Control-Allow-Origin","Content-Type","SOAPAction","apikey","Internal-Key"] +allow_credentials = false + +#[apim.throttling] +#enable_data_publishing = true +#enable_policy_deploy = true +#enable_blacklist_condition = true +#enable_persistence = true +#throttle_decision_endpoints = ["tcp://localhost:5672","tcp://localhost:5672"] + +#[apim.throttling.blacklist_condition] +#start_delay = "5m" +#period = "1h" + +#[apim.throttling.jms] +#start_delay = "5m" + +#[apim.throttling.event_sync] +#hostName = "0.0.0.0" +#port = 11224 + +#[apim.throttling.event_management] +#hostName = "0.0.0.0" +#port = 10005 + +#[[apim.throttling.url_group]] +#traffic_manager_urls = ["tcp://localhost:9611","tcp://localhost:9611"] +#traffic_manager_auth_urls = ["ssl://localhost:9711","ssl://localhost:9711"] +#type = "loadbalance" + +#[[apim.throttling.url_group]] +#traffic_manager_urls = ["tcp://localhost:9611","tcp://localhost:9611"] +#traffic_manager_auth_urls = ["ssl://localhost:9711","ssl://localhost:9711"] +#type = "failover" + +#[apim.workflow] +#enable = false +#service_url = "https://localhost:9445/bpmn" +#username = "$ref{super_admin.username}" +#password = "$ref{super_admin.password}" +#callback_endpoint = "https://localhost:${mgt.transport.https.port}/api/am/admin/v0.17/workflows/update-workflow-status" +#token_endpoint = "https://localhost:${https.nio.port}/token" +#client_registration_endpoint = "https://localhost:${mgt.transport.https.port}/client-registration/v0.17/register" +#client_registration_username = "$ref{super_admin.username}" +#client_registration_password = "$ref{super_admin.password}" + +#data bridge config +#[transport.receiver] +#type = "binary" +#worker_threads = 10 +#session_timeout = "30m" +#keystore.file_name = "$ref{keystore.tls.file_name}" +#keystore.password = "$ref{keystore.tls.password}" +#tcp_port = 9611 +#ssl_port = 9711 +#ssl_receiver_thread_pool_size = 100 +#tcp_receiver_thread_pool_size = 100 +#ssl_enabled_protocols = ["TLSv1","TLSv1.1","TLSv1.2"] +#ciphers = ["SSL_RSA_WITH_RC4_128_MD5","SSL_RSA_WITH_RC4_128_SHA"] + +#[apim.notification] +#from_address = "APIM.com" +#username = "APIM" +#password = "APIM+123" +#hostname = "localhost" +#port = 3025 +#enable_start_tls = false +#enable_authentication = true + +#[apim.token.revocation] +#notifier_impl = "org.wso2.carbon.apimgt.keymgt.events.TokenRevocationNotifierImpl" +#enable_realtime_notifier = true +#realtime_notifier.ttl = 5000 +#enable_persistent_notifier = true +#persistent_notifier.hostname = "https://localhost:2379/v2/keys/jti/" +#persistent_notifier.ttl = 5000 +#persistent_notifier.username = "root" +#persistent_notifier.password = "root" + +[[event_handler]] +name="userPostSelfRegistration" +subscriptions=["POST_ADD_USER"] + +[service_provider] +sp_name_regex = "^[\\sa-zA-Z0-9._-]*$" + +[database.local] +url = "jdbc:h2:./repository/database/WSO2CARBON_DB;DB_CLOSE_ON_EXIT=FALSE" + +[[event_listener]] +id = "token_revocation" +type = "org.wso2.carbon.identity.core.handler.AbstractIdentityHandler" +name = "org.wso2.is.notification.ApimOauthEventInterceptor" +order = 1 + +[[event_listener]] +id = "token_refresh" +type = "org.wso2.carbon.identity.core.handler.AbstractIdentityHandler" +name = "org.wso2.carbon.identity.data.publisher.oauth.listener.RefreshTokenGrantAuditLogger" +order = 2 + +[[event_listener]] +id = "token_refresh_revoke" +type = "org.wso2.carbon.identity.core.handler.AbstractIdentityHandler" +name = "org.wso2.carbon.identity.data.publisher.oauth.listener.TokenRevocationAuditLogger" +order = 3 + +[event_listener.properties] +notification_endpoint = "https://localhost:${mgt.transport.https.port}/internal/data/v1/notify" +username = "${admin.username}" +password = "${admin.password}" +'header.X-WSO2-KEY-MANAGER' = "default" + +[oauth.grant_type.token_exchange] +enable = true +allow_refresh_tokens = true +iat_validity_period = "1h" + +[apim.key_manager] +enable_apikey_subscription_validation = true \ No newline at end of file diff --git a/platform/runtime/base/logging/cef-logger-layout/wso2/conf/log4j2-entaxy.properties b/platform/runtime/base/logging/cef-logger-layout/wso2/conf/log4j2-entaxy.properties new file mode 100644 index 00000000..ef0b531a --- /dev/null +++ b/platform/runtime/base/logging/cef-logger-layout/wso2/conf/log4j2-entaxy.properties @@ -0,0 +1,26 @@ +# CEF logger +log4j2.logger.AUDIT_FILE.name = AUDIT_LOGFILE +log4j2.logger.AUDIT_FILE.level = INFO +log4j2.logger.AUDIT_FILE.appenderRef.AUDIT_LOGFILE.ref = AuditCompositeLogger +log4j2.logger.AUDIT_FILE.additivity = false + +log4j2.appender.AUDIT_LOGFILE.type = CEFAggregate +log4j2.appender.AUDIT_LOGFILE.name = AuditCompositeLogger +log4j2.appender.AUDIT_LOGFILE.children = CefFile +log4j2.appender.AUDIT_LOGFILE.filter.threshold.type = ThresholdFilter +log4j2.appender.AUDIT_LOGFILE.filter.threshold.level = INFO + +log4j2.appender.AUDIT_LOGFILE_1.type = RollingRandomAccessFile +log4j2.appender.AUDIT_LOGFILE_1.name = CefFile +log4j2.appender.AUDIT_LOGFILE_1.append = true +log4j2.appender.AUDIT_LOGFILE_1.fileName = ${karaf.log}/cef-audit.log +log4j2.appender.AUDIT_LOGFILE_1.filePattern = ${karaf.log}/cef-audit-%d{MM-dd-yyyy}.log +log4j2.appender.AUDIT_LOGFILE_1.layout.type = CEFLayout +log4j2.appender.AUDIT_LOGFILE_1.layout.vendor = EMDEV +log4j2.appender.AUDIT_LOGFILE_1.layout.product = ENTAXY +log4j2.appender.AUDIT_LOGFILE_1.layout.productVersion = 1.1.10-SNAPSHOT +log4j2.appender.AUDIT_LOGFILE_1.policies.type = Policies +log4j2.appender.AUDIT_LOGFILE_1.policies.size.type = SizeBasedTriggeringPolicy +log4j2.appender.AUDIT_LOGFILE_1.policies.size.size = 10MB +log4j2.appender.AUDIT_LOGFILE_1.filter.threshold.type = ThresholdFilter +log4j2.appender.AUDIT_LOGFILE_1.filter.threshold.level = INFO \ No newline at end of file diff --git a/platform/runtime/base/logging/cef-logger-layout/wso2/conf/log4j2.properties b/platform/runtime/base/logging/cef-logger-layout/wso2/conf/log4j2.properties new file mode 100644 index 00000000..964a0c56 --- /dev/null +++ b/platform/runtime/base/logging/cef-logger-layout/wso2/conf/log4j2.properties @@ -0,0 +1,484 @@ +# list of all appenders +#add entry "syslog" to use the syslog appender +appenders=CARBON_CONSOLE, CARBON_LOGFILE, AUDIT_LOGFILE, ATOMIKOS_LOGFILE, CARBON_TRACE_LOGFILE, ERROR_LOGFILE, OPEN_TRACING,SERVICE_APPENDER, TRACE_APPENDER, osgi, CORRELATION, BOTDATA_APPENDER, API_LOGFILE, AUDIT_LOGFILE_1, AUDIT_LOGFILE_2 +#, syslog + +# CARBON_CONSOLE is set to be a ConsoleAppender using a PatternLayout. +appender.CARBON_CONSOLE.type = Console +appender.CARBON_CONSOLE.name = CARBON_CONSOLE +appender.CARBON_CONSOLE.layout.type = PatternLayout +appender.CARBON_CONSOLE.layout.pattern = [%d{DEFAULT}] %5p - %c{1} %m%n +appender.CARBON_CONSOLE.filter.threshold.type = ThresholdFilter +appender.CARBON_CONSOLE.filter.threshold.level = DEBUG + +# CARBON_LOGFILE is set to be a DailyRollingFileAppender using a PatternLayout. +appender.CARBON_LOGFILE.type = RollingFile +appender.CARBON_LOGFILE.name = CARBON_LOGFILE +appender.CARBON_LOGFILE.fileName = ${sys:carbon.home}/repository/logs/wso2carbon.log +appender.CARBON_LOGFILE.filePattern = ${sys:carbon.home}/repository/logs/wso2carbon-%d{MM-dd-yyyy}-%i.log +appender.CARBON_LOGFILE.layout.type = PatternLayout +appender.CARBON_LOGFILE.layout.pattern = TID: [%tenantId] [%appName] [%d] %5p {%c} - %m%ex%n +appender.CARBON_LOGFILE.policies.type = Policies +appender.CARBON_LOGFILE.policies.time.type = TimeBasedTriggeringPolicy +appender.CARBON_LOGFILE.policies.time.interval = 1 +appender.CARBON_LOGFILE.policies.time.modulate = true +appender.CARBON_LOGFILE.policies.size.type = SizeBasedTriggeringPolicy +appender.CARBON_LOGFILE.policies.size.size = 10MB +appender.CARBON_LOGFILE.strategy.type = DefaultRolloverStrategy +appender.CARBON_LOGFILE.strategy.max = 20 +appender.CARBON_LOGFILE.filter.threshold.type = ThresholdFilter +appender.CARBON_LOGFILE.filter.threshold.level = DEBUG + +# Appender config to AUDIT_LOGFILE +appender.AUDIT_LOGFILE.type = CEFAggregate +appender.AUDIT_LOGFILE.name = AUDIT_LOGFILE +appender.AUDIT_LOGFILE.children = AUDIT_LOGFILE_1, AUDIT_LOGFILE_2 +appender.AUDIT_LOGFILE.filter.threshold.type = ThresholdFilter +appender.AUDIT_LOGFILE.filter.threshold.level = INFO + +# audit.log CEF output +appender.AUDIT_LOGFILE_1.type = RollingFile +appender.AUDIT_LOGFILE_1.name = AUDIT_LOGFILE_1 +appender.AUDIT_LOGFILE_1.fileName = ${sys:carbon.home}/repository/logs/audit.log +appender.AUDIT_LOGFILE_1.filePattern = ${sys:carbon.home}/repository/logs/audit-%d{MM-dd-yyyy}.log +#appender.AUDIT_LOGFILE.layout.type = PatternLayout +#appender.AUDIT_LOGFILE.layout.pattern = TID: [%tenantId] [%d] %5p {%c} - %m%ex%n +appender.AUDIT_LOGFILE_1.layout.type = CEFLayout +appender.AUDIT_LOGFILE_1.layout.vendor = EMDEV +appender.AUDIT_LOGFILE_1.layout.product = WSO2APIM +appender.AUDIT_LOGFILE_1.layout.productVersion = 4.1.0 +appender.AUDIT_LOGFILE_1.policies.type = Policies +appender.AUDIT_LOGFILE_1.policies.time.type = TimeBasedTriggeringPolicy +appender.AUDIT_LOGFILE_1.policies.time.interval = 1 +appender.AUDIT_LOGFILE_1.policies.time.modulate = true +appender.AUDIT_LOGFILE_1.policies.size.type = SizeBasedTriggeringPolicy +appender.AUDIT_LOGFILE_1.policies.size.size = 10MB +appender.AUDIT_LOGFILE_1.strategy.type = DefaultRolloverStrategy +appender.AUDIT_LOGFILE_1.strategy.max = 20 +appender.AUDIT_LOGFILE_1.filter.threshold.type = ThresholdFilter +appender.AUDIT_LOGFILE_1.filter.threshold.level = INFO + +# console audit JSON output +appender.AUDIT_LOGFILE_2.type = Console +appender.AUDIT_LOGFILE_2.name = AUDIT_LOGFILE_2 +appender.AUDIT_LOGFILE_2.layout.type = CEFLayout +appender.AUDIT_LOGFILE_2.layout.vendor = EMDEV +appender.AUDIT_LOGFILE_2.layout.product = WSO2APIM +appender.AUDIT_LOGFILE_2.layout.productVersion = 4.1.0 +appender.AUDIT_LOGFILE_2.layout.format = json +appender.AUDIT_LOGFILE_2.filter.threshold.type = ThresholdFilter +appender.AUDIT_LOGFILE_2.filter.threshold.level = INFO + + +# Appender config API logging +appender.API_LOGFILE.type = RollingFile +appender.API_LOGFILE.name = API_LOGFILE +appender.API_LOGFILE.fileName = ${sys:carbon.home}/repository/logs/api.log +appender.API_LOGFILE.filePattern = ${sys:carbon.home}/repository/logs/api-%d{MM-dd-yyyy}-%i.log +appender.API_LOGFILE.layout.type = PatternLayout +appender.API_LOGFILE.layout.pattern = [%d] %5p {%c} %X{apiName} - %m%ex%n +appender.API_LOGFILE.policies.type = Policies +appender.API_LOGFILE.policies.time.type = TimeBasedTriggeringPolicy +appender.API_LOGFILE.policies.time.interval = 1 +appender.API_LOGFILE.policies.time.modulate = true +appender.API_LOGFILE.policies.size.type = SizeBasedTriggeringPolicy +appender.API_LOGFILE.policies.size.size = 10MB +appender.API_LOGFILE.strategy.type = DefaultRolloverStrategy +appender.API_LOGFILE.strategy.max = 20 +appender.API_LOGFILE.filter.threshold.type = ThresholdFilter +appender.API_LOGFILE.filter.threshold.level = DEBUG + +# Appender config to send Atomikos transaction logs to new log file tm.out. +appender.ATOMIKOS_LOGFILE.type = RollingFile +appender.ATOMIKOS_LOGFILE.name = ATOMIKOS_LOGFILE +appender.ATOMIKOS_LOGFILE.fileName = ${sys:carbon.home}/repository/logs/tm.out +appender.ATOMIKOS_LOGFILE.filePattern = ${sys:carbon.home}/repository/logs/tm-%d{MM-dd-yyyy}.out +appender.ATOMIKOS_LOGFILE.layout.type = PatternLayout +appender.ATOMIKOS_LOGFILE.layout.pattern = [%d] [%tenantId] %5p {%c} - %m%ex%n +appender.ATOMIKOS_LOGFILE.policies.type = Policies +appender.ATOMIKOS_LOGFILE.policies.time.type = TimeBasedTriggeringPolicy +appender.ATOMIKOS_LOGFILE.policies.time.interval = 1 +appender.ATOMIKOS_LOGFILE.policies.time.modulate = true +appender.ATOMIKOS_LOGFILE.strategy.type = DefaultRolloverStrategy +appender.ATOMIKOS_LOGFILE.strategy.max = 20 + +# Appender config to CARBON_TRACE_LOGFILE +appender.CARBON_TRACE_LOGFILE.type = RollingFile +appender.CARBON_TRACE_LOGFILE.name = CARBON_TRACE_LOGFILE +appender.CARBON_TRACE_LOGFILE.fileName = ${sys:carbon.home}/repository/logs/wso2carbon-trace-messages.log +appender.CARBON_TRACE_LOGFILE.filePattern = ${sys:carbon.home}/repository/logs/wso2carbon-trace-messages-%d{MM-dd-yyyy}.log +appender.CARBON_TRACE_LOGFILE.layout.type = PatternLayout +appender.CARBON_TRACE_LOGFILE.layout.pattern = [%d] [%tenantId] %5p {%c} - %m%ex%n +appender.CARBON_TRACE_LOGFILE.policies.type = Policies +appender.CARBON_TRACE_LOGFILE.policies.time.type = TimeBasedTriggeringPolicy +appender.CARBON_TRACE_LOGFILE.policies.time.interval = 1 +appender.CARBON_TRACE_LOGFILE.policies.time.modulate = true +appender.CARBON_TRACE_LOGFILE.policies.size.type = SizeBasedTriggeringPolicy +appender.CARBON_TRACE_LOGFILE.policies.size.size = 10MB +appender.CARBON_TRACE_LOGFILE.strategy.type = DefaultRolloverStrategy +appender.CARBON_TRACE_LOGFILE.strategy.max = 20 + +# Appender config to put correlation Log. +appender.CORRELATION.type = RollingFile +appender.CORRELATION.name = CORRELATION +appender.CORRELATION.fileName = ${sys:carbon.home}/repository/logs/correlation.log +appender.CORRELATION.filePattern =${sys:carbon.home}/repository/logs/correlation-%d{MM-dd-yyyy}-%i.log.gz +appender.CORRELATION.layout.type = PatternLayout +appender.CORRELATION.layout.pattern = %d{yyyy-MM-dd HH:mm:ss,SSS}|%X{Correlation-ID}|%t|%m%n +appender.CORRELATION.policies.type = Policies +appender.CORRELATION.policies.time.type = TimeBasedTriggeringPolicy +appender.CORRELATION.policies.time.interval = 1 +appender.CORRELATION.policies.time.modulate = true +appender.CORRELATION.policies.size.type = SizeBasedTriggeringPolicy +appender.CORRELATION.policies.size.size = 10MB +appender.CORRELATION.strategy.type = DefaultRolloverStrategy +appender.CORRELATION.strategy.max = 20 +appender.CORRELATION.filter.threshold.type = ThresholdFilter +appender.CORRELATION.filter.threshold.level = INFO + +appender.ERROR_LOGFILE.type = RollingFile +appender.ERROR_LOGFILE.name = ERROR_LOGFILE +appender.ERROR_LOGFILE.fileName = ${sys:carbon.home}/repository/logs/wso2-apigw-errors.log +appender.ERROR_LOGFILE.filePattern = ${sys:carbon.home}/repository/logs/wso2-apigw-errors-%d{MM-dd-yyyy}-%i.log.gz +appender.ERROR_LOGFILE.layout.type = PatternLayout +appender.ERROR_LOGFILE.layout.pattern = %d{ISO8601} [%X{ip}-%X{host}] [%t] %5p %c{1} %m%n +appender.ERROR_LOGFILE.policies.type = Policies +appender.ERROR_LOGFILE.policies.time.type = TimeBasedTriggeringPolicy +appender.ERROR_LOGFILE.policies.time.interval = 1 +appender.ERROR_LOGFILE.policies.time.modulate = true +appender.ERROR_LOGFILE.policies.size.type = SizeBasedTriggeringPolicy +appender.ERROR_LOGFILE.policies.size.size = 10MB +appender.ERROR_LOGFILE.strategy.type = DefaultRolloverStrategy +appender.ERROR_LOGFILE.strategy.max = 20 +appender.ERROR_LOGFILE.filter.threshold.type = ThresholdFilter +appender.ERROR_LOGFILE.filter.threshold.level = WARN + +appender.CARBON_SYS_LOG.type = Syslog +appender.CARBON_SYS_LOG.name = CARBON_SYS_LOG +appender.CARBON_SYS_LOG.host = localhost +appender.CARBON_SYS_LOG.facility = USER +appender.CARBON_SYS_LOG.layout.type = PatternLayout +appender.CARBON_SYS_LOG.layout.pattern = [%d] %5p - %x %m {%c}%n +appender.CARBON_SYS_LOG.filter.threshold.type = ThresholdFilter +appender.CARBON_SYS_LOG.filter.threshold.level = DEBUG + +appender.OPEN_TRACING.type = RollingFile +appender.OPEN_TRACING.name = OPEN_TRACING +appender.OPEN_TRACING.fileName = ${sys:carbon.home}/repository/logs/wso2-apimgt-open-tracing.log +appender.OPEN_TRACING.filePattern = ${sys:carbon.home}/repository/logs/wso2-apimgt-open-tracing-%d{MM-dd-yyyy}-%i.log.gz +appender.OPEN_TRACING.layout.type = PatternLayout +appender.OPEN_TRACING.layout.pattern = %d{HH:mm:ss,SSS} [%X{ip}-%X{host}] [%t] %5p %m%nn +appender.OPEN_TRACING.policies.type = Policies +appender.OPEN_TRACING.policies.time.type = TimeBasedTriggeringPolicy +appender.OPEN_TRACING.policies.time.interval = 1 +appender.OPEN_TRACING.policies.time.modulate = true +appender.OPEN_TRACING.policies.size.type = SizeBasedTriggeringPolicy +appender.OPEN_TRACING.policies.size.size = 10MB +appender.OPEN_TRACING.strategy.type = DefaultRolloverStrategy +appender.OPEN_TRACING.strategy.max = 20 +appender.OPEN_TRACING.filter.threshold.type = ThresholdFilter +appender.OPEN_TRACING.filter.threshold.level = TRACE + +appender.TRACE_APPENDER.type = RollingFile +appender.TRACE_APPENDER.name = TRACE_APPENDER +appender.TRACE_APPENDER.fileName = ${sys:carbon.home}/repository/logs/wso2-apigw-trace.log +appender.TRACE_APPENDER.filePattern = ${sys:carbon.home}/repository/logs/wso2-apigw-trace-%d{MM-dd-yyyy}.log +appender.TRACE_APPENDER.layout.type = PatternLayout +appender.TRACE_APPENDER.layout.pattern = %d{HH:mm:ss,SSS} [%X{ip}-%X{host}] [%t] %5p %c{1} %m%n +appender.TRACE_APPENDER.policies.type = Policies +appender.TRACE_APPENDER.policies.time.type = TimeBasedTriggeringPolicy +appender.TRACE_APPENDER.policies.time.interval = 1 +appender.TRACE_APPENDER.policies.time.modulate = true +appender.TRACE_APPENDER.strategy.type = DefaultRolloverStrategy +appender.TRACE_APPENDER.strategy.max = 20 + +appender.SERVICE_APPENDER.type = RollingFile +appender.SERVICE_APPENDER.name = SERVICE_APPENDER +appender.SERVICE_APPENDER.fileName = ${sys:carbon.home}/repository/logs/wso2-apigw-service.log +appender.SERVICE_APPENDER.filePattern = ${sys:carbon.home}/repository/logs/wso2-apigw-service-%i.log +appender.SERVICE_APPENDER.layout.type = PatternLayout +appender.SERVICE_APPENDER.layout.pattern = %d{ISO8601} [%X{ip}-%X{host}] [%t] %5p %c{1} %m%n +appender.SERVICE_APPENDER.policies.type = Policies +appender.SERVICE_APPENDER.policies.size.type = SizeBasedTriggeringPolicy +appender.SERVICE_APPENDER.policies.size.size=1000KB +appender.SERVICE_APPENDER.strategy.type = DefaultRolloverStrategy +appender.SERVICE_APPENDER.strategy.max = 10 + +appender.osgi.type = PaxOsgi +appender.osgi.name = PaxOsgi +appender.osgi.filter = * + +loggers = AUDIT_LOG, trace-messages, org-apache-coyote, com-hazelcast, Owasp-CsrfGuard, org-apache-axis2-wsdl-codegen-writer-PrettyPrinter, org-apache-axis2-clustering, org-apache-catalina, org-apache-tomcat, org-wso2-carbon-apacheds, org-apache-directory-server-ldap, org-apache-directory-server-core-event, com-atomikos, org-quartz, org-apache-jackrabbit-webdav, org-apache-juddi, org-apache-commons-digester-Digester, org-apache-jasper-compiler-TldLocationsCache, org-apache-qpid, org-apache-qpid-server-Main, qpid-message, qpid-message-broker-listening, org-apache-tiles, org-apache-commons-httpclient, org-apache-solr, me-prettyprint-cassandra-hector-TimingLogger, org-apache-axis-enterprise, org-apache-directory-shared-ldap, org-apache-directory-server-ldap-handlers, org-apache-directory-shared-ldap-entry-DefaultServerAttribute, org-apache-directory-server-core-DefaultDirectoryService, org-apache-directory-shared-ldap-ldif-LdifReader, org-apache-directory-server-ldap-LdapProtocolHandler, org-apache-directory-server-core, org-apache-directory-server-ldap-LdapSession, DataNucleus, Datastore, Datastore-Schema, JPOX-Datastore, JPOX-Plugin, JPOX-MetaData, JPOX-Query, JPOX-General, JPOX-Enhancer, org-apache-hadoop-hive, hive, ExecMapper, ExecReducer, net-sf-ehcache-config-ConfigurationFactory, axis2Deployment, equinox, tomcat2, StAXDialectDetector, trace, synapse, synapse_transport, axis2, axis2_transport, org-wso2-carbon, hunsicker, thrift-publisher, service_logger, trace_logger, org-wso2-carbon-apimgt-gateway-mediators-BotDetectionMediator, wso2-callhome, correlation, JAGGERY_LOG, API_LOG + +logger.API_LOG.name = API_LOG +logger.API_LOG.level = INFO +logger.API_LOG.appenderRef.API_LOGFILE.ref = API_LOGFILE +logger.API_LOG.additivity = false + +logger.JAGGERY_LOG.name = JAGGERY +logger.JAGGERY_LOG.level = INFO + +logger.AUDIT_LOG.name = AUDIT_LOG +logger.AUDIT_LOG.level = INFO +logger.AUDIT_LOG.appenderRef.AUDIT_LOGFILE.ref = AUDIT_LOGFILE +logger.AUDIT_LOG.additivity = false + +logger.trace-messages.name = trace.messages +logger.trace-messages.level = TRACE +logger.trace-messages.appenderRef.CARBON_TRACE_LOGFILE.ref = CARBON_TRACE_LOGFILE + +logger.org-apache-coyote.name = org.apache.coyote +logger.org-apache-coyote.level = WARN + +logger.com-hazelcast.name = com.hazelcast +logger.com-hazelcast.level = ERROR + +logger.Owasp-CsrfGuard.name = Owasp.CsrfGuard +logger.Owasp-CsrfGuard.level = WARN + +logger.org-apache-axis2-wsdl-codegen-writer-PrettyPrinter.name = org.apache.axis2.wsdl.codegen.writer.PrettyPrinter +logger.org-apache-axis2-wsdl-codegen-writer-PrettyPrinter.level = ERROR +logger.org-apache-axis2-wsdl-codegen-writer-PrettyPrinter.appenderRef.CARBON_LOGFILE.ref = CARBON_LOGFILE + +logger.org-apache-axis2-clustering.name = org.apache.axis2.clustering +logger.org-apache-axis2-clustering.level = INFO +logger.org-apache-axis2-clustering.additivity = false + +logger.org-apache.name = org.apache +logger.org-apache.level = INFO +logger.org-apache.additivity = false +logger.org-apache.appenderRef.CARBON_LOGFILE.ref = CARBON_LOGFILE + +logger.org-apache-catalina.name = org.apache.catalina +logger.org-apache-catalina.level = ERROR + +logger.org-apache-tomcat.name = org.apache.tomcat +logger.org-apache-tomcat.level = INFO + +logger.org-wso2-carbon-apacheds.name = org.wso2.carbon.apacheds +logger.org-wso2-carbon-apacheds.level = WARN + +logger.org-apache-directory-server-ldap.name = org.apache.directory.server.ldap +logger.org-apache-directory-server-ldap.level = ERROR + +logger.org-apache-directory-server-core-event.name = org.apache.directory.server.core.event +logger.org-apache-directory-server-core-event.level = WARN + +logger.com-atomikos.name = com.atomikos +logger.com-atomikos.level = INFO +logger.com-atomikos.additivity = false +logger.com-atomikos.appenderRef.ATOMIKOS_LOGFILE.ref = ATOMIKOS_LOGFILE + +logger.org-quartz.name = org.quartz +logger.org-quartz.level = WARN + +logger.org-apache-jackrabbit-webdav.name = org.apache.jackrabbit.webdav +logger.org-apache-jackrabbit-webdav.level = WARN + +logger.org-apache-juddi.name = org.apache.juddi +logger.org-apache-juddi.level = ERROR + +logger.org-apache-commons-digester-Digester.name = org.apache.commons.digester.Digester +logger.org-apache-commons-digester-Digester.level = WARN + +logger.org-apache-jasper-compiler-TldLocationsCache.name = org.apache.jasper.compiler.TldLocationsCache +logger.org-apache-jasper-compiler-TldLocationsCache.level = WARN + +logger.org-apache-qpid.name = org.apache.qpid +logger.org-apache-qpid.level = WARN + +logger.org-apache-qpid-server-Main.name = org.apache.qpid.server.Main +logger.org-apache-qpid-server-Main.level = INFO + +logger.qpid-message.name = qpid.message +logger.qpid-message.level = WARN + +logger.qpid-message-broker-listening.name = qpid.message.broker.listening +logger.qpid-message-broker-listening.level = INFO + +logger.org-apache-tiles.name = org.apache.tiles +logger.org-apache-tiles.level = WARN + +logger.org-apache-commons-httpclient.name = org.apache.commons.httpclient +logger.org-apache-commons-httpclient.level = ERROR + +logger.org-apache-solr.name = org.apache.solr +logger.org-apache-solr.level = ERROR + +logger.me-prettyprint-cassandra-hector-TimingLogger.name = me.prettyprint.cassandra.hector.TimingLogger +logger.me-prettyprint-cassandra-hector-TimingLogger.level = ERROR + +logger.org-wso2.name = org.wso2 +logger.org-wso2.level = INFO + +logger.org-wso2-carbon.name = org.wso2.carbon +logger.org-wso2-carbon.level = INFO + +logger.org-apache-axis-enterprise.name = org.apache.axis2.enterprise +logger.org-apache-axis-enterprise.level = FATAL +logger.org-apache-axis-enterprise.appenderRef.CARBON_LOGFILE.ref = CARBON_LOGFILE + +logger.org-apache-directory-shared-ldap.name = org.apache.directory.shared.ldap +logger.org-apache-directory-shared-ldap.level = WARN +logger.org-apache-directory-shared-ldap.appenderRef.CARBON_LOGFILE.ref = CARBON_LOGFILE + +logger.org-apache-directory-server-ldap-handlers.name = org.apache.directory.server.ldap.handlers +logger.org-apache-directory-server-ldap-handlers.level = WARN +logger.org-apache-directory-server-ldap-handlers.appenderRef.CARBON_LOGFILE.ref = CARBON_LOGFILE + +# Following are to remove false error messages from startup (IS) +logger.org-apache-directory-shared-ldap-entry-DefaultServerAttribute.name = org.apache.directory.shared.ldap.entry.DefaultServerAttribute +logger.org-apache-directory-shared-ldap-entry-DefaultServerAttribute.level = FATAL +logger.org-apache-directory-shared-ldap-entry-DefaultServerAttribute.appenderRef.CARBON_LOGFILE.ref = CARBON_LOGFILE + +logger.org-apache-directory-server-core-DefaultDirectoryService.name = org.apache.directory.server.core.DefaultDirectoryService +logger.org-apache-directory-server-core-DefaultDirectoryService.level = ERROR +logger.org-apache-directory-server-core-DefaultDirectoryService.appenderRef.CARBON_LOGFILE.ref = CARBON_LOGFILE + +logger.org-apache-directory-shared-ldap-ldif-LdifReader.name = org.apache.directory.shared.ldap.ldif.LdifReader +logger.org-apache-directory-shared-ldap-ldif-LdifReader.level = ERROR +logger.org-apache-directory-shared-ldap-ldif-LdifReader.appenderRef.CARBON_LOGFILE.ref = CARBON_LOGFILE + +logger.org-apache-directory-server-ldap-LdapProtocolHandler.name = org.apache.directory.server.ldap.LdapProtocolHandler +logger.org-apache-directory-server-ldap-LdapProtocolHandler.level = ERROR +logger.org-apache-directory-server-ldap-LdapProtocolHandler.appenderRef.CARBON_LOGFILE.ref = CARBON_LOGFILE + +logger.org-apache-directory-server-core.name = org.apache.directory.server.core +logger.org-apache-directory-server-core.level = ERROR +logger.org-apache-directory-server-core.appenderRef.CARBON_LOGFILE.ref = CARBON_LOGFILE + +logger.org-apache-directory-server-ldap-LdapSession.name = org.apache.directory.server.ldap.LdapSession +logger.org-apache-directory-server-ldap-LdapSession.level = Error +logger.org-apache-directory-server-ldap-LdapSession.appenderRef.CARBON_LOGFILE.ref = CARBON_LOGFILE + +logger.correlation.name = correlation +logger.correlation.level = INFO +logger.correlation.appenderRef.CORRELATION.ref = CORRELATION +logger.correlation.additivity = false + +# Hive Related Log configurations +logger.DataNucleus.name = DataNucleus +logger.DataNucleus.level = ERROR + +logger.Datastore.name = Datastore +logger.Datastore.level = ERROR + +logger.Datastore-Schema.name = Datastore.Schema +logger.Datastore-Schema.level = ERROR + +logger.JPOX-Datastore.name = JPOX.Datastore +logger.JPOX-Datastore.level = ERROR + +logger.JPOX-Plugin.name = JPOX.Plugin +logger.JPOX-Plugin.level = ERROR + +logger.JPOX-MetaData.name = JPOX.MetaData +logger.JPOX-MetaData.level = ERROR + +logger.JPOX-Query.name = JPOX.Query +logger.JPOX-Query.level = ERROR + +logger.JPOX-General.name = JPOX.General +logger.JPOX-General.level = ERROR + +logger.JPOX-Enhancer.name = JPOX.Enhancer +logger.JPOX-Enhancer.level = ERROR + +logger.org-apache-hadoop-hive.name = org.apache.hadoop.hive +logger.org-apache-hadoop-hive.level = WARN + +logger.hive.name = hive +logger.hive.level = WARN + +logger.ExecMapper.name = ExecMapper +logger.ExecMapper.level = WARN + +logger.ExecReducer.name = ExecReducer +logger.ExecReducer.level = WARN + +logger.net-sf-ehcache-config-ConfigurationFactory.name = net.sf.ehcache.config.ConfigurationFactory +logger.net-sf-ehcache-config-ConfigurationFactory.level = ERROR + +logger.axis2Deployment.name = org.apache.axis2.deployment +logger.axis2Deployment.level = WARN + +logger.equinox.name = org.eclipse.equinox +logger.equinox.level = FATAL + +logger.tomcat2.name = tomcat +logger.tomcat2.level = FATAL + +logger.StAXDialectDetector.name = org.apache.axiom.util.stax.dialect.StAXDialectDetector +logger.StAXDialectDetector.level = ERROR + +logger.trace.name = tracer +logger.trace.level = TRACE +logger.trace.appenderRef.OPEN_TRACING.ref = OPEN_TRACING + +logger.synapse.name = org.apache.synapse +logger.synapse.level = INFO + +logger.synapse_transport.name = org.apache.synapse.transport +logger.synapse_transport.level = INFO + +logger.axis2.name = org.apache.axis2 +logger.axis2.level = INFO + +logger.axis2_transport.name = org.apache.axis2.transport +logger.axis2_transport.level = INFO + +logger.hunsicker.name = de.hunsicker.jalopy.io +logger.hunsicker.level = FATAL + +logger.synapse-headers.name = org.apache.synapse.transport.http.headers +logger.synapse-headers.level = DEBUG + +logger.synapse-wire.name = org.apache.synapse.transport.http.wire +logger.synapse-wire.level = DEBUG + +logger.thrift-publisher.name = org.wso2.carbon.databridge.agent.thrift.AsyncDataPublisher +logger.thrift-publisher.level = WARN + +logger.service_logger.name = SERVICE_LOGGER +logger.service_logger.level = INFO +logger.service_logger.additivity = false +logger.service_logger.appenderRef.SERVICE_APPENDER.ref = SERVICE_APPENDER + +logger.wso2-callhome.name = org.wso2.callhome +logger.wso2-callhome.level = INFO + +logger.trace_logger.name = TRACE_LOGGER +logger.trace_logger.level = INFO +logger.trace_logger.appenderRef.TRACE_APPENDER.ref = TRACE_APPENDER + +# root loggers +rootLogger.level = ERROR +rootLogger.appenderRef.CARBON_CONSOLE.ref = CARBON_CONSOLE +rootLogger.appenderRef.CARBON_LOGFILE.ref = CARBON_LOGFILE +rootLogger.appenderRef.ERROR_LOGFILE.ref = ERROR_LOGFILE +rootLogger.appenderRef.PaxOsgi.ref = PaxOsgi +#rootLogger.appenderReg.CARBON_SYS_LOG.ref = CARBON_SYS_LOG +#rootLogger.appenderRef.syslog.ref = syslog + +# bot detection feature appender +appender.BOTDATA_APPENDER.type = RollingFile +appender.BOTDATA_APPENDER.name = BOTDATA_APPENDER +appender.BOTDATA_APPENDER.fileName = ${sys:carbon.home}/repository/logs/wso2-BotDetectedData.log +appender.BOTDATA_APPENDER.filePattern = ${sys:carbon.home}/repository/logs/wso2-BotDetectedData-%d{MM-dd-yyyy}.log +appender.BOTDATA_APPENDER.layout.type = PatternLayout +appender.BOTDATA_APPENDER.layout.pattern = [%d] [%tenantId] %5p {%c} - %m%ex%n +appender.BOTDATA_APPENDER.policies.type = Policies +appender.BOTDATA_APPENDER.policies.time.type = TimeBasedTriggeringPolicy +appender.BOTDATA_APPENDER.policies.time.interval = 1 +appender.BOTDATA_APPENDER.policies.time.modulate = true +appender.BOTDATA_APPENDER.policies.size.type = SizeBasedTriggeringPolicy +appender.BOTDATA_APPENDER.policies.size.size = 10MB +appender.BOTDATA_APPENDER.strategy.type = DefaultRolloverStrategy +appender.BOTDATA_APPENDER.strategy.max = 20 + +logger.org-wso2-carbon-apimgt-gateway-mediators-BotDetectionMediator.name = org.wso2.carbon.apimgt.gateway.mediators.BotDetectionMediator +logger.org-wso2-carbon-apimgt-gateway-mediators-BotDetectionMediator.level = INFO +logger.org-wso2-carbon-apimgt-gateway-mediators-BotDetectionMediator.appenderRef.BOTDATA_APPENDER.ref = BOTDATA_APPENDER +logger.org-wso2-carbon-apimgt-gateway-mediators-BotDetectionMediator.additivity = false + +category.SERVICE_APPENDER._OpenService_ = TRACE_APPENDER, BOTDATA_APPENDER diff --git a/platform/runtime/base/logging/entaxy-audit/LICENSE.txt b/platform/runtime/base/logging/entaxy-audit/LICENSE.txt new file mode 100644 index 00000000..4ae94b75 --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/LICENSE.txt @@ -0,0 +1,175 @@ + ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ + +Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой) +версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего +Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН +7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова, +д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу +https://www.emdev.ru/about (далее - Компания). + +Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями» +(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения, +Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в +настоящем документе, в противном случае, он должен не использовать или не получать доступ +к Программному обеспечению. + + 1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ + +a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии +или редакции, исключительные права на которую принадлежат Правообладателю. +b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные +права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ +для ЭВМ № 2021610848 от 19.01.2021 года. +c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта +https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО. +d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также +личные неимущественные права авторов произведений на результат интеллектуальной деятельности. +e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование +ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка +включает предоставление Пользователю неисключительного права использования ПО, в том числе +получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение +патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается +Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается +для каждого Пользователя индивидуально в Сертификате. +f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром), +подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное +обеспечение в ограниченном объёме и на определённый период времени. +g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО, +предоставленных Пользователю согласно условиям Подписки. +h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного +обеспечения. +i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий +из одного или нескольких файлов, который может быть прочтён человеком. +j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля +программы, полученный в результате обработки исходного кода, еще не связанный в полную программу. +Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый +продукт. +k) Некоммерческое использование – индивидуальное личное использование Пользователем программного +обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации +возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая +выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения. + + 2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ + +2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного +обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом +воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения +в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ. +2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит +неисключительный характер. +2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию, +лицензия на ограниченное использование Программного обеспечения. +2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования +имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан +обратиться в службу поддержки Правообладателя по адресу: https://entaxy.ru/ для изменения +вида лицензии с Базовой бесплатной версии на Подписки. +2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для +пробного использования программного обеспечения – не ограничен. +2.6. Использование Пользователем настоящего программного обеспечения в целях разработки, +модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю, +без разрешения Правообладателя не допускается. + + 3. АВТОРСКОЕ ПРАВО. + +3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение +и любые его копии принадлежат Правообладателю. +3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента, +к которому можно получить доступ с помощью Программного обеспечения, является собственностью +соответствующего владельца контента и защищается применимым законодательством об авторском +праве или другими законами и договорами об интеллектуальной собственности. +3.3. Условия использования Программного обеспечения. +Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь +придерживается следующих условий: +3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять +какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании +Программного обеспечения или на нем. +3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать, +расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать +Программное обеспечение. +3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования +ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне. +3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено +использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам. + + 4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС» + +4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю +на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с +использованием Пользователем: +4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в +Программное обеспечение; +4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями +настоящего соглашения; +4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием, +или данными, не предоставленными Пользователю Правообладателем; +4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем. + + +5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ +ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ +И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ +ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ +И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ +ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО. + + 6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ. +НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ +ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ, +ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ; +ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ. +ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ +ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ; +КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ +ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ. + + 7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ: +Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия +(включая, но не ограничиваясь) по: +-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код) + Программного обеспечения; +-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный +код Программного обеспечения, за исключением тех изменений, которые вносятся средствами, +включёнными в Программное обеспечение и описанными непосредственно в документации к нему; +-созданию условий для использования Программного обеспечения лицами, не имеющими прав на +использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство +третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа +к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку; +-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию). + + 8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА. + +8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из +лицензионных продуктов, используемых на законных основаниях, а +именно https://entaxy.ru/libs/licenses/root-aggregated.deps. +8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть +совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения. +8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться +Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения, +содержащих все изменения и дополнения программного обеспечения. + + 9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ. + +9.1. Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым +программным обеспечением. +9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно +с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм +«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public. +9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий +пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя, +прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер +ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства +Российской Федерации. + + 10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ. + +10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет +право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб, +недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий +пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере +2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения +исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy). +10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое +законодательство – Российской Федерации. +10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным, +остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать +исполнять свои обязанности в соответствии с этими положениями. diff --git a/platform/runtime/base/logging/entaxy-audit/Logging-config.md b/platform/runtime/base/logging/entaxy-audit/Logging-config.md new file mode 100644 index 00000000..75ae5e2c --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/Logging-config.md @@ -0,0 +1,48 @@ +# Настройка логгирования в entaxy + + +Нужен артефакт cef-logger-layout версии __1.0.1__. +Его требуется любым доступным способом задеплоить +в karaf/entaxy. + +## Настройка лог-файла + +В файл `/etc/org.ops4j.pax.logging.cfg` необходимо добавить: + +``` +# CEF logger +log4j2.logger.AUDIT_FILE.name = AUDIT_LOGFILE +log4j2.logger.AUDIT_FILE.level = INFO +log4j2.logger.AUDIT_FILE.appenderRef.AUDIT_LOGFILE.ref = AuditCompositeLogger +log4j2.logger.AUDIT_FILE.additivity = false + +log4j2.appender.AUDIT_LOGFILE.type = CEFAggregate +log4j2.appender.AUDIT_LOGFILE.name = AuditCompositeLogger +log4j2.appender.AUDIT_LOGFILE.children = CefFile +log4j2.appender.AUDIT_LOGFILE.filter.threshold.type = ThresholdFilter +log4j2.appender.AUDIT_LOGFILE.filter.threshold.level = INFO + +log4j2.appender.AUDIT_LOGFILE_1.type = RollingRandomAccessFile +log4j2.appender.AUDIT_LOGFILE_1.name = CefFile +log4j2.appender.AUDIT_LOGFILE_1.append = true +log4j2.appender.AUDIT_LOGFILE_1.fileName = ${karaf.log}/cef-audit.log +log4j2.appender.AUDIT_LOGFILE_1.filePattern = ${karaf.log}/cef-audit-%d{MM-dd-yyyy}.log +log4j2.appender.AUDIT_LOGFILE_1.layout.type = CEFLayout +log4j2.appender.AUDIT_LOGFILE_1.layout.vendor = EMDEV +log4j2.appender.AUDIT_LOGFILE_1.layout.product = ENTAXY +log4j2.appender.AUDIT_LOGFILE_1.layout.productVersion = 1.1.10-SNAPSHOT +log4j2.appender.AUDIT_LOGFILE_1.policies.type = Policies +log4j2.appender.AUDIT_LOGFILE_1.policies.size.type = SizeBasedTriggeringPolicy +log4j2.appender.AUDIT_LOGFILE_1.policies.size.size = 10MB +log4j2.appender.AUDIT_LOGFILE_1.filter.threshold.type = ThresholdFilter +log4j2.appender.AUDIT_LOGFILE_1.filter.threshold.level = INFO +``` +Здесь используется композитный логгер, так что при необходимости +можно добавить вывод в консоль в cef или json формате +по образцу того, как было сделано в wso2. + +Логгируется: + +- Вход/выход в hawtio +- Все команды JAAS в karaf +- Изменения бандлов и конфигурации в karaf. \ No newline at end of file diff --git a/platform/runtime/base/logging/entaxy-audit/README.md b/platform/runtime/base/logging/entaxy-audit/README.md new file mode 100644 index 00000000..4bdffe0e --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/README.md @@ -0,0 +1,10 @@ +# Установка + +- Установите или просто скопируйте в deploy файл `cef-logger-layout-1.0.1.jar` +- Установите бандл `entaxy-audit-logging-1.0.1.jar` (`bundle:install mvn:ru.entaxy/entaxy-audit-logging/1.0.1`) и +запустите его (bundle:start ) +- Замените файл `/system/io/hawt/hawtio-osgi/2.14.1/hawtio-osgi-2.14.1.war` на одноименный из сборки + с зависимостью от `entaxy-audit-logging` (лучше сразу подготовить сборку с ним - он включается в WEB-INF/lib) + +Сконфигурируйте логгирование как описано в файле +`Logging-config.md` в этом репозитории. diff --git a/platform/runtime/base/logging/entaxy-audit/pom.xml b/platform/runtime/base/logging/entaxy-audit/pom.xml new file mode 100644 index 00000000..333f3c41 --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/pom.xml @@ -0,0 +1,88 @@ + + 4.0.0 + + ru.entaxy.platform + logging + 1.11.0 + + ru.entaxy.platform.logging + entaxy-audit + bundle + ENTAXY :: LOGGING :: AUDIT + ENTAXY :: LOGGING :: AUDIT + + + + ru.entaxy.audit* + + + + + + org.slf4j + slf4j-api + ${slf4j.version} + provided + + + javax.servlet + javax.servlet-api + + + com.google.code.gson + gson + ${gson.version} + + + org.apache.felix + org.apache.felix.eventadmin + 1.5.0 + + + + org.junit.jupiter + junit-jupiter + 5.8.1 + test + + + org.osgi + org.osgi.core + ${osgi.version} + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${maven.compiler.source} + ${maven.compiler.target} + + + + org.apache.felix + maven-bundle-plugin + true + + + ru.entaxy.audit.service.osgi.Activator + * + ${project.build.directory}/classes/ + + + + + package + + bundle + + + + + + + + diff --git a/platform/runtime/base/logging/entaxy-audit/src/main/cfg/generated/fragments.xml b/platform/runtime/base/logging/entaxy-audit/src/main/cfg/generated/fragments.xml new file mode 100644 index 00000000..2c319c0a --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/src/main/cfg/generated/fragments.xml @@ -0,0 +1,5 @@ + + + mvn:ru.entaxy.platform.logging/entaxy-audit/1.11.0/cfg/ru.entaxy.audit.interpreter.jmx + + \ No newline at end of file diff --git a/platform/runtime/base/logging/entaxy-audit/src/main/cfg/ru.entaxy.audit.interpreter.jmx.cfg b/platform/runtime/base/logging/entaxy-audit/src/main/cfg/ru.entaxy.audit.interpreter.jmx.cfg new file mode 100644 index 00000000..3fb3b57e --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/src/main/cfg/ru.entaxy.audit.interpreter.jmx.cfg @@ -0,0 +1,27 @@ +### +# ~~~~~~licensing~~~~~~ +# entaxy-audit +# ========== +# Copyright (C) 2020 - 2025 EmDev LLC +# ========== +# You may not use this file except in accordance with the License Terms of the Copyright +# Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property +# rights to the Software and any copies are the property of the Copyright Holder. Unless +# it is explicitly allowed the Copyright Holder, the User is prohibited from using the +# Software for commercial purposes to provide services to third parties. +# +# The Copyright Holder hereby declares that the Software is provided on an "AS IS". +# Under no circumstances does the Copyright Holder guarantee or promise that the +# Software provided by him will be suitable or not suitable for the specific purposes +# of the User, that the Software will meet all commercial and personal subjective +# expectations of the User, that the Software will work properly, without technical +# errors, quickly and uninterruptedly. +# +# Under no circumstances shall the Copyright Holder or its Affiliates is not liable +# to the User for any direct or indirect losses of the User, his expenses or actual +# damage, including, downtime; loss of bussines; lost profit; lost earnings; loss +# or damage to data, property, etc. +# ~~~~~~/licensing~~~~~~ +### +topics.ignore=GETATTRIBUTE,GETMBEANINFO +topics.process=INVOKE diff --git a/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/data/Actions.java b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/data/Actions.java new file mode 100644 index 00000000..92dfa25b --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/data/Actions.java @@ -0,0 +1,31 @@ +/*- + * ~~~~~~licensing~~~~~~ + * entaxy-audit + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.audit.data; + +public enum Actions { + LOGIN, + LOGOUT +} diff --git a/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/data/AuditEvent.java b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/data/AuditEvent.java new file mode 100644 index 00000000..a441ab0e --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/data/AuditEvent.java @@ -0,0 +1,147 @@ +/*- + * ~~~~~~licensing~~~~~~ + * entaxy-audit + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.audit.data; + +import ru.entaxy.audit.utils.AuditHelper; + +public class AuditEvent { + private final String target; + private final String category; + private final String suser; + private final String duser; + private final String message; + private final Outcome outcome; + + private final Severity severity; + private final String src; + + public AuditEvent(String target, String category, String suser, + String duser, String message, Outcome outcome, + Severity severity, String src) { + this.target = target; + this.category = category; + this.suser = suser; + this.duser = duser; + this.message = message; + this.outcome = outcome; + this.severity = severity; + this.src = src; + } + + public String getTarget() { + return target; + } + + public String getCategory() { + return category; + } + + public String getSuser() { + return suser; + } + + public String getDuser() { + return duser; + } + + public String getMessage() { + return message; + } + + public Outcome getOutcome() { + return outcome; + } + + public Severity getSeverity() { + return severity; + } + + public String getSrc() { + return src; + } + + public static class AuditLoggingEventBuilder { + private String target = AuditHelper.DEFAULT_TARGET; + private String category; + private String suser; + private String duser; + private String message; + + private String src; + private Outcome outcome = Outcome.SUCCESS; + private Severity severity = AuditHelper.DEFAULT_SEVERITY; + + + public static AuditLoggingEventBuilder getInstance() { + return new AuditLoggingEventBuilder(); + } + + public AuditLoggingEventBuilder target(String target) { + this.target = target; + return this; + } + + public AuditLoggingEventBuilder category(String category) { + this.category = category; + return this; + } + + public AuditLoggingEventBuilder suser(String suser) { + this.suser = suser; + return this; + } + + public AuditLoggingEventBuilder duser(String duser) { + this.duser = duser; + return this; + } + + public AuditLoggingEventBuilder message(String message) { + this.message = message; + return this; + } + + public AuditLoggingEventBuilder outcome(Outcome outcome) { + this.outcome = outcome; + return this; + } + + public AuditLoggingEventBuilder severity(Severity severity) { + this.severity = severity; + return this; + } + + public AuditLoggingEventBuilder src(String src) { + this.src = src; + return this; + } + + public AuditEvent build() { + return new AuditEvent(target, category, suser, duser, + message, outcome, severity, src); + } + } +} diff --git a/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/data/Outcome.java b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/data/Outcome.java new file mode 100644 index 00000000..455a796d --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/data/Outcome.java @@ -0,0 +1,39 @@ +/*- + * ~~~~~~licensing~~~~~~ + * entaxy-audit + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.audit.data; + +public enum Outcome { + SUCCESS("Success"), FAILURE("Failed"); + private final String label; + + Outcome(String label) { + this.label = label; + } + + public String getLabel() { + return label; + } +} diff --git a/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/data/Severity.java b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/data/Severity.java new file mode 100644 index 00000000..13280378 --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/data/Severity.java @@ -0,0 +1,40 @@ +/*- + * ~~~~~~licensing~~~~~~ + * entaxy-audit + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.audit.data; + +public enum Severity { + INFO(3), WARNING(8), IMPORTANT(6); + + private final int value; + + Severity(int i) { + this.value = i; + } + + public int getValue() { + return value; + } +} diff --git a/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/AuditService.java b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/AuditService.java new file mode 100644 index 00000000..fc3601ab --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/AuditService.java @@ -0,0 +1,53 @@ +/*- + * ~~~~~~licensing~~~~~~ + * entaxy-audit + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.audit.service; + +import javax.security.auth.Subject; +import javax.servlet.http.HttpServletRequest; + +import org.osgi.service.event.Event; + +import ru.entaxy.audit.data.AuditEvent; +import ru.entaxy.audit.data.Outcome; + + +public interface AuditService { + void onAudit(AuditEvent record); + + void onLogin(String username, HttpServletRequest request, Outcome outcome); + + void onLogout(String username, HttpServletRequest request); + + void onOSGIEvent(Event event); + + void onFileChange(Event event); + + boolean interpret(Event event); + + void setRequestAndSubject(Subject subject, HttpServletRequest request); + + void setRequestAndUser(String user, HttpServletRequest request); +} diff --git a/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/AuditServiceFactory.java b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/AuditServiceFactory.java new file mode 100644 index 00000000..30c1e165 --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/AuditServiceFactory.java @@ -0,0 +1,38 @@ +/*- + * ~~~~~~licensing~~~~~~ + * entaxy-audit + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.audit.service; + +import ru.entaxy.audit.service.impl.AuditServiceImpl; + +public class AuditServiceFactory { + private static final AuditServiceImpl INSTANCE = new AuditServiceImpl(); + + + public static AuditService getAuditService() { + return INSTANCE; + } + +} diff --git a/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/EventConverter.java b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/EventConverter.java new file mode 100644 index 00000000..a269fd87 --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/EventConverter.java @@ -0,0 +1,41 @@ +/*- + * ~~~~~~licensing~~~~~~ + * entaxy-audit + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.audit.service; + +import ru.entaxy.audit.data.AuditEvent; + +public interface EventConverter { + + default Class[] getAllowedClasses() { + if (getClass().isAnnotationPresent(EventConverterInfo.class)) { + return getClass().getAnnotation(EventConverterInfo.class).classes(); + } + return new Class[] {}; + }; + + AuditEvent convert(T event); + +} diff --git a/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/EventConverterInfo.java b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/EventConverterInfo.java new file mode 100644 index 00000000..cebb2c1a --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/EventConverterInfo.java @@ -0,0 +1,40 @@ +/*- + * ~~~~~~licensing~~~~~~ + * entaxy-audit + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.audit.service; + +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +@Retention(RUNTIME) +@Target(TYPE) +public @interface EventConverterInfo { + + Class[] classes(); + +} diff --git a/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/EventInterpreter.java b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/EventInterpreter.java new file mode 100644 index 00000000..53080846 --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/EventInterpreter.java @@ -0,0 +1,34 @@ +/*- + * ~~~~~~licensing~~~~~~ + * entaxy-audit + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.audit.service; + +import org.osgi.service.event.Event; + +public interface EventInterpreter { + + InterpretedEvent interpret(Event origin); + +} diff --git a/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/EventSubscriber.java b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/EventSubscriber.java new file mode 100644 index 00000000..88d5c993 --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/EventSubscriber.java @@ -0,0 +1,43 @@ +/*- + * ~~~~~~licensing~~~~~~ + * entaxy-audit + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.audit.service; + +import org.osgi.service.event.Event; +import org.osgi.service.event.EventHandler; +import ru.entaxy.audit.service.filter.EventRouter; + +public class EventSubscriber implements EventHandler { + private final EventRouter eventRouter; + + public EventSubscriber(EventRouter eventRouter) { + this.eventRouter = eventRouter; + } + + @Override + public void handleEvent(Event event) { + eventRouter.consumeEvent(event); + } +} diff --git a/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/InterpretedEvent.java b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/InterpretedEvent.java new file mode 100644 index 00000000..a8110688 --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/InterpretedEvent.java @@ -0,0 +1,56 @@ +/*- + * ~~~~~~licensing~~~~~~ + * entaxy-audit + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.audit.service; + +import java.util.HashMap; +import java.util.Map; + +import org.osgi.service.event.Event; + +public class InterpretedEvent { + + public enum EventResolution { + IGNORE, + PROCESS, + NONE + } + + public Event originalEvent; + + public EventResolution resolution = EventResolution.NONE; + + protected Map eventEssense = new HashMap<>(); + + public InterpretedEvent(Event origin) { + this.originalEvent = origin; + eventEssense.put("event.topic", origin.getTopic()); + } + + public Map getEventEssense() { + return eventEssense; + } + +} diff --git a/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/filter/EventRouter.java b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/filter/EventRouter.java new file mode 100644 index 00000000..6cec921c --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/filter/EventRouter.java @@ -0,0 +1,108 @@ +/*- + * ~~~~~~licensing~~~~~~ + * entaxy-audit + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.audit.service.filter; + +import java.util.Queue; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.atomic.AtomicLong; + +import org.osgi.service.event.Event; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ru.entaxy.audit.service.AuditService; + +public class EventRouter { + private final Queue events = new LinkedBlockingQueue<>(10_000); + private final AtomicLong counter = new AtomicLong(0); + private final AtomicLong consumed = new AtomicLong(0); + private final AtomicLong rejected = new AtomicLong(0); + private final ExecutorService executor = Executors.newFixedThreadPool(3, + (r) -> new Thread(r, "audit-logger-helper-thread #" + counter.getAndIncrement())); + private final AuditService auditService; + + private static final Logger LOGGER = LoggerFactory.getLogger(EventRouter.class); + + public EventRouter(AuditService service) { + this.auditService = service; + } + + private boolean processEvent(Event event) { + if (event == null) { + return false; + } + if (event.getTopic().contains("EXECUTED") && event.getProperty("command") != null) { + auditService.onOSGIEvent(event); + return true; + } else { + // if it's a log event + if (event.getTopic().startsWith("org/osgi/service/log")) { + String bundleSymbolicName = (String) event.getProperty("bundle.symbolicname"); + // if it's configuration update event + if (bundleSymbolicName != null && "org.apache.felix.fileinstall".equals(bundleSymbolicName)) { + Object message = event.getProperty("message"); + if (message instanceof String) { + String messageText = (String) message; + if (messageText.contains("Updating")) { + auditService.onFileChange(event); + return true; + } + } + } + } else { + return auditService.interpret(event); + } + } + return false; + } + + public String stats() { + return String.format("Consumed: %d, rejected: %d", consumed.get(), rejected.get()); + } + + public void consumeEvent(Event event) { + boolean added = events.offer(event); + if (added) { + executor.submit(() -> { + Event evt = events.poll(); + if (processEvent(evt)) { + consumed.incrementAndGet(); + } else { + rejected.incrementAndGet(); + } + }); + } else { + LOGGER.warn("Cannot consume event {}, queue is probably full", event); + } + } + + public void stop() { + executor.shutdown(); + events.clear(); + } +} diff --git a/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/hawtio/HawtioEventConverter.java b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/hawtio/HawtioEventConverter.java new file mode 100644 index 00000000..3f3aac8b --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/hawtio/HawtioEventConverter.java @@ -0,0 +1,62 @@ +/*- + * ~~~~~~licensing~~~~~~ + * entaxy-audit + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.audit.service.hawtio; + +import org.osgi.service.component.annotations.Component; + +import ru.entaxy.audit.data.AuditEvent; +import ru.entaxy.audit.data.Outcome; +import ru.entaxy.audit.data.Severity; +import ru.entaxy.audit.service.EventConverter; +import ru.entaxy.audit.service.EventConverterInfo; +import ru.entaxy.audit.service.InterpretedEvent; + +@Component(service = EventConverter.class, immediate = true) +@EventConverterInfo(classes = {HawtioInterpretedEvent.class}) +public class HawtioEventConverter implements EventConverter { + + @Override + public AuditEvent convert(T event) { + if (!(event instanceof HawtioInterpretedEvent)) + return null; + + HawtioInterpretedEvent hawtioEvent = (HawtioInterpretedEvent) event; + + AuditEvent result = AuditEvent.AuditLoggingEventBuilder.getInstance() + .target("auth") + .outcome(hawtioEvent.isSuccessful ? Outcome.SUCCESS : Outcome.FAILURE) + .message(String.format("%s", hawtioEvent.getMessage())) + .severity(Severity.IMPORTANT) + .category(hawtioEvent.getAction()) + .suser(hawtioEvent.getUser()) + .src(hawtioEvent.getSrc()) + .build(); + + return result; + + } + +} diff --git a/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/hawtio/HawtioEventInterpreter.java b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/hawtio/HawtioEventInterpreter.java new file mode 100644 index 00000000..ecd198aa --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/hawtio/HawtioEventInterpreter.java @@ -0,0 +1,50 @@ +/*- + * ~~~~~~licensing~~~~~~ + * entaxy-audit + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.audit.service.hawtio; + +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.ConfigurationPolicy; +import org.osgi.service.event.Event; + +import ru.entaxy.audit.service.EventInterpreter; +import ru.entaxy.audit.service.InterpretedEvent; + +@Component(service = EventInterpreter.class, immediate = true, configurationPolicy = ConfigurationPolicy.OPTIONAL) +public class HawtioEventInterpreter implements EventInterpreter { + + private static final String HAWTIO_AUDIT_TOPIC = "entaxy/hawtio/audit"; + + @Override + public InterpretedEvent interpret(Event origin) { + + if (!HAWTIO_AUDIT_TOPIC.equals(origin.getTopic())) + return null; + + return new HawtioInterpretedEvent(origin); + + } + +} diff --git a/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/hawtio/HawtioInterpretedEvent.java b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/hawtio/HawtioInterpretedEvent.java new file mode 100644 index 00000000..7e2baeb0 --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/hawtio/HawtioInterpretedEvent.java @@ -0,0 +1,74 @@ +/*- + * ~~~~~~licensing~~~~~~ + * entaxy-audit + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.audit.service.hawtio; + +import org.osgi.service.event.Event; + +import ru.entaxy.audit.service.InterpretedEvent; + +public class HawtioInterpretedEvent extends InterpretedEvent { + + String action; + + String message; + + String user; + + String src; + + boolean isSuccessful; + + public HawtioInterpretedEvent(Event origin) { + super(origin); + action = origin.getProperty("category").toString(); + message = origin.getProperty("message").toString(); + user = origin.getProperty("user").toString(); + src = origin.getProperty("src").toString(); + isSuccessful = (Boolean) origin.getProperty("result"); + } + + public String getAction() { + return action; + } + + public String getMessage() { + return message; + } + + public String getUser() { + return user; + } + + public String getSrc() { + return src; + } + + public boolean isSuccessful() { + return isSuccessful; + } + + +} diff --git a/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/impl/AuditServiceImpl.java b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/impl/AuditServiceImpl.java new file mode 100644 index 00000000..a426be30 --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/impl/AuditServiceImpl.java @@ -0,0 +1,143 @@ +/*- + * ~~~~~~licensing~~~~~~ + * entaxy-audit + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.audit.service.impl; + +import javax.security.auth.Subject; +import javax.servlet.http.HttpServletRequest; + +import org.osgi.service.event.Event; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ru.entaxy.audit.data.AuditEvent; +import ru.entaxy.audit.data.Outcome; +import ru.entaxy.audit.service.AuditService; +import ru.entaxy.audit.service.InterpretedEvent; +import ru.entaxy.audit.utils.AuditHelper; + +public class AuditServiceImpl implements AuditService { + + private static final Logger LOG = LoggerFactory.getLogger(AuditServiceImpl.class); + + private final WebLoginModule webLoginModule = new WebLoginModule(); + private final OSGIEventModule osgiEventModule = new OSGIEventModule(); + + @Override + public void onAudit(AuditEvent record) { + throw new RuntimeException("Not implemented"); + } + + @Override + public void onLogin(String username, HttpServletRequest request, Outcome outcome) { + webLoginModule.onLogin(username, request, outcome); + } + + @Override + public void onLogout(String username, HttpServletRequest request) { + webLoginModule.onLogout(username, request); + } + + @Override + public void onOSGIEvent(Event event) { + osgiEventModule.onEvent(event); + } + + @Override + public void onFileChange(Event event) { + osgiEventModule.onFileChange(event); + } + + @Override + public boolean interpret(Event event) { + if (InterpreterService.INSTANCE == null) + return false; + InterpretedEvent result = InterpreterService.INSTANCE.interpret(event); + + if (result == null) { + if (LOG.isTraceEnabled()) + LOG.trace("Event from topic [{}] not interpreted", event.getTopic()); + return false; + } + + if (result.resolution.equals(InterpretedEvent.EventResolution.IGNORE)) { + if (LOG.isTraceEnabled()) + LOG.trace("Event from topic [{}] IGNORED; interpreted as [{}] -> [{}]", event.getTopic(), + result.getClass().getName()); + return false; + } + + + if (ConverterService.INSTANCE == null) + return false; + + AuditEvent convertedEvent = ConverterService.INSTANCE.convert(result); + + if (convertedEvent == null) { + if (LOG.isDebugEnabled()) + LOG.debug("NOT CONVERTED: Event from topic [{}] interpreted as [{}]", event.getTopic(), + result.getClass().getName()); + return false; + } + + Subject subject = (Subject) event.getProperty("subject"); + boolean processed = false; + + String suser = "local"; + String address = "localhost"; + + if (subject != null) { + suser = AuditHelper.findRemoteUser(subject); + address = AuditHelper.findAddress(subject); + } + + AuditEvent auditEvent = AuditEvent.AuditLoggingEventBuilder.getInstance() + .category(convertedEvent.getCategory()) + .duser(convertedEvent.getDuser()) + .message(convertedEvent.getMessage()) + .outcome(convertedEvent.getOutcome()) + .severity(convertedEvent.getSeverity()) + .src(convertedEvent.getSrc() != null ? convertedEvent.getSrc() : address) + .suser(convertedEvent.getSuser() != null ? convertedEvent.getSuser() : suser) + .target(convertedEvent.getTarget()) + .build(); + + + AuditHelper.log(auditEvent); + processed = true; + + return processed; + } + + @Override + public void setRequestAndSubject(Subject subject, HttpServletRequest request) { + webLoginModule.setMDC(subject, request); + } + + @Override + public void setRequestAndUser(String user, HttpServletRequest request) { + webLoginModule.setMDC(user, request); + } +} diff --git a/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/impl/ConverterService.java b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/impl/ConverterService.java new file mode 100644 index 00000000..14bc35a0 --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/impl/ConverterService.java @@ -0,0 +1,101 @@ +/*- + * ~~~~~~licensing~~~~~~ + * entaxy-audit + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.audit.service.impl; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Deactivate; +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 ru.entaxy.audit.data.AuditEvent; +import ru.entaxy.audit.service.EventConverter; +import ru.entaxy.audit.service.InterpretedEvent; + +@Component(service = ConverterService.class, immediate = true) +public class ConverterService { + + static public ConverterService INSTANCE = null; + + protected Map, Set> converters = new HashMap<>(); + + protected Object convertersLock = new Object(); + + @Activate + public void activate() { + INSTANCE = this; + } + + @Deactivate + public void deactivate() { + INSTANCE = null; + } + + @Reference(cardinality = ReferenceCardinality.MULTIPLE, policyOption = ReferencePolicyOption.GREEDY, + policy = ReferencePolicy.DYNAMIC, unbind = "removeConverter") + public void addInterpreter(EventConverter converter) { + synchronized (convertersLock) { + for (Class clazz : converter.getAllowedClasses()) { + this.converters.putIfAbsent(clazz, new HashSet<>()); + this.converters.get(clazz).add(converter); + } + } + } + + public void removeConverter(EventConverter converter) { + synchronized (convertersLock) { + for (Class clazz : converter.getAllowedClasses()) { + if (converters.containsKey(clazz)) + converters.get(clazz).remove(converter); + } + } + + } + + public AuditEvent convert(T event) { + AuditEvent result = null; + if (converters.containsKey(event.getClass())) { + for (EventConverter converter : converters.get(event.getClass())) { + try { + result = converter.convert(event); + } catch (Exception ignore) { + // NOOP + } + if (result != null) + break; + } + + } + return result; + } +} diff --git a/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/impl/InterpreterService.java b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/impl/InterpreterService.java new file mode 100644 index 00000000..09903520 --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/impl/InterpreterService.java @@ -0,0 +1,91 @@ +/*- + * ~~~~~~licensing~~~~~~ + * entaxy-audit + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.audit.service.impl; + +import java.util.ArrayList; +import java.util.List; + +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Deactivate; +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.osgi.service.event.Event; + +import ru.entaxy.audit.service.EventInterpreter; +import ru.entaxy.audit.service.InterpretedEvent; + +@Component(service = InterpreterService.class, immediate = true) +public class InterpreterService { + + static public InterpreterService INSTANCE = null; + + protected List interpreters = new ArrayList<>(); + + protected Object interpretersLock = new Object(); + + @Activate + public void activate() { + INSTANCE = this; + } + + @Deactivate + public void deactivate() { + INSTANCE = null; + } + + @Reference(cardinality = ReferenceCardinality.MULTIPLE, policyOption = ReferencePolicyOption.GREEDY, + policy = ReferencePolicy.DYNAMIC, unbind = "removeInterpreter") + public void addInterpreter(EventInterpreter interpreter) { + synchronized (interpretersLock) { + if (!interpreters.contains(interpreter)) + interpreters.add(interpreter); + } + } + + public void removeInterpreter(EventInterpreter interpreter) { + synchronized (interpretersLock) { + interpreters.remove(interpreter); + } + + } + + public InterpretedEvent interpret(Event event) { + InterpretedEvent result = null; + for (EventInterpreter interpreter : interpreters) { + try { + result = interpreter.interpret(event); + } catch (Exception ignore) { + // NOOP + } + if (result != null) + break; + } + return result; + } +} diff --git a/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/impl/OSGIEventModule.java b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/impl/OSGIEventModule.java new file mode 100644 index 00000000..908445c0 --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/impl/OSGIEventModule.java @@ -0,0 +1,117 @@ +/*- + * ~~~~~~licensing~~~~~~ + * entaxy-audit + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.audit.service.impl; + + +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.LongAdder; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.security.auth.Subject; + +import org.osgi.service.event.Event; + +import ru.entaxy.audit.data.AuditEvent; +import ru.entaxy.audit.data.Severity; +import ru.entaxy.audit.utils.AuditHelper; +import ru.entaxy.audit.utils.CommandWeight; + +public class OSGIEventModule { + + private Map processedCommands = new ConcurrentHashMap<>(); + private Map skippedCommands = new ConcurrentHashMap<>(); + + private final Set targets = new HashSet() {{ + add("jaas"); + }}; + + private final static Pattern COMMAND_PATTERN = Pattern.compile("^(.+):([A-Za-z-]+)\\s?+(.+)?$"); + private final static Pattern FILE_PATTERN = Pattern.compile("^Updating ([a-zA-Z]+)\\s+(from)?\\s?(.+)$"); + + public void onEvent(Event event) { + String command = (String) event.getProperty("command"); + if (command == null) { + return; + } + Subject subject = (Subject) event.getProperty("subject"); + boolean processed = false; + Matcher m = checkCommand(command); + if (m != null && subject != null) { + String suser = AuditHelper.findRemoteUser(subject); + String address = AuditHelper.findAddress(subject); + String target = m.group(1); + String commandName = m.group(2); + String arguments = m.group(3); + if (targets.contains(target)) { + AuditEvent auditEvent = AuditEvent.AuditLoggingEventBuilder.getInstance() + .target(target) + .suser(suser) + .src(address) + .category(commandName) + .severity(CommandWeight.getByTarget(target)) + .message(arguments == null ? "" : arguments).build(); + AuditHelper.log(auditEvent); + processed = true; + } + } + Map target = processed ? processedCommands : skippedCommands; + target.computeIfAbsent(command, (s) -> new LongAdder()).increment(); + } + + private Matcher checkCommand(String command) { + Matcher m = COMMAND_PATTERN.matcher(command); + if (m.find()) { + return m; + } + return null; + } + + public void onFileChange(Event event) { + String message = (String) event.getProperty("message"); + Matcher m = FILE_PATTERN.matcher(message); + if (m.find()) { + String filename = m.group(3); + String changeSubject = m.group(1); + String target = "Update " + changeSubject; + if (changeSubject.equals("bundle") || changeSubject.equals("configuration")) { + AuditEvent auditEvent = AuditEvent.AuditLoggingEventBuilder.getInstance() + .target(target) + .suser("local") + .src("localhost") + .category(filename) + .severity(Severity.WARNING) + .message(message).build(); + AuditHelper.log(auditEvent); + processedCommands.computeIfAbsent(target, (s) -> new LongAdder()).increment(); + } + skippedCommands.computeIfAbsent(target, (s) -> new LongAdder()).increment(); + } + } +} diff --git a/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/impl/WebLoginModule.java b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/impl/WebLoginModule.java new file mode 100644 index 00000000..5f8ff433 --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/impl/WebLoginModule.java @@ -0,0 +1,93 @@ +/*- + * ~~~~~~licensing~~~~~~ + * entaxy-audit + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.audit.service.impl; + +import org.slf4j.MDC; +import ru.entaxy.audit.data.AuditEvent; +import ru.entaxy.audit.utils.AuditHelper; +import ru.entaxy.audit.utils.Constants; +import ru.entaxy.audit.data.Outcome; +import ru.entaxy.audit.data.Severity; + +import javax.security.auth.Subject; +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +public class WebLoginModule { + public void onLogin(String username, HttpServletRequest request, Outcome outcome) { + String remoteAddress = requestRemoteAddress(request); + AuditEvent event = AuditEvent.AuditLoggingEventBuilder.getInstance() + .suser(username) + .outcome(outcome) + .severity(outcome == Outcome.SUCCESS ? Severity.INFO : Severity.WARNING) + .src(remoteAddress) + .category(outcome == Outcome.SUCCESS ? "Login success" : "Login failed") + .target("auth") + .build(); + AuditHelper.log(event); + } + + public void onLogout(String username, HttpServletRequest request) { + String remoteAddress = requestRemoteAddress(request); + AuditEvent event = AuditEvent.AuditLoggingEventBuilder.getInstance() + .suser(username) + .outcome(Outcome.SUCCESS) + .severity(Severity.INFO) + .src(remoteAddress) + .category("Logout") + .target("auth") + .build(); + AuditHelper.log(event); + } + + private static String requestRemoteAddress(HttpServletRequest request) { + return Optional.ofNullable(request.getHeader(Constants.X_FORWARDER_FOR)) + .orElse(request.getRemoteHost()); + } + + public void setMDC(Subject subject, HttpServletRequest request) { + String remoteUser = AuditHelper.findRemoteUser(subject); + saveMDC(remoteUser, request); + } + + public void setMDC(String username, HttpServletRequest request) { + saveMDC(username, request); + } + + private void saveMDC(String username, HttpServletRequest request) { + Map contextMap = MDC.getCopyOfContextMap(); + if (contextMap == null) { + contextMap = new HashMap<>(); + } + contextMap.put(Constants.HTTP_REQUEST_USER, username); + contextMap.put(Constants.HTTP_REQUEST_REMOTE_IP, requestRemoteAddress(request)); + contextMap.put(Constants.HTTP_REQUEST_SERVER_IP, request.getServerName()); + MDC.setContextMap(contextMap); + } + +} diff --git a/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/jmx/JMXEventInterpreter.java b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/jmx/JMXEventInterpreter.java new file mode 100644 index 00000000..dc37a94b --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/jmx/JMXEventInterpreter.java @@ -0,0 +1,140 @@ +/*- + * ~~~~~~licensing~~~~~~ + * entaxy-audit + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.audit.service.jmx; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.ConfigurationPolicy; +import org.osgi.service.component.annotations.Modified; +import org.osgi.service.event.Event; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ru.entaxy.audit.service.EventInterpreter; +import ru.entaxy.audit.service.InterpretedEvent; +import ru.entaxy.audit.service.InterpretedEvent.EventResolution; + +@Component(service = EventInterpreter.class, immediate = true, configurationPid = "ru.entaxy.audit.interpreter.jmx", + configurationPolicy = ConfigurationPolicy.OPTIONAL) +public class JMXEventInterpreter implements EventInterpreter { + + private static final Logger LOG = LoggerFactory.getLogger(JMXEventInterpreter.class); + + public static final String JMX_AUDIT_TOPIC_PREFIX = "javax/management/MBeanServer"; + + public static final String JMX_AUDIT_INVOKE_SUBTOPIC = "INVOKE"; + + protected static final String PROP_IGNORE_TOPICS = "topics.ignore"; + + protected static final String PROP_PROCESS_TOPICS = "topics.process"; + + protected List topicsToIgnore = new ArrayList<>(); + + protected List topicsToProcess = new ArrayList<>(); + + @Activate + public void activate(Map properties) { + parseProperties(properties); + } + + @Modified + public void modified(Map properties) { + parseProperties(properties); + } + + protected void parseProperties(Map properties) { + if (properties == null) + return; + if (LOG.isDebugEnabled()) + LOG.debug("\n CONFIGURATION :: \n " + properties.toString()); + if (properties.containsKey(PROP_IGNORE_TOPICS)) { + String ignoreTopics = (String) properties.get(PROP_IGNORE_TOPICS); + if (ignoreTopics == null) + topicsToIgnore = new ArrayList<>(); + else { + topicsToIgnore = Arrays.asList(ignoreTopics.split(",")); + } + } else { + topicsToIgnore = new ArrayList<>(); + } + if (properties.containsKey(PROP_PROCESS_TOPICS)) { + String processTopics = (String) properties.get(PROP_PROCESS_TOPICS); + if (processTopics == null) + topicsToProcess = new ArrayList<>(); + else { + topicsToProcess = Arrays.asList(processTopics.split(",")); + } + } else { + topicsToProcess = new ArrayList<>(); + } + + } + + @Override + public InterpretedEvent interpret(Event origin) { + if (!origin.getTopic().startsWith(JMX_AUDIT_TOPIC_PREFIX)) + return null; + + JMXInterpretedEvent result; + + String subtopic = origin.getTopic().substring(JMX_AUDIT_TOPIC_PREFIX.length() + 1); + + if (subtopic.startsWith(JMX_AUDIT_INVOKE_SUBTOPIC)) + result = new JMXInvokeEvent(origin); + else + result = new JMXInterpretedEvent(origin); + + result.subtopic = subtopic; + + result.resolution = EventResolution.IGNORE; + + if (!topicsToProcess.isEmpty()) { + for (String process : topicsToProcess) + if (result.subtopic.startsWith(process)) { + result.resolution = EventResolution.PROCESS; + break; + } + + } else { + result.resolution = EventResolution.PROCESS; + } + + for (String ignore : topicsToIgnore) + if (result.subtopic.startsWith(ignore)) { + result.resolution = EventResolution.IGNORE; + break; + } + + return result; + } + + +} diff --git a/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/jmx/JMXInterpretedEvent.java b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/jmx/JMXInterpretedEvent.java new file mode 100644 index 00000000..d767505d --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/jmx/JMXInterpretedEvent.java @@ -0,0 +1,56 @@ +/*- + * ~~~~~~licensing~~~~~~ + * entaxy-audit + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.audit.service.jmx; + +import org.osgi.service.event.Event; + +import ru.entaxy.audit.service.InterpretedEvent; + +public class JMXInterpretedEvent extends InterpretedEvent { + + protected String subtopic = null; + + public JMXInterpretedEvent(Event origin) { + super(origin); + this.eventEssense.put("event.source", "jmx"); + } + + public JMXInterpretedEvent subtopic(String value) { + setSubtopic(value); + return this; + } + + public String getSubtopic() { + return subtopic; + } + + public void setSubtopic(String subtopic) { + this.subtopic = subtopic; + this.eventEssense.put("event.subtopic", this.subtopic); + } + + +} diff --git a/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/jmx/JMXInvokeEvent.java b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/jmx/JMXInvokeEvent.java new file mode 100644 index 00000000..79f36f7f --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/jmx/JMXInvokeEvent.java @@ -0,0 +1,104 @@ +/*- + * ~~~~~~licensing~~~~~~ + * entaxy-audit + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.audit.service.jmx; + +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Map; + +import javax.management.ObjectName; + +import org.osgi.service.event.Event; + +public class JMXInvokeEvent extends JMXInterpretedEvent { + + public static final String PROP_PARAMS = "params"; + + protected ObjectName objectName; + + protected String methodName; + + protected Object[] methodParams; + + protected Map objectNameData = new HashMap<>(); + + public JMXInvokeEvent(Event origin) { + super(origin); + if (this.originalEvent.containsProperty(PROP_PARAMS)) { + + Object[] data = (Object[]) this.originalEvent.getProperty(PROP_PARAMS); + + setObjectName((ObjectName) data[0]); + setMethodName((String) data[1]); + setMethodParams((Object[]) data[2]); + + } + } + + protected void parseObjectName() { + this.objectNameData.clear(); + this.objectNameData.put("jmx.domain", this.objectName.getDomain()); + Hashtable properties = this.objectName.getKeyPropertyList(); + for (Map.Entry entry : properties.entrySet()) { + this.objectNameData.put("jmx.property." + entry.getKey(), entry.getValue()); + } + + } + + public ObjectName getObjectName() { + return objectName; + } + + public void setObjectName(ObjectName objectName) { + this.objectName = objectName; + parseObjectName(); + } + + public String getMethodName() { + return methodName; + } + + public void setMethodName(String methodName) { + this.methodName = methodName; + this.eventEssense.put("jmx.methodName", methodName); + } + + public Object[] getMethodParams() { + return methodParams; + } + + public void setMethodParams(Object[] methodParams) { + this.methodParams = methodParams; + } + + @Override + public Map getEventEssense() { + Map result = new HashMap<>(super.getEventEssense()); + result.putAll(this.objectNameData); + return result; + } + +} diff --git a/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/osgi/Activator.java b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/osgi/Activator.java new file mode 100644 index 00000000..f9bff969 --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/service/osgi/Activator.java @@ -0,0 +1,115 @@ +/*- + * ~~~~~~licensing~~~~~~ + * entaxy-audit + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.audit.service.osgi; + +import java.util.Dictionary; +import java.util.Hashtable; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceRegistration; +import org.osgi.service.event.EventConstants; +import org.osgi.service.event.EventHandler; + +import ru.entaxy.audit.service.AuditService; +import ru.entaxy.audit.service.AuditServiceFactory; +import ru.entaxy.audit.service.EventSubscriber; +import ru.entaxy.audit.service.filter.EventRouter; +import ru.entaxy.audit.service.impl.AuditServiceImpl; + +public class Activator implements BundleActivator { + + private static final String LOGS_TOPIC = "org/osgi/service/*"; + private static final String COMMANDS_TOPIC = "org/apache/karaf/shell/console/*"; + private static final String JMX_AUDIT_TOPIC = "javax/management/MBeanServer/*"; + private static final String HAWTIO_AUDIT_TOPIC = "entaxy/hawtio/audit"; + + private ServiceRegistration listenerRegistration = null; + private ServiceRegistration serviceRegistration = null; + private ServiceRegistration commandRegistration = null; + private ServiceRegistration jmxRegistration = null; + private ServiceRegistration hawtioRegistration = null; + + private ServiceRegistration eventRouterRegistration = null; + + private EventRouter eventRouter; + + @Override + public void start(BundleContext bundleContext) throws Exception { + // System.err.println("I'm activating!"); + AuditService auditService = AuditServiceFactory.getAuditService(); + serviceRegistration = + bundleContext.registerService(AuditService.class.getName(), new AuditServiceImpl(), new Hashtable<>()); + eventRouter = new EventRouter(auditService); + eventRouterRegistration = bundleContext.registerService(EventRouter.class, eventRouter, new Hashtable<>()); + + EventHandler logSubscriber = new EventSubscriber(eventRouter); + EventHandler commandsSubscriber = new EventSubscriber(eventRouter); + EventHandler jmxSubscriber = new EventSubscriber(eventRouter); + EventHandler hawtioSubscriber = new EventSubscriber(eventRouter); + + Dictionary events = new Hashtable<>(); + events.put(EventConstants.EVENT_TOPIC, LOGS_TOPIC); + listenerRegistration = bundleContext.registerService(EventHandler.class.getName(), logSubscriber, events); + + Dictionary commandEvents = new Hashtable<>(); + commandEvents.put(EventConstants.EVENT_TOPIC, COMMANDS_TOPIC); + commandRegistration = + bundleContext.registerService(EventHandler.class.getName(), commandsSubscriber, commandEvents); + + Dictionary jmxEvents = new Hashtable<>(); + jmxEvents.put(EventConstants.EVENT_TOPIC, JMX_AUDIT_TOPIC); + jmxRegistration = + bundleContext.registerService(EventHandler.class.getName(), jmxSubscriber, jmxEvents); + + Dictionary hawtioEvents = new Hashtable<>(); + hawtioEvents.put(EventConstants.EVENT_TOPIC, HAWTIO_AUDIT_TOPIC); + hawtioRegistration = + bundleContext.registerService(EventHandler.class.getName(), hawtioSubscriber, hawtioEvents); + } + + @Override + public void stop(BundleContext bundleContext) throws Exception { + if (listenerRegistration != null) { + listenerRegistration.unregister(); + } + if (commandRegistration != null) { + commandRegistration.unregister(); + } + if (jmxRegistration != null) { + jmxRegistration.unregister(); + } + if (serviceRegistration != null) { + serviceRegistration.unregister(); + } + if (eventRouterRegistration != null) { + eventRouterRegistration.unregister(); + } + if (eventRouter != null) { + eventRouter.stop(); + } + } +} diff --git a/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/utils/AuditHelper.java b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/utils/AuditHelper.java new file mode 100644 index 00000000..cfa1602c --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/utils/AuditHelper.java @@ -0,0 +1,103 @@ +/*- + * ~~~~~~licensing~~~~~~ + * entaxy-audit + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.audit.utils; + +import com.google.gson.JsonObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ru.entaxy.audit.data.AuditEvent; +import ru.entaxy.audit.data.Severity; + +import javax.security.auth.Subject; +import java.lang.reflect.Method; +import java.security.Principal; +import java.util.Optional; +import java.util.Set; +import java.util.function.Function; + +public class AuditHelper { + public static final String TARGET_ACTION = "action"; + + public static final Severity DEFAULT_SEVERITY = Severity.IMPORTANT; + public static final String DEFAULT_TARGET = TARGET_ACTION; + private static final Logger AUDIT = LoggerFactory.getLogger(Constants.LOG_FACILITY_NAME); + + private static final Logger logger = LoggerFactory.getLogger(AuditHelper.class); + + public static void log(AuditEvent event) { + JsonObject logRecord = new JsonObject(); + logRecord.addProperty("isEmdevEvents", true); + logRecord.addProperty("typ", event.getTarget()); + logRecord.addProperty("action", event.getCategory()); + logRecord.addProperty("performedBy", event.getSuser()); + + JsonObject info = new JsonObject(); + if (event.getSrc() != null) { + info.addProperty("src", event.getSrc()); + } + if (event.getDuser() != null) { + info.addProperty("duser", event.getDuser()); + } + info.addProperty("suser", event.getSuser()); + info.addProperty("severity", event.getSeverity().getValue()); + info.addProperty("msg", event.getMessage()); + info.addProperty("outcome", event.getOutcome().getLabel()); + logRecord.add("info", info); + + AUDIT.info(logRecord.toString()); + } + + public static String findRemoteUser(Subject subject) { + return findAndProcessPrincipal(subject, "UserPrincipal", Principal::getName); + } + + private static String findAndProcessPrincipal(Subject subject, String principalName, Function mapping) { + Set principals = subject.getPrincipals(); + if (principals != null) { + Optional userName = principals.stream() + .filter(p -> p.getClass().getSimpleName().startsWith(principalName)).findFirst() + .map(mapping); + return userName.orElse(null); + } + return null; + } + + public static String findAddress(Subject subject) { + return findAndProcessPrincipal(subject, "ClientPrincipal", AuditHelper::getAddress); + } + + private static String getAddress(Principal p) { + //We're assumiming to process Karaf's ClientPrincipal. We need method getAddress(); + try { + Method m = p.getClass().getMethod("getAddress"); + Object result = m.invoke(p); + return (String) result; + } catch (Throwable t) { + logger.error("Cannot get address from principal {}:", p, t); + return null; + } + } +} diff --git a/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/utils/CommandWeight.java b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/utils/CommandWeight.java new file mode 100644 index 00000000..89bbf1d7 --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/utils/CommandWeight.java @@ -0,0 +1,57 @@ +/*- + * ~~~~~~licensing~~~~~~ + * entaxy-audit + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.audit.utils; + +import ru.entaxy.audit.data.Severity; + +public enum CommandWeight { + JAAS("jaas", Severity.IMPORTANT); + + private final String target; + private final Severity severity; + + CommandWeight(String target, Severity severity) { + this.target = target; + this.severity = severity; + } + + public String getTarget() { + return target; + } + + public Severity getSeverity() { + return severity; + } + + public static Severity getByTarget(String target) { + for (CommandWeight value : values()) { + if (value.getTarget().equals(target)) { + return value.severity; + } + } + return Severity.INFO; + } +} diff --git a/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/utils/Constants.java b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/utils/Constants.java new file mode 100644 index 00000000..82fb3421 --- /dev/null +++ b/platform/runtime/base/logging/entaxy-audit/src/main/java/ru/entaxy/audit/utils/Constants.java @@ -0,0 +1,38 @@ +/*- + * ~~~~~~licensing~~~~~~ + * entaxy-audit + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.audit.utils; + +public class Constants { + public static final String X_FORWARDER_FOR = "X-Forwarder-For"; + public static final String LOG_FACILITY_NAME = "AUDIT_LOGFILE"; + + public static final String HTTP_REQUEST_USER = "Audit-HTTP-Request-User"; + public static final String HTTP_REQUEST_REMOTE_IP = "Audit-HTTP-Request-Remote-IP"; + public static final String HTTP_REQUEST_SERVER_IP = "Audit-HTTP-Request-Server-IP"; + + private Constants() {} + +} diff --git a/platform/runtime/base/logging/pom.xml b/platform/runtime/base/logging/pom.xml new file mode 100644 index 00000000..b3312c49 --- /dev/null +++ b/platform/runtime/base/logging/pom.xml @@ -0,0 +1,102 @@ + + 4.0.0 + + ru.entaxy.esb.platform.runtime + base + 1.11.0 + + ru.entaxy.platform + logging + pom + ENTAXY :: LOGGING + ENTAXY :: LOGGING + + cef-logger-layout + entaxy-audit + + + + + + combine-logging-cfg + + false + + src/main/cfg/org.ops4j.pax.logging.cfg + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-logging-from-underlying + prepare-package + + copy + + + + + ru.entaxy.esb.underlying + entaxy-underlying-configuration + ${project.version} + cfg + org.ops4j.pax.logging + true + ${project.build.directory}/combine-logging + + 1.cfg + + + + + + + + + org.apache.maven.plugins + maven-antrun-plugin + + + + + combine_logging_cfg + prepare-package + + run + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/platform/runtime/base/logging/src/main/cfg/generated/fragments.xml b/platform/runtime/base/logging/src/main/cfg/generated/fragments.xml new file mode 100644 index 00000000..73ff82e3 --- /dev/null +++ b/platform/runtime/base/logging/src/main/cfg/generated/fragments.xml @@ -0,0 +1,5 @@ + + + mvn:ru.entaxy.platform/logging/1.11.0/cfg/org.ops4j.pax.logging + + \ No newline at end of file diff --git a/platform/runtime/base/logging/src/main/cfg/org.ops4j.pax.logging.cfg b/platform/runtime/base/logging/src/main/cfg/org.ops4j.pax.logging.cfg new file mode 100644 index 00000000..77e036ad --- /dev/null +++ b/platform/runtime/base/logging/src/main/cfg/org.ops4j.pax.logging.cfg @@ -0,0 +1,69 @@ +### +# ~~~~~~licensing~~~~~~ +# logging +# ========== +# Copyright (C) 2020 - 2025 EmDev LLC +# ========== +# You may not use this file except in accordance with the License Terms of the Copyright +# Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property +# rights to the Software and any copies are the property of the Copyright Holder. Unless +# it is explicitly allowed the Copyright Holder, the User is prohibited from using the +# Software for commercial purposes to provide services to third parties. +# +# The Copyright Holder hereby declares that the Software is provided on an "AS IS". +# Under no circumstances does the Copyright Holder guarantee or promise that the +# Software provided by him will be suitable or not suitable for the specific purposes +# of the User, that the Software will meet all commercial and personal subjective +# expectations of the User, that the Software will work properly, without technical +# errors, quickly and uninterruptedly. +# +# Under no circumstances shall the Copyright Holder or its Affiliates is not liable +# to the User for any direct or indirect losses of the User, his expenses or actual +# damage, including, downtime; loss of bussines; lost profit; lost earnings; loss +# or damage to data, property, etc. +# ~~~~~~/licensing~~~~~~ +### +# Artemis logger +log4j2.logger.artemis.name = org.apache.activemq +log4j2.logger.artemis.level = INFO +log4j2.logger.artemis.additivity = false +log4j2.logger.artemis.appenderRef.ArtemisRollingFile.ref = ArtemisRollingFile + +# Artemis file appender +log4j2.appender.artemis.type = RollingRandomAccessFile +log4j2.appender.artemis.name = ArtemisRollingFile +log4j2.appender.artemis.fileName = ${karaf.log}/artemis.log +log4j2.appender.artemis.filePattern = ${karaf.log}/artemis-%i.log +log4j2.appender.artemis.append = true +log4j2.appender.artemis.layout.type = PatternLayout +log4j2.appender.artemis.layout.pattern = ${log4j2.pattern} +log4j2.appender.artemis.policies.type = Policies +log4j2.appender.artemis.policies.size.type = SizeBasedTriggeringPolicy +log4j2.appender.artemis.policies.size.size = 8MB + +# Entaxy CEF logger +log4j2.logger.AUDIT_FILE.name = AUDIT_LOGFILE +log4j2.logger.AUDIT_FILE.level = INFO +log4j2.logger.AUDIT_FILE.appenderRef.AUDIT_LOGFILE.ref = AuditCompositeLogger +log4j2.logger.AUDIT_FILE.additivity = false + +log4j2.appender.AUDIT_LOGFILE.type = CEFAggregate +log4j2.appender.AUDIT_LOGFILE.name = AuditCompositeLogger +log4j2.appender.AUDIT_LOGFILE.children = CefFile +log4j2.appender.AUDIT_LOGFILE.filter.threshold.type = ThresholdFilter +log4j2.appender.AUDIT_LOGFILE.filter.threshold.level = INFO + +log4j2.appender.AUDIT_LOGFILE_1.type = RollingRandomAccessFile +log4j2.appender.AUDIT_LOGFILE_1.name = CefFile +log4j2.appender.AUDIT_LOGFILE_1.append = true +log4j2.appender.AUDIT_LOGFILE_1.fileName = ${karaf.log}/cef-audit.log +log4j2.appender.AUDIT_LOGFILE_1.filePattern = ${karaf.log}/cef-audit-%d{MM-dd-yyyy}.log +log4j2.appender.AUDIT_LOGFILE_1.layout.type = CEFLayout +log4j2.appender.AUDIT_LOGFILE_1.layout.vendor = EMDEV +log4j2.appender.AUDIT_LOGFILE_1.layout.product = ENTAXY +log4j2.appender.AUDIT_LOGFILE_1.layout.productVersion = ${project.version} +log4j2.appender.AUDIT_LOGFILE_1.policies.type = Policies +log4j2.appender.AUDIT_LOGFILE_1.policies.size.type = SizeBasedTriggeringPolicy +log4j2.appender.AUDIT_LOGFILE_1.policies.size.size = 10MB +log4j2.appender.AUDIT_LOGFILE_1.filter.threshold.type = ThresholdFilter +log4j2.appender.AUDIT_LOGFILE_1.filter.threshold.level = INFO diff --git a/platform/runtime/base/management-core/pom.xml b/platform/runtime/base/management-core/pom.xml index 36d3a48f..2adfdb2d 100644 --- a/platform/runtime/base/management-core/pom.xml +++ b/platform/runtime/base/management-core/pom.xml @@ -3,7 +3,7 @@ ru.entaxy.esb.platform.runtime base - 1.10.0 + 1.11.0 ru.entaxy.esb.platform.runtime.base management-core diff --git a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/ManagementCore.java b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/ManagementCore.java index 61480d6f..3ae8ca1e 100644 --- a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/ManagementCore.java +++ b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/ManagementCore.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * management-core * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/Qualifier.java b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/Qualifier.java index 7cfd35eb..9036d4c5 100644 --- a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/Qualifier.java +++ b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/Qualifier.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * management-core * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/AnnotatedMBean.java b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/AnnotatedMBean.java index 37a338f9..fac1276b 100644 --- a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/AnnotatedMBean.java +++ b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/AnnotatedMBean.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * management-core * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/Attribute.java b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/Attribute.java index e7ad0d8f..24698db0 100644 --- a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/Attribute.java +++ b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/Attribute.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * management-core * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/EntaxyRuntimeTyped.java b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/EntaxyRuntimeTyped.java index 226be6f0..742949b8 100644 --- a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/EntaxyRuntimeTyped.java +++ b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/EntaxyRuntimeTyped.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * management-core * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/MBeanAnnotated.java b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/MBeanAnnotated.java index 440e60ec..7b2692c1 100644 --- a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/MBeanAnnotated.java +++ b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/MBeanAnnotated.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * management-core * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/MBeanExportPolicy.java b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/MBeanExportPolicy.java index fb36ccd2..7e580ffd 100644 --- a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/MBeanExportPolicy.java +++ b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/MBeanExportPolicy.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * management-core * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/NotExported.java b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/NotExported.java index 1aee738a..025a78d9 100644 --- a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/NotExported.java +++ b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/NotExported.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * management-core * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/Operation.java b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/Operation.java index d50f61f8..963c1471 100644 --- a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/Operation.java +++ b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/Operation.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * management-core * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/Parameter.java b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/Parameter.java index c567e9f3..dbb02163 100644 --- a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/Parameter.java +++ b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/Parameter.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * management-core * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/RuntimeTypedMBean.java b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/RuntimeTypedMBean.java index 8333c22a..1b949b60 100644 --- a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/RuntimeTypedMBean.java +++ b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/api/RuntimeTypedMBean.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * management-core * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/AttributeChangeTracker.java b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/AttributeChangeTracker.java index a7256c3a..5a90e825 100644 --- a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/AttributeChangeTracker.java +++ b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/AttributeChangeTracker.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * profile-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/BundleAwareMBean.java b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/BundleAwareMBean.java index f2dfc881..94c1d8f5 100644 --- a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/BundleAwareMBean.java +++ b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/BundleAwareMBean.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * profile-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/BundleAwareMBeanImpl.java b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/BundleAwareMBeanImpl.java index 160859e4..7235eca1 100644 --- a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/BundleAwareMBeanImpl.java +++ b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/BundleAwareMBeanImpl.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * profile-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/BundleAwareManagedObject.java b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/BundleAwareManagedObject.java index aab0d899..9f2303ad 100644 --- a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/BundleAwareManagedObject.java +++ b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/BundleAwareManagedObject.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * profile-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/BundleAwareManagedObjectImpl.java b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/BundleAwareManagedObjectImpl.java index 7adf46cb..98f7f79a 100644 --- a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/BundleAwareManagedObjectImpl.java +++ b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/BundleAwareManagedObjectImpl.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * profile-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/ExtendedBundleTrackerCustomizer.java b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/ExtendedBundleTrackerCustomizer.java index 55ff34ea..9189ebf7 100644 --- a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/ExtendedBundleTrackerCustomizer.java +++ b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/ExtendedBundleTrackerCustomizer.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * profile-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/MBeanInfoHelper.java b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/MBeanInfoHelper.java index 7c56d255..374c1ed8 100644 --- a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/MBeanInfoHelper.java +++ b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/MBeanInfoHelper.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * management-core * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/ManagedObjectDescriptor.java b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/ManagedObjectDescriptor.java index d6d28e89..01c84af8 100644 --- a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/ManagedObjectDescriptor.java +++ b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/ManagedObjectDescriptor.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * profile-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/ManagedObjectsListener.java b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/ManagedObjectsListener.java index c765070c..460cdee0 100644 --- a/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/ManagedObjectsListener.java +++ b/platform/runtime/base/management-core/src/main/java/ru/entaxy/esb/platform/base/management/core/utils/ManagedObjectsListener.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * profile-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/object-factory/pom.xml b/platform/runtime/base/objects-base/object-factory/pom.xml index 7e50a735..0e742ae7 100644 --- a/platform/runtime/base/objects-base/object-factory/pom.xml +++ b/platform/runtime/base/objects-base/object-factory/pom.xml @@ -3,7 +3,7 @@ ru.entaxy.esb.platform.runtime.base objects-base - 1.10.0 + 1.11.0 ru.entaxy.esb.platform.runtime.base.objects-base object-factory diff --git a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/EntaxyFactory.java b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/EntaxyFactory.java index 7658eff4..4182d89a 100644 --- a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/EntaxyFactory.java +++ b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/EntaxyFactory.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/EntaxyFactoryElements.java b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/EntaxyFactoryElements.java index df11b51e..495ddb15 100644 --- a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/EntaxyFactoryElements.java +++ b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/EntaxyFactoryElements.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * object-factory * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/EntaxyFactoryException.java b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/EntaxyFactoryException.java index d0a33483..ece25829 100644 --- a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/EntaxyFactoryException.java +++ b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/EntaxyFactoryException.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/EntaxyFactoryRegistry.java b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/EntaxyFactoryRegistry.java new file mode 100644 index 00000000..191a1c70 --- /dev/null +++ b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/EntaxyFactoryRegistry.java @@ -0,0 +1,37 @@ +/*- + * ~~~~~~licensing~~~~~~ + * object-factory + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.base.objects.factory; + +import java.util.Collection; + + +public interface EntaxyFactoryRegistry { + + Collection getAllFactories(); + + String getParentFactory(String factoryId); + +} diff --git a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/EntaxyFactoryUtils.java b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/EntaxyFactoryUtils.java index 80c3e0cf..ebca8e3f 100644 --- a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/EntaxyFactoryUtils.java +++ b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/EntaxyFactoryUtils.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * object-factory * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/Importer.java b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/Importer.java index 5d433c30..f22fc127 100644 --- a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/Importer.java +++ b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/Importer.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * object-factory * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/configuration/AbstractElement.java b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/configuration/AbstractElement.java index 58ea47b6..5c990cdf 100644 --- a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/configuration/AbstractElement.java +++ b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/configuration/AbstractElement.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/configuration/FactoryElement.java b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/configuration/FactoryElement.java index 5fda7f34..07f6233c 100644 --- a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/configuration/FactoryElement.java +++ b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/configuration/FactoryElement.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/configuration/FieldElement.java b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/configuration/FieldElement.java index 97c5c4fb..a7c2f0f8 100644 --- a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/configuration/FieldElement.java +++ b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/configuration/FieldElement.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/configuration/FieldsElement.java b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/configuration/FieldsElement.java index 8d88a937..71facd6a 100644 --- a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/configuration/FieldsElement.java +++ b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/configuration/FieldsElement.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/configuration/OutputElement.java b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/configuration/OutputElement.java index cfd944f0..5272fe88 100644 --- a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/configuration/OutputElement.java +++ b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/configuration/OutputElement.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/configuration/OutputsElement.java b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/configuration/OutputsElement.java index 53d97ce5..e4d85833 100644 --- a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/configuration/OutputsElement.java +++ b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/configuration/OutputsElement.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/configuration/RefFieldElement.java b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/configuration/RefFieldElement.java index 16562b88..a7a4b09c 100644 --- a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/configuration/RefFieldElement.java +++ b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/configuration/RefFieldElement.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/exceptions/FactoryNotFoundException.java b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/exceptions/FactoryNotFoundException.java index fa19a69a..cc43489b 100644 --- a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/exceptions/FactoryNotFoundException.java +++ b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/exceptions/FactoryNotFoundException.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * object-factory * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/exceptions/NotSupportedForAbstractFactory.java b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/exceptions/NotSupportedForAbstractFactory.java index 02c5c6dd..dadf4842 100644 --- a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/exceptions/NotSupportedForAbstractFactory.java +++ b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/exceptions/NotSupportedForAbstractFactory.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * object-factory * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/exceptions/OutputNotDefinedException.java b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/exceptions/OutputNotDefinedException.java index ee287c6d..deb29eb1 100644 --- a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/exceptions/OutputNotDefinedException.java +++ b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/exceptions/OutputNotDefinedException.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * object-factory * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/exceptions/ScopeNotSupportedException.java b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/exceptions/ScopeNotSupportedException.java index b0bcf18d..35af1ae5 100644 --- a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/exceptions/ScopeNotSupportedException.java +++ b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/exceptions/ScopeNotSupportedException.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * object-factory * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/impl/DefaultFactory.java b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/impl/DefaultFactory.java index 38945320..1f325719 100644 --- a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/impl/DefaultFactory.java +++ b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/impl/DefaultFactory.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/impl/FactoryRegistry.java b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/impl/FactoryRegistry.java index b63f7887..256db26b 100644 --- a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/impl/FactoryRegistry.java +++ b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/impl/FactoryRegistry.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * object-factory * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/impl/FactorySearchProvider.java b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/impl/FactorySearchProvider.java new file mode 100644 index 00000000..e0beafe7 --- /dev/null +++ b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/impl/FactorySearchProvider.java @@ -0,0 +1,64 @@ +/*- + * ~~~~~~licensing~~~~~~ + * object-factory + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.base.objects.factory.impl; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.osgi.framework.Filter; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.component.annotations.ReferenceCardinality; + +import ru.entaxy.platform.base.objects.factory.EntaxyFactory; +import ru.entaxy.platform.base.objects.factory.EntaxyFactoryRegistry; +import ru.entaxy.platform.base.objects.factory.EntaxyFactoryUtils; +import ru.entaxy.platform.search.AbstractSearchProvider; +import ru.entaxy.platform.search.SearchProvider; +import ru.entaxy.platform.search.SearchProviderInfo; + +@Component(service = SearchProvider.class, immediate = true) +@SearchProviderInfo(id = "factories", targetTypes = {"factory"}) +public class FactorySearchProvider extends AbstractSearchProvider { + + @Reference(cardinality = ReferenceCardinality.MANDATORY) + EntaxyFactoryRegistry factoryRegistry; + + @Override + public Map getStandardAttributes(String targetType) throws IllegalArgumentException { + return EntaxyFactory.SEARCH.STANDARD_ATTRIBUTES; + } + + @Override + public List> search(String targetType, Filter filter) throws IllegalArgumentException { + + return factoryRegistry.getAllFactories().stream().map(f -> EntaxyFactoryUtils.getFactoryEssence(f, "")) + .filter(es -> filter.matches(es)) + .collect(Collectors.toList()); + } + +} diff --git a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/impl/GenerationHelper.java b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/impl/GenerationHelper.java index 22c1b97c..4a4acf1e 100644 --- a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/impl/GenerationHelper.java +++ b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/impl/GenerationHelper.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/tracker/TrackedDynamicFactoryCustomizer.java b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/tracker/TrackedDynamicFactoryCustomizer.java index 9c286696..5d05e227 100644 --- a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/tracker/TrackedDynamicFactoryCustomizer.java +++ b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/tracker/TrackedDynamicFactoryCustomizer.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/tracker/TrackedFactory.java b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/tracker/TrackedFactory.java index 1d43ff9a..b8e81bb3 100644 --- a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/tracker/TrackedFactory.java +++ b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/tracker/TrackedFactory.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/tracker/TrackedFactoryContainer.java b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/tracker/TrackedFactoryContainer.java index 2aded73f..faf899a5 100644 --- a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/tracker/TrackedFactoryContainer.java +++ b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/tracker/TrackedFactoryContainer.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * object-factory * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/tracker/TrackedFactoryCustomizer.java b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/tracker/TrackedFactoryCustomizer.java index 6e645cd5..4c7536cc 100644 --- a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/tracker/TrackedFactoryCustomizer.java +++ b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/tracker/TrackedFactoryCustomizer.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/tracker/TrackedFactoryCustomizerListener.java b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/tracker/TrackedFactoryCustomizerListener.java index 4771480d..3cf28382 100644 --- a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/tracker/TrackedFactoryCustomizerListener.java +++ b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/tracker/TrackedFactoryCustomizerListener.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/tracker/TrackedFactoryManager.java b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/tracker/TrackedFactoryManager.java index 2fc9e627..22f425a1 100644 --- a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/tracker/TrackedFactoryManager.java +++ b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/tracker/TrackedFactoryManager.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * object-factory * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/tracker/TrackerManager.java b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/tracker/TrackerManager.java index 7a6120d9..b84fdff0 100644 --- a/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/tracker/TrackerManager.java +++ b/platform/runtime/base/objects-base/object-factory/src/main/java/ru/entaxy/platform/base/objects/factory/tracker/TrackerManager.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/object-factory/src/main/resources/ru/entaxy/factory/base-object.json b/platform/runtime/base/objects-base/object-factory/src/main/resources/ru/entaxy/factory/base-object.json index f2d7e152..16901fb6 100644 --- a/platform/runtime/base/objects-base/object-factory/src/main/resources/ru/entaxy/factory/base-object.json +++ b/platform/runtime/base/objects-base/object-factory/src/main/resources/ru/entaxy/factory/base-object.json @@ -26,6 +26,9 @@ "@TYPEINFO": { "validation": { "rules": { + "checkUniqueness": { + "currentOnly": true + }, "length": { "min": 3 }, @@ -43,7 +46,8 @@ "description": "Name of the Entaxy entity that will be used as an alias for displaying at UI", "displayName": "Display name", "@UI": { - "ignoreChildChanges": true + "ignoreChildChanges": true, + "ignoreValueIfTemplate": true } }, "description": { diff --git a/platform/runtime/base/objects-base/objects-core/pom.xml b/platform/runtime/base/objects-base/objects-core/pom.xml index fe8b6d1c..3ed97ab7 100644 --- a/platform/runtime/base/objects-base/objects-core/pom.xml +++ b/platform/runtime/base/objects-base/objects-core/pom.xml @@ -3,7 +3,7 @@ ru.entaxy.esb.platform.runtime.base objects-base - 1.10.0 + 1.11.0 ru.entaxy.esb.platform.runtime.base.objects-base objects-core diff --git a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/EntaxyObject.java b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/EntaxyObject.java index 0e2e2a7e..287fa8ab 100644 --- a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/EntaxyObject.java +++ b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/EntaxyObject.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/EntaxyObjectService.java b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/EntaxyObjectService.java index 3c132fe6..7dcbcc9b 100644 --- a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/EntaxyObjectService.java +++ b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/EntaxyObjectService.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/EntaxyObjectServiceListener.java b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/EntaxyObjectServiceListener.java index 097ce6f0..92b79275 100644 --- a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/EntaxyObjectServiceListener.java +++ b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/EntaxyObjectServiceListener.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * objects-core * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/EntaxyObjectStorage.java b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/EntaxyObjectStorage.java index fef9cb2e..5b0e7398 100644 --- a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/EntaxyObjectStorage.java +++ b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/EntaxyObjectStorage.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/EntaxyObjectStorageService.java b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/EntaxyObjectStorageService.java index 40aa59be..137e7480 100644 --- a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/EntaxyObjectStorageService.java +++ b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/EntaxyObjectStorageService.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/service/impl/BundleInfoImpl.java b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/service/impl/BundleInfoImpl.java index 49fdef5f..f3796798 100644 --- a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/service/impl/BundleInfoImpl.java +++ b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/service/impl/BundleInfoImpl.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/service/impl/EntaxyObjectServiceImpl.java b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/service/impl/EntaxyObjectServiceImpl.java index 324571d1..55f1b46c 100644 --- a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/service/impl/EntaxyObjectServiceImpl.java +++ b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/service/impl/EntaxyObjectServiceImpl.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/service/impl/TrackedEntaxyObject.java b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/service/impl/TrackedEntaxyObject.java index aa69e2fb..3ff58059 100644 --- a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/service/impl/TrackedEntaxyObject.java +++ b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/service/impl/TrackedEntaxyObject.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/service/tracker/TrackedEntaxyObjectCustomizer.java b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/service/tracker/TrackedEntaxyObjectCustomizer.java index a12df162..286df2d5 100644 --- a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/service/tracker/TrackedEntaxyObjectCustomizer.java +++ b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/service/tracker/TrackedEntaxyObjectCustomizer.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/service/tracker/TrackedEntaxyObjectCustomizerListener.java b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/service/tracker/TrackedEntaxyObjectCustomizerListener.java index d8574ec3..a18dda0a 100644 --- a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/service/tracker/TrackedEntaxyObjectCustomizerListener.java +++ b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/service/tracker/TrackedEntaxyObjectCustomizerListener.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/shell/EntaxyObjectServiceSupport.java b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/shell/EntaxyObjectServiceSupport.java index d3f80bf1..e20e1ef7 100644 --- a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/shell/EntaxyObjectServiceSupport.java +++ b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/shell/EntaxyObjectServiceSupport.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/shell/ListObjects.java b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/shell/ListObjects.java index ee5ca4e3..6812853d 100644 --- a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/shell/ListObjects.java +++ b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/shell/ListObjects.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/shell/ObjectAwareCommand.java b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/shell/ObjectAwareCommand.java index 6ad4b491..e7992abd 100644 --- a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/shell/ObjectAwareCommand.java +++ b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/shell/ObjectAwareCommand.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/shell/ObjectConfiguration.java b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/shell/ObjectConfiguration.java index 2c139648..bfc8fb00 100644 --- a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/shell/ObjectConfiguration.java +++ b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/shell/ObjectConfiguration.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/shell/ObjectRelations.java b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/shell/ObjectRelations.java index a7ed212e..06d915ae 100644 --- a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/shell/ObjectRelations.java +++ b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/shell/ObjectRelations.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/shell/SimpleObjectTree.java b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/shell/SimpleObjectTree.java index 4037e93b..8b7f4ad6 100644 --- a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/shell/SimpleObjectTree.java +++ b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/shell/SimpleObjectTree.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * objects-core * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/shell/completers/ObjectCompleter.java b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/shell/completers/ObjectCompleter.java index 04caf5d9..60bfab56 100644 --- a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/shell/completers/ObjectCompleter.java +++ b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/shell/completers/ObjectCompleter.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/storage/impl/EntaxyObjectStorageServiceImpl.java b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/storage/impl/EntaxyObjectStorageServiceImpl.java index 0adb7a69..2912aa0a 100644 --- a/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/storage/impl/EntaxyObjectStorageServiceImpl.java +++ b/platform/runtime/base/objects-base/objects-core/src/main/java/ru/entaxy/platform/base/objects/storage/impl/EntaxyObjectStorageServiceImpl.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/objects-base/pom.xml b/platform/runtime/base/objects-base/pom.xml index b3736035..cea22ab9 100644 --- a/platform/runtime/base/objects-base/pom.xml +++ b/platform/runtime/base/objects-base/pom.xml @@ -3,7 +3,7 @@ ru.entaxy.esb.platform.runtime base - 1.10.0 + 1.11.0 ru.entaxy.esb.platform.runtime.base objects-base diff --git a/platform/runtime/base/platform-manager/platform-manager-core/pom.xml b/platform/runtime/base/platform-manager/platform-manager-core/pom.xml index 027a267f..44e69e3b 100644 --- a/platform/runtime/base/platform-manager/platform-manager-core/pom.xml +++ b/platform/runtime/base/platform-manager/platform-manager-core/pom.xml @@ -3,7 +3,7 @@ ru.entaxy.esb.platform.runtime.base platform-manager - 1.10.0 + 1.11.0 platform-manager-core bundle diff --git a/platform/runtime/base/platform-manager/platform-manager-core/src/main/java/ru/entaxy/platform/manager/EntaxyPlatformManager.java b/platform/runtime/base/platform-manager/platform-manager-core/src/main/java/ru/entaxy/platform/manager/EntaxyPlatformManager.java index aec837fc..f361a84b 100644 --- a/platform/runtime/base/platform-manager/platform-manager-core/src/main/java/ru/entaxy/platform/manager/EntaxyPlatformManager.java +++ b/platform/runtime/base/platform-manager/platform-manager-core/src/main/java/ru/entaxy/platform/manager/EntaxyPlatformManager.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * platform-manager-core * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/platform-manager/platform-manager-core/src/main/java/ru/entaxy/platform/manager/impl/EntaxyPlatformManagerImpl.java b/platform/runtime/base/platform-manager/platform-manager-core/src/main/java/ru/entaxy/platform/manager/impl/EntaxyPlatformManagerImpl.java index b878cc91..29525339 100644 --- a/platform/runtime/base/platform-manager/platform-manager-core/src/main/java/ru/entaxy/platform/manager/impl/EntaxyPlatformManagerImpl.java +++ b/platform/runtime/base/platform-manager/platform-manager-core/src/main/java/ru/entaxy/platform/manager/impl/EntaxyPlatformManagerImpl.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * platform-manager-core * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/platform-manager/platform-manager-core/src/main/java/ru/entaxy/platform/manager/shell/EntaxyPlatformManagerSupport.java b/platform/runtime/base/platform-manager/platform-manager-core/src/main/java/ru/entaxy/platform/manager/shell/EntaxyPlatformManagerSupport.java index 3ab6c964..9ca54bc9 100644 --- a/platform/runtime/base/platform-manager/platform-manager-core/src/main/java/ru/entaxy/platform/manager/shell/EntaxyPlatformManagerSupport.java +++ b/platform/runtime/base/platform-manager/platform-manager-core/src/main/java/ru/entaxy/platform/manager/shell/EntaxyPlatformManagerSupport.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * platform-manager-core * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/platform-manager/platform-manager-core/src/main/java/ru/entaxy/platform/manager/shell/PlatformHealth.java b/platform/runtime/base/platform-manager/platform-manager-core/src/main/java/ru/entaxy/platform/manager/shell/PlatformHealth.java index a43494d0..e17bdc8f 100644 --- a/platform/runtime/base/platform-manager/platform-manager-core/src/main/java/ru/entaxy/platform/manager/shell/PlatformHealth.java +++ b/platform/runtime/base/platform-manager/platform-manager-core/src/main/java/ru/entaxy/platform/manager/shell/PlatformHealth.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * platform-manager-core * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/platform-manager/platform-manager-core/src/main/java/ru/entaxy/platform/manager/shell/ShellTableColFixed.java b/platform/runtime/base/platform-manager/platform-manager-core/src/main/java/ru/entaxy/platform/manager/shell/ShellTableColFixed.java index 02121d79..19e9c6de 100644 --- a/platform/runtime/base/platform-manager/platform-manager-core/src/main/java/ru/entaxy/platform/manager/shell/ShellTableColFixed.java +++ b/platform/runtime/base/platform-manager/platform-manager-core/src/main/java/ru/entaxy/platform/manager/shell/ShellTableColFixed.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * platform-manager-core * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/platform-manager/platform-manager-core/src/main/java/ru/entaxy/platform/manager/shell/ShellTableFixed.java b/platform/runtime/base/platform-manager/platform-manager-core/src/main/java/ru/entaxy/platform/manager/shell/ShellTableFixed.java index 200a1d4e..1407d4db 100644 --- a/platform/runtime/base/platform-manager/platform-manager-core/src/main/java/ru/entaxy/platform/manager/shell/ShellTableFixed.java +++ b/platform/runtime/base/platform-manager/platform-manager-core/src/main/java/ru/entaxy/platform/manager/shell/ShellTableFixed.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * platform-manager-core * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/platform-manager/platform-manager-core/src/main/java/ru/entaxy/platform/manager/shell/Utils.java b/platform/runtime/base/platform-manager/platform-manager-core/src/main/java/ru/entaxy/platform/manager/shell/Utils.java index 348bc4c2..d7849106 100644 --- a/platform/runtime/base/platform-manager/platform-manager-core/src/main/java/ru/entaxy/platform/manager/shell/Utils.java +++ b/platform/runtime/base/platform-manager/platform-manager-core/src/main/java/ru/entaxy/platform/manager/shell/Utils.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * platform-manager-core * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/platform-manager/pom.xml b/platform/runtime/base/platform-manager/pom.xml index 5ab669c6..26614671 100644 --- a/platform/runtime/base/platform-manager/pom.xml +++ b/platform/runtime/base/platform-manager/pom.xml @@ -3,7 +3,7 @@ ru.entaxy.esb.platform.runtime base - 1.10.0 + 1.11.0 ru.entaxy.esb.platform.runtime.base platform-manager diff --git a/platform/runtime/base/pom.xml b/platform/runtime/base/pom.xml index 36e7d344..d8cef068 100644 --- a/platform/runtime/base/pom.xml +++ b/platform/runtime/base/pom.xml @@ -3,7 +3,7 @@ ru.entaxy.esb.platform runtime - 1.10.0 + 1.11.0 4.0.0 diff --git a/platform/runtime/base/resources/pom.xml b/platform/runtime/base/resources/pom.xml index 32d8e0da..4cf47068 100644 --- a/platform/runtime/base/resources/pom.xml +++ b/platform/runtime/base/resources/pom.xml @@ -3,7 +3,7 @@ ru.entaxy.esb.platform.runtime base - 1.10.0 + 1.11.0 ru.entaxy.esb.platform.runtime.base resources diff --git a/platform/runtime/base/resources/resources-api/pom.xml b/platform/runtime/base/resources/resources-api/pom.xml index 8b477de9..1381590c 100644 --- a/platform/runtime/base/resources/resources-api/pom.xml +++ b/platform/runtime/base/resources/resources-api/pom.xml @@ -3,7 +3,7 @@ ru.entaxy.esb.platform.runtime.base resources - 1.10.0 + 1.11.0 ru.entaxy.esb.platform.runtime.base.resources resources-api diff --git a/platform/runtime/base/resources/resources-api/src/main/java/ru/entaxy/esb/resources/EntaxyResource.java b/platform/runtime/base/resources/resources-api/src/main/java/ru/entaxy/esb/resources/EntaxyResource.java index 4b49ecf5..1f3c41d3 100644 --- a/platform/runtime/base/resources/resources-api/src/main/java/ru/entaxy/esb/resources/EntaxyResource.java +++ b/platform/runtime/base/resources/resources-api/src/main/java/ru/entaxy/esb/resources/EntaxyResource.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * resources-api * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/resources/resources-api/src/main/java/ru/entaxy/esb/resources/EntaxyResourceMetadata.java b/platform/runtime/base/resources/resources-api/src/main/java/ru/entaxy/esb/resources/EntaxyResourceMetadata.java index 53d912f6..bcb2115e 100644 --- a/platform/runtime/base/resources/resources-api/src/main/java/ru/entaxy/esb/resources/EntaxyResourceMetadata.java +++ b/platform/runtime/base/resources/resources-api/src/main/java/ru/entaxy/esb/resources/EntaxyResourceMetadata.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * resources-api * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/resources/resources-api/src/main/java/ru/entaxy/esb/resources/EntaxyResourceProcessor.java b/platform/runtime/base/resources/resources-api/src/main/java/ru/entaxy/esb/resources/EntaxyResourceProcessor.java index 47089b74..f125947c 100644 --- a/platform/runtime/base/resources/resources-api/src/main/java/ru/entaxy/esb/resources/EntaxyResourceProcessor.java +++ b/platform/runtime/base/resources/resources-api/src/main/java/ru/entaxy/esb/resources/EntaxyResourceProcessor.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * resources-api * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/resources/resources-api/src/main/java/ru/entaxy/esb/resources/EntaxyResourceProvider.java b/platform/runtime/base/resources/resources-api/src/main/java/ru/entaxy/esb/resources/EntaxyResourceProvider.java index 155bcafb..d3234251 100644 --- a/platform/runtime/base/resources/resources-api/src/main/java/ru/entaxy/esb/resources/EntaxyResourceProvider.java +++ b/platform/runtime/base/resources/resources-api/src/main/java/ru/entaxy/esb/resources/EntaxyResourceProvider.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * resources-api * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/resources/resources-api/src/main/java/ru/entaxy/esb/resources/EntaxyResourceProviderProxy.java b/platform/runtime/base/resources/resources-api/src/main/java/ru/entaxy/esb/resources/EntaxyResourceProviderProxy.java index 54f16e24..e7199747 100644 --- a/platform/runtime/base/resources/resources-api/src/main/java/ru/entaxy/esb/resources/EntaxyResourceProviderProxy.java +++ b/platform/runtime/base/resources/resources-api/src/main/java/ru/entaxy/esb/resources/EntaxyResourceProviderProxy.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * resources-api * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/resources/resources-api/src/main/java/ru/entaxy/esb/resources/EntaxyResourceService.java b/platform/runtime/base/resources/resources-api/src/main/java/ru/entaxy/esb/resources/EntaxyResourceService.java index 0fdbb0f1..6b7ce56c 100644 --- a/platform/runtime/base/resources/resources-api/src/main/java/ru/entaxy/esb/resources/EntaxyResourceService.java +++ b/platform/runtime/base/resources/resources-api/src/main/java/ru/entaxy/esb/resources/EntaxyResourceService.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * resources-api * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property @@ -26,6 +26,7 @@ package ru.entaxy.esb.resources; import java.util.List; +import java.util.Map; public interface EntaxyResourceService { @@ -35,6 +36,7 @@ public interface EntaxyResourceService { EntaxyResource getResource(String location); List getResources(String location); + Map getProviders(); boolean isProtocolAvailable(String protocol); diff --git a/platform/runtime/base/resources/resources-api/src/main/java/ru/entaxy/esb/resources/EntaxyResourceURLFactory.java b/platform/runtime/base/resources/resources-api/src/main/java/ru/entaxy/esb/resources/EntaxyResourceURLFactory.java new file mode 100644 index 00000000..7cadfb60 --- /dev/null +++ b/platform/runtime/base/resources/resources-api/src/main/java/ru/entaxy/esb/resources/EntaxyResourceURLFactory.java @@ -0,0 +1,96 @@ +/*- + * ~~~~~~licensing~~~~~~ + * resources-api + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.resources; + +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; + +public class EntaxyResourceURLFactory { + + private EntaxyResourceURLFactory() { + + } + + public static final String DEFAULT_GLOBAL_PROTOCOL = "entaxy-resource"; + + public static URI getLocalUri(String resourceUrl) throws URISyntaxException { + return getLocalUri(resourceUrl, DEFAULT_GLOBAL_PROTOCOL); + } + + public static URI getLocalUri(String resourceUrl, String globalProtocol) throws URISyntaxException { + String prefix = globalProtocol.concat("://"); + String result = resourceUrl; + if (resourceUrl.startsWith(prefix)) + result = resourceUrl.substring(prefix.length()); + int index = result.indexOf(":"); + if (index > 0) + return new URI(result); + index = result.indexOf("/"); + if (index <= 0) + return new URI(result); + return new URI(result.substring(0, index).concat(":").concat(result.substring(index + 1))); + + } + + public static URL getGlobalUrl(EntaxyResource resource) throws MalformedURLException { + return getGlobalUrl(resource, DEFAULT_GLOBAL_PROTOCOL); + } + + public static URL getGlobalUrl(String resourceUrl) throws MalformedURLException { + return getGlobalUrl(resourceUrl, DEFAULT_GLOBAL_PROTOCOL); + } + + public static URL getGlobalUrl(EntaxyResource resource, String globalProtocol) throws MalformedURLException { + return getGlobalUrl(resource.getURL(), globalProtocol); + } + + public static URL getGlobalUrl(String resourceUrl, String globalProtocol) throws MalformedURLException { + if (resourceUrl.startsWith(globalProtocol + "://")) + return new URL(resourceUrl); + + String localProtocol = ""; + String resourcePath = resourceUrl; + + int index = resourceUrl.indexOf(':'); + if (index > 0) { + localProtocol = resourceUrl.substring(0, index); + resourcePath = resourceUrl.substring(index + 1); + } + + while (resourcePath.startsWith("/")) + resourcePath = resourcePath.substring(1); + + String resultPath = localProtocol.length() > 0 ? localProtocol.concat("/").concat(resourcePath) : resourcePath; + + while (resultPath.startsWith("/")) + resultPath = resultPath.substring(1); + + return new URL(globalProtocol.concat("://").concat(resultPath)); + } + +} diff --git a/platform/runtime/base/resources/resources-management/pom.xml b/platform/runtime/base/resources/resources-management/pom.xml index 68c471b9..417a6c21 100644 --- a/platform/runtime/base/resources/resources-management/pom.xml +++ b/platform/runtime/base/resources/resources-management/pom.xml @@ -4,7 +4,7 @@ ru.entaxy.esb.platform.runtime.base resources - 1.10.0 + 1.11.0 ru.entaxy.esb.platform.runtime.base.resources resources-management diff --git a/platform/runtime/base/resources/resources-management/src/main/java/ru/entaxy/esb/resources/management/EntaxyResourceProviderMBean.java b/platform/runtime/base/resources/resources-management/src/main/java/ru/entaxy/esb/resources/management/EntaxyResourceProviderMBean.java index 6049c620..98dc9f7a 100644 --- a/platform/runtime/base/resources/resources-management/src/main/java/ru/entaxy/esb/resources/management/EntaxyResourceProviderMBean.java +++ b/platform/runtime/base/resources/resources-management/src/main/java/ru/entaxy/esb/resources/management/EntaxyResourceProviderMBean.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * resources-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property @@ -51,4 +51,8 @@ public interface EntaxyResourceProviderMBean { void removeResource( @Parameter(name = "path", desc = "Path or location of the resource") String path) throws Exception; + @Operation(desc = "Save resource") + void saveResource(@Parameter(name = "path", desc = "Path to the resource") String path, + @Parameter(name = "content", desc = "The resource content") String content) throws Exception; + } diff --git a/platform/runtime/base/resources/resources-management/src/main/java/ru/entaxy/esb/resources/management/EntaxyResourceServiceMBean.java b/platform/runtime/base/resources/resources-management/src/main/java/ru/entaxy/esb/resources/management/EntaxyResourceServiceMBean.java index 45b94504..cc021e7a 100644 --- a/platform/runtime/base/resources/resources-management/src/main/java/ru/entaxy/esb/resources/management/EntaxyResourceServiceMBean.java +++ b/platform/runtime/base/resources/resources-management/src/main/java/ru/entaxy/esb/resources/management/EntaxyResourceServiceMBean.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * resources-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property @@ -30,6 +30,7 @@ import ru.entaxy.esb.platform.base.management.core.api.MBeanExportPolicy; import ru.entaxy.esb.platform.base.management.core.api.Operation; import ru.entaxy.esb.platform.base.management.core.api.Parameter; +import java.util.List; import java.util.Map; @MBeanAnnotated(policy = MBeanExportPolicy.ANNOTATED_ONLY) @@ -47,4 +48,7 @@ public interface EntaxyResourceServiceMBean { Map getResourceMetadata( @Parameter(name = "location", desc = "Location of the resource") String location) throws Exception; + @Operation(desc = "Get a list of providers") + List listProviders() throws Exception; + } diff --git a/platform/runtime/base/resources/resources-management/src/main/java/ru/entaxy/esb/resources/management/impl/EntaxyResourceProviderMBeanImpl.java b/platform/runtime/base/resources/resources-management/src/main/java/ru/entaxy/esb/resources/management/impl/EntaxyResourceProviderMBeanImpl.java index 2982d6a8..fc6c0737 100644 --- a/platform/runtime/base/resources/resources-management/src/main/java/ru/entaxy/esb/resources/management/impl/EntaxyResourceProviderMBeanImpl.java +++ b/platform/runtime/base/resources/resources-management/src/main/java/ru/entaxy/esb/resources/management/impl/EntaxyResourceProviderMBeanImpl.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * resources-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property @@ -107,11 +107,25 @@ public class EntaxyResourceProviderMBeanImpl extends AnnotatedMBean resources = ServiceHelper.INSTANCE.entaxyResourceService + .getResources(sourceResource.getURL()); + for(EntaxyResource resource : resources) { + pasteResource(resource, to + '/' + resource.getName()); + } + } else { + try (InputStream is = sourceResource.getInputStream()) { + EntaxyResource targetResource = resourceProvider.getResource(to); + targetResource.save(is); + } } + } else { + throw new IllegalArgumentException("Resource located at [" + sourceResource.getURL() + "] is not found"); } } @@ -127,4 +141,11 @@ public class EntaxyResourceProviderMBeanImpl extends AnnotatedMBean listProviders() { + return new ArrayList<>(entaxyResourceService.getProviders().keySet()); + } } diff --git a/platform/runtime/base/resources/resources-management/src/main/java/ru/entaxy/esb/resources/management/impl/ServiceHelper.java b/platform/runtime/base/resources/resources-management/src/main/java/ru/entaxy/esb/resources/management/impl/ServiceHelper.java new file mode 100644 index 00000000..39397da3 --- /dev/null +++ b/platform/runtime/base/resources/resources-management/src/main/java/ru/entaxy/esb/resources/management/impl/ServiceHelper.java @@ -0,0 +1,50 @@ +/*- + * ~~~~~~licensing~~~~~~ + * resources-management + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.resources.management.impl; + +import org.osgi.service.component.annotations.*; +import ru.entaxy.esb.resources.EntaxyResourceService; + +@Component(service = ServiceHelper.class, immediate = true) +public class ServiceHelper { + + public static ServiceHelper INSTANCE; + + @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC, + policyOption = ReferencePolicyOption.GREEDY) + volatile public EntaxyResourceService entaxyResourceService; + + @Activate + public void activate() { + INSTANCE = this; + } + + @Deactivate + public void deactivate() { + INSTANCE = null; + } + +} diff --git a/platform/runtime/base/resources/resources-service/pom.xml b/platform/runtime/base/resources/resources-service/pom.xml index 4bfb1319..020e8a93 100644 --- a/platform/runtime/base/resources/resources-service/pom.xml +++ b/platform/runtime/base/resources/resources-service/pom.xml @@ -3,7 +3,7 @@ ru.entaxy.esb.platform.runtime.base resources - 1.10.0 + 1.11.0 ru.entaxy.esb.platform.runtime.base.resources resources-service diff --git a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/AbstractResource.java b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/AbstractResource.java index df89694a..5c8a5602 100644 --- a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/AbstractResource.java +++ b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/AbstractResource.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * resources-service * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/AbstractResourceProvider.java b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/AbstractResourceProvider.java index 1e4609f2..64e2deab 100644 --- a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/AbstractResourceProvider.java +++ b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/AbstractResourceProvider.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * resources-service * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/AbstractResourceProviderProxy.java b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/AbstractResourceProviderProxy.java index 9e4dc590..ca533f3e 100644 --- a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/AbstractResourceProviderProxy.java +++ b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/AbstractResourceProviderProxy.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * resources-service * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/CommonResourceProviderProxy.java b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/CommonResourceProviderProxy.java index 02242fb3..dc226f02 100644 --- a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/CommonResourceProviderProxy.java +++ b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/CommonResourceProviderProxy.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * resources-service * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/ResourceWrapper.java b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/ResourceWrapper.java index e86949ba..69af0ebd 100644 --- a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/ResourceWrapper.java +++ b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/ResourceWrapper.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * resources-service * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/service/EntaxyResourceServiceImpl.java b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/service/EntaxyResourceServiceImpl.java index 3721e3c4..b014b9b2 100644 --- a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/service/EntaxyResourceServiceImpl.java +++ b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/service/EntaxyResourceServiceImpl.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * resources-service * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property @@ -33,6 +33,7 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; import org.osgi.framework.BundleContext; @@ -112,7 +113,9 @@ public class EntaxyResourceServiceImpl implements EntaxyResourceService { return null; String location = resourceLocation; try { - location = EntaxyResourceURLFactory.getLocalUri(resourceLocation).toString(); + location = EntaxyResourceURLFactory + .getLocalUri(resourceLocation.replaceAll(" ", "%20")).toString() + .replaceAll("%20", " "); } catch (URISyntaxException e) { log.warn(String.format("Failed getting local URI for [%s]", resourceLocation), e); } @@ -137,7 +140,9 @@ public class EntaxyResourceServiceImpl implements EntaxyResourceService { String location = resourceLocation; try { - location = EntaxyResourceURLFactory.getLocalUri(resourceLocation).toString(); + location = EntaxyResourceURLFactory + .getLocalUri(resourceLocation.replaceAll(" ", "%20")).toString() + .replaceAll("%20", " "); } catch (URISyntaxException e) { log.warn(String.format("Failed getting local URI for [%s]", resourceLocation), e); } @@ -166,6 +171,11 @@ public class EntaxyResourceServiceImpl implements EntaxyResourceService { } } + @Override + public Map getProviders() { + return controller.getProviders(); + } + protected void updateResourceTimestamp(EntaxyResource resource, String timestamp) { if (resource == null) return; diff --git a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/service/ProvidersController.java b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/service/ProvidersController.java index 3d4d171b..1865a36b 100644 --- a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/service/ProvidersController.java +++ b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/service/ProvidersController.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * resources-service * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property @@ -74,6 +74,10 @@ public class ProvidersController { return this.providers.getOrDefault(protocol, null); } + public Map getProviders() { + return this.providers; + } + public void registerProtocolCallback(String protocol, EntaxyResourceProtocolAvailableCallback callback) { if (!callbacks.containsKey(protocol)) callbacks.put(protocol, new ArrayList<>()); diff --git a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/service/ProxyController.java b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/service/ProxyController.java index c6b12014..1cb4ab7b 100644 --- a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/service/ProxyController.java +++ b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/service/ProxyController.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * resources-service * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/service/ProxyProvider.java b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/service/ProxyProvider.java index 4abdf844..0ac2c3ab 100644 --- a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/service/ProxyProvider.java +++ b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/impl/service/ProxyProvider.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * resources-service * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/provider/FileResourceProvider.java b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/provider/FileResourceProvider.java index 53de6cce..e7f2ef0f 100644 --- a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/provider/FileResourceProvider.java +++ b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/provider/FileResourceProvider.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * resources-service * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property @@ -239,6 +239,8 @@ public class FileResourceProvider extends AbstractResourceProvider { @Override protected void deleteMatadata() { + if (!metadataInited) + initMetadata(); deleteFile(metadataFile); } diff --git a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/shell/ResourceList.java b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/shell/ResourceList.java index 3d1d895b..d7243654 100644 --- a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/shell/ResourceList.java +++ b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/shell/ResourceList.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * resources-service * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/shell/ResourceOpenByUrl.java b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/shell/ResourceOpenByUrl.java index 0098ce2f..577de878 100644 --- a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/shell/ResourceOpenByUrl.java +++ b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/shell/ResourceOpenByUrl.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * resources-service * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/support/EntaxyResourcesURLHandler.java b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/support/EntaxyResourcesURLHandler.java index 55e0f439..d4d8f792 100644 --- a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/support/EntaxyResourcesURLHandler.java +++ b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/support/EntaxyResourcesURLHandler.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * resources-service * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/support/XslUrlResolver.java b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/support/XslUrlResolver.java index 5e14f1b8..ce993b54 100644 --- a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/support/XslUrlResolver.java +++ b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/support/XslUrlResolver.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * schema-impl * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/tracker/ResourceProvider.java b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/tracker/ResourceProvider.java index 77769529..4341c506 100644 --- a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/tracker/ResourceProvider.java +++ b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/tracker/ResourceProvider.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * resources-service * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property @@ -79,18 +79,23 @@ public class ResourceProvider { int splitIndex = path.indexOf("/"); String protocol = splitIndex > 0 ? path.substring(0, splitIndex) - : ""; + : path; if (splitIndex > 0) path = path.substring(splitIndex + 1); + else + path = ""; - if (!CommonUtils.isValid(protocol) || !CommonUtils.isValid(resourceName)) + if (!CommonUtils.isValid(protocol) || !CommonUtils.isValid(resourceName)) { + log.warn("Incorrect resource URL: [{}]", entry.toString()); continue; + } if (!resources.containsKey(protocol)) resources.put(protocol, new ArrayList<>()); - resources.get(protocol).add(new ResourceDescriptor(entry, path + "/" + resourceName)); + resources.get(protocol) + .add(new ResourceDescriptor(entry, (CommonUtils.isValid(path) ? path + "/" : "") + resourceName)); } diff --git a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/tracker/ResourceProviderCustomizer.java b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/tracker/ResourceProviderCustomizer.java index 25d0bd89..2cfa21b6 100644 --- a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/tracker/ResourceProviderCustomizer.java +++ b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/tracker/ResourceProviderCustomizer.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * resources-service * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/tracker/ResourceProviderCustomizerListener.java b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/tracker/ResourceProviderCustomizerListener.java index bdddd4da..82a21e5b 100644 --- a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/tracker/ResourceProviderCustomizerListener.java +++ b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/tracker/ResourceProviderCustomizerListener.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * resources-service * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/tracker/TrackerManager.java b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/tracker/TrackerManager.java index ffea6313..9fc2af4d 100644 --- a/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/tracker/TrackerManager.java +++ b/platform/runtime/base/resources/resources-service/src/main/java/ru/entaxy/esb/resources/tracker/TrackerManager.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * resources-service * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/base/search-service/LICENSE.txt b/platform/runtime/base/search-service/LICENSE.txt new file mode 100644 index 00000000..4ae94b75 --- /dev/null +++ b/platform/runtime/base/search-service/LICENSE.txt @@ -0,0 +1,175 @@ + ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ + +Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой) +версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего +Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН +7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова, +д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу +https://www.emdev.ru/about (далее - Компания). + +Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями» +(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения, +Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в +настоящем документе, в противном случае, он должен не использовать или не получать доступ +к Программному обеспечению. + + 1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ + +a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии +или редакции, исключительные права на которую принадлежат Правообладателю. +b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные +права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ +для ЭВМ № 2021610848 от 19.01.2021 года. +c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта +https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО. +d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также +личные неимущественные права авторов произведений на результат интеллектуальной деятельности. +e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование +ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка +включает предоставление Пользователю неисключительного права использования ПО, в том числе +получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение +патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается +Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается +для каждого Пользователя индивидуально в Сертификате. +f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром), +подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное +обеспечение в ограниченном объёме и на определённый период времени. +g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО, +предоставленных Пользователю согласно условиям Подписки. +h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного +обеспечения. +i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий +из одного или нескольких файлов, который может быть прочтён человеком. +j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля +программы, полученный в результате обработки исходного кода, еще не связанный в полную программу. +Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый +продукт. +k) Некоммерческое использование – индивидуальное личное использование Пользователем программного +обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации +возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая +выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения. + + 2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ + +2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного +обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом +воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения +в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ. +2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит +неисключительный характер. +2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию, +лицензия на ограниченное использование Программного обеспечения. +2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования +имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан +обратиться в службу поддержки Правообладателя по адресу: https://entaxy.ru/ для изменения +вида лицензии с Базовой бесплатной версии на Подписки. +2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для +пробного использования программного обеспечения – не ограничен. +2.6. Использование Пользователем настоящего программного обеспечения в целях разработки, +модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю, +без разрешения Правообладателя не допускается. + + 3. АВТОРСКОЕ ПРАВО. + +3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение +и любые его копии принадлежат Правообладателю. +3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента, +к которому можно получить доступ с помощью Программного обеспечения, является собственностью +соответствующего владельца контента и защищается применимым законодательством об авторском +праве или другими законами и договорами об интеллектуальной собственности. +3.3. Условия использования Программного обеспечения. +Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь +придерживается следующих условий: +3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять +какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании +Программного обеспечения или на нем. +3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать, +расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать +Программное обеспечение. +3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования +ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне. +3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено +использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам. + + 4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС» + +4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю +на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с +использованием Пользователем: +4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в +Программное обеспечение; +4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями +настоящего соглашения; +4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием, +или данными, не предоставленными Пользователю Правообладателем; +4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем. + + +5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ +ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ +И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ +ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ +И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ +ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО. + + 6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ. +НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ +ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ, +ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ; +ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ. +ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ +ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ; +КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ +ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ. + + 7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ: +Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия +(включая, но не ограничиваясь) по: +-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код) + Программного обеспечения; +-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный +код Программного обеспечения, за исключением тех изменений, которые вносятся средствами, +включёнными в Программное обеспечение и описанными непосредственно в документации к нему; +-созданию условий для использования Программного обеспечения лицами, не имеющими прав на +использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство +третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа +к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку; +-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию). + + 8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА. + +8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из +лицензионных продуктов, используемых на законных основаниях, а +именно https://entaxy.ru/libs/licenses/root-aggregated.deps. +8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть +совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения. +8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться +Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения, +содержащих все изменения и дополнения программного обеспечения. + + 9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ. + +9.1. Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым +программным обеспечением. +9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно +с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм +«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public. +9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий +пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя, +прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер +ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства +Российской Федерации. + + 10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ. + +10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет +право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб, +недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий +пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере +2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения +исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy). +10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое +законодательство – Российской Федерации. +10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным, +остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать +исполнять свои обязанности в соответствии с этими положениями. diff --git a/platform/runtime/base/search-service/pom.xml b/platform/runtime/base/search-service/pom.xml new file mode 100644 index 00000000..f36a43ad --- /dev/null +++ b/platform/runtime/base/search-service/pom.xml @@ -0,0 +1,53 @@ + + 4.0.0 + + ru.entaxy.esb.platform.runtime + base + 1.11.0 + + ru.entaxy.platform + search-service + bundle + ENTAXY :: PLATFORM :: SEARCH SERVICE + ENTAXY :: PLATFORM :: SEARCH SERVICE + + + + ru.entaxy.platform.search + + + ru.entaxy.platform.search.* + + none + + + + + ru.entaxy.esb.platform.runtime.base + base-support + ${project.version} + + + ru.entaxy.esb.platform.runtime.base + management-core + ${project.version} + + + org.apache.karaf.shell + org.apache.karaf.shell.core + ${karaf.version} + + + + org.apache.commons + commons-collections4 + 4.4 + + + ru.entaxy.esb.platform.runtime.base + management-core + ${project.version} + + + + diff --git a/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/AbstractSearchProvider.java b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/AbstractSearchProvider.java new file mode 100644 index 00000000..2929906a --- /dev/null +++ b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/AbstractSearchProvider.java @@ -0,0 +1,48 @@ +/*- + * ~~~~~~licensing~~~~~~ + * search-service + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.search; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public abstract class AbstractSearchProvider implements SearchProvider { + + @Override + public String getProviderId() { + if (this.getClass().isAnnotationPresent(SearchProviderInfo.class)) + return this.getClass().getAnnotation(SearchProviderInfo.class).id(); + return null; + } + + @Override + public List getTargetTypes() { + if (this.getClass().isAnnotationPresent(SearchProviderInfo.class)) + return Arrays.asList(this.getClass().getAnnotation(SearchProviderInfo.class).targetTypes()); + return new ArrayList<>(); + } + +} diff --git a/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/SearchProvider.java b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/SearchProvider.java new file mode 100644 index 00000000..e0b07362 --- /dev/null +++ b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/SearchProvider.java @@ -0,0 +1,52 @@ +/*- + * ~~~~~~licensing~~~~~~ + * search-service + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.search; + +import java.util.List; +import java.util.Map; + +import org.osgi.framework.Filter; +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.InvalidSyntaxException; + +public interface SearchProvider { + + String getProviderId(); + + List getTargetTypes(); + + Map getStandardAttributes(String targetType) throws IllegalArgumentException; + + default List> search(String targetType, String filter) + throws InvalidSyntaxException, IllegalArgumentException { + if (!getTargetTypes().contains(targetType)) + throw new IllegalArgumentException( + String.format("Provider [%s]: target type [%s] not supported", getProviderId(), targetType)); + return search(targetType, FrameworkUtil.createFilter(filter)); + } + + List> search(String targetType, Filter filter) throws IllegalArgumentException; +} diff --git a/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/SearchProviderInfo.java b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/SearchProviderInfo.java new file mode 100644 index 00000000..08db98aa --- /dev/null +++ b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/SearchProviderInfo.java @@ -0,0 +1,42 @@ +/*- + * ~~~~~~licensing~~~~~~ + * search-service + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.search; + +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +@Retention(RUNTIME) +@Target(TYPE) +public @interface SearchProviderInfo { + + String id(); + + String[] targetTypes(); + +} diff --git a/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/SearchService.java b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/SearchService.java new file mode 100644 index 00000000..6baac955 --- /dev/null +++ b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/SearchService.java @@ -0,0 +1,89 @@ +/*- + * ~~~~~~licensing~~~~~~ + * search-service + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.search; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.osgi.framework.Filter; +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.InvalidSyntaxException; + +public interface SearchService { + + List getProviders(); + + SearchProvider getProviderForType(String targetType); + + default List getProvidedTypes() { + return getProviders().stream().map(p -> p.getTargetTypes()).flatMap(t -> t.stream()).distinct() + .collect(Collectors.toList()); + } + + default Map getStandardAttributes(String targetType) throws IllegalArgumentException { + SearchProvider provider = getProviderForType(targetType); + if (provider == null) + throw new IllegalArgumentException(String.format("Search provider for type [%s] not found", targetType)); + return provider.getStandardAttributes(targetType); + } + + default List getAttributes(String targetType, String filter) + throws InvalidSyntaxException, IllegalArgumentException { + return getAttributes(targetType, FrameworkUtil.createFilter(filter)); + } + + default List getAttributes(String targetType, Filter filter) + throws InvalidSyntaxException, IllegalArgumentException { + + List result = new ArrayList<>(); + + List> found = search(targetType, filter); + + if (found != null) { + result.addAll(found.stream().map(m -> m.keySet()).flatMap(ks -> ks.stream()).distinct() + .collect(Collectors.toList())); + } + + return result; + } + + default List> search(String targetType, String filter) + throws InvalidSyntaxException, IllegalArgumentException { + Filter osgiFilter = FrameworkUtil.createFilter(filter); + return search(targetType, osgiFilter); + } + + + default List> search(String targetType, Filter filter) + throws InvalidSyntaxException, IllegalArgumentException { + SearchProvider provider = getProviderForType(targetType); + if (provider == null) + throw new IllegalArgumentException(String.format("Search provider for type [%s] not found", targetType)); + return provider.search(targetType, filter); + }; +} diff --git a/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/impl/SearchServiceImpl.java b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/impl/SearchServiceImpl.java new file mode 100644 index 00000000..104e52ec --- /dev/null +++ b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/impl/SearchServiceImpl.java @@ -0,0 +1,143 @@ +/*- + * ~~~~~~licensing~~~~~~ + * search-service + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.search.impl; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.osgi.framework.BundleContext; +import org.osgi.framework.Constants; +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.Reference; +import org.osgi.service.component.annotations.ReferenceCardinality; +import org.osgi.service.component.annotations.ReferencePolicy; +import org.osgi.service.component.annotations.ReferencePolicyOption; + +import ru.entaxy.platform.search.SearchProvider; +import ru.entaxy.platform.search.SearchService; + +@Component(service = SearchService.class, immediate = true) +public class SearchServiceImpl implements SearchService { + + protected final Map> providers = new HashMap<>(); + + protected final Map containers = new HashMap<>(); + + protected Object providersLock = new Object(); + + protected BundleContext bundleContext; + + @Activate + public void activate(ComponentContext componentContext) { + this.bundleContext = componentContext.getBundleContext(); + } + + @Reference(unbind = "unbindProvider", cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC, + policyOption = ReferencePolicyOption.GREEDY) + public void bindProvider(SearchProvider provider, Map properties) { + synchronized (providersLock) { + SearchProviderContainer container = new SearchProviderContainer(provider, properties); + for (String s : provider.getTargetTypes()) { + if (!providers.containsKey(s)) + providers.put(s, new ArrayList<>()); + providers.get(s).add(container); + } + containers.put(provider, container); + } + } + + public void unbindProvider(SearchProvider provider) { + synchronized (providersLock) { + SearchProviderContainer container = containers.get(provider); + containers.remove(provider); + if (container != null) + for (String s : provider.getTargetTypes()) { + List list = providers.get(s); + if (list != null) + list.remove(container); + } + } + } + + @Override + public List getProviders() { + return this.providers.keySet().stream().map(t -> getProviderForType(t)).filter(p -> p != null).distinct() + .collect(Collectors.toList()); + } + + @Override + public SearchProvider getProviderForType(String targetType) { + if (providers.containsKey(targetType)) { + List list = providers.get(targetType); + if (list == null || list.isEmpty()) + return null; + + SearchProviderContainer targetContainer = list.stream().sorted(new Comparator() { + + @Override + public int compare(SearchProviderContainer o1, SearchProviderContainer o2) { + return Integer.compare(o1.ranking, o2.ranking); + } + }).findFirst().get(); + + return targetContainer.provider; + + } + return null; + } + + protected class SearchProviderContainer { + + int ranking = 0; + SearchProvider provider; + + protected SearchProviderContainer(SearchProvider provider, Map properties) { + this.provider = provider; + if (properties.containsKey(Constants.SERVICE_RANKING)) { + Object rankingValue = properties.get(Constants.SERVICE_RANKING); + if (rankingValue != null) + try { + if (rankingValue instanceof Number) + ranking = ((Number) rankingValue).intValue(); + } catch (Exception e1) { + try { + ranking = Integer.parseInt(rankingValue.toString()); + } catch (Exception ignore) { + // NOOP + } + } + } + } + + } + +} diff --git a/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/jmx/SearchMBean.java b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/jmx/SearchMBean.java new file mode 100644 index 00000000..c75262f9 --- /dev/null +++ b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/jmx/SearchMBean.java @@ -0,0 +1,81 @@ +/*- + * ~~~~~~licensing~~~~~~ + * search-service + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.search.jmx; + +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import javax.management.MBeanOperationInfo; + +import org.osgi.framework.InvalidSyntaxException; + +import ru.entaxy.esb.platform.base.management.core.ManagementCore; +import ru.entaxy.esb.platform.base.management.core.api.MBeanAnnotated; +import ru.entaxy.esb.platform.base.management.core.api.MBeanExportPolicy; +import ru.entaxy.esb.platform.base.management.core.api.Operation; +import ru.entaxy.esb.platform.base.management.core.api.Parameter; + +@MBeanAnnotated(policy = MBeanExportPolicy.ANNOTATED_ONLY) +public interface SearchMBean { + + String SEARCH_KEY = "util"; + String SEARCH_KEY_VALUE = "search"; + + String JMX_OBJECT_NAME = ManagementCore.Q_PLATFORM_S + "," + + SearchMBean.SEARCH_KEY + "=" + SearchMBean.SEARCH_KEY_VALUE; + + @Operation(impact = MBeanOperationInfo.INFO, desc = "Lists available search providers") + List listProviders(); + + @Operation(impact = MBeanOperationInfo.INFO, desc = "Lists types available for search") + List listProvidedTypes(); + + @Operation(impact = MBeanOperationInfo.INFO, desc = "Lists standard attributes for selected type") + Map listStandardAttributes(@Parameter(name = "type") String type) + throws InvalidSyntaxException, IllegalArgumentException; + + @Operation(impact = MBeanOperationInfo.INFO, desc = "Lists attributes available for the target search") + default List listAttributes(@Parameter(name = "type") String type, + @Parameter(name = "filter") String filter) + throws InvalidSyntaxException, IllegalArgumentException { + + List result = new LinkedList<>(); + + for (Map item : search(type, filter)) + for (String attr : item.keySet()) + if (!result.contains(attr)) + result.add(attr); + + return result; + }; + + + @Operation(impact = MBeanOperationInfo.INFO, desc = "Executes search") + List> search(@Parameter(name = "type") String type, @Parameter(name = "filter") String filter) + throws InvalidSyntaxException, IllegalArgumentException; + +} diff --git a/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/jmx/impl/SearchMBeanImpl.java b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/jmx/impl/SearchMBeanImpl.java new file mode 100644 index 00000000..720f0872 --- /dev/null +++ b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/jmx/impl/SearchMBeanImpl.java @@ -0,0 +1,83 @@ +/*- + * ~~~~~~licensing~~~~~~ + * search-service + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.search.jmx.impl; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import javax.management.DynamicMBean; +import javax.management.MBeanRegistration; +import javax.management.NotCompliantMBeanException; + +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.component.annotations.ServiceScope; + +import ru.entaxy.esb.platform.base.management.core.ManagementCore; +import ru.entaxy.esb.platform.base.management.core.api.AnnotatedMBean; +import ru.entaxy.platform.search.SearchService; +import ru.entaxy.platform.search.jmx.SearchMBean; + +@Component( + service = {SearchMBean.class, DynamicMBean.class, MBeanRegistration.class}, + property = {ManagementCore.JMX_OBJECTNAME + "=" + SearchMBean.JMX_OBJECT_NAME}, + scope = ServiceScope.SINGLETON, + immediate = true) +public class SearchMBeanImpl extends AnnotatedMBean implements SearchMBean { + + @Reference + SearchService searchService; + + public SearchMBeanImpl() throws NotCompliantMBeanException { + super(SearchMBean.class); + } + + @Override + public List listProviders() { + return searchService.getProviders().stream().map(p -> p.getProviderId()).collect(Collectors.toList()); + } + + @Override + public List listProvidedTypes() { + return searchService.getProvidedTypes(); + } + + @Override + public Map listStandardAttributes(String type) + throws InvalidSyntaxException, IllegalArgumentException { + return searchService.getStandardAttributes(type); + } + + @Override + public List> search(String type, String filter) + throws InvalidSyntaxException, IllegalArgumentException { + return searchService.search(type, FrameworkUtil.createFilter(filter)); + } + +} diff --git a/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/provider/OsgiSearchProvider.java b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/provider/OsgiSearchProvider.java new file mode 100644 index 00000000..3eec191b --- /dev/null +++ b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/provider/OsgiSearchProvider.java @@ -0,0 +1,209 @@ +/*- + * ~~~~~~licensing~~~~~~ + * search-service + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.search.provider; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Dictionary; +import java.util.Enumeration; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.collections4.MapUtils; +import org.apache.karaf.bundle.core.BundleInfo; +import org.apache.karaf.bundle.core.BundleService; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.Constants; +import org.osgi.framework.Filter; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceReference; +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.Reference; +import org.osgi.service.component.annotations.ReferenceCardinality; + +import ru.entaxy.platform.search.AbstractSearchProvider; +import ru.entaxy.platform.search.SearchProvider; +import ru.entaxy.platform.search.SearchProviderInfo; + +@Component(service = SearchProvider.class, immediate = true) +@SearchProviderInfo(id = "osgi", targetTypes = {OsgiSearchProvider.TYPE_BUNDLE, OsgiSearchProvider.TYPE_SERVICE}) +public class OsgiSearchProvider extends AbstractSearchProvider { + + public static final String TYPE_BUNDLE = "bundle"; + + public static final String TYPE_SERVICE = "service"; + + public interface BundleSearch { + + String ATTR_ID = "id"; + String ATTR_LOCATION = "location"; + String ATTR_SYMBOLIC_NAME = "symbolicName"; + String ATTR_LAST_MODIFIED = "lastModified"; + + String ATTR_HEADER_PREFIX = "header."; + String ATTR_HEADER = ATTR_HEADER_PREFIX + "*"; + + List STANDARD_ATTRIBUTES_LIST = Arrays.asList(new String[] { + ATTR_ID, ATTR_SYMBOLIC_NAME, ATTR_LOCATION, ATTR_LAST_MODIFIED + }); + + Map STANDARD_ATTRIBUTES = MapUtils.putAll(new LinkedHashMap<>(), new String[][] { + {ATTR_ID, "Bundle Id"}, + {ATTR_LOCATION, "Bundle location"}, + {ATTR_SYMBOLIC_NAME, "Bundle symbolic name"}, + {ATTR_LAST_MODIFIED, "Bundle last modified timestamp"}, + {ATTR_HEADER, "Bundle header value"} + }); + } + + public interface ServiceSearch { + + String ATTR_ID = "service.id"; + String ATTR_OBJECT_CLASS = "objectClass"; + String ATTR_BUNDLE_ID = "service.bundleId"; + + + List STANDARD_ATTRIBUTES_LIST = Arrays.asList(new String[] { + ATTR_ID, ATTR_OBJECT_CLASS, ATTR_BUNDLE_ID + }); + + Map STANDARD_ATTRIBUTES = MapUtils.putAll(new LinkedHashMap<>(), new String[][] { + {ATTR_ID, "Service Id"}, + {ATTR_OBJECT_CLASS, "Service object class"}, + {ATTR_BUNDLE_ID, "Service bundle id"} + }); + } + + @Reference(cardinality = ReferenceCardinality.MANDATORY) + BundleService bundleService; + + protected BundleContext bundleContext; + + @Activate + public void activate(ComponentContext componentContext) { + this.bundleContext = componentContext.getBundleContext(); + } + + @Override + public List> search(String targetType, Filter filter) throws IllegalArgumentException { + if (TYPE_BUNDLE.equalsIgnoreCase(targetType)) + return searchBundles(filter); + if (TYPE_SERVICE.equalsIgnoreCase(targetType)) + try { + return searchServices(filter); + } catch (InvalidSyntaxException e) { + throw new IllegalArgumentException(String.format("Invalid filter: [%s]", filter.toString())); + } + + + throw new IllegalArgumentException( + String.format("Provider [%s]: target type [%s] not supported", getProviderId(), targetType)); + + + } + + @Override + public Map getStandardAttributes(String targetType) throws IllegalArgumentException { + if (TYPE_BUNDLE.equalsIgnoreCase(targetType)) + return BundleSearch.STANDARD_ATTRIBUTES; + + if (TYPE_SERVICE.equalsIgnoreCase(targetType)) + return ServiceSearch.STANDARD_ATTRIBUTES; + + throw new IllegalArgumentException( + String.format("Provider [%s]: target type [%s] not supported", getProviderId(), targetType)); + + } + + protected List> searchBundles(Filter filter) { + List> result = new ArrayList<>(); + for (Bundle b : bundleContext.getBundles()) { + Map essence = getBundleEssence(b); + if (filter.matches(essence)) + result.add(essence); + } + + return result; + } + + protected Map getBundleEssence(Bundle bundle) { + Map result = new LinkedHashMap<>(); + + BundleInfo bi = bundleService.getInfo(bundle); + + result.put(BundleSearch.ATTR_ID, bundle.getBundleId()); + result.put(BundleSearch.ATTR_SYMBOLIC_NAME, bundle.getSymbolicName()); + result.put(BundleSearch.ATTR_LOCATION, bi.getUpdateLocation()); + result.put(BundleSearch.ATTR_LAST_MODIFIED, bundle.getLastModified()); + + + Dictionary headers = bundle.getHeaders(); + Enumeration keys = headers.keys(); + while (keys.hasMoreElements()) { + String key = keys.nextElement(); + result.put(BundleSearch.ATTR_HEADER_PREFIX + key, headers.get(key)); + } + + return result; + } + + protected List> searchServices(Filter filter) throws InvalidSyntaxException { + + ServiceReference[] refs = bundleContext.getAllServiceReferences(null, filter.toString()); + + List> result = new ArrayList<>(); + for (ServiceReference ref : refs) { + result.add(getServiceEssence(ref)); + } + + return result; + } + + protected Map getServiceEssence(ServiceReference ref) { + Map result = new LinkedHashMap<>(); + + result.put(ServiceSearch.ATTR_ID, ref.getProperty(Constants.SERVICE_ID)); + Object refObjectClass = ref.getProperty(Constants.OBJECTCLASS); + if (refObjectClass == null || !(refObjectClass instanceof String[])) + result.put(ServiceSearch.ATTR_OBJECT_CLASS, ""); + else + result.put(ServiceSearch.ATTR_OBJECT_CLASS, Arrays.asList((String[]) refObjectClass)); + + result.put(ServiceSearch.ATTR_BUNDLE_ID, ref.getBundle().getBundleId()); + + String[] keys = ref.getPropertyKeys(); + for (String key : keys) + if (!ServiceSearch.STANDARD_ATTRIBUTES_LIST.contains(key)) + result.put(key, ref.getProperty(key)); + + return result; + } + +} diff --git a/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/shell/ProvidersList.java b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/shell/ProvidersList.java new file mode 100644 index 00000000..f2014716 --- /dev/null +++ b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/shell/ProvidersList.java @@ -0,0 +1,58 @@ +/*- + * ~~~~~~licensing~~~~~~ + * search-service + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.search.shell; + +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.base.support.karaf.shell.ShellTableExt; +import ru.entaxy.platform.search.SearchProvider; +import ru.entaxy.platform.search.shell.support.AbstractSearchCommand; + +@Service +@Command(scope = AbstractSearchCommand.COMMAND_SCOPE, name = "search-provider-list") +public class ProvidersList extends AbstractSearchCommand { + + @Override + protected void doExecute() throws Exception { + List list = searchService.getProviders(); + + ShellTableExt table = new ShellTableExt(); + table.column("Id"); + table.column("Supported types"); + + for (SearchProvider p : list) + table.addRow().addContent(p.getProviderId(), p.getTargetTypes().stream().collect(Collectors.joining("\n"))); + + // print output + table.print(System.out); + + } + +} diff --git a/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/shell/Search.java b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/shell/Search.java new file mode 100644 index 00000000..1d727277 --- /dev/null +++ b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/shell/Search.java @@ -0,0 +1,122 @@ +/*- + * ~~~~~~licensing~~~~~~ + * search-service + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.search.shell; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.apache.karaf.shell.api.action.Argument; +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.Option; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.base.support.karaf.shell.RowExt; +import ru.entaxy.platform.base.support.karaf.shell.ShellTableExt; +import ru.entaxy.platform.search.shell.support.AbstractSearchCommand; +import ru.entaxy.platform.search.shell.support.ObjectTypeAwareCommand; + +@Service +@Command(scope = AbstractSearchCommand.COMMAND_SCOPE, name = "search") +public class Search extends ObjectTypeAwareCommand { + + @Option(name = "-d", aliases = {"--display-attributes"}) + List attributes = new ArrayList<>(); + + @Option(name = "-n", aliases = {"--attribute-names-only"}) + boolean attributeNamesOnly = false; + + @Option(name = "-s", aliases = {"--no-split-lists"}) + boolean noSplitLists = false; + + @Argument(index = 1, required = true) + String filter; + + @Override + protected void doExecute() throws Exception { + + if (attributeNamesOnly) { + listAttributeNames(); + return; + } + + List> result = searchService.search(type, filter); + + ShellTableExt table = new ShellTableExt(); + table.splitLists(!noSplitLists); + + if (!attributes.isEmpty()) { + // fixed attributes + + List attrs = attributes.stream().distinct().collect(Collectors.toList()); + + for (String s : attrs) + table.column(s); + + for (Map essence : result) { + RowExt row = table.addRow(); + List data = new ArrayList<>(); + for (String s : attrs) + data.add(essence.getOrDefault(s, "")); + row.addContent(data); + } + + } else { + + List attrs = result.stream().map(s -> s.keySet()).flatMap(ks -> ks.stream()).distinct() + .collect(Collectors.toList()); + + for (String attr : attrs) + table.column(attr); + + for (Map essence : result) { + RowExt row = table.addRow(); + + List data = new ArrayList<>(); + for (String s : attrs) + data.add(essence.getOrDefault(s, "")); + row.addContent(data); + } + + + } + + // output + table.print(System.out); + + } + + protected void listAttributeNames() throws Exception { + List list = searchService.getAttributes(type, filter); + + // output + for (String s : list) + System.out.println(s); + + } + +} diff --git a/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/shell/StandardAttributes.java b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/shell/StandardAttributes.java new file mode 100644 index 00000000..ca3b228d --- /dev/null +++ b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/shell/StandardAttributes.java @@ -0,0 +1,57 @@ +/*- + * ~~~~~~licensing~~~~~~ + * search-service + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.search.shell; + +import java.util.Map; + +import org.apache.karaf.shell.api.action.Command; +import org.apache.karaf.shell.api.action.lifecycle.Service; + +import ru.entaxy.platform.base.support.karaf.shell.ShellTableExt; +import ru.entaxy.platform.search.shell.support.ObjectTypeAwareCommand; +import ru.entaxy.platform.search.shell.support.AbstractSearchCommand; + +@Service +@Command(name = "search-standard-atributes", scope = AbstractSearchCommand.COMMAND_SCOPE) +public class StandardAttributes extends ObjectTypeAwareCommand { + + @Override + protected void doExecute() throws Exception { + + ShellTableExt table = new ShellTableExt(); + + table.column("Attribute"); + table.column("Description"); + + for (Map.Entry entry : searchService.getStandardAttributes(type).entrySet()) + table.addRow().addContent(entry.getKey(), entry.getValue()); + + // output + table.print(System.out); + + } + +} diff --git a/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/shell/support/AbstractSearchCommand.java b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/shell/support/AbstractSearchCommand.java new file mode 100644 index 00000000..a757500f --- /dev/null +++ b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/shell/support/AbstractSearchCommand.java @@ -0,0 +1,51 @@ +/*- + * ~~~~~~licensing~~~~~~ + * search-service + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.search.shell.support; + +import org.apache.karaf.shell.api.action.Action; + +public abstract class AbstractSearchCommand extends SearchServiceSupport implements Action { + + public static final String COMMAND_SCOPE = "entaxy"; + + @Override + public Object execute() throws Exception { + + try { + doExecute(); + } catch (Exception e) { + + // output error + System.err.println(String.format("ERROR: [%s]\n --> %s", e.getClass().getName(), e.getMessage())); + + } + + return null; + } + + abstract protected void doExecute() throws Exception; + +} diff --git a/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/shell/support/ObjectTypeAwareCommand.java b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/shell/support/ObjectTypeAwareCommand.java new file mode 100644 index 00000000..0d5e601f --- /dev/null +++ b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/shell/support/ObjectTypeAwareCommand.java @@ -0,0 +1,37 @@ +/*- + * ~~~~~~licensing~~~~~~ + * search-service + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.search.shell.support; + +import org.apache.karaf.shell.api.action.Argument; +import org.apache.karaf.shell.api.action.Completion; + +public abstract class ObjectTypeAwareCommand extends AbstractSearchCommand { + + @Argument(index = 0, required = true) + @Completion(caseSensitive = false, value = ObjectTypeCompleter.class) + public String type; + +} diff --git a/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/shell/support/ObjectTypeCompleter.java b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/shell/support/ObjectTypeCompleter.java new file mode 100644 index 00000000..4f200633 --- /dev/null +++ b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/shell/support/ObjectTypeCompleter.java @@ -0,0 +1,44 @@ +/*- + * ~~~~~~licensing~~~~~~ + * search-service + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.search.shell.support; + +import java.util.List; + +import org.apache.karaf.shell.api.action.lifecycle.Service; +import org.apache.karaf.shell.api.console.CommandLine; +import org.apache.karaf.shell.api.console.Completer; +import org.apache.karaf.shell.api.console.Session; + +@Service +public class ObjectTypeCompleter extends SearchServiceSupport implements Completer { + + @Override + public int complete(Session session, CommandLine commandLine, List candidates) { + candidates.addAll(searchService.getProvidedTypes()); + return 0; + } + +} diff --git a/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/shell/support/SearchServiceSupport.java b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/shell/support/SearchServiceSupport.java new file mode 100644 index 00000000..6a6af021 --- /dev/null +++ b/platform/runtime/base/search-service/src/main/java/ru/entaxy/platform/search/shell/support/SearchServiceSupport.java @@ -0,0 +1,37 @@ +/*- + * ~~~~~~licensing~~~~~~ + * search-service + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.search.shell.support; + +import org.apache.karaf.shell.api.action.lifecycle.Reference; + +import ru.entaxy.platform.search.SearchService; + +public class SearchServiceSupport { + + @Reference + public SearchService searchService; + +} diff --git a/platform/runtime/base/src/main/features/features.xml b/platform/runtime/base/src/main/features/features.xml index 499e8e9e..a540fc61 100644 --- a/platform/runtime/base/src/main/features/features.xml +++ b/platform/runtime/base/src/main/features/features.xml @@ -3,7 +3,7 @@ ~~~~~~licensing~~~~~~ base ========== - Copyright (C) 2020 - 2024 EmDev LLC + Copyright (C) 2020 - 2025 EmDev LLC ========== You may not use this file except in accordance with the License Terms of the Copyright Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property @@ -78,7 +78,7 @@ - mvn:ru.entaxy.platform.logging/cef-logger-layout/${project.version} + mvn:ru.entaxy.platform.logging/cef-logger-layout/${project.version} entaxy-underlying-configuration diff --git a/platform/runtime/base/src/main/features/support.xml b/platform/runtime/base/src/main/features/support.xml index f2029dc8..0a383916 100644 --- a/platform/runtime/base/src/main/features/support.xml +++ b/platform/runtime/base/src/main/features/support.xml @@ -3,7 +3,7 @@ ~~~~~~licensing~~~~~~ base ========== - Copyright (C) 2020 - 2024 EmDev LLC + Copyright (C) 2020 - 2025 EmDev LLC ========== You may not use this file except in accordance with the License Terms of the Copyright Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property @@ -39,8 +39,11 @@ mvn:ru.entaxy.esb.system/system-parent/${project.version}/xml/basics --> - - mvn:ru.entaxy.platform.logging/cef-logger-layout/${project.version} + + mvn:com.fasterxml.jackson.core/jackson-annotations/${jackson.version} + mvn:com.fasterxml.jackson.core/jackson-core/${jackson.version} + mvn:com.fasterxml.jackson.core/jackson-databind/${jackson.version} + mvn:ru.entaxy.platform.logging/cef-logger-layout/${project.version} diff --git a/platform/runtime/core/artifact-management-extensions/LICENSE.txt b/platform/runtime/core/artifact-management-extensions/LICENSE.txt new file mode 100644 index 00000000..4ae94b75 --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/LICENSE.txt @@ -0,0 +1,175 @@ + ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ + +Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой) +версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего +Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН +7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова, +д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу +https://www.emdev.ru/about (далее - Компания). + +Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями» +(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения, +Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в +настоящем документе, в противном случае, он должен не использовать или не получать доступ +к Программному обеспечению. + + 1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ + +a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии +или редакции, исключительные права на которую принадлежат Правообладателю. +b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные +права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ +для ЭВМ № 2021610848 от 19.01.2021 года. +c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта +https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО. +d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также +личные неимущественные права авторов произведений на результат интеллектуальной деятельности. +e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование +ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка +включает предоставление Пользователю неисключительного права использования ПО, в том числе +получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение +патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается +Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается +для каждого Пользователя индивидуально в Сертификате. +f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром), +подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное +обеспечение в ограниченном объёме и на определённый период времени. +g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО, +предоставленных Пользователю согласно условиям Подписки. +h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного +обеспечения. +i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий +из одного или нескольких файлов, который может быть прочтён человеком. +j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля +программы, полученный в результате обработки исходного кода, еще не связанный в полную программу. +Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый +продукт. +k) Некоммерческое использование – индивидуальное личное использование Пользователем программного +обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации +возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая +выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения. + + 2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ + +2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного +обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом +воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения +в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ. +2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит +неисключительный характер. +2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию, +лицензия на ограниченное использование Программного обеспечения. +2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования +имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан +обратиться в службу поддержки Правообладателя по адресу: https://entaxy.ru/ для изменения +вида лицензии с Базовой бесплатной версии на Подписки. +2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для +пробного использования программного обеспечения – не ограничен. +2.6. Использование Пользователем настоящего программного обеспечения в целях разработки, +модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю, +без разрешения Правообладателя не допускается. + + 3. АВТОРСКОЕ ПРАВО. + +3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение +и любые его копии принадлежат Правообладателю. +3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента, +к которому можно получить доступ с помощью Программного обеспечения, является собственностью +соответствующего владельца контента и защищается применимым законодательством об авторском +праве или другими законами и договорами об интеллектуальной собственности. +3.3. Условия использования Программного обеспечения. +Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь +придерживается следующих условий: +3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять +какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании +Программного обеспечения или на нем. +3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать, +расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать +Программное обеспечение. +3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования +ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне. +3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено +использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам. + + 4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС» + +4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю +на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с +использованием Пользователем: +4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в +Программное обеспечение; +4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями +настоящего соглашения; +4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием, +или данными, не предоставленными Пользователю Правообладателем; +4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем. + + +5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ +ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ +И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ +ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ +И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ +ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО. + + 6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ. +НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ +ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ, +ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ; +ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ. +ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ +ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ; +КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ +ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ. + + 7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ: +Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия +(включая, но не ограничиваясь) по: +-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код) + Программного обеспечения; +-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный +код Программного обеспечения, за исключением тех изменений, которые вносятся средствами, +включёнными в Программное обеспечение и описанными непосредственно в документации к нему; +-созданию условий для использования Программного обеспечения лицами, не имеющими прав на +использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство +третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа +к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку; +-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию). + + 8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА. + +8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из +лицензионных продуктов, используемых на законных основаниях, а +именно https://entaxy.ru/libs/licenses/root-aggregated.deps. +8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть +совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения. +8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться +Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения, +содержащих все изменения и дополнения программного обеспечения. + + 9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ. + +9.1. Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым +программным обеспечением. +9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно +с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм +«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public. +9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий +пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя, +прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер +ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства +Российской Федерации. + + 10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ. + +10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет +право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб, +недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий +пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере +2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения +исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy). +10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое +законодательство – Российской Федерации. +10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным, +остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать +исполнять свои обязанности в соответствии с этими положениями. diff --git a/platform/runtime/core/artifact-management-extensions/pom.xml b/platform/runtime/core/artifact-management-extensions/pom.xml new file mode 100644 index 00000000..adc8b370 --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/pom.xml @@ -0,0 +1,61 @@ + + 4.0.0 + + ru.entaxy.esb.platform.runtime + core + 1.11.0 + + ru.entaxy.esb.platform.runtime.core + artifact-management-extensions + bundle + ENTAXY :: PLATFORM :: CORE :: ARTIFACT MANAGEMENT EXTENSIONS + ENTAXY :: PLATFORM :: CORE :: ARTIFACT MANAGEMENT EXTENSIONS + + + + ru.entaxy.platform.core.artifact.ext.binary, + ru.entaxy.platform.core.artifact.ext.features, + ru.entaxy.platform.core.artifact.ext.impl, + ru.entaxy.platform.core.artifact.ext + + + ru.entaxy.platform.core.artifact.ext.internal, + ru.entaxy.platform.core.artifact.ext.features.impl, + ru.entaxy.platform.core.artifact.ext.binary.impl, + + + *, + org.apache.karaf.cellar.bundle + + + + + + + ru.entaxy.esb.platform.runtime.core + artifact-management + ${project.version} + + + commons-io + commons-io + ${commons-io.version} + + + org.apache.karaf.features + org.apache.karaf.features.core + ${karaf.version} + + + org.apache.karaf.cellar + org.apache.karaf.cellar.features + ${cellar.version} + + + ru.entaxy.esb.platform.runtime.base + cellar-extensions + ${project.version} + + + + diff --git a/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/ArtifactExtended.java b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/ArtifactExtended.java new file mode 100644 index 00000000..09e43eec --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/ArtifactExtended.java @@ -0,0 +1,33 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.ext; + +public interface ArtifactExtended { + + String ARTIFACT_CATEGORY_UNTYPED_BINARY = "UNTYPED_BINARY"; + String ARTIFACT_CATEGORY_FEATURE = "FEATURE"; + +} diff --git a/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/ExtTypedInstallerFactory.java b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/ExtTypedInstallerFactory.java new file mode 100644 index 00000000..9255acb3 --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/ExtTypedInstallerFactory.java @@ -0,0 +1,67 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.ext; + +import ru.entaxy.platform.core.artifact.Artifact; +import ru.entaxy.platform.core.artifact.ext.binary.UntypedBinaryInstaller; +import ru.entaxy.platform.core.artifact.ext.binary.impl.UntypedBinaryInstallerImpl; +import ru.entaxy.platform.core.artifact.ext.features.FeatureInstaller; +import ru.entaxy.platform.core.artifact.ext.features.FeaturesInstaller; +import ru.entaxy.platform.core.artifact.ext.features.impl.FeatureInstallerImpl; +import ru.entaxy.platform.core.artifact.ext.features.impl.FeaturesInstallerImpl; +import ru.entaxy.platform.core.artifact.installer.builder.typed.AbstractTypedInstallerFactory; +import ru.entaxy.platform.core.artifact.installer.builder.typed.TypedInstaller; +import ru.entaxy.platform.core.artifact.installer.builder.typed.TypedInstallerFactoryDescriptor; + +@TypedInstallerFactoryDescriptor( + supportedClasses = {FeaturesInstaller.class, FeatureInstaller.class, UntypedBinaryInstaller.class}, + supportedTypes = {Artifact.ARTIFACT_CATEGORY_FEATURES, ArtifactExtended.ARTIFACT_CATEGORY_FEATURE, + ArtifactExtended.ARTIFACT_CATEGORY_UNTYPED_BINARY}) +public class ExtTypedInstallerFactory extends AbstractTypedInstallerFactory { + + @Override + protected TypedInstaller doCreate(String type) { + if (Artifact.ARTIFACT_CATEGORY_FEATURES.equalsIgnoreCase(type)) { + return new FeaturesInstallerImpl(); + } + if (ArtifactExtended.ARTIFACT_CATEGORY_UNTYPED_BINARY.equalsIgnoreCase(type)) { + return new UntypedBinaryInstallerImpl(); + } + return null; + } + + @Override + protected TypedInstaller doCreate(Class targetClass) { + if (FeaturesInstaller.class.equals(targetClass)) + return new FeaturesInstallerImpl(); + if (FeatureInstaller.class.equals(targetClass)) + return new FeatureInstallerImpl(); + if (UntypedBinaryInstaller.class.equals(targetClass)) + return new UntypedBinaryInstallerImpl(); + return null; + } + +} diff --git a/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/SequenceSupport.java b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/SequenceSupport.java new file mode 100644 index 00000000..84ad384a --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/SequenceSupport.java @@ -0,0 +1,32 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.ext; + +public interface SequenceSupport { + + T inSequence(String sequenceId); + +} diff --git a/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/AbstractBinaryArtifact.java b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/AbstractBinaryArtifact.java new file mode 100644 index 00000000..6a571c48 --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/AbstractBinaryArtifact.java @@ -0,0 +1,135 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.ext.binary; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; + +import org.apache.commons.io.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ru.entaxy.platform.core.artifact.DefaultArtifact; + +/** + * Allowed content types: InputStream, File, byte[] + */ +public abstract class AbstractBinaryArtifact extends DefaultArtifact { + + private static final Logger LOG = LoggerFactory.getLogger(AbstractBinaryArtifact.class); + + @Override + public void setContent(Object content) { + super.setContent(content); + } + + @Override + public void toFile(File destination) { + if (content == null) + return; + + if (content instanceof File) { + try { + Files.copy(((File) content).getAbsoluteFile().toPath(), destination.getAbsoluteFile().toPath(), + StandardCopyOption.REPLACE_EXISTING); + } catch (IOException e) { + LOG.error("Error saving file", e); + } + return; + } + + if (content instanceof InputStream) { + try { + InputStream is = (InputStream) content; + if (is.markSupported()) { + is.mark(0); + } + Files.copy((InputStream) content, destination.getAbsoluteFile().toPath(), + StandardCopyOption.REPLACE_EXISTING); + if (is.markSupported()) { + is.reset(); + } + } catch (IOException e) { + LOG.error("Error saving file", e); + } + return; + } + + if (content instanceof byte[]) { + try (InputStream is = new ByteArrayInputStream((byte[]) content)) { + Files.copy(is, destination.getAbsoluteFile().toPath(), + StandardCopyOption.REPLACE_EXISTING); + } catch (IOException e) { + LOG.error("Error saving file", e); + } + return; + } + + super.toFile(destination); + } + + @Override + public byte[] asByteArray() { + if (content == null) + return new byte[0]; + + if (content instanceof byte[]) + return (byte[]) content; + + if (content instanceof InputStream) + try { + byte[] byteArray; + InputStream is = (InputStream) content; + if (is.markSupported()) { + is.mark(0); + } + byteArray = IOUtils.toByteArray(is); + if (is.markSupported()) { + is.reset(); + } + return byteArray; + } catch (IOException e) { + LOG.error("Error getting bytes", e); + return new byte[0]; + } + + if (content instanceof File) + try (InputStream is = new FileInputStream((File) content)) { + return IOUtils.toByteArray(is); + } catch (Exception e) { + LOG.error("Error getting bytes", e); + return new byte[0]; + } + + return super.asByteArray(); + } + +} diff --git a/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/JarArtifact.java b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/JarArtifact.java new file mode 100644 index 00000000..c0189098 --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/JarArtifact.java @@ -0,0 +1,39 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.ext.binary; + +import java.io.File; +import java.io.InputStream; + +import ru.entaxy.platform.core.artifact.Artifact; +import ru.entaxy.platform.core.artifact.annotation.ArtifactSupport; + +@ArtifactSupport(supportedCategory = Artifact.ARTIFACT_CATEGORY_JAR, + supportedContentClasses = {File.class, InputStream.class, byte[].class}, + defaultArtifactType = "jar") +public class JarArtifact extends AbstractBinaryArtifact { + +} diff --git a/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/UntypedBinaryArtifact.java b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/UntypedBinaryArtifact.java new file mode 100644 index 00000000..14d36e1f --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/UntypedBinaryArtifact.java @@ -0,0 +1,39 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.ext.binary; + +import java.io.File; +import java.io.InputStream; + +import ru.entaxy.platform.core.artifact.annotation.ArtifactSupport; +import ru.entaxy.platform.core.artifact.ext.ArtifactExtended; + +@ArtifactSupport(supportedCategory = ArtifactExtended.ARTIFACT_CATEGORY_UNTYPED_BINARY, + supportedContentClasses = {File.class, InputStream.class, byte[].class}, + defaultArtifactType = "jar") +public class UntypedBinaryArtifact extends AbstractBinaryArtifact { + +} diff --git a/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/UntypedBinaryInstaller.java b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/UntypedBinaryInstaller.java new file mode 100644 index 00000000..1e7aab6b --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/UntypedBinaryInstaller.java @@ -0,0 +1,32 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.ext.binary; + +import ru.entaxy.platform.core.artifact.installer.builder.typed.CommonBundleInstaller; + +public interface UntypedBinaryInstaller extends CommonBundleInstaller { + +} diff --git a/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/impl/UntypedBinaryInstallerHelperCellar.java b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/impl/UntypedBinaryInstallerHelperCellar.java new file mode 100644 index 00000000..e9203bac --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/impl/UntypedBinaryInstallerHelperCellar.java @@ -0,0 +1,32 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.ext.binary.impl; + +import ru.entaxy.platform.core.artifact.installer.builder.impl.cluster.ClusterCommonBundleInstallerHelper; + +public class UntypedBinaryInstallerHelperCellar extends ClusterCommonBundleInstallerHelper { + +} diff --git a/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/impl/UntypedBinaryInstallerHelperConfig.java b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/impl/UntypedBinaryInstallerHelperConfig.java new file mode 100644 index 00000000..da43b4d7 --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/impl/UntypedBinaryInstallerHelperConfig.java @@ -0,0 +1,32 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.ext.binary.impl; + +import ru.entaxy.platform.core.artifact.installer.builder.typed.impl.CommonBundleInstallerHelperConfig; + +public interface UntypedBinaryInstallerHelperConfig extends CommonBundleInstallerHelperConfig { + +} diff --git a/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/impl/UntypedBinaryInstallerHelperLocal.java b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/impl/UntypedBinaryInstallerHelperLocal.java new file mode 100644 index 00000000..ff54e5c5 --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/impl/UntypedBinaryInstallerHelperLocal.java @@ -0,0 +1,32 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.ext.binary.impl; + +import ru.entaxy.platform.core.artifact.installer.builder.impl.local.LocalCommonBundleInstallerHelper; + +public class UntypedBinaryInstallerHelperLocal extends LocalCommonBundleInstallerHelper { + +} diff --git a/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/impl/UntypedBinaryInstallerImpl.java b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/impl/UntypedBinaryInstallerImpl.java new file mode 100644 index 00000000..e60f9acd --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/binary/impl/UntypedBinaryInstallerImpl.java @@ -0,0 +1,44 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.ext.binary.impl; + +import ru.entaxy.platform.core.artifact.ext.binary.UntypedBinaryInstaller; +import ru.entaxy.platform.core.artifact.installer.builder.impl.cluster.ClusterTypedInstallerHelper; +import ru.entaxy.platform.core.artifact.installer.builder.typed.impl.CommonBundleInstallerImpl; +import ru.entaxy.platform.core.artifact.installer.builder.typed.impl.HelperCreator; +import ru.entaxy.platform.core.artifact.installer.builder.typed.impl.TypedInstallerHelperImpl; + +public class UntypedBinaryInstallerImpl extends CommonBundleInstallerImpl + implements UntypedBinaryInstaller, UntypedBinaryInstallerHelperConfig, HelperCreator { + + @Override + public H createHelper(Class targetClass) { + if (ClusterTypedInstallerHelper.class.isAssignableFrom(targetClass)) + return (H) new UntypedBinaryInstallerHelperCellar(); + return (H) new UntypedBinaryInstallerHelperLocal(); + } + +} diff --git a/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/FeatureInstaller.java b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/FeatureInstaller.java new file mode 100644 index 00000000..6618a7ce --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/FeatureInstaller.java @@ -0,0 +1,51 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.ext.features; + +import ru.entaxy.platform.core.artifact.ext.SequenceSupport; +import ru.entaxy.platform.core.artifact.installer.builder.typed.TypedInstaller; + +public interface FeatureInstaller extends TypedInstaller, SequenceSupport { + + public interface FeatureInstallDescriptor extends TypedInstaller { + + FeatureInstallDescriptor version(String version); + + FeatureInstallDescriptor noRefresh(); + + FeatureInstallDescriptor noStart(); + + FeatureInstallDescriptor noManage(); + + FeatureInstallDescriptor upgrade(); + + + FeatureInstallDescriptor feature(String name); + } + + FeatureInstallDescriptor feature(String name); + +} diff --git a/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/FeaturesArtifact.java b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/FeaturesArtifact.java new file mode 100644 index 00000000..aeb1b70e --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/FeaturesArtifact.java @@ -0,0 +1,77 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.ext.features; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.w3c.dom.Document; + +import ru.entaxy.platform.base.support.xml.CommonXMLUtils; +import ru.entaxy.platform.core.artifact.Artifact; +import ru.entaxy.platform.core.artifact.annotation.ArtifactSupport; +import ru.entaxy.platform.core.artifact.ext.binary.AbstractBinaryArtifact; + +@ArtifactSupport(supportedCategory = Artifact.ARTIFACT_CATEGORY_FEATURES, + supportedContentClasses = {File.class, InputStream.class, byte[].class, Document.class, String.class}, + defaultArtifactType = "xml") +public class FeaturesArtifact extends AbstractBinaryArtifact { + + private static final Logger LOG = LoggerFactory.getLogger(FeaturesArtifact.class); + + @Override + public void toFile(File destination) { + if (content == null) + return; + + if (content instanceof Document) { + String data = null; + try { + data = CommonXMLUtils.doc2string((Document) content); + } catch (Exception e) { + LOG.error("Error converting Document to String for artifact [" + getCoordinates().toMavenString() + "]", + e); + return; + } + try (InputStream is = new ByteArrayInputStream(data.getBytes())) { + Files.copy(is, destination.getAbsoluteFile().toPath(), + StandardCopyOption.REPLACE_EXISTING); + } catch (Exception e) { + LOG.error("Error saving to file for artifact [" + getCoordinates().toMavenString() + "]", e); + return; + } + return; + } + + super.toFile(destination); + } + +} diff --git a/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/FeaturesInstaller.java b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/FeaturesInstaller.java new file mode 100644 index 00000000..11e51897 --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/FeaturesInstaller.java @@ -0,0 +1,39 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.ext.features; + +import ru.entaxy.platform.core.artifact.ext.SequenceSupport; +import ru.entaxy.platform.core.artifact.installer.builder.typed.TypedInstaller; + +public interface FeaturesInstaller extends TypedInstaller, SequenceSupport { + + FeaturesInstaller installAllFeatures(); + + FeaturesInstaller refresh(); + + FeaturesInstaller installFeatures(String... features); + +} diff --git a/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/CellarFeaturesInstallerHelper.java b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/CellarFeaturesInstallerHelper.java new file mode 100644 index 00000000..5b8c0158 --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/CellarFeaturesInstallerHelper.java @@ -0,0 +1,121 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.ext.features.impl; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.karaf.cellar.features.management.CellarFeaturesMBean; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ru.entaxy.platform.base.support.CommonUtils; +import ru.entaxy.platform.base.support.osgi.OSGIUtils; +import ru.entaxy.platform.core.artifact.installer.builder.impl.InstallationResultImpl; +import ru.entaxy.platform.core.artifact.installer.builder.impl.cluster.ClusterTypedInstallerHelper; +import ru.entaxy.platform.runtime.cellar.sequence.CellarSequenceManager; + +public class CellarFeaturesInstallerHelper extends ClusterTypedInstallerHelper + implements FeaturesInstallerConfigurableHelper { + + private static final Logger LOG = LoggerFactory.getLogger(CellarFeaturesInstallerHelper.class); + + protected FeaturesInstallerHelperConfig config; + + public FeaturesInstallerHelperConfig getConfig() { + return config; + } + + @Override + public void setConfig(FeaturesInstallerHelperConfig config) { + this.config = config; + } + + protected CellarFeaturesMBean getFeaturesService() throws Exception { + if (CommonUtils.isValid(config.getSequenceId())) { + CellarSequenceManager seqManager = + OSGIUtils.services().ofClass(CellarSequenceManager.class).waitService(2000).get(); + + return seqManager.getSequencedHelper(config.getSequenceId(), CellarFeaturesMBean.class); + + } + return OSGIUtils.services().ofClass(CellarFeaturesMBean.class).waitService(2000).get(); + } + + @Override + public InstallationResultImpl install(InstallationResultImpl installationResult) { + CellarFeaturesMBean featuresService; + try { + featuresService = getFeaturesService(); + } catch (Exception e) { + LOG.error("Error getting CellarFeaturesMBean service", e); + return installationResult.failed("Error getting CellarFeaturesMBean service").error(e); + } + + List groupsToInstall = new ArrayList<>(); + for (String groupName : getGroups()) + if (checkGroup(groupName)) + if (!groupsToInstall.contains(groupName)) + groupsToInstall.add(groupName); + + if (groupsToInstall.size() == 0) { + return installationResult.failed("No groups to install to"); + } + + // TODO decide if we really need several groups + // now we use only the first one + String groupToInstall = groupsToInstall.get(0); + + String repositoryUrl = config.getSourceLocation(); + if (repositoryUrl.indexOf(':') < 0) + repositoryUrl = "mvn:" + repositoryUrl; + + try { + if (featuresService.getRepositories(groupToInstall).contains(repositoryUrl)) { + if (config.isRefresh()) + featuresService.refreshRepository(groupToInstall, repositoryUrl); + } else { + featuresService.addRepository(groupToInstall, repositoryUrl, null, config.isInstallAllFetures()); + } + + if (!config.isInstallAllFetures()) + for (String feature : config.getFeaturesToInstall()) + featuresService.installFeature(groupToInstall, feature); + + return installationResult.installed(); + } catch (Exception e) { + LOG.error("Error installing repository [" + repositoryUrl + "]", e); + return installationResult.failed("Error installing repository [" + repositoryUrl + "]").error(e); + } + } + + @Override + public InstallationResultImpl uninstall(InstallationResultImpl installationResult) { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeatureInstallerClusterHelper.java b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeatureInstallerClusterHelper.java new file mode 100644 index 00000000..1d688b6a --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeatureInstallerClusterHelper.java @@ -0,0 +1,192 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.ext.features.impl; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.karaf.cellar.features.management.CellarFeaturesMBean; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ru.entaxy.platform.base.support.CommonUtils; +import ru.entaxy.platform.base.support.osgi.OSGIUtils; +import ru.entaxy.platform.core.artifact.ext.features.impl.FeatureInstallerImpl.FeatureInstallDescriptorImpl; +import ru.entaxy.platform.core.artifact.ext.impl.ClusterTypedConfigurableHelper; +import ru.entaxy.platform.core.artifact.installer.builder.impl.InstallationResultImpl; +import ru.entaxy.platform.runtime.cellar.sequence.CellarSequenceManager; + +public class FeatureInstallerClusterHelper extends ClusterTypedConfigurableHelper + implements FeatureInstallerConfigurableHelper { + + private static final Logger LOG = LoggerFactory.getLogger(FeatureInstallerClusterHelper.class); + + protected CellarFeaturesMBean getFeaturesService() throws Exception { + if (CommonUtils.isValid(config.sequenceId)) { + CellarSequenceManager seqManager = + OSGIUtils.services().ofClass(CellarSequenceManager.class).waitService(2000).get(); + + return seqManager.getSequencedHelper(config.sequenceId, CellarFeaturesMBean.class); + + } + return OSGIUtils.services().ofClass(CellarFeaturesMBean.class).waitService(2000).get(); + } + + @Override + public InstallationResultImpl install(InstallationResultImpl installationResult) { + CellarFeaturesMBean featuresService; + try { + featuresService = getFeaturesService(); + } catch (Exception e) { + LOG.error("Error getting CellarFeaturesMBean service", e); + return installationResult.failed("Error getting CellarFeaturesMBean service").error(e); + } + + List groupsToInstall = new ArrayList<>(); + for (String groupName : getGroups()) + if (checkGroup(groupName)) + if (!groupsToInstall.contains(groupName)) + groupsToInstall.add(groupName); + + if (groupsToInstall.size() == 0) { + return installationResult.failed("No groups to install to"); + } + + // TODO decide if we really need several groups + // now we use only the first one + String groupToInstall = groupsToInstall.get(0); + + boolean hasFailed = false; + boolean hasSuccessfull = false; + + + for (FeatureInstallDescriptorImpl descriptor : config.descriptors.values()) { + InstallationResultImpl subResult = InstallationResultImpl.create(); + subResult.object(descriptor.featureName); + try { + + // convert version to OSGI-style version + // mj.mn.p-q -> mj.mn.p.q + String finalFeatureVersion = descriptor.featureVersion; + if (CommonUtils.isValid(finalFeatureVersion)) { + finalFeatureVersion = finalFeatureVersion.replace('-', '.'); + } + + featuresService.installFeature(groupToInstall, descriptor.featureName, + finalFeatureVersion, + descriptor.noRefresh, + descriptor.noStart, + descriptor.noManage, + descriptor.upgrade); + subResult.installed(); + hasSuccessfull = true; + } catch (Exception e) { + LOG.error("Error installing repository [" + descriptor.featureName + "]", e); + subResult.failed("Error installing feature [" + descriptor.featureName + "]").error(e); + hasFailed = true; + } + installationResult.subResult(subResult); + } + + if (!hasFailed) + installationResult.installed(); + else { + if (hasSuccessfull) { + installationResult.message("HAS FAILED SUBRESULTS"); + installationResult.installed(); + } else { + installationResult.failed(); + } + } + return installationResult; + } + + @Override + public InstallationResultImpl uninstall(InstallationResultImpl installationResult) { + CellarFeaturesMBean featuresService; + try { + featuresService = getFeaturesService(); + } catch (Exception e) { + LOG.error("Error getting CellarFeaturesMBean service", e); + return installationResult.failed("Error getting CellarFeaturesMBean service").error(e); + } + + List groupsToUninstall = new ArrayList<>(); + for (String groupName : getGroups()) + if (checkGroup(groupName)) + if (!groupsToUninstall.contains(groupName)) + groupsToUninstall.add(groupName); + + if (groupsToUninstall.size() == 0) { + return installationResult.failed("No groups to uninstall from"); + } + + // TODO decide if we really need several groups + // now we use only the first one + String groupToUninstall = groupsToUninstall.get(0); + + boolean hasFailed = false; + boolean hasSuccessfull = false; + + + for (FeatureInstallDescriptorImpl descriptor : config.descriptors.values()) { + InstallationResultImpl subResult = InstallationResultImpl.create(); + subResult.object(descriptor.featureName); + try { + + // convert version to OSGI-style version + // mj.mn.p-q -> mj.mn.p.q + String finalFeatureVersion = descriptor.featureVersion; + if (CommonUtils.isValid(finalFeatureVersion)) { + finalFeatureVersion = finalFeatureVersion.replace('-', '.'); + } + + featuresService.uninstallFeature(groupToUninstall, descriptor.featureName, finalFeatureVersion, + descriptor.noRefresh); + subResult.uninstalled(); + hasSuccessfull = true; + } catch (Exception e) { + LOG.error("Error uninstalling repository [" + descriptor.featureName + "]", e); + subResult.failed("Error uninstalling feature [" + descriptor.featureName + "]").error(e); + hasFailed = true; + } + installationResult.subResult(subResult); + } + + if (!hasFailed) + installationResult.uninstalled(); + else { + if (hasSuccessfull) { + installationResult.message("HAS FAILED SUBRESULTS"); + installationResult.uninstalled(); + } else { + installationResult.failed(); + } + } + return installationResult; + } + +} diff --git a/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeatureInstallerConfigurableHelper.java b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeatureInstallerConfigurableHelper.java new file mode 100644 index 00000000..e7dcfa7f --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeatureInstallerConfigurableHelper.java @@ -0,0 +1,36 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.ext.features.impl; + +import ru.entaxy.platform.core.artifact.ext.impl.InstallerConfigurableHelper; + +public interface FeatureInstallerConfigurableHelper extends InstallerConfigurableHelper { + + @Override + default Class getConfigClass() { + return FeatureInstallerImpl.class; + } +} diff --git a/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeatureInstallerImpl.java b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeatureInstallerImpl.java new file mode 100644 index 00000000..ad127a95 --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeatureInstallerImpl.java @@ -0,0 +1,172 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.ext.features.impl; + +import java.util.HashMap; +import java.util.Map; + +import ru.entaxy.platform.core.artifact.DeployedArtifact; +import ru.entaxy.platform.core.artifact.ext.features.FeatureInstaller; +import ru.entaxy.platform.core.artifact.ext.impl.ExtendedTypedInstallerImpl; +import ru.entaxy.platform.core.artifact.installer.builder.InstallationResult; +import ru.entaxy.platform.core.artifact.installer.builder.typed.impl.TypedInstallerHelperImpl; + +public class FeatureInstallerImpl + extends ExtendedTypedInstallerImpl + implements FeatureInstaller { + + protected static class FeatureInstallDescriptorImpl implements FeatureInstallDescriptor { + + FeatureInstallerImpl featureInstaller; + + String featureName; + String featureVersion; + + boolean noStart = false; + boolean noRefresh = false; + boolean noManage = false; + boolean upgrade = false; + + protected FeatureInstallDescriptorImpl(FeatureInstallerImpl featureInstaller, String name) { + this.featureInstaller = featureInstaller; + this.featureName = name; + } + + @Override + public void clearInstaller() { + featureInstaller.clearInstaller(); + } + + @Override + public void setSourceLocation(String sourceLocation) {} + + @Override + public String getSourceLocation() { + return featureInstaller.getSourceLocation(); + } + + @Override + public void setArtifact(DeployedArtifact artifact) { + featureInstaller.setArtifact(artifact); + } + + @Override + public DeployedArtifact getArtifact() { + return featureInstaller.getArtifact(); + } + + @Override + public String getTypedName() { + return featureInstaller.getTypedName(); + } + + @Override + public void setTypedName(String typedName) { + featureInstaller.setTypedName(typedName); + } + + @Override + public InstallationResult install() { + return featureInstaller.install(); + } + + @Override + public InstallationResult uninstall() { + return featureInstaller.uninstall(); + } + + @Override + public FeatureInstallDescriptor version(String version) { + this.featureVersion = version; + return this; + } + + @Override + public FeatureInstallDescriptor noRefresh() { + this.noRefresh = true; + return this; + } + + @Override + public FeatureInstallDescriptor noStart() { + this.noStart = true; + return this; + } + + @Override + public FeatureInstallDescriptor noManage() { + this.noManage = true; + return this; + } + + @Override + public FeatureInstallDescriptor upgrade() { + this.upgrade = true; + return this; + } + + @Override + public FeatureInstallDescriptor feature(String name) { + return featureInstaller.feature(name); + } + + } + + protected final Map descriptors = new HashMap<>(); + + protected String sequenceId = null; + + @Override + public FeatureInstaller inSequence(String sequenceId) { + this.sequenceId = sequenceId; + return this; + } + + @Override + public FeatureInstallDescriptor feature(String name) { + if (descriptors.containsKey(name)) + return descriptors.get(name); + FeatureInstallDescriptorImpl descriptor = new FeatureInstallDescriptorImpl(this, name); + descriptors.put(name, descriptor); + return descriptor; + } + + @Override + protected Class getHelperClass() { + return FeatureInstallerConfigurableHelper.class; + } + + @Override + protected H createClusterHelper(Class targetClass) { + return (H) new FeatureInstallerClusterHelper(); + } + + @Override + protected H createLocalHelper(Class targetClass) { + return (H) new FeatureInstallerLocalHelper(); + } + +} diff --git a/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeatureInstallerLocalHelper.java b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeatureInstallerLocalHelper.java new file mode 100644 index 00000000..ff47a9c3 --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeatureInstallerLocalHelper.java @@ -0,0 +1,46 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.ext.features.impl; + +import ru.entaxy.platform.core.artifact.ext.impl.LocalTypedConfigurableHelper; +import ru.entaxy.platform.core.artifact.installer.builder.impl.InstallationResultImpl; + +public class FeatureInstallerLocalHelper extends LocalTypedConfigurableHelper + implements FeatureInstallerConfigurableHelper { + + @Override + public InstallationResultImpl install(InstallationResultImpl installationResult) { + // TODO Auto-generated method stub + return null; + } + + @Override + public InstallationResultImpl uninstall(InstallationResultImpl installationResult) { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeaturesInstallerConfigurableHelper.java b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeaturesInstallerConfigurableHelper.java new file mode 100644 index 00000000..128a37e0 --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeaturesInstallerConfigurableHelper.java @@ -0,0 +1,38 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.ext.features.impl; + +import ru.entaxy.platform.core.artifact.installer.builder.impl.InstallationResultImpl; + +public interface FeaturesInstallerConfigurableHelper { + + void setConfig(FeaturesInstallerHelperConfig config); + + public InstallationResultImpl install(InstallationResultImpl installationResult); + + public InstallationResultImpl uninstall(InstallationResultImpl installationResult); + +} diff --git a/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeaturesInstallerHelperConfig.java b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeaturesInstallerHelperConfig.java new file mode 100644 index 00000000..145768c8 --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeaturesInstallerHelperConfig.java @@ -0,0 +1,42 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.ext.features.impl; + +import java.util.List; + +public interface FeaturesInstallerHelperConfig { + + boolean isRefresh(); + + boolean isInstallAllFetures(); + + List getFeaturesToInstall(); + + String getSourceLocation(); + + String getSequenceId(); + +} diff --git a/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeaturesInstallerHelperImpl.java b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeaturesInstallerHelperImpl.java new file mode 100644 index 00000000..d9c853ea --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeaturesInstallerHelperImpl.java @@ -0,0 +1,46 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.ext.features.impl; + +import ru.entaxy.platform.core.artifact.installer.builder.typed.impl.TypedInstallerHelperImpl; + +public abstract class FeaturesInstallerHelperImpl extends TypedInstallerHelperImpl + implements FeaturesInstallerConfigurableHelper { + + protected FeaturesInstallerHelperConfig config; + + public FeaturesInstallerHelperConfig getConfig() { + return config; + } + + @Override + public void setConfig(FeaturesInstallerHelperConfig config) { + this.config = config; + } + + + +} diff --git a/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeaturesInstallerImpl.java b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeaturesInstallerImpl.java new file mode 100644 index 00000000..637fe94f --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/FeaturesInstallerImpl.java @@ -0,0 +1,133 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.ext.features.impl; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import ru.entaxy.platform.core.artifact.ext.features.FeaturesInstaller; +import ru.entaxy.platform.core.artifact.installer.builder.InstallationResult; +import ru.entaxy.platform.core.artifact.installer.builder.impl.InstallationResultImpl; +import ru.entaxy.platform.core.artifact.installer.builder.impl.cluster.ClusterTypedInstallerHelper; +import ru.entaxy.platform.core.artifact.installer.builder.typed.impl.HelperCreator; +import ru.entaxy.platform.core.artifact.installer.builder.typed.impl.TypedInstallerHelperImpl; +import ru.entaxy.platform.core.artifact.installer.builder.typed.impl.TypedInstallerImpl; + +public class FeaturesInstallerImpl extends TypedInstallerImpl + implements FeaturesInstaller, HelperCreator, FeaturesInstallerHelperConfig { + + protected boolean isInstallAllFeatures = false; + + protected boolean isRefresh = false; + + protected List featuresToInstall = new ArrayList<>(); + + protected FeaturesInstallerConfigurableHelper featuresHelper; + + protected String sequenceId = null; + + @Override + public FeaturesInstaller inSequence(String sequenceId) { + this.sequenceId = sequenceId; + return this; + } + + @Override + public InstallationResult install() { + InstallationResultImpl result = InstallationResultImpl.create(); + if (this.featuresHelper == null) + result.failed("HELPER NOT FOUND"); + else + this.featuresHelper.install(result); + return result.property("artifact", this.artifact); + } + + @Override + public InstallationResult uninstall() { + InstallationResultImpl result = InstallationResultImpl.create(); + if (this.featuresHelper == null) + result.failed("HELPER NOT FOUND"); + else + this.featuresHelper.uninstall(result); + return result.property("artifact", this.artifact); + } + + @Override + public void setHelper(TypedInstallerHelperImpl helper) { + if (helper instanceof FeaturesInstallerConfigurableHelper) { + featuresHelper = (FeaturesInstallerConfigurableHelper) helper; + featuresHelper.setConfig(this); + } + super.setHelper(helper); + } + + @Override + public FeaturesInstaller installAllFeatures() { + isInstallAllFeatures = true; + return this; + } + + @Override + public FeaturesInstaller installFeatures(String... features) { + if (features != null) + this.featuresToInstall = new ArrayList<>(Arrays.asList(features)); + return this; + } + + @Override + public H createHelper(Class targetClass) { + if (ClusterTypedInstallerHelper.class.isAssignableFrom(targetClass)) + return (H) new CellarFeaturesInstallerHelper(); + return (H) new LocalFeaturesInstallerHelper(); + } + + @Override + public FeaturesInstaller refresh() { + isRefresh = true; + return this; + } + + @Override + public boolean isRefresh() { + return isRefresh; + } + + @Override + public boolean isInstallAllFetures() { + return isInstallAllFeatures; + } + + @Override + public List getFeaturesToInstall() { + return featuresToInstall; + } + + @Override + public String getSequenceId() { + return sequenceId; + } +} diff --git a/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/LocalFeaturesInstallerHelper.java b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/LocalFeaturesInstallerHelper.java new file mode 100644 index 00000000..27d47b59 --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/features/impl/LocalFeaturesInstallerHelper.java @@ -0,0 +1,44 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.ext.features.impl; + +import ru.entaxy.platform.core.artifact.installer.builder.impl.InstallationResultImpl; + +public class LocalFeaturesInstallerHelper extends FeaturesInstallerHelperImpl { + + @Override + public InstallationResultImpl install(InstallationResultImpl installationResult) { + // TODO Auto-generated method stub + return null; + } + + @Override + public InstallationResultImpl uninstall(InstallationResultImpl installationResult) { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/impl/ClusterTypedConfigurableHelper.java b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/impl/ClusterTypedConfigurableHelper.java new file mode 100644 index 00000000..6277bd31 --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/impl/ClusterTypedConfigurableHelper.java @@ -0,0 +1,40 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.ext.impl; + +import ru.entaxy.platform.core.artifact.installer.builder.impl.cluster.ClusterTypedInstallerHelper; + +public abstract class ClusterTypedConfigurableHelper extends ClusterTypedInstallerHelper + implements InstallerConfigurableHelper { + + protected T config; + + @Override + public void setConfig(T config) { + this.config = config; + } + +} diff --git a/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/impl/ExtendedTypedInstallerImpl.java b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/impl/ExtendedTypedInstallerImpl.java new file mode 100644 index 00000000..9cc244ca --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/impl/ExtendedTypedInstallerImpl.java @@ -0,0 +1,82 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.ext.impl; + +import ru.entaxy.platform.core.artifact.installer.builder.InstallationResult; +import ru.entaxy.platform.core.artifact.installer.builder.impl.InstallationResultImpl; +import ru.entaxy.platform.core.artifact.installer.builder.impl.cluster.ClusterTypedInstallerHelper; +import ru.entaxy.platform.core.artifact.installer.builder.typed.impl.HelperCreator; +import ru.entaxy.platform.core.artifact.installer.builder.typed.impl.TypedInstallerHelperImpl; +import ru.entaxy.platform.core.artifact.installer.builder.typed.impl.TypedInstallerImpl; + +public abstract class ExtendedTypedInstallerImpl, T> extends TypedInstallerImpl + implements HelperCreator { + + protected S localTypedHelper; + + protected abstract Class getHelperClass(); + + @Override + public InstallationResult install() { + InstallationResultImpl result = InstallationResultImpl.create(); + if (localTypedHelper == null) + result.failed("HELPER NOT FOUND"); + else + result = localTypedHelper.install(result); + return result; + } + + @Override + public InstallationResult uninstall() { + InstallationResultImpl result = InstallationResultImpl.create(); + if (localTypedHelper == null) + result.failed("HELPER NOT FOUND"); + else + result = localTypedHelper.uninstall(result); + return result; + } + + @Override + public void setHelper(TypedInstallerHelperImpl helper) { + if (getHelperClass().isInstance(helper)) { + this.localTypedHelper = (S) helper; + if (localTypedHelper.getConfigClass().isAssignableFrom(getClass())) + localTypedHelper.setConfig((T) this); + } + super.setHelper(helper); + } + + @Override + public H createHelper(Class targetClass) { + if (ClusterTypedInstallerHelper.class.isAssignableFrom(targetClass)) + return (H) createClusterHelper(targetClass); + return (H) createLocalHelper(targetClass); + } + + protected abstract H createClusterHelper(Class targetClass); + + protected abstract H createLocalHelper(Class targetClass); +} diff --git a/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/impl/InstallerConfigurableHelper.java b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/impl/InstallerConfigurableHelper.java new file mode 100644 index 00000000..c6bd2a54 --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/impl/InstallerConfigurableHelper.java @@ -0,0 +1,41 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.ext.impl; + +import ru.entaxy.platform.core.artifact.installer.builder.impl.InstallationResultImpl; + +public interface InstallerConfigurableHelper { + + void setConfig(T config); + + Class getConfigClass(); + + public InstallationResultImpl install(InstallationResultImpl installationResult); + + public InstallationResultImpl uninstall(InstallationResultImpl installationResult); + + +} diff --git a/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/impl/LocalTypedConfigurableHelper.java b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/impl/LocalTypedConfigurableHelper.java new file mode 100644 index 00000000..0ad6ecdc --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/impl/LocalTypedConfigurableHelper.java @@ -0,0 +1,40 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.ext.impl; + +import ru.entaxy.platform.core.artifact.installer.builder.typed.impl.TypedInstallerHelperImpl; + +public abstract class LocalTypedConfigurableHelper extends TypedInstallerHelperImpl + implements InstallerConfigurableHelper { + + protected T config; + + @Override + public void setConfig(T config) { + this.config = config; + } + +} diff --git a/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/internal/Registrator.java b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/internal/Registrator.java new file mode 100644 index 00000000..6d3bdffc --- /dev/null +++ b/platform/runtime/core/artifact-management-extensions/src/main/java/ru/entaxy/platform/core/artifact/ext/internal/Registrator.java @@ -0,0 +1,55 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management-extensions + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.ext.internal; + +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.component.annotations.ReferenceCardinality; + +import ru.entaxy.platform.core.artifact.Artifacts; +import ru.entaxy.platform.core.artifact.ext.ExtTypedInstallerFactory; +import ru.entaxy.platform.core.artifact.ext.binary.JarArtifact; +import ru.entaxy.platform.core.artifact.ext.binary.UntypedBinaryArtifact; +import ru.entaxy.platform.core.artifact.installer.builder.typed.TypedInstallerManager; +import ru.entaxy.platform.core.artifact.service.ArtifactService; + +@Component(service = Registrator.class, immediate = true) +public class Registrator { + + @Reference(cardinality = ReferenceCardinality.MANDATORY) + ArtifactService artifactService; + + @Activate + public void activate() { + Artifacts.registerSupport(JarArtifact.class); + Artifacts.registerSupport(UntypedBinaryArtifact.class); + + TypedInstallerManager.register(new ExtTypedInstallerFactory()); + + } + +} diff --git a/platform/runtime/core/artifact-management/pom.xml b/platform/runtime/core/artifact-management/pom.xml index 1e5b670d..dcbb69d6 100644 --- a/platform/runtime/core/artifact-management/pom.xml +++ b/platform/runtime/core/artifact-management/pom.xml @@ -3,7 +3,7 @@ ru.entaxy.esb.platform.runtime core - 1.10.0 + 1.11.0 ru.entaxy.esb.platform.runtime.core artifact-management diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/Artifact.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/Artifact.java index 27c3f10c..115a354a 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/Artifact.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/Artifact.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/ArtifactCoordinates.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/ArtifactCoordinates.java index cba8cc08..3993cf8c 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/ArtifactCoordinates.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/ArtifactCoordinates.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/ArtifactManifest.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/ArtifactManifest.java index 560bba2d..fa71c3f6 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/ArtifactManifest.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/ArtifactManifest.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/Artifacts.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/Artifacts.java index fa0bc8cf..c94396dd 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/Artifacts.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/Artifacts.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/Blueprint.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/Blueprint.java index 16c8f828..e0c02d14 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/Blueprint.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/Blueprint.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/BlueprintManifest.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/BlueprintManifest.java index dfef9acb..7209c142 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/BlueprintManifest.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/BlueprintManifest.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/DefaultArtifact.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/DefaultArtifact.java index 4cb0df47..5788e4e8 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/DefaultArtifact.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/DefaultArtifact.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/DeployedArtifact.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/DeployedArtifact.java index c1d8d8b0..0968f359 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/DeployedArtifact.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/DeployedArtifact.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/Manifested.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/Manifested.java index 99313c27..ad623eca 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/Manifested.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/Manifested.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/annotation/ArtifactSupport.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/annotation/ArtifactSupport.java index f1382a20..e10abe34 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/annotation/ArtifactSupport.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/annotation/ArtifactSupport.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/capabilities/ManifestCapabilityHelper.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/capabilities/ManifestCapabilityHelper.java index 2fa3b413..5cb1e432 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/capabilities/ManifestCapabilityHelper.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/capabilities/ManifestCapabilityHelper.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * test-producers * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/impl/CapabilityDescriptorImpl.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/impl/CapabilityDescriptorImpl.java index 2646661e..9c7ccc3e 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/impl/CapabilityDescriptorImpl.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/impl/CapabilityDescriptorImpl.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/ArtifactInstaller.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/ArtifactInstaller.java index e6d1614b..bb6fc857 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/ArtifactInstaller.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/ArtifactInstaller.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/ClusterInstaller.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/ClusterInstaller.java index 48c433ec..4adf0abd 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/ClusterInstaller.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/ClusterInstaller.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/CommonInstaller.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/CommonInstaller.java index 9d1909e3..b1663e0c 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/CommonInstaller.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/CommonInstaller.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/InstallationResult.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/InstallationResult.java index 5a42998c..968f7d81 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/InstallationResult.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/InstallationResult.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/Installer.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/Installer.java index ebd29011..10ad97be 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/Installer.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/Installer.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/Installers.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/Installers.java index 013d9c72..15a0406b 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/Installers.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/Installers.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/InstallersWithDefaults.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/InstallersWithDefaults.java index 51d26db6..e247fad9 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/InstallersWithDefaults.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/InstallersWithDefaults.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/LocalInstaller.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/LocalInstaller.java index 75a69f92..6dae6f49 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/LocalInstaller.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/LocalInstaller.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/AbstractInstaller.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/AbstractInstaller.java index 6810a9b9..e634d823 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/AbstractInstaller.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/AbstractInstaller.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/InstallationResultImpl.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/InstallationResultImpl.java index 886c0bbc..8010e2f7 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/InstallationResultImpl.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/InstallationResultImpl.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/InstallersImpl.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/InstallersImpl.java index 6181fbb6..cbf65279 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/InstallersImpl.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/InstallersImpl.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/InstallersWithDefaultsImpl.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/InstallersWithDefaultsImpl.java index de4a1858..3e23ebcb 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/InstallersWithDefaultsImpl.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/InstallersWithDefaultsImpl.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/cluster/ClusterCommonBundleInstallerHelper.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/cluster/ClusterCommonBundleInstallerHelper.java index 249c5196..60e33d07 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/cluster/ClusterCommonBundleInstallerHelper.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/cluster/ClusterCommonBundleInstallerHelper.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/cluster/ClusterInstallerWrapperImpl.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/cluster/ClusterInstallerWrapperImpl.java index 475aae30..63b0ac8f 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/cluster/ClusterInstallerWrapperImpl.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/cluster/ClusterInstallerWrapperImpl.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/cluster/ClusterTypedInstallerHelper.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/cluster/ClusterTypedInstallerHelper.java index 003bae02..9d42587b 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/cluster/ClusterTypedInstallerHelper.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/cluster/ClusterTypedInstallerHelper.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/cluster/DefaultCellarInstaller.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/cluster/DefaultCellarInstaller.java index c9dc237e..d84a6d24 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/cluster/DefaultCellarInstaller.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/cluster/DefaultCellarInstaller.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/local/DefaultLocalInstaller.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/local/DefaultLocalInstaller.java index b811e84e..de8396e2 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/local/DefaultLocalInstaller.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/local/DefaultLocalInstaller.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/local/LocalCommonBundleInstallerHelper.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/local/LocalCommonBundleInstallerHelper.java index 9a3457ac..4509e9d0 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/local/LocalCommonBundleInstallerHelper.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/local/LocalCommonBundleInstallerHelper.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/local/LocalTypedInstallerHelper.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/local/LocalTypedInstallerHelper.java index b3ad87ed..912e7292 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/local/LocalTypedInstallerHelper.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/impl/local/LocalTypedInstallerHelper.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/AbstractTypedInstallerFactory.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/AbstractTypedInstallerFactory.java new file mode 100644 index 00000000..2e472893 --- /dev/null +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/AbstractTypedInstallerFactory.java @@ -0,0 +1,74 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.installer.builder.typed; + +import java.util.Arrays; +import java.util.List; + +public abstract class AbstractTypedInstallerFactory implements TypedInstallerFactory { + + protected List> supportedClasses; + + protected List supportedTypes; + + protected AbstractTypedInstallerFactory() { + super(); + if (this.getClass().isAnnotationPresent(TypedInstallerFactoryDescriptor.class)) { + TypedInstallerFactoryDescriptor descriptor = + this.getClass().getAnnotation(TypedInstallerFactoryDescriptor.class); + this.supportedClasses = Arrays.asList(descriptor.supportedClasses()); + this.supportedTypes = Arrays.asList(descriptor.supportedTypes()); + } + } + + @Override + public List> getSupportedClasses() { + return supportedClasses; + } + + @Override + public List getSupportedTypes() { + return supportedTypes; + } + + @Override + public TypedInstaller create(String type) { + if (!supportedTypes.contains(type)) + return null; + return doCreate(type); + } + + protected abstract TypedInstaller doCreate(String type); + + @Override + public TypedInstaller create(Class targetClass) { + if (!supportedClasses.contains(targetClass)) + return null; + return doCreate(targetClass); + } + + protected abstract TypedInstaller doCreate(Class targetClass); +} diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/BlueprintInstaller.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/BlueprintInstaller.java index 52dcca5e..ee098b34 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/BlueprintInstaller.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/BlueprintInstaller.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/BundleInstaller.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/BundleInstaller.java index 49c542e6..bc8ba799 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/BundleInstaller.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/BundleInstaller.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/CommonBundleInstaller.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/CommonBundleInstaller.java index a9a4d38a..f360ce92 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/CommonBundleInstaller.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/CommonBundleInstaller.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/ConfigInstaller.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/ConfigInstaller.java index 1bee6053..bb9e6fd4 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/ConfigInstaller.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/ConfigInstaller.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/DefaultTypedInstallerFactory.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/DefaultTypedInstallerFactory.java new file mode 100644 index 00000000..45755a30 --- /dev/null +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/DefaultTypedInstallerFactory.java @@ -0,0 +1,98 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.installer.builder.typed; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.Map; + +import ru.entaxy.platform.core.artifact.Artifact; +import ru.entaxy.platform.core.artifact.installer.builder.typed.impl.BlueprintInstallerImpl; +import ru.entaxy.platform.core.artifact.installer.builder.typed.impl.BundleInstallerImpl; +import ru.entaxy.platform.core.artifact.installer.builder.typed.impl.JarInstallerImpl; +import ru.entaxy.platform.core.artifact.installer.builder.typed.impl.TypedInstallerImpl; + +@TypedInstallerFactoryDescriptor(supportedTypes = {Artifact.ARTIFACT_CATEGORY_BLUEPRINT, + Artifact.ARTIFACT_CATEGORY_BUNDLE, Artifact.ARTIFACT_CATEGORY_JAR}, + supportedClasses = {BlueprintInstaller.class, BundleInstaller.class, JarInstaller.class}) +public class DefaultTypedInstallerFactory extends AbstractTypedInstallerFactory { + + protected static DefaultTypedInstallerFactory INSTANCE; + + public static DefaultTypedInstallerFactory getInstance() { + if (INSTANCE == null) + INSTANCE = new DefaultTypedInstallerFactory(); + return INSTANCE; + } + + protected static Map> typeToClassMap; + protected static Map, Class> classToClassMap; + + static { + + typeToClassMap = new HashMap<>(); + typeToClassMap.put(Artifact.ARTIFACT_CATEGORY_BLUEPRINT, BlueprintInstallerImpl.class); + typeToClassMap.put(Artifact.ARTIFACT_CATEGORY_BUNDLE, BundleInstallerImpl.class); + typeToClassMap.put(Artifact.ARTIFACT_CATEGORY_JAR, JarInstallerImpl.class); + + classToClassMap = new HashMap<>(); + classToClassMap.put(BlueprintInstaller.class, BlueprintInstallerImpl.class); + classToClassMap.put(BundleInstaller.class, BundleInstallerImpl.class); + classToClassMap.put(JarInstaller.class, JarInstallerImpl.class); + + } + + protected DefaultTypedInstallerFactory() { + super(); + } + + @Override + protected TypedInstaller doCreate(String type) { + Class clazz = typeToClassMap.get(type); + if (clazz == null) + return null; + return createOfClass(clazz); + } + + @Override + protected TypedInstaller doCreate(Class targetClass) { + Class clazz = classToClassMap.get(targetClass); + if (clazz == null) + return null; + return createOfClass(clazz); + } + + protected TypedInstaller createOfClass(Class clazz) { + try { + Constructor constructor = clazz.getConstructor(); + return (TypedInstaller) constructor.newInstance(); + } catch (NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException + | IllegalArgumentException | InvocationTargetException e) { + return null; + } + } +} diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/FeaturesInstaller.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/FeaturesInstaller.java index ab2216b0..1fac51eb 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/FeaturesInstaller.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/FeaturesInstaller.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/JarInstaller.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/JarInstaller.java index 63ce141f..88f3ad60 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/JarInstaller.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/JarInstaller.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/StartAware.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/StartAware.java index 644fd2aa..a1fb2877 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/StartAware.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/StartAware.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/StopAware.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/StopAware.java index 23d1f3e8..5e716fe9 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/StopAware.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/StopAware.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/TypedInstaller.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/TypedInstaller.java index 06b012de..6f5e7e2d 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/TypedInstaller.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/TypedInstaller.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/TypedInstallerFactory.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/TypedInstallerFactory.java new file mode 100644 index 00000000..eac14874 --- /dev/null +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/TypedInstallerFactory.java @@ -0,0 +1,40 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.installer.builder.typed; + +import java.util.List; + +public interface TypedInstallerFactory { + + List> getSupportedClasses(); + + List getSupportedTypes(); + + TypedInstaller create(String type); + + TypedInstaller create(Class targetClass); + +} diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/TypedInstallerFactoryDescriptor.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/TypedInstallerFactoryDescriptor.java new file mode 100644 index 00000000..e488aebb --- /dev/null +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/TypedInstallerFactoryDescriptor.java @@ -0,0 +1,42 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.installer.builder.typed; + +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +@Retention(RUNTIME) +@Target(TYPE) +public @interface TypedInstallerFactoryDescriptor { + + Class[] supportedClasses(); + + String[] supportedTypes(); + +} diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/TypedInstallerManager.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/TypedInstallerManager.java new file mode 100644 index 00000000..1e9b5e22 --- /dev/null +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/TypedInstallerManager.java @@ -0,0 +1,192 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.installer.builder.typed; + +import java.util.HashMap; +import java.util.Map; + +import ru.entaxy.platform.core.artifact.installer.builder.ClusterInstaller; +import ru.entaxy.platform.core.artifact.installer.builder.Installer; +import ru.entaxy.platform.core.artifact.installer.builder.LocalInstaller; + +public class TypedInstallerManager { + + + protected static Map>, TypedInstallerStorage> storages = new HashMap<>(); + + protected static TypedInstallerStorage commonStorage = new TypedInstallerStorage(); + + static { + storages.put(LocalInstaller.class, new TypedInstallerStorage()); + storages.put(ClusterInstaller.class, new TypedInstallerStorage()); + } + + protected static Object storagesLock = new Object(); + + public static void register(String artifactType, + TypedInstallerFactory factory) { + + register(commonStorage, artifactType, factory); + } + + public static void register(TypedInstallerFactory factory) { + + register(commonStorage, factory); + } + + protected static TypedInstallerStorage getOrCreateStorage(Class> installerClass) { + if (!storages.containsKey(installerClass)) { + synchronized (storagesLock) { + storages.put(installerClass, new TypedInstallerStorage()); + } + } + return storages.get(installerClass); + } + + public static void register(Class> installerClass, String artifactType, + TypedInstallerFactory factory) { + register(getOrCreateStorage(installerClass), artifactType, factory); + } + + public static void register(Class> installerClass, + TypedInstallerFactory factory) { + register(getOrCreateStorage(installerClass), factory); + } + + protected static void register(TypedInstallerStorage storage, TypedInstallerFactory factory) { + for (String type : factory.getSupportedTypes()) + register(storage, type, factory); + } + + protected static void register(TypedInstallerStorage storage, String artifactType, + TypedInstallerFactory factory) { + storage.register(artifactType, factory); + } + + public static TypedInstaller create(Object owner, String type) { + return create(owner, type, false); + } + + public static TypedInstaller create(Object owner, String type, boolean strict) { + for (Class> installerClass : storages.keySet()) + if (installerClass.isInstance(owner)) + return create(installerClass, type, strict); + if (strict) + return null; + return create(null, type, strict); + } + + public static TypedInstaller create(Class> installerClass, String type) { + return create(installerClass, type, false); + } + + public static TypedInstaller create(Class> installerClass, String type, boolean strict) { + TypedInstallerStorage storage = installerClass == null ? null : storages.get(installerClass); + TypedInstaller result = null; + if (storage != null) { + result = storage.create(type); + } + if (result != null) + return result; + if (strict) + return null; + else + return commonStorage.create(type); + + } + + public static TypedInstaller create(Object owner, Class typedClass) { + return create(owner, typedClass, false); + } + + public static TypedInstaller create(Object owner, Class typedClass, boolean strict) { + for (Class> installerClass : storages.keySet()) + if (installerClass.isInstance(owner)) + return create(installerClass, typedClass, strict); + if (strict) + return null; + return create(null, typedClass, strict); + } + + public static TypedInstaller create(Class> installerClass, + Class typedClass) { + return create(installerClass, typedClass, false); + } + + public static TypedInstaller create(Class> installerClass, + Class typedClass, boolean strict) { + TypedInstallerStorage storage = installerClass == null ? null : storages.get(installerClass); + TypedInstaller result = null; + if (storage != null) { + result = storage.create(typedClass); + } + if (result != null) + return result; + if (strict) + return null; + else + return commonStorage.create(typedClass); + + } + + + protected static class TypedInstallerStorage { + + protected Map factories = new HashMap<>(); + + protected Object factoriesLock = new Object(); + + public void register(String type, TypedInstallerFactory factory) { + synchronized (factoriesLock) { + factories.put(type, factory); + } + } + + public TypedInstaller create(String type) { + if (!factories.containsKey(type)) + return null; + return factories.get(type).create(type); + } + + public TypedInstaller create(Class typedClass) { + + TypedInstallerFactory factory = null; + + for (TypedInstallerFactory f : factories.values()) + if (f.getSupportedClasses().contains(typedClass)) { + factory = f; + break; + } + + if (factory == null) + return null; + + return factory.create(typedClass); + } + + } + +} diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/BlueprintInstallerImpl.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/BlueprintInstallerImpl.java index cdd65f9b..be8ccc88 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/BlueprintInstallerImpl.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/BlueprintInstallerImpl.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/BundleInstallerImpl.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/BundleInstallerImpl.java index 696a9ed1..560ec8d6 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/BundleInstallerImpl.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/BundleInstallerImpl.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/CommonBundleInstallerHelper.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/CommonBundleInstallerHelper.java index 78b7a8f9..d5aa786d 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/CommonBundleInstallerHelper.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/CommonBundleInstallerHelper.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/CommonBundleInstallerHelperConfig.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/CommonBundleInstallerHelperConfig.java index dba4fc81..825c016b 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/CommonBundleInstallerHelperConfig.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/CommonBundleInstallerHelperConfig.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/CommonBundleInstallerImpl.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/CommonBundleInstallerImpl.java index 3666caa9..fbfe3296 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/CommonBundleInstallerImpl.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/CommonBundleInstallerImpl.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/HelperCreator.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/HelperCreator.java new file mode 100644 index 00000000..754688bb --- /dev/null +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/HelperCreator.java @@ -0,0 +1,32 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.installer.builder.typed.impl; + +public interface HelperCreator { + + H createHelper(Class targetClass); + +} diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/JarInstallerImpl.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/JarInstallerImpl.java index e22bfc88..2ef9e6a1 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/JarInstallerImpl.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/JarInstallerImpl.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/TypedInstallerHelperAware.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/TypedInstallerHelperAware.java new file mode 100644 index 00000000..1c8c581c --- /dev/null +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/TypedInstallerHelperAware.java @@ -0,0 +1,34 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.installer.builder.typed.impl; + +public interface TypedInstallerHelperAware { + + TypedInstallerHelperImpl getHelper(); + + void setHelper(TypedInstallerHelperImpl helper); + +} diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/TypedInstallerHelperImpl.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/TypedInstallerHelperImpl.java new file mode 100644 index 00000000..d69b8783 --- /dev/null +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/TypedInstallerHelperImpl.java @@ -0,0 +1,30 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.installer.builder.typed.impl; + +public class TypedInstallerHelperImpl { + +} diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/TypedInstallerImpl.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/TypedInstallerImpl.java index ff944c45..da9fd73f 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/TypedInstallerImpl.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/builder/typed/impl/TypedInstallerImpl.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/impl/AbstractArtifactInstaller.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/impl/AbstractArtifactInstaller.java index 496c85ee..d60742ce 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/impl/AbstractArtifactInstaller.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/impl/AbstractArtifactInstaller.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/impl/ArtifactInstallerCollector.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/impl/ArtifactInstallerCollector.java index 7b4379f2..671b4a36 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/impl/ArtifactInstallerCollector.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/impl/ArtifactInstallerCollector.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/impl/DefaultClusterArtifactInstaller.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/impl/DefaultClusterArtifactInstaller.java index fcf1f944..1adf98bb 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/impl/DefaultClusterArtifactInstaller.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/impl/DefaultClusterArtifactInstaller.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/impl/DefaultLocalArtifactInstaller.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/impl/DefaultLocalArtifactInstaller.java index a59ed701..e4b94da2 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/impl/DefaultLocalArtifactInstaller.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/installer/impl/DefaultLocalArtifactInstaller.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/legacy/BundleController.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/legacy/BundleController.java index beff51b7..5dbce0ee 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/legacy/BundleController.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/legacy/BundleController.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * cellar-deployer * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/ArtifactRepository.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/ArtifactRepository.java index 7464025e..caa0578e 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/ArtifactRepository.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/ArtifactRepository.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property @@ -52,7 +52,7 @@ public interface ArtifactRepository { public boolean isSystem(); - public DeployedArtifact deploy(Artifact artifact); + public DeployedArtifact deploy(Artifact artifact) throws Exception; public List getAvailableVersions(Artifact artifact); diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/ArtifactRepositoryInitializer.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/ArtifactRepositoryInitializer.java index e321c0b9..4a4be8c6 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/ArtifactRepositoryInitializer.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/ArtifactRepositoryInitializer.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/RepositoryDescriptor.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/RepositoryDescriptor.java new file mode 100644 index 00000000..f290bc91 --- /dev/null +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/RepositoryDescriptor.java @@ -0,0 +1,62 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.repository; + + + +public interface RepositoryDescriptor { + + String getName(); + + String getLocation(); + + String getUrl(); + + boolean isProxy(); + + boolean isMirror(); + + boolean isSnapshots(); + + String getRemotes(); + + boolean isReadOnly(); + + boolean isCopyOnChange(); + + boolean isEnabled(); + + String getUsername(); + + String getPassword(); + + String getRemoteHostSuffix(); + + boolean isSystem(); + + boolean isLookupEnabled(); + +} diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/RepositoryDescriptorCollector.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/RepositoryDescriptorCollector.java new file mode 100644 index 00000000..ab21e4b5 --- /dev/null +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/RepositoryDescriptorCollector.java @@ -0,0 +1,35 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.repository; + +/* + * Internal interface to collect helpers managed by config files + */ +public interface RepositoryDescriptorCollector { + public void addRepositoryDescriptor(RepositoryDescriptor helper); + + public void removeRepositoryDescriptor(RepositoryDescriptor helper); +} diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/ArtifactRepositoryImpl.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/ArtifactRepositoryImpl.java index 12ca188b..59679031 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/ArtifactRepositoryImpl.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/ArtifactRepositoryImpl.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property @@ -144,14 +144,14 @@ public class ArtifactRepositoryImpl implements ArtifactRepository { } @Override - public DeployedArtifact deploy(Artifact artifact) { + public DeployedArtifact deploy(Artifact artifact) throws Exception { if (isHealthy() && isEnabled() && !isReadOnly()) { return deployArtifact(artifact); } return new DeployedArtifactImpl(artifact); } - protected DeployedArtifact deployArtifact(Artifact artifact) { + protected DeployedArtifact deployArtifact(Artifact artifact) throws Exception { String location = "mvn:"; if (!repositoryDescriptor.isProxy() || repositoryDescriptor.isMirror()) @@ -185,12 +185,13 @@ public class ArtifactRepositoryImpl implements ArtifactRepository { } } - protected void deployToRemoteMaven(Artifact artifact) { + protected void deployToRemoteMaven(Artifact artifact) throws Exception { try { initRemoteRepository(); this.remoteRepository.deploy(artifact); } catch (Exception e) { log.error("deployToRemoteMaven", e); + throw e; } } diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/DeployedArtifactImpl.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/DeployedArtifactImpl.java index 70b0c020..03f3e0c3 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/DeployedArtifactImpl.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/DeployedArtifactImpl.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/RepositoryConfigurableHelper.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/RepositoryConfigurableHelper.java index 99e01c8b..94c23c34 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/RepositoryConfigurableHelper.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/RepositoryConfigurableHelper.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/RepositoryDescriptorImpl.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/RepositoryDescriptorImpl.java new file mode 100644 index 00000000..11356a79 --- /dev/null +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/RepositoryDescriptorImpl.java @@ -0,0 +1,188 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.repository.impl; + +import ru.entaxy.platform.core.artifact.repository.RepositoryDescriptor; + +public class RepositoryDescriptorImpl implements RepositoryDescriptor { + + protected String name; + String location; + String url; + boolean isProxy; + boolean isMirror; + String remotes; + boolean isReadOnly = false; + boolean copyOnChange; + String username = ""; + String password = ""; + + boolean isSnapshots = false; + + boolean isEnabled = true; + + String remoteHostSuffix = ""; + + boolean isSystem = true; + + boolean isLookupEnabled = true; + + @Override + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + @Override + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + @Override + public boolean isProxy() { + return isProxy; + } + + public void setProxy(boolean isProxy) { + this.isProxy = isProxy; + } + + @Override + public boolean isMirror() { + return isMirror; + } + + public void setMirror(boolean isMirror) { + this.isMirror = isMirror; + } + + @Override + public boolean isSnapshots() { + return isSnapshots; + } + + public void setSnapshots(boolean isSnapshots) { + this.isSnapshots = isSnapshots; + } + + @Override + public String getRemotes() { + return remotes; + } + + public void setRemotes(String remotes) { + this.remotes = remotes; + } + + @Override + public boolean isReadOnly() { + return isReadOnly; + } + + public void setReadOnly(boolean isReadOnly) { + this.isReadOnly = isReadOnly; + } + + @Override + public boolean isCopyOnChange() { + return copyOnChange; + } + + public void setCopyOnChange(boolean copyOnChange) { + this.copyOnChange = copyOnChange; + } + + @Override + public boolean isEnabled() { + return isEnabled; + } + + public void setEnabled(boolean isEnabled) { + this.isEnabled = isEnabled; + } + + @Override + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + @Override + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + @Override + public String getRemoteHostSuffix() { + return remoteHostSuffix; + } + + public void setRemoteHostSuffix(String remoteHostSuffix) { + this.remoteHostSuffix = remoteHostSuffix; + } + + @Override + public boolean isSystem() { + return isSystem; + } + + public void setSystem(boolean isSystem) { + this.isSystem = isSystem; + } + + @Override + public boolean isLookupEnabled() { + return isLookupEnabled; + } + + public void setLookupEnabled(boolean isLookupEnabled) { + this.isLookupEnabled = isLookupEnabled; + } + +} diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/RepositoryRegistrator.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/RepositoryRegistrator.java new file mode 100644 index 00000000..f9487b33 --- /dev/null +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/RepositoryRegistrator.java @@ -0,0 +1,158 @@ +/*- + * ~~~~~~licensing~~~~~~ + * artifact-management + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.artifact.repository.impl; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.felix.utils.properties.TypedProperties; +import org.apache.karaf.config.core.ConfigRepository; +import org.osgi.framework.InvalidSyntaxException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ru.entaxy.platform.base.support.osgi.OSGIUtils; +import ru.entaxy.platform.core.artifact.repository.ArtifactRepository; + +public class RepositoryRegistrator { + + private static final Logger log = LoggerFactory.getLogger(RepositoryRegistrator.class); + + public static RepositoryRegistrator INSTANCE = new RepositoryRegistrator(); + + private static final String REPO_CONFIG_PID = "org.ops4j.pax.url.mvn"; + + private static final String PROP_ENTAXY_SYSTEM_REPO_LIST = "org.ops4j.pax.url.mvn.repositories.entaxy"; + private static final String PROP_ENTAXY_CUSTOM_REPO_LIST = "org.ops4j.pax.url.mvn.repositories.entaxy.custom"; + + private static final String ENTAXY_PROPERTY_HTTP_PORT = "entaxy.org.osgi.service.http.port"; + + private static final String URL_PREFIX = "http://localhost:${" + ENTAXY_PROPERTY_HTTP_PORT + "}"; + + protected Map systemRepos = new HashMap<>(); + protected Map customRepos = new HashMap<>(); + + private RepositoryRegistrator() { + + } + + public void addRepository(ArtifactRepository repository) { + addRepository(repository, true); + } + public void addRepository(ArtifactRepository repository, boolean httpEnabled) { + Map targetMap; + String propertyName; + if (repository.isSystem()) { + targetMap = systemRepos; + propertyName = PROP_ENTAXY_SYSTEM_REPO_LIST; + // TODO implement for initializer + return; + } else { + targetMap = customRepos; + propertyName = PROP_ENTAXY_CUSTOM_REPO_LIST; + } + + targetMap.put(repository.getName(), repository); + + String repositoryUrlsResult = calculatePropertyValue(targetMap, httpEnabled); + try { + setPropertyValue(propertyName, repositoryUrlsResult); + return; + } catch (IOException e) { + log.error("Error updating config", e); + } catch (InvalidSyntaxException e) { + log.error("Error updating config", e); + } catch (Exception e) { + log.error("Error updating config", e); + } + + targetMap.remove(repository.getName()); + } + + public void removeRepository(ArtifactRepository repository) { + if (repository.isSystem()) { + systemRepos.remove(repository.getName()); + } else { + customRepos.remove(repository.getName()); + } + } + + protected String calculatePropertyValue(Map repoMap, boolean httpEnabled) { + List list = new ArrayList<>(repoMap.values()); + Collections.sort(list, new Comparator() { + + @Override + public int compare(ArtifactRepository o1, ArtifactRepository o2) { + return o1.getName().compareToIgnoreCase(o2.getName()); + } + + }); + + String resultValue = ""; + List urlList = new ArrayList<>(); + for (ArtifactRepository repo : list) { + String url = URL_PREFIX.concat(repo.getUrl()) + .concat("@id=").concat(repo.getName()) + .concat("@checksum=ignore") + .concat(repo.isSnapshotsAllowed() ? "@snapshots" : ""); + if (!httpEnabled) { + url = url.replace("http:", "https:"); + } + urlList.add(url); + } + resultValue = urlList.stream().collect(Collectors.joining(", ")); + return resultValue; + } + + protected void setPropertyValue(String propertyName, String propertyValue) throws Exception { + ConfigRepository configRepository = + OSGIUtils.services().ofClass(ConfigRepository.class).waitService(20000).get(); + + TypedProperties properties = configRepository.getConfig(REPO_CONFIG_PID); + + String hashKey = propertyName + ".md5"; + + String newHash = DigestUtils.md5Hex(propertyValue); + String currentHash = properties.getOrDefault(hashKey, "").toString(); + + // To avoid extra config rewriting + // which may cause config loss while updating + if (!newHash.equals(currentHash)) { + properties.put(propertyName, propertyValue); + properties.put(hashKey, newHash); + configRepository.update(REPO_CONFIG_PID, properties); + } + + } + +} diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/remote/AbstractRemoteRepository.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/remote/AbstractRemoteRepository.java index 643f4d0b..b6419c38 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/remote/AbstractRemoteRepository.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/remote/AbstractRemoteRepository.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/remote/NexusRepository.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/remote/NexusRepository.java index efd0e3ae..4a67450a 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/remote/NexusRepository.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/remote/NexusRepository.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/remote/RemoteRepository.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/remote/RemoteRepository.java index 4e168992..2c1ed101 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/remote/RemoteRepository.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/remote/RemoteRepository.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/remote/RemoteRepositoryDescriptor.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/remote/RemoteRepositoryDescriptor.java index af326784..d5c6e935 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/remote/RemoteRepositoryDescriptor.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/remote/RemoteRepositoryDescriptor.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/remote/RemoteRepositoryFactory.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/remote/RemoteRepositoryFactory.java index f4227d26..5fde2a41 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/remote/RemoteRepositoryFactory.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/repository/impl/remote/RemoteRepositoryFactory.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/service/ArtifactService.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/service/ArtifactService.java index 48eea6ac..8c6e8700 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/service/ArtifactService.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/service/ArtifactService.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/service/impl/ArtifactServiceImpl.java b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/service/impl/ArtifactServiceImpl.java index 89d94f96..94e2596e 100644 --- a/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/service/impl/ArtifactServiceImpl.java +++ b/platform/runtime/core/artifact-management/src/main/java/ru/entaxy/platform/core/artifact/service/impl/ArtifactServiceImpl.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * artifact-management * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property @@ -110,7 +110,6 @@ public class ArtifactServiceImpl implements ArtifactService, RepositoryDescripto return deploy(artifact, ArtifactRepository.REPO_NAME_SHARED); } - // TODO refactor to using repository exceptions if needed protected DeployedArtifact deploy(Artifact artifact, String repositoryName) { String error = "Repository [" + repositoryName + "] not found"; if (repositories.containsKey(repositoryName)) { @@ -119,8 +118,13 @@ public class ArtifactServiceImpl implements ArtifactService, RepositoryDescripto artifact.getCoordinates().toString()); if (repo.isHealthy()) if (repo.isEnabled()) - if (!repo.isReadOnly()) - return repo.deploy(artifact); + if (!repo.isReadOnly()) { + try { + return repo.deploy(artifact); + } catch (Exception e) { + error += ": ".concat(e.getMessage()); + } + } else error += ": repository is readonly"; else diff --git a/platform/runtime/core/artifact-management/src/main/non-packaged-resources/etc/ru.entaxy.esb.artifact.repositories.cfg b/platform/runtime/core/artifact-management/src/main/non-packaged-resources/etc/ru.entaxy.esb.artifact.repositories.cfg index 8ac0d101..a9be4ebe 100644 --- a/platform/runtime/core/artifact-management/src/main/non-packaged-resources/etc/ru.entaxy.esb.artifact.repositories.cfg +++ b/platform/runtime/core/artifact-management/src/main/non-packaged-resources/etc/ru.entaxy.esb.artifact.repositories.cfg @@ -2,7 +2,7 @@ # ~~~~~~licensing~~~~~~ # artifact-management # ========== -# Copyright (C) 2020 - 2024 EmDev LLC +# Copyright (C) 2020 - 2025 EmDev LLC # ========== # You may not use this file except in accordance with the License Terms of the Copyright # Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/artifact-management/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/platform/runtime/core/artifact-management/src/main/resources/OSGI-INF/blueprint/blueprint.xml index 458b3d99..2feab946 100644 --- a/platform/runtime/core/artifact-management/src/main/resources/OSGI-INF/blueprint/blueprint.xml +++ b/platform/runtime/core/artifact-management/src/main/resources/OSGI-INF/blueprint/blueprint.xml @@ -3,7 +3,7 @@ ~~~~~~licensing~~~~~~ uniform-service-exchange-endpoint ========== - Copyright (C) 2020 - 2024 EmDev LLC + Copyright (C) 2020 - 2025 EmDev LLC ========== You may not use this file except in accordance with the License Terms of the Copyright Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/cluster/cluster-persistence-service/pom.xml b/platform/runtime/core/cluster/cluster-persistence-service/pom.xml index fd318a51..91241364 100644 --- a/platform/runtime/core/cluster/cluster-persistence-service/pom.xml +++ b/platform/runtime/core/cluster/cluster-persistence-service/pom.xml @@ -3,7 +3,7 @@ ru.entaxy.esb.platform.runtime.core cluster - 1.10.0 + 1.11.0 ru.entaxy.esb.platform.runtime.core.cluster cluster-persistence-service diff --git a/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/Helper.java b/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/Helper.java index 9305b272..17481760 100644 --- a/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/Helper.java +++ b/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/Helper.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * cluster-persistence-service * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/PersistenceManager.java b/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/PersistenceManager.java index b693fb54..92dcfb9a 100644 --- a/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/PersistenceManager.java +++ b/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/PersistenceManager.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * cluster-persistence-service * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property @@ -105,17 +105,10 @@ public class PersistenceManager { @Override public void run() { log.debug("~~> UPDATE_TASK :: RUN"); - try { - log.debug("~~> UPDATE_TASK :: RUN :: sleeping"); - Thread.currentThread().sleep(15000); - log.debug("~~> UPDATE_TASK :: RUN :: processing"); - // TODO add support for different groups - this.helper.saveClusterState("default"); - log.debug("~~> UPDATE_TASK :: RUN :: processed"); - this.callback.executed(); - } catch (InterruptedException e) { - log.error("UpdateTask", e); - } + // TODO add support for different groups + this.helper.saveClusterState("default"); + log.debug("~~> UPDATE_TASK :: RUN :: processed"); + this.callback.executed(); } } diff --git a/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/Serializer.java b/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/Serializer.java index e3a865e9..e4549986 100644 --- a/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/Serializer.java +++ b/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/Serializer.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * cluster-persistence-service * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/ServiceProvider.java b/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/ServiceProvider.java index 971519b4..7281c9c0 100644 --- a/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/ServiceProvider.java +++ b/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/ServiceProvider.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * cluster-persistence-service * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/activator/Activator.java b/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/activator/Activator.java index 21ecae92..4f3da2bc 100644 --- a/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/activator/Activator.java +++ b/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/activator/Activator.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * hazelcast-test * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property @@ -145,6 +145,7 @@ public class Activator extends BaseActivator implements ServiceProvider, Members bundleEventHandler.init(); handlerRegistry.addHandler(bundleEventHandler); + log.debug("Cluster bundleEventHandler started"); /* * config management */ @@ -162,6 +163,7 @@ public class Activator extends BaseActivator implements ServiceProvider, Members configEventHandler.init(); handlerRegistry.addHandler(configEventHandler); + log.debug("Cluster configEventHandler started"); /* * feature repository management */ @@ -182,6 +184,7 @@ public class Activator extends BaseActivator implements ServiceProvider, Members repositoryEventHandler.init(bundleContext); handlerRegistry.addHandler(repositoryEventHandler); + log.debug("Cluster repositoryEventHandler started"); /* * feature management */ @@ -203,6 +206,8 @@ public class Activator extends BaseActivator implements ServiceProvider, Members repositoryPersistenceManager.addDependent(featurePersistenceManager); + log.debug("Cluster featuresEventHandler started"); + /* * kar management */ @@ -230,6 +235,7 @@ public class Activator extends BaseActivator implements ServiceProvider, Members } consumer.start(); + log.debug("Cluster consumer started"); } protected void checkStartStopConsumer() { diff --git a/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalBundleEventHandler.java b/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalBundleEventHandler.java index 3abe30ec..94135678 100644 --- a/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalBundleEventHandler.java +++ b/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalBundleEventHandler.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * cluster-persistence-service * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalConfigurationEventHandler.java b/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalConfigurationEventHandler.java new file mode 100644 index 00000000..be3479fe --- /dev/null +++ b/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalConfigurationEventHandler.java @@ -0,0 +1,169 @@ +/*- + * ~~~~~~licensing~~~~~~ + * cluster-persistence-service + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +/* + * 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. + */ +package ru.entaxy.esb.platform.core.cluster.persistence.handler; + +import java.util.Map; +import java.util.Properties; + +import org.apache.karaf.cellar.config.ClusterConfigurationEvent; +import org.apache.karaf.cellar.config.ConfigurationEventHandler; +import org.apache.karaf.cellar.config.ConfigurationSupport; +import org.apache.karaf.cellar.config.Constants; +import org.apache.karaf.cellar.core.Configurations; +import org.apache.karaf.cellar.core.Group; +import org.apache.karaf.cellar.core.control.BasicSwitch; +import org.apache.karaf.cellar.core.control.Switch; +import org.apache.karaf.cellar.core.control.SwitchStatus; +import org.apache.karaf.cellar.core.event.EventHandler; +import org.apache.karaf.cellar.core.event.EventType; +import org.osgi.service.cm.Configuration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ru.entaxy.esb.platform.core.cluster.persistence.PersistenceManager; + +/** + * LocalConfigurationEventHandler handles received configuration cluster event. + */ +public class LocalConfigurationEventHandler extends ConfigurationSupport + implements EventHandler { + + private static final transient Logger LOGGER = LoggerFactory.getLogger(LocalConfigurationEventHandler.class); + + public static final String SWITCH_ID = "org.apache.karaf.cellar.configuration.handler"; + + private final Switch eventSwitch = new BasicSwitch(SWITCH_ID); + + private PersistenceManager persistenceManager; + + @Override + public void handle(ClusterConfigurationEvent event) { + + // check if the handler is ON + if (this.getSwitch().getStatus().equals(SwitchStatus.OFF)) { + LOGGER.debug("CELLAR CONFIG: {} switch is OFF, cluster event not handled", SWITCH_ID); + return; + } + + if (groupManager == null) { + // in rare cases for example right after installation this happens! + LOGGER.error("CELLAR CONFIG: retrieved event {} while groupManager is not available yet!", event); + return; + } + + // check if the group is local + if (!groupManager.isLocalGroup(event.getSourceGroup().getName())) { + LOGGER.debug("CELLAR CONFIG: node is not part of the event cluster group {}", + event.getSourceGroup().getName()); + return; + } + + // @ENTAXY:SKIP check if it's not a "local" event + //if (event.getLocal() != null && event.getLocal().getId().equalsIgnoreCase(clusterManager.getNode().getId())) { + // LOGGER.trace("CELLAR CONFIG: cluster event is local (coming from local synchronizer or listener)"); + // return; + //} + + Group group = event.getSourceGroup(); + String groupName = group.getName(); + + Map clusterConfigurations = + clusterManager.getMap(Constants.CONFIGURATION_MAP + Configurations.SEPARATOR + groupName); + + String pid = event.getId(); + + if (isAllowed(event.getSourceGroup(), Constants.CATEGORY, pid, EventType.INBOUND)) { + try { + // TODO mark cluster state as needed to be saved + LOGGER.debug("-->> WE NEED TO SAVE CLUSTER STATE"); + this.persistenceManager.updated(); + } catch (Exception ex) { + LOGGER.error("CELLAR CONFIG: failed to read cluster configuration", ex); + } + } else + LOGGER.trace("CELLAR CONFIG: configuration PID {} is marked BLOCKED INBOUND for cluster group {}", pid, + groupName); + } + + public void init() { + // nothing to do + } + + public void destroy() { + // nothing to do + } + + /** + * Get the cluster configuration event handler switch. + * + * @return the cluster configuration event handler switch. + */ + @Override + public Switch getSwitch() { + // load the switch status from the config + try { + Configuration configuration = configurationAdmin.getConfiguration(Configurations.NODE, null); + if (configuration != null) { + Boolean status = new Boolean((String) configuration.getProperties() + .get(Configurations.HANDLER + "." + ConfigurationEventHandler.class.getName())); + if (status) { + eventSwitch.turnOn(); + } else { + eventSwitch.turnOff(); + } + } + } catch (Exception e) { + // nothing to do + } + return eventSwitch; + } + + /** + * Get the cluster event type. + * + * @return the cluster configuration event type. + */ + @Override + public Class getType() { + return ClusterConfigurationEvent.class; + } + + public void setPersistenceManager(PersistenceManager persistenceManager) { + this.persistenceManager = persistenceManager; + } + +} diff --git a/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalEventDispatchTask.java b/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalEventDispatchTask.java index cb3bd084..8314e59c 100644 --- a/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalEventDispatchTask.java +++ b/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalEventDispatchTask.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * cluster-persistence-service * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalEventHandlerRegistryDispatcher.java b/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalEventHandlerRegistryDispatcher.java index c15725bf..cc345b80 100644 --- a/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalEventHandlerRegistryDispatcher.java +++ b/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalEventHandlerRegistryDispatcher.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * cluster-persistence-service * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalFeaturesEventHandler.java b/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalFeaturesEventHandler.java new file mode 100644 index 00000000..9d61aa4f --- /dev/null +++ b/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalFeaturesEventHandler.java @@ -0,0 +1,174 @@ +/*- + * ~~~~~~licensing~~~~~~ + * cluster-persistence-service + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +/* + * 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. + */ +package ru.entaxy.esb.platform.core.cluster.persistence.handler; + +import org.apache.karaf.cellar.core.Configurations; +import org.apache.karaf.cellar.core.control.BasicSwitch; +import org.apache.karaf.cellar.core.control.Switch; +import org.apache.karaf.cellar.core.control.SwitchStatus; +import org.apache.karaf.cellar.core.event.EventHandler; +import org.apache.karaf.cellar.core.event.EventType; +import org.apache.karaf.cellar.features.ClusterFeaturesEvent; +import org.apache.karaf.cellar.features.Constants; +import org.apache.karaf.cellar.features.FeatureState; +import org.apache.karaf.cellar.features.FeaturesEventHandler; +import org.apache.karaf.cellar.features.FeaturesSupport; +import org.apache.karaf.cellar.features.FeaturesSynchronizer; +import org.apache.karaf.features.FeatureEvent; +import org.osgi.framework.BundleContext; +import org.osgi.service.cm.Configuration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ru.entaxy.esb.platform.core.cluster.persistence.PersistenceManager; + +/** + * Handler for cluster features event. + */ +public class LocalFeaturesEventHandler extends FeaturesSupport implements EventHandler { + + private static final transient Logger LOGGER = LoggerFactory.getLogger(FeaturesSynchronizer.class); + + public static final String SWITCH_ID = "org.apache.karaf.cellar.event.features.handler"; + + private final Switch eventSwitch = new BasicSwitch(SWITCH_ID); + + private PersistenceManager persistenceManager; + + public PersistenceManager getPersistenceManager() { + return persistenceManager; + } + + public void setPersistenceManager(PersistenceManager persistenceManager) { + this.persistenceManager = persistenceManager; + } + + @Override + public void init(BundleContext bundleContext) { + super.init(bundleContext); + } + + @Override + public void destroy() { + super.destroy(); + } + + /** + * Handle a received cluster features event. + * + * @param event the received cluster feature event. + */ + public void handle(ClusterFeaturesEvent event) { + + if (this.getSwitch().getStatus().equals(SwitchStatus.OFF)) { + LOGGER.debug("CELLAR FEATURE: {} switch is OFF, cluster event is not handled", SWITCH_ID); + return; + } + + if (groupManager == null) { + // in rare cases for example right after installation this happens! + LOGGER.error("CELLAR FEATURE: retrieved event {} while groupManager is not available yet!", event); + return; + } + + // check if the group is local + if (!groupManager.isLocalGroup(event.getSourceGroup().getName())) { + LOGGER.debug("CELLAR FEATURE: node is not part of the event cluster group {}", + event.getSourceGroup().getName()); + return; + } + + // check if it's not a "local" event + if (event.getLocal() != null && event.getLocal().getId().equalsIgnoreCase(clusterManager.getNode().getId())) { + LOGGER.trace("CELLAR FEATURE: cluster event is local (coming from local synchronizer or listener)"); + return; + } + + String name = event.getName(); + String version = event.getVersion(); + if (isAllowed(event.getSourceGroup(), Constants.CATEGORY, name, EventType.INBOUND) || event.getForce()) { + FeatureEvent.EventType type = event.getType(); + Boolean isInstalled = isFeatureInstalledLocally(name, version); + try { + + persistenceManager.updated(); + + } catch (Exception e) { + LOGGER.error("CELLAR FEATURE: failed to handle cluster feature event", e); + } + } else + LOGGER.trace("CELLAR FEATURE: feature {} is marked BLOCKED INBOUND for cluster group {}", name, + event.getSourceGroup().getName()); + } + + /** + * Get the event type that this handler is able to handle. + * + * @return the cluster features event type. + */ + @Override + public Class getType() { + return ClusterFeaturesEvent.class; + } + + /** + * Get the handler switch. + * + * @return the handler switch. + */ + @Override + public Switch getSwitch() { + // load the switch status from the config + try { + Configuration configuration = configurationAdmin.getConfiguration(Configurations.NODE, null); + if (configuration != null) { + Boolean status = new Boolean((String) configuration.getProperties() + .get(Configurations.HANDLER + "." + + FeaturesEventHandler.class.getName())); + if (status) { + eventSwitch.turnOn(); + } else { + eventSwitch.turnOff(); + } + } + } catch (Exception e) { + // ignore + } + return eventSwitch; + } + +} diff --git a/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalHandlerRegistry.java b/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalHandlerRegistry.java index 2a5d800a..3d353f40 100644 --- a/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalHandlerRegistry.java +++ b/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalHandlerRegistry.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * cluster-persistence-service * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalRepositoryEventHandler.java b/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalRepositoryEventHandler.java new file mode 100644 index 00000000..6049b848 --- /dev/null +++ b/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalRepositoryEventHandler.java @@ -0,0 +1,135 @@ +/*- + * ~~~~~~licensing~~~~~~ + * cluster-persistence-service + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +/* + * 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. + */ +package ru.entaxy.esb.platform.core.cluster.persistence.handler; + +import org.apache.karaf.cellar.core.control.BasicSwitch; +import org.apache.karaf.cellar.core.control.Switch; +import org.apache.karaf.cellar.core.control.SwitchStatus; +import org.apache.karaf.cellar.core.event.EventHandler; +import org.apache.karaf.cellar.features.ClusterRepositoryEvent; +import org.apache.karaf.cellar.features.FeaturesSupport; +import org.apache.karaf.features.RepositoryEvent; +import org.osgi.framework.BundleContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ru.entaxy.esb.platform.core.cluster.persistence.PersistenceManager; + +/** + * Handler for cluster features repository event. + */ +public class LocalRepositoryEventHandler extends FeaturesSupport implements EventHandler { + + private static final transient Logger LOGGER = LoggerFactory.getLogger(LocalRepositoryEventHandler.class); + + public static final String SWITCH_ID = "org.apache.karaf.cellar.event.repository.handler"; + + private final Switch eventSwitch = new BasicSwitch(SWITCH_ID); + + private PersistenceManager persistenceManager; + + @Override + public void init(BundleContext bundleContext) { + super.init(bundleContext); + } + + @Override + public void destroy() { + super.destroy(); + } + + /** + * Handle cluster features repository event. + * + * @param event the cluster event to handle. + */ + @Override + public void handle(ClusterRepositoryEvent event) { + + // check if the handler is ON + if (eventSwitch.getStatus().equals(SwitchStatus.OFF)) { + LOGGER.debug("CELLAR FEATURE: {} switch is OFF, cluster event is not handled", SWITCH_ID); + return; + } + + if (groupManager == null) { + // in rare cases for example right after installation this happens! + LOGGER.error("CELLAR FEATURE: retrieved event {} while groupManager is not available yet!", event); + return; + } + + // check if the group is local + if (!groupManager.isLocalGroup(event.getSourceGroup().getName())) { + LOGGER.debug("CELLAR FEATURE: node is not part of the event cluster group"); + return; + } + + // check if the event is not "local" + if (event.getLocal() != null && event.getLocal().getId().equals(clusterManager.getNode().getId())) { + LOGGER.trace("CELLAR FEATURE: event is local (coming from synchronizer or listener)"); + return; + } + + String uri = event.getId(); + RepositoryEvent.EventType type = event.getType(); + try { + + // TODO mark cluster state as needed to be saved + LOGGER.debug("-->> WE NEED TO SAVE CLUSTER STATE"); + this.persistenceManager.updated(); + + } catch (Exception e) { + LOGGER.error("CELLAR FEATURE: failed to add/remove repository URL {}", uri, e); + } + } + + @Override + public Class getType() { + return ClusterRepositoryEvent.class; + } + + @Override + public Switch getSwitch() { + return eventSwitch; + } + + public void setPersistenceManager(PersistenceManager persistenceManager) { + this.persistenceManager = persistenceManager; + } + + +} diff --git a/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalTopicConsumer.java b/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalTopicConsumer.java index a2049552..3bbee7fc 100644 --- a/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalTopicConsumer.java +++ b/platform/runtime/core/cluster/cluster-persistence-service/src/main/java/ru/entaxy/esb/platform/core/cluster/persistence/handler/LocalTopicConsumer.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * cluster-persistence-service * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/cluster/pom.xml b/platform/runtime/core/cluster/pom.xml index 3d4549dd..6e85d69e 100644 --- a/platform/runtime/core/cluster/pom.xml +++ b/platform/runtime/core/cluster/pom.xml @@ -3,7 +3,7 @@ ru.entaxy.esb.platform.runtime core - 1.10.0 + 1.11.0 ru.entaxy.esb.platform.runtime.core cluster diff --git a/platform/runtime/core/core-support/cfg/ignite.cfg b/platform/runtime/core/core-support/cfg/ignite.cfg new file mode 100644 index 00000000..59a5bb3d --- /dev/null +++ b/platform/runtime/core/core-support/cfg/ignite.cfg @@ -0,0 +1,9 @@ +ignite.work.directory.path=data/ignite +ignite.metrics.log.frequency=600000 + +ignite.platform.cache.name=platform +ignite.common.cache.name=runtime +ignite.common.cache.cacheMode=REPLICATED +ignite.common.cache.rebalanceMode=SYNC +ignite.common.cache.atomicityMode=TRANSACTIONAL +ignite.common.cache.backups=2 \ No newline at end of file diff --git a/platform/runtime/core/core-support/cfg/jgroups.locking.xml b/platform/runtime/core/core-support/cfg/jgroups.locking.xml new file mode 100644 index 00000000..a3391afc --- /dev/null +++ b/platform/runtime/core/core-support/cfg/jgroups.locking.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/platform/runtime/core/core-support/core-support-design/pom.xml b/platform/runtime/core/core-support/core-support-design/pom.xml index 958dc7ff..390c3dfe 100644 --- a/platform/runtime/core/core-support/core-support-design/pom.xml +++ b/platform/runtime/core/core-support/core-support-design/pom.xml @@ -4,7 +4,7 @@ ru.entaxy.esb.platform.runtime.core core-support - 1.10.0 + 1.11.0 core-support-design bundle diff --git a/platform/runtime/core/core-support/core-support-design/src/main/java/ru/entaxy/platform/core/support/design/classgen/Cu2JaConverter.java b/platform/runtime/core/core-support/core-support-design/src/main/java/ru/entaxy/platform/core/support/design/classgen/Cu2JaConverter.java index 28b2b5f4..cbd46573 100644 --- a/platform/runtime/core/core-support/core-support-design/src/main/java/ru/entaxy/platform/core/support/design/classgen/Cu2JaConverter.java +++ b/platform/runtime/core/core-support/core-support-design/src/main/java/ru/entaxy/platform/core/support/design/classgen/Cu2JaConverter.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * core-support-design * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/core-support/core-support-design/src/main/java/ru/entaxy/platform/core/support/design/openapi/EntaxyOpenApiGenerator.java b/platform/runtime/core/core-support/core-support-design/src/main/java/ru/entaxy/platform/core/support/design/openapi/EntaxyOpenApiGenerator.java index b8d96a44..f1f1efb8 100644 --- a/platform/runtime/core/core-support/core-support-design/src/main/java/ru/entaxy/platform/core/support/design/openapi/EntaxyOpenApiGenerator.java +++ b/platform/runtime/core/core-support/core-support-design/src/main/java/ru/entaxy/platform/core/support/design/openapi/EntaxyOpenApiGenerator.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * core-support-design * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/core-support/core-support-design/src/main/java/ru/entaxy/platform/core/support/design/openapi/EntaxyOpenApiGeneratorDeprecated.java b/platform/runtime/core/core-support/core-support-design/src/main/java/ru/entaxy/platform/core/support/design/openapi/EntaxyOpenApiGeneratorDeprecated.java new file mode 100644 index 00000000..a335657a --- /dev/null +++ b/platform/runtime/core/core-support/core-support-design/src/main/java/ru/entaxy/platform/core/support/design/openapi/EntaxyOpenApiGeneratorDeprecated.java @@ -0,0 +1,658 @@ +/*- + * ~~~~~~licensing~~~~~~ + * core-support-design + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.support.design.openapi; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import javax.json.Json; +import javax.json.stream.JsonGenerator; + +import org.apache.commons.io.FileUtils; +import org.openapitools.codegen.ClientOptInput; +import org.openapitools.codegen.DefaultGenerator; +import org.openapitools.codegen.Generator; +import org.openapitools.codegen.config.CodegenConfigurator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.serialization.JavaParserJsonSerializer; +import com.github.javaparser.utils.SourceRoot; + +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.parser.OpenAPIV3Parser; +import io.swagger.v3.parser.core.models.SwaggerParseResult; +import javassist.CtClass; +import ru.entaxy.platform.base.support.CommonUtils; +import ru.entaxy.platform.core.support.design.classgen.Cu2JaConverter; + +@Deprecated(since = "1.10", forRemoval = true) +public class EntaxyOpenApiGeneratorDeprecated { + + private static final Logger log = LoggerFactory.getLogger(EntaxyOpenApiGeneratorDeprecated.class); + + public enum GENERATION_STATUS { + NONE, + IN_PROGRESS, + OK, + FAILED + } + + public enum GENERATION_PHASE { + NONE, + CHECK, + GENERATE_JAVA, + PARSE_JAVA, + GENERATE_CLASSES + } + + public enum GENERATION_PHASE_STATE { + PRE_EXECUTE, + IN_PROGRESS, + DONE + } + + public static interface GenerationCallback { + + public void event(GenerationResult generationResult); + + } + + public static abstract class AbstractResult { + public GENERATION_STATUS status = GENERATION_STATUS.NONE; + public List exceptions = new ArrayList<>();; + public Map properties = new HashMap<>(); + + public AbstractResult status(GENERATION_STATUS newStatus) { + this.status = newStatus; + return this; + } + + public boolean isOk() { + return GENERATION_STATUS.OK.equals(status); + } + + public boolean isFailed() { + return GENERATION_STATUS.FAILED.equals(status); + } + + public boolean isInProgress() { + return GENERATION_STATUS.IN_PROGRESS.equals(status); + } + + public boolean isFinished() { + return isOk() || isFailed(); + } + } + + public static class GenerationResult extends AbstractResult { + + public GENERATION_PHASE currentPhase = GENERATION_PHASE.NONE; + public Map phases = new LinkedHashMap<>(); + + public EntaxyOpenApiGeneratorDeprecated generator; + + public GenerationResult phase(GENERATION_PHASE phase) { + return this.phase(phase, new PhaseResult()); + } + + public GenerationResult phase(GENERATION_PHASE phase, PhaseResult phaseResult) { + phases.put(phase, phaseResult); + currentPhase = phase; + return this; + } + + public GenerationResult phaseStatus(GENERATION_STATUS newStatus) { + this.currentPhaseResult().status = newStatus; + this.generator.callback(this); + return this; + } + + public GenerationResult phaseInProgress() { + this.currentPhaseResult().state(GENERATION_PHASE_STATE.IN_PROGRESS); + return this.phaseStatus(GENERATION_STATUS.IN_PROGRESS); + } + + public GenerationResult phaseOk() { + this.currentPhaseResult().state(GENERATION_PHASE_STATE.DONE); + return this.phaseStatus(GENERATION_STATUS.OK); + } + + public GenerationResult phaseFailed() { + this.currentPhaseResult().state(GENERATION_PHASE_STATE.DONE); + return this.phaseStatus(GENERATION_STATUS.FAILED); + } + + public PhaseResult currentPhaseResult() { + return this.phases.get(currentPhase); + } + + public boolean isCurrentPhaseOk() { + return (currentPhase!=null) + && currentPhaseResult().status.equals(GENERATION_STATUS.OK); + } + + } + + public static class PhaseResult extends AbstractResult { + public List resultObjects = new ArrayList<>(); + public GENERATION_PHASE_STATE currentState = GENERATION_PHASE_STATE.PRE_EXECUTE; + public PhaseResult state(GENERATION_PHASE_STATE state) { + this.currentState = state; + return this; + } + } + + protected static abstract class PhaseProcessor { + + protected EntaxyOpenApiGeneratorDeprecated generator; + protected GenerationResult generationResult; + + public void process(EntaxyOpenApiGeneratorDeprecated generator, GenerationResult generationResult) { + this.generator = generator; + this.generationResult = generationResult; + this.generationResult.phase(getPhase()); + this.generator.callback(this.generationResult); + execute(); + } + + protected abstract GENERATION_PHASE getPhase(); + + protected void execute() { + this.generationResult.currentPhaseResult().state(GENERATION_PHASE_STATE.IN_PROGRESS); + this.generator.callback(this.generationResult); + doExecute(); + this.generationResult.currentPhaseResult().state(GENERATION_PHASE_STATE.DONE); + this.generator.callback(this.generationResult); + }; + + protected abstract void doExecute(); + + protected void failWithException(Throwable e) { + generationResult.exceptions.add(e); + generationResult.currentPhaseResult().exceptions.add(e); + generationResult.currentPhaseResult().state(GENERATION_PHASE_STATE.DONE); + generationResult.phaseFailed(); + generator.callback(generationResult); + } + } + + protected static class CheckPhaseProcessor extends PhaseProcessor { + + public CheckPhaseProcessor() { + super(); + } + + @Override + protected GENERATION_PHASE getPhase() { + return GENERATION_PHASE.CHECK; + } + + @Override + protected void doExecute() { + this.generationResult.currentPhaseResult().status(GENERATION_STATUS.IN_PROGRESS); + SwaggerParseResult result = (new OpenAPIV3Parser()).readLocation( + this.generator.getUrl() + , null + , null); + OpenAPI api = result.getOpenAPI(); + if (api != null) { + this.generationResult.currentPhaseResult().properties.put("api", api); + this.generationResult.properties.put("api", api); + this.generationResult.currentPhaseResult().status(GENERATION_STATUS.OK); + } else { + this.generationResult.currentPhaseResult().status(GENERATION_STATUS.FAILED); + } + } + + } + + protected static class GenerateJavaPhaseProcessor extends PhaseProcessor { + + public GenerateJavaPhaseProcessor() { + super(); + } + + @Override + protected GENERATION_PHASE getPhase() { + return GENERATION_PHASE.GENERATE_JAVA; + } + + @Override + protected void doExecute() { + this.generationResult.generator.initializeRootFolder(); + this.generationResult.phaseInProgress(); + + CodegenConfigurator configurator = new CodegenConfigurator(); + Generator codeGenerator; + + if (!CommonUtils.isValid(generator.getApiPackage())) { + generator.setApiPackage("entaxy.openapi." + + generator.apiTitleConverted + + ".v_" + generator.apiVersionConverted); + } + if (!CommonUtils.isValid(generator.getModelPackage())) { + generator.setModelPackage(generator.apiPackage + ".model"); + } + + configurator.setApiPackage(generator.apiPackage); + configurator.setModelPackage(generator.modelPackage); + + configurator.setGeneratorName("jaxrs-cxf"); + + configurator.setOutputDir( + Paths.get(generator.targetDir.getAbsolutePath(), "sources") + .toFile() + .getAbsolutePath()); + + configurator.setInputSpec(generator.getUrl()); + + try { + + final ClientOptInput clientOptInput = configurator.toClientOptInput(); + + codeGenerator = new DefaultGenerator(false); + + codeGenerator.opts(clientOptInput); + codeGenerator.generate(); + + generationResult.properties.put("generator.java.source.path", "sources/src/gen/java"); + + generationResult.phaseOk(); + + } catch (Exception e) { + + log.error("openapi-generator finished with exception", e); + failWithException(e); + } + + } + + } + + protected static class ParseJavaPhaseProcessor extends PhaseProcessor { + + public ParseJavaPhaseProcessor() { + super(); + } + + @Override + protected GENERATION_PHASE getPhase() { + return GENERATION_PHASE.PARSE_JAVA; + } + + @Override + protected void doExecute() { + + List apiCUs; + List modelCUs; + + String sourceRootFolder = Paths.get( generator.targetDir.getAbsolutePath() + ,generationResult.properties.get("generator.java.source.path") + .toString()).toAbsolutePath().toString(); + + String apiPackageFolder = generator.apiPackage.replace('.', '/'); + String modelPackageFolder = generator.modelPackage.replace('.', '/'); + + String apiFolder = Paths.get(sourceRootFolder, apiPackageFolder).toAbsolutePath().toString(); + String modelFolder = Paths.get(sourceRootFolder, modelPackageFolder).toAbsolutePath().toString(); + + File apiFolderFile = new File(apiFolder); + File[] apis = apiFolderFile.listFiles((dir, name)->dir.getAbsolutePath().equals(apiFolderFile.getAbsolutePath()) && name.endsWith(".java")); + File modelFolderFile = new File(modelFolder); + File[] models = modelFolderFile.listFiles((dir, name)->dir.getAbsolutePath().equals(modelFolderFile.getAbsolutePath()) && name.endsWith(".java")); + + String parsedRootFolder = Paths.get(generator.targetDir.getAbsolutePath(), "parsed").toAbsolutePath().toString(); + try { + Files.createDirectories(Paths.get(parsedRootFolder)); + Files.createDirectories(Paths.get(parsedRootFolder, "model")); + } catch (IOException e) { + log.error("Error creating directories", e); + } + + SourceRoot sourceRoot = new SourceRoot(Paths.get(sourceRootFolder)); + + JavaParserJsonSerializer serializer = new JavaParserJsonSerializer(); + + apiCUs = new ArrayList<>(); + modelCUs = new ArrayList<>(); + + for (int i=0; i0) { + for (int i=0; i apiCUs = (List)generationResult.properties + .getOrDefault("parser.cu.api", Collections.emptyList()); + @SuppressWarnings("unchecked") + List modelCUs = (List)generationResult.properties + .getOrDefault("parser.cu.model", Collections.emptyList()); + + try { + String classesRootFolder = Paths.get(generator.targetDir.getAbsolutePath(), "classes").toString(); + + Files.createDirectories(Paths.get(classesRootFolder)); + + Cu2JaConverter converter = new Cu2JaConverter(); + + List modelClassesImports = new ArrayList<>(); + for (CompilationUnit cu: modelCUs) + modelClassesImports.add(cu.getPackageDeclaration().get().getName().asString() + + "." + cu.getPrimaryType().get().getNameAsString()); + + List modelClasses = new ArrayList<>(); + List apiClasses = new ArrayList<>(); + + for (CompilationUnit cu: modelCUs) { + converter.clearImports(); + for (String s: modelClassesImports) + converter.addImport(s); + modelClasses.add(converter.convert(cu)); + } + + for (CompilationUnit cu: apiCUs) { + converter.clearImports(); + for (String s: modelClassesImports) + converter.addImport(s); + apiClasses.add(converter.convert(cu)); + } + + List apiClassesFinal = new ArrayList<>(); + List modelClassesFinal = new ArrayList<>(); + + for (CtClass ctClass: modelClasses) { + if (ctClass == null) + continue; + ctClass.writeFile(classesRootFolder); + modelClassesFinal.add(ctClass.getName()); + } + + for (CtClass ctClass: apiClasses) { + if (ctClass == null) + continue; + ctClass.writeFile(classesRootFolder); + apiClassesFinal.add(ctClass.getName()); + } + + generationResult.properties.put("classes.path", classesRootFolder); + generationResult.properties.put("classes.api", apiClassesFinal); + generationResult.properties.put("classes.model", modelClassesFinal); + + generationResult.phaseOk(); + + + } catch (Exception e) { + log.error("javassist finished with exception", e); + failWithException(e); + return; + } + + } + } + + protected static Map> processorMap = new HashMap<>(); + + protected static List defaultPlan = new LinkedList<>(); + + static { + + processorMap.put(GENERATION_PHASE.CHECK, CheckPhaseProcessor.class); + processorMap.put(GENERATION_PHASE.GENERATE_JAVA, GenerateJavaPhaseProcessor.class); + processorMap.put(GENERATION_PHASE.PARSE_JAVA, ParseJavaPhaseProcessor.class); + processorMap.put(GENERATION_PHASE.GENERATE_CLASSES, GenerateClassesPhaseProcessor.class); + + defaultPlan.add(GENERATION_PHASE.CHECK); + defaultPlan.add(GENERATION_PHASE.GENERATE_JAVA); + defaultPlan.add(GENERATION_PHASE.PARSE_JAVA); + defaultPlan.add(GENERATION_PHASE.GENERATE_CLASSES); + + } + + + + protected String url; + + protected String rootFolder = UUID.randomUUID().toString(); + + protected SwaggerParseResult parseResult; + + protected String apiTitleConverted = "unknown_api"; + protected String apiVersionConverted = "1_0_0"; + + protected String apiPackage; + protected String modelPackage; + + protected List executionPlan = defaultPlan; + + protected GenerationCallback callback; + + protected GenerationResult result = new GenerationResult(); + + protected File targetDir = null; + + public GenerationResult generate() { + + result.generator = this; + + result.phase(GENERATION_PHASE.NONE).status(GENERATION_STATUS.NONE); + callback(result); + if (executionPlan != null) { + result.status(GENERATION_STATUS.IN_PROGRESS); + callback(result); + for (GENERATION_PHASE phase: executionPlan) { + PhaseProcessor processor = null; + try { + processor = processorMap.get(phase).getConstructor().newInstance(); + } catch (InstantiationException | IllegalAccessException | IllegalArgumentException + | InvocationTargetException | NoSuchMethodException | SecurityException e) { + result.currentPhaseResult().exceptions.add(e); + result.exceptions.add(e); + result.status(GENERATION_STATUS.FAILED); + callback(result); + return result; + } + processor.process(this, result); + if (result.currentPhaseResult().status.equals(GENERATION_STATUS.FAILED)) + return result; + } + result.status(GENERATION_STATUS.OK); + callback(result); + } + return result; + } + + protected void initializeRootFolder() { + if (this.targetDir != null) + return; + Path target = Paths.get( + System.getProperty("karaf.home") + , "temp" + , rootFolder); + this.targetDir = target.toFile(); + if (!this.targetDir.exists()) + this.targetDir.mkdirs(); + } + + public void clean() { + try { + FileUtils.deleteDirectory(targetDir); + } catch (IOException e) { + log.error("Failed deleting [" + targetDir.getAbsolutePath() + "]", e); + } + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getRootFolder() { + return rootFolder; + } + + public void setRootFolder(String rootFolder) { + this.rootFolder = rootFolder; + } + + public SwaggerParseResult getParseResult() { + return parseResult; + } + + public GenerationCallback getCallback() { + return callback; + } + + public void setCallback(GenerationCallback callback) { + this.callback = callback; + } + + public void callback(GenerationResult generationResult) { + if (callback != null) + callback.event(generationResult); + } + + public List getExecutionPlan() { + return executionPlan; + } + + public void setExecutionPlan(List executionPlan) { + this.executionPlan = executionPlan; + } + + public String getApiTitleConverted() { + return apiTitleConverted; + } + + public void setApiTitleConverted(String apiTitleConverted) { + this.apiTitleConverted = apiTitleConverted; + } + + public String getApiVersionConverted() { + return apiVersionConverted; + } + + public void setApiVersionConverted(String apiVersionConverted) { + this.apiVersionConverted = apiVersionConverted; + } + + public String getApiPackage() { + return apiPackage; + } + + public void setApiPackage(String apiPackage) { + this.apiPackage = apiPackage; + } + + public String getModelPackage() { + return modelPackage; + } + + public void setModelPackage(String modelPackage) { + this.modelPackage = modelPackage; + } + + public File getTargetDir() { + return targetDir; + } + +} diff --git a/platform/runtime/core/core-support/core-support-design/src/main/java/ru/entaxy/platform/core/support/design/openapi/utils/CompilationUnit.java b/platform/runtime/core/core-support/core-support-design/src/main/java/ru/entaxy/platform/core/support/design/openapi/utils/CompilationUnit.java new file mode 100644 index 00000000..8e76c3f8 --- /dev/null +++ b/platform/runtime/core/core-support/core-support-design/src/main/java/ru/entaxy/platform/core/support/design/openapi/utils/CompilationUnit.java @@ -0,0 +1,121 @@ +/*- + * ~~~~~~licensing~~~~~~ + * core-support-design + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.support.design.openapi.utils; + +import org.eclipse.jdt.internal.compiler.env.ICompilationUnit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.Path; +import java.util.StringTokenizer; + +public class CompilationUnit implements ICompilationUnit { + + public static final int BUFFER_SIZE = 8192; + private final String className; + private final String sourceFile; + private final String ignoredPart; + + private static final Logger log = LoggerFactory.getLogger(CompilationUnit.class); + + public CompilationUnit(String sourceFile, String className, String ignoredPart) { + this.className = className; + this.sourceFile = sourceFile; + this.ignoredPart = ignoredPart; + } + + @Override + public char[] getFileName() { + int i = sourceFile.indexOf(ignoredPart); + String result = sourceFile; + if (i >= 0) { + result = result.substring(i + ignoredPart.length()); + } + return result.toCharArray(); + } + + @Override + public char[] getContents() { + char[] result = null; + try (FileInputStream is = new FileInputStream(sourceFile); + InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8); + Reader reader = new BufferedReader(isr)) { + char[] chars = new char[BUFFER_SIZE]; + StringBuilder source = new StringBuilder(); + int count; + while ((count = reader.read(chars, 0, chars.length)) > 0) { + source.append(chars, 0, count); + } + result = new char[source.length()]; + source.getChars(0, result.length, result, 0); + } catch (IOException e) { + log.error("Failed to get source file {} contents", sourceFile, e); + } + return result; + } + + @Override + public char[] getMainTypeName() { + int dot = className.lastIndexOf('.'); + if (dot > 0) { + return className.substring(dot + 1).toCharArray(); + } + return className.toCharArray(); + } + + @Override + public char[][] getPackageName() { + StringTokenizer st = new StringTokenizer(className, "."); + char[][] result = new char[st.countTokens() - 1][]; + for (int i = 0; i < result.length; i++) { + String token = st.nextToken(); + result[i] = token.toCharArray(); + } + return result; + } + + public static ICompilationUnit build(Path fullPath, String containingDir) { + Path name = fullPath.getFileName(); + String directory = fullPath.toString(); + int i = directory.indexOf(containingDir); + if (i != -1) { + String packageDir = directory + .substring(i + containingDir.length()) + .replace(name.toString(), "").replace('\\', '/'); + String className = name.toString().replaceAll(".java$", ""); + if (!packageDir.endsWith("/")) { + packageDir = packageDir + "/"; + } + if (packageDir.startsWith("/")) { + packageDir = packageDir.substring(1); + } + return new CompilationUnit(fullPath.toString(), packageDir.replaceAll("/", ".") + className, containingDir); + } + return null; + } +} diff --git a/platform/runtime/core/core-support/core-support-design/src/main/java/ru/entaxy/platform/core/support/design/openapi/utils/CompilerRequestor.java b/platform/runtime/core/core-support/core-support-design/src/main/java/ru/entaxy/platform/core/support/design/openapi/utils/CompilerRequestor.java new file mode 100644 index 00000000..f076d412 --- /dev/null +++ b/platform/runtime/core/core-support/core-support-design/src/main/java/ru/entaxy/platform/core/support/design/openapi/utils/CompilerRequestor.java @@ -0,0 +1,115 @@ +/*- + * ~~~~~~licensing~~~~~~ + * core-support-design + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.support.design.openapi.utils; + +import com.google.common.base.Joiner; +import org.eclipse.jdt.core.compiler.IProblem; +import org.eclipse.jdt.internal.compiler.ClassFile; +import org.eclipse.jdt.internal.compiler.CompilationResult; +import org.eclipse.jdt.internal.compiler.ICompilerRequestor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class CompilerRequestor implements ICompilerRequestor { + private static final Logger log = LoggerFactory.getLogger(CompilerRequestor.class); + + private final Map> problemList = new HashMap<>(); + + private final String outputDir; + + public CompilerRequestor(String outputDir) { + this.outputDir = outputDir; + } + + @Override + public void acceptResult(CompilationResult result) { + if (result.hasProblems()) { + IProblem[] problems = result.getProblems(); + for (IProblem problem : problems) { + if (problem.isError()) { + String fileName = + new String(problem.getOriginatingFileName()); + List errors = problemList.getOrDefault(fileName, new ArrayList<>()); + errors.add(String.format("%s %d: %s", fileName, problem.getSourceLineNumber(), problem.getMessage())); + problemList.put(fileName, errors); + } + } + } + if (problemList.isEmpty()) { + createOutDirIfNotExist(this.outputDir); + ClassFile[] classFiles = result.getClassFiles(); + for (ClassFile classFile : classFiles) { + char[][] compoundName = + classFile.getCompoundName(); + StringBuilder classFileName = new StringBuilder(outputDir).append('/'); + for (int j = 0; j < compoundName.length; j++) { + if (j > 0) { + classFileName.append('/'); + } + classFileName.append(compoundName[j]); + if (j == compoundName.length - 2) { + createOutDirIfNotExist(classFileName.toString()); + } + } + + byte[] bytes = classFile.getBytes(); + classFileName.append(".class"); + try (FileOutputStream classStream = new FileOutputStream(classFileName.toString()); + BufferedOutputStream bos = new BufferedOutputStream(classStream)) { + bos.write(bytes); + } catch (IOException e) { + log.error("Error writing classfile {}", classFileName, e); + } + } + } else { + problemList.forEach((file, errors) -> log.error("Error compiling {}:\n {}", file, Joiner.on("\n\t").join(errors))); + } + } + + private void createOutDirIfNotExist(String directory) { + File f = new File(directory); + if (! f.exists()) { + if (! f.mkdirs()) { + throw new RuntimeException("Cannot create output directory " + directory); + } + } else if (! f.isDirectory()) { + throw new RuntimeException("File " + directory + " is not directory"); + } + } + + public Map> getProblemList() { + return problemList; + } +} diff --git a/platform/runtime/core/core-support/core-support-design/src/main/java/ru/entaxy/platform/core/support/design/openapi/utils/INameEnvironmentImpl.java b/platform/runtime/core/core-support/core-support-design/src/main/java/ru/entaxy/platform/core/support/design/openapi/utils/INameEnvironmentImpl.java new file mode 100644 index 00000000..6a7f6c2d --- /dev/null +++ b/platform/runtime/core/core-support/core-support-design/src/main/java/ru/entaxy/platform/core/support/design/openapi/utils/INameEnvironmentImpl.java @@ -0,0 +1,155 @@ +/*- + * ~~~~~~licensing~~~~~~ + * core-support-design + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.support.design.openapi.utils; + +import org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader; +import org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException; +import org.eclipse.jdt.internal.compiler.env.INameEnvironment; +import org.eclipse.jdt.internal.compiler.env.NameEnvironmentAnswer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + +public class INameEnvironmentImpl implements INameEnvironment { + private static final Logger log = LoggerFactory.getLogger(INameEnvironmentImpl.class); + private final ClassLoader classLoader; + + public INameEnvironmentImpl(ClassLoader classLoader) { + this.classLoader = classLoader; + } + + @Override + public NameEnvironmentAnswer findType(char[][] compoundTypeName) { + StringBuilder result = new StringBuilder(); + for(int i = 0; i < compoundTypeName.length; i++) { + if (i > 0) { + result.append("."); + } + result.append(compoundTypeName[i]); + } + String typeName = result.toString(); + log.debug("Searching for any package type {}", typeName); + return findType(typeName); + } + + @Override + public NameEnvironmentAnswer findType(char[] typeName, char[][] packageName) { + StringBuilder buffer = new StringBuilder(); + int i=0; + for (; i < packageName.length; i++) { + if (i > 0) { + buffer.append('.'); + } + buffer.append(packageName[i]); + } + if (i > 0) { + buffer.append('.'); + } + buffer.append(typeName); + String result = buffer.toString(); + log.debug("Searching for type {} in package {}", new String(typeName), result); + return findType(result); + } + + private NameEnvironmentAnswer findType(String className) { + String resourceName = className.replace('.', '/') + ".class"; + + try (InputStream is = classLoader.getResourceAsStream(resourceName)) { + if (is != null) { + byte[] classBytes; + byte[] buf = new byte[8192]; + ByteArrayOutputStream baos = new ByteArrayOutputStream(buf.length); + int count; + while ((count = is.read(buf, 0, buf.length)) > 0) { + baos.write(buf, 0, count); + } + baos.flush(); + classBytes = baos.toByteArray(); + char[] fileName = className.toCharArray(); + ClassFileReader classFileReader = new ClassFileReader(classBytes, fileName, true); + log.debug("Found type {}", className); + return new NameEnvironmentAnswer(classFileReader, null); + } else { + log.error("Class {} not found ", className); + } + } catch (IOException | ClassFormatException e) { + log.error("Failed to get class {}", className, e); + } + return null; + } + + private boolean isPackage(String resource) { + boolean result = false; + String resourceName = resource.replace('.', '/') + ".class"; + try (InputStream is = classLoader.getResourceAsStream(resourceName)) { + result = is == null; + } catch (IOException e) { + result = false; + } + log.debug("isPackage({}) result: {}", resource, result); + return result; + } + + @Override + public boolean isPackage(char[][] parentPackageName, char[] packageName) { + StringBuilder result = new StringBuilder(); + //fast hack: package are seldom start from uppercase + String lp = new String(packageName); + if (lp.matches("^[A-Z].*?") || lp.contains("$")) { + log.debug("Skipping package check for resource {}", packageName); + return false; + } + int i = 0; + if (parentPackageName != null) { + for (; i < parentPackageName.length; i++) { + if (i > 0) { + result.append('.'); + } + result.append(parentPackageName[i]); + } + } + + if (Character.isUpperCase(packageName[0])) { + if (!isPackage(result.toString())) { + return false; + } + } + if (i > 0) { + result.append('.'); + } + result.append(packageName); + + return isPackage(result.toString()); + } + + @Override + public void cleanup() { + + } +} diff --git a/platform/runtime/core/core-support/core-support-runtime-legacy/LICENSE.txt b/platform/runtime/core/core-support/core-support-runtime-legacy/LICENSE.txt new file mode 100644 index 00000000..4ae94b75 --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime-legacy/LICENSE.txt @@ -0,0 +1,175 @@ + ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ + +Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой) +версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего +Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН +7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова, +д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу +https://www.emdev.ru/about (далее - Компания). + +Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями» +(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения, +Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в +настоящем документе, в противном случае, он должен не использовать или не получать доступ +к Программному обеспечению. + + 1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ + +a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии +или редакции, исключительные права на которую принадлежат Правообладателю. +b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные +права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ +для ЭВМ № 2021610848 от 19.01.2021 года. +c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта +https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО. +d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также +личные неимущественные права авторов произведений на результат интеллектуальной деятельности. +e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование +ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка +включает предоставление Пользователю неисключительного права использования ПО, в том числе +получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение +патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается +Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается +для каждого Пользователя индивидуально в Сертификате. +f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром), +подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное +обеспечение в ограниченном объёме и на определённый период времени. +g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО, +предоставленных Пользователю согласно условиям Подписки. +h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного +обеспечения. +i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий +из одного или нескольких файлов, который может быть прочтён человеком. +j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля +программы, полученный в результате обработки исходного кода, еще не связанный в полную программу. +Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый +продукт. +k) Некоммерческое использование – индивидуальное личное использование Пользователем программного +обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации +возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая +выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения. + + 2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ + +2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного +обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом +воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения +в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ. +2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит +неисключительный характер. +2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию, +лицензия на ограниченное использование Программного обеспечения. +2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования +имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан +обратиться в службу поддержки Правообладателя по адресу: https://entaxy.ru/ для изменения +вида лицензии с Базовой бесплатной версии на Подписки. +2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для +пробного использования программного обеспечения – не ограничен. +2.6. Использование Пользователем настоящего программного обеспечения в целях разработки, +модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю, +без разрешения Правообладателя не допускается. + + 3. АВТОРСКОЕ ПРАВО. + +3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение +и любые его копии принадлежат Правообладателю. +3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента, +к которому можно получить доступ с помощью Программного обеспечения, является собственностью +соответствующего владельца контента и защищается применимым законодательством об авторском +праве или другими законами и договорами об интеллектуальной собственности. +3.3. Условия использования Программного обеспечения. +Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь +придерживается следующих условий: +3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять +какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании +Программного обеспечения или на нем. +3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать, +расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать +Программное обеспечение. +3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования +ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне. +3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено +использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам. + + 4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС» + +4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю +на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с +использованием Пользователем: +4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в +Программное обеспечение; +4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями +настоящего соглашения; +4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием, +или данными, не предоставленными Пользователю Правообладателем; +4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем. + + +5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ +ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ +И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ +ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ +И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ +ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО. + + 6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ. +НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ +ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ, +ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ; +ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ. +ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ +ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ; +КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ +ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ. + + 7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ: +Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия +(включая, но не ограничиваясь) по: +-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код) + Программного обеспечения; +-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный +код Программного обеспечения, за исключением тех изменений, которые вносятся средствами, +включёнными в Программное обеспечение и описанными непосредственно в документации к нему; +-созданию условий для использования Программного обеспечения лицами, не имеющими прав на +использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство +третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа +к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку; +-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию). + + 8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА. + +8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из +лицензионных продуктов, используемых на законных основаниях, а +именно https://entaxy.ru/libs/licenses/root-aggregated.deps. +8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть +совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения. +8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться +Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения, +содержащих все изменения и дополнения программного обеспечения. + + 9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ. + +9.1. Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым +программным обеспечением. +9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно +с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм +«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public. +9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий +пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя, +прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер +ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства +Российской Федерации. + + 10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ. + +10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет +право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб, +недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий +пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере +2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения +исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy). +10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое +законодательство – Российской Федерации. +10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным, +остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать +исполнять свои обязанности в соответствии с этими положениями. diff --git a/platform/runtime/core/core-support/core-support-runtime-legacy/pom.xml b/platform/runtime/core/core-support/core-support-runtime-legacy/pom.xml new file mode 100644 index 00000000..317e2f28 --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime-legacy/pom.xml @@ -0,0 +1,166 @@ + + 4.0.0 + + ru.entaxy.esb.platform.runtime.core + core-support + 1.11.0 + + core-support-runtime-legacy + bundle + ENTAXY :: PLATFORM :: CORE :: SUPPORT :: RUNTIME LEGACY + ENTAXY :: PLATFORM :: CORE :: SUPPORT :: RUNTIME LEGACY + + + + ru.entaxy.esb.system.common.aggregation, + ru.entaxy.esb.system.common.aggregation.hazelcast, + ru.entaxy.esb.system.common.aggregation.repo, + ru.entaxy.esb.system.common.exception, + ru.entaxy.esb.system.common.interceptor, + ru.entaxy.esb.system.common.util, + ru.entaxy.esb.system.common.validator + + + com.google.gson, + org.osgi.service.blueprint.container, + javax.xml.soap*;version="[1.3,2)", + javax.jws.*;version="[2.0.0,3.0.0)", + javax.jws.soap.*;version="[2.0.0,3.0.0)", + javax.xml.ws.*;version="[2.2.0,3.0.0)", + !com.sun.xml.*, + javax.xml.bind;version="[2,3)", + javax.xml.bind.annotation;version="[2,3)", + javax.persistence;version="[2,3)", + org.hibernate, + org.hibernate.cfg, + org.hibernate.service, + org.hibernate.jpa, + org.hibernate.proxy, + org.apache.ignite, + org.apache.ignite.internal.processors.cluster, + org.apache.ignite.internal.processors.marshaller, + org.apache.ignite.internal.util.lang.gridfunc, + org.apache.ignite.spi.discovery.tcp.internal, + org.apache.ignite.transactions, + org.apache.ignite.internal.*, + javassist.util.proxy, + org.apache.commons.lang3, + * + + + + + + + com.google.code.gson + gson + + + xerces + xercesImpl + ${xerces.version} + + + xml-apis + xml-apis + + + + + org.osgi + org.osgi.core + ${osgi.version} + + + commons-collections + commons-collections + + + commons-lang + commons-lang + ${commons-lang.version} + + + org.apache.aries.blueprint + org.apache.aries.blueprint.cm + + + org.osgi + osgi.core + provided + + + org.eclipse.persistence + javax.persistence + ${jpa.version} + + + org.hibernate + hibernate-core + ${hibernate.version} + + + javax.transaction + javax.transaction-api + ${javax.transaction.version} + + + javax.interceptor + javax.interceptor-api + ${javax.interceptor.version} + + + org.apache.cxf + cxf-rt-transports-http + + + org.apache.cxf + cxf-rt-transports-http-jetty + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + org.apache.ignite + ignite-core + ${ignite.version} + + + + org.apache.ignite + ignite-jcl + ${ignite.version} + + + + com.hazelcast + hazelcast + ${hazelcast.version} + + + org.apache.camel + camel-core + + + org.apache.camel + camel-jms + + + org.apache.camel + camel-sql + + + org.apache.camel + camel-cxf + + + org.apache.camel + camel-base + ${camel.version}-ENTAXY + + + + + diff --git a/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/aggregation/HeaderMergeAggregatorImpl.java b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/aggregation/HeaderMergeAggregatorImpl.java new file mode 100644 index 00000000..a3a863df --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/aggregation/HeaderMergeAggregatorImpl.java @@ -0,0 +1,53 @@ +/*- + * ~~~~~~licensing~~~~~~ + * system-commons + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.system.common.aggregation; + +import java.util.Map; +import java.util.stream.Collectors; + +import org.apache.camel.AggregationStrategy; +import org.apache.camel.Exchange; + +public class HeaderMergeAggregatorImpl implements AggregationStrategy { + + @Override + public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { + if (oldExchange != null && newExchange != null) { + Map oldHeaders = oldExchange.getIn().getHeaders(); + Map newHeaders = newExchange.getIn().getHeaders(); + + oldHeaders = oldHeaders.entrySet().stream() + .filter(e -> !newHeaders.containsKey(e.getKey())) + .collect(Collectors.toMap(e->e.getKey(), e->e.getValue())); + newExchange.getIn().getHeaders().putAll(oldHeaders); + return newExchange; + } else if (newExchange == null && oldExchange != null) { + oldExchange.getIn().setBody(null); + } + return oldExchange; + } + +} diff --git a/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/aggregation/JdbcCamelCodec.java b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/aggregation/JdbcCamelCodec.java new file mode 100644 index 00000000..a6cf75c5 --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/aggregation/JdbcCamelCodec.java @@ -0,0 +1,122 @@ +/*- + * ~~~~~~licensing~~~~~~ + * core-support-runtime-legacy + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.system.common.aggregation; + +import java.util.ArrayList; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.OutputStream; + +import org.apache.camel.CamelContext; +import org.apache.camel.Endpoint; +import org.apache.camel.Exchange; +import org.apache.camel.ExtendedExchange; +import org.apache.camel.processor.aggregate.jdbc.ClassLoadingAwareObjectInputStream; +import org.apache.camel.support.DefaultExchange; +import org.apache.camel.support.DefaultExchangeHolder; +import org.apache.camel.util.IOHelper; + +/** + * Adapted from HawtDBCamelCodec + */ +public class JdbcCamelCodec { + + public byte[] marshallExchange(CamelContext camelContext, Exchange exchange, boolean allowSerializedHeaders) throws IOException { + ByteArrayOutputStream bytesOut = new ByteArrayOutputStream(); + marshallExchange(camelContext, exchange, allowSerializedHeaders, bytesOut); + return bytesOut.toByteArray(); + } + + public void marshallExchange(CamelContext camelContext, Exchange exchange, boolean allowSerializedHeaders, OutputStream outputStream) throws IOException { + // use DefaultExchangeHolder to marshal to a serialized object + DefaultExchangeHolder pe = DefaultExchangeHolder.marshal(exchange, false, allowSerializedHeaders); + // add the aggregated size and timeout property as the only properties we want to retain + DefaultExchangeHolder.addProperty(pe, Exchange.AGGREGATED_SIZE, exchange.getProperty(Exchange.AGGREGATED_SIZE, Integer.class)); + DefaultExchangeHolder.addProperty(pe, Exchange.AGGREGATED_TIMEOUT, exchange.getProperty(Exchange.AGGREGATED_TIMEOUT, Long.class)); + // add the aggregated completed by property to retain + DefaultExchangeHolder.addProperty(pe, Exchange.AGGREGATED_COMPLETED_BY, exchange.getProperty(Exchange.AGGREGATED_COMPLETED_BY, String.class)); + // add the aggregated correlation key property to retain + DefaultExchangeHolder.addProperty(pe, Exchange.AGGREGATED_CORRELATION_KEY, exchange.getProperty(Exchange.AGGREGATED_CORRELATION_KEY, String.class)); + DefaultExchangeHolder.addProperty(pe, Exchange.AGGREGATED_CORRELATION_KEY, exchange.getProperty(Exchange.AGGREGATED_CORRELATION_KEY, String.class)); + // and a guard property if using the flexible toolbox aggregator + DefaultExchangeHolder.addProperty(pe, Exchange.AGGREGATED_COLLECTION_GUARD, exchange.getProperty(Exchange.AGGREGATED_COLLECTION_GUARD, String.class)); + // @ENTAXY-FIX GROUPED_EXCHANGE isn't marshaling + if (exchange.getProperty(Exchange.GROUPED_EXCHANGE) != null && exchange.getProperty(Exchange.GROUPED_EXCHANGE) instanceof ArrayList) { + DefaultExchangeHolder.addProperty(pe, Exchange.GROUPED_EXCHANGE, exchange.getProperty(Exchange.GROUPED_EXCHANGE, ArrayList.class)); + } else if (exchange.getProperty(Exchange.GROUPED_EXCHANGE) != null && exchange.getProperty(Exchange.GROUPED_EXCHANGE) instanceof StringBuffer) { + DefaultExchangeHolder.addProperty(pe, Exchange.GROUPED_EXCHANGE, exchange.getProperty(Exchange.GROUPED_EXCHANGE, StringBuffer.class)); + } + // persist the from endpoint as well + if (exchange.getFromEndpoint() != null) { + DefaultExchangeHolder.addProperty(pe, "CamelAggregatedFromEndpoint", exchange.getFromEndpoint().getEndpointUri()); + } + encode(pe, outputStream); + } + + public Exchange unmarshallExchange(CamelContext camelContext, byte[] buffer) throws IOException, ClassNotFoundException { + return unmarshallExchange(camelContext, new ByteArrayInputStream(buffer)); + } + + public Exchange unmarshallExchange(CamelContext camelContext, InputStream inputStream) throws IOException, ClassNotFoundException { + DefaultExchangeHolder pe = decode(camelContext, inputStream); + Exchange answer = new DefaultExchange(camelContext); + DefaultExchangeHolder.unmarshal(answer, pe); + // restore the from endpoint + String fromEndpointUri = (String) answer.removeProperty("CamelAggregatedFromEndpoint"); + if (fromEndpointUri != null) { + Endpoint fromEndpoint = camelContext.hasEndpoint(fromEndpointUri); + if (fromEndpoint != null) { + answer.adapt(ExtendedExchange.class).setFromEndpoint(fromEndpoint); + } + } + return answer; + } + + private void encode(Object object, OutputStream bytesOut) throws IOException { + try (ObjectOutputStream objectOut = new ObjectOutputStream(bytesOut)) { + objectOut.writeObject(object); + } + } + + private DefaultExchangeHolder decode(CamelContext camelContext, InputStream bytesIn) throws IOException, ClassNotFoundException { + ObjectInputStream objectIn = null; + Object obj = null; + try { + objectIn = new ClassLoadingAwareObjectInputStream(camelContext, bytesIn); + obj = objectIn.readObject(); + } finally { + IOHelper.close(objectIn); + } + + return (DefaultExchangeHolder)obj; + } + +} + diff --git a/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/aggregation/TimeoutAwareAggregationStrategyImpl.java b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/aggregation/TimeoutAwareAggregationStrategyImpl.java new file mode 100644 index 00000000..f32e0352 --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/aggregation/TimeoutAwareAggregationStrategyImpl.java @@ -0,0 +1,61 @@ +/*- + * ~~~~~~licensing~~~~~~ + * system-commons + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.system.common.aggregation; + +import org.apache.camel.AggregationStrategy; +import org.apache.camel.Exchange; + +public class TimeoutAwareAggregationStrategyImpl implements AggregationStrategy { + + private static final String ACK_MESSAGE_HEADER = "NTX_AckMessage"; + + private final String nameHeaderAcknowledge; + + public TimeoutAwareAggregationStrategyImpl(String nameHeaderAcknowledge) { + this.nameHeaderAcknowledge = nameHeaderAcknowledge; + } + + @Override + public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { + if (oldExchange == null) { + return newExchange; + } else { + oldExchange.getMessage().setHeader(nameHeaderAcknowledge, checkOnCorrectPair(oldExchange, newExchange)); + return oldExchange; + } + } + + private boolean checkOnCorrectPair(Exchange oldExchange, Exchange newExchange) { + return (oldExchange != null && oldExchange.getMessage().getHeader(ACK_MESSAGE_HEADER) == null && + (newExchange == null || newExchange.getMessage().getHeader(ACK_MESSAGE_HEADER) == null)); + } + + @Override + public void timeout(Exchange oldExchange, int index, int total, long timeout) { + oldExchange.getMessage().setHeader(nameHeaderAcknowledge, + (oldExchange.getMessage().getHeader(ACK_MESSAGE_HEADER) == null)); + } +} diff --git a/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/aggregation/hazelcast/DisconnectedMembershipListener.java b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/aggregation/hazelcast/DisconnectedMembershipListener.java new file mode 100644 index 00000000..6e397eaf --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/aggregation/hazelcast/DisconnectedMembershipListener.java @@ -0,0 +1,74 @@ +/*- + * ~~~~~~licensing~~~~~~ + * system-commons + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.system.common.aggregation.hazelcast; + +import com.hazelcast.core.HazelcastInstance; +import com.hazelcast.core.MemberAttributeEvent; +import com.hazelcast.core.MembershipEvent; +import com.hazelcast.core.MembershipListener; +import org.apache.camel.CamelContext; +import org.apache.camel.processor.aggregate.AggregateProcessorSetter; +import org.apache.camel.processor.aggregate.EntaxyAggregateProcessor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DisconnectedMembershipListener implements MembershipListener, AggregateProcessorSetter { + + protected static final Logger log = LoggerFactory.getLogger(DisconnectedMembershipListener.class); + private CamelContext camelContext; + private EntaxyAggregateProcessor aggregateProcessor; + + @Override + public void memberAdded(MembershipEvent membershipEvent) { + } + + @Override + public void memberRemoved(MembershipEvent membershipEvent) { + try { + aggregateProcessor.recoverCompletedMessageFromAggregationRepository(camelContext); + aggregateProcessor.restoreTimeoutMapFromAggregationRepository(); + } catch (Exception e) { + log.error("Can't restore Timeout from Aggregator. Please restart bundle.", e); + } + } + + @Override + public void memberAttributeChanged(MemberAttributeEvent memberAttributeEvent) { + } + + @Override + public void setAggregateProcessor(EntaxyAggregateProcessor aggregateProcessor) { + this.aggregateProcessor = aggregateProcessor; + } + + public void setHazelcastInstance(HazelcastInstance hazelcastInstance) { + hazelcastInstance.getCluster().addMembershipListener(this); + } + + public void setCamelContext(CamelContext camelContext) { + this.camelContext = camelContext; + } +} diff --git a/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/aggregation/repo/IgniteAggregationRepository.java b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/aggregation/repo/IgniteAggregationRepository.java new file mode 100644 index 00000000..be39beec --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/aggregation/repo/IgniteAggregationRepository.java @@ -0,0 +1,380 @@ +/*- + * ~~~~~~licensing~~~~~~ + * system-commons + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.system.common.aggregation.repo; + +import org.apache.camel.CamelContext; +import org.apache.camel.Exchange; +import org.apache.camel.RuntimeCamelException; +import org.apache.camel.processor.aggregate.jdbc.DefaultJdbcOptimisticLockingExceptionMapper; +import org.apache.camel.processor.aggregate.jdbc.JdbcOptimisticLockingExceptionMapper; +import org.apache.camel.spi.OptimisticLockingAggregationRepository; +import org.apache.camel.spi.RecoverableAggregationRepository; +import org.apache.camel.support.service.ServiceSupport; +import org.apache.camel.util.ObjectHelper; +import org.apache.ignite.Ignite; +import org.apache.ignite.IgniteCache; +import org.apache.ignite.IgniteTransactions; +import org.apache.ignite.cache.CacheAtomicityMode; +import org.apache.ignite.cache.CacheMode; +import org.apache.ignite.cache.CacheRebalanceMode; +import org.apache.ignite.cache.query.ScanQuery; +import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi; +import org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder; +import org.apache.ignite.transactions.Transaction; +import org.jetbrains.annotations.NotNull; +import org.osgi.framework.BundleContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.dao.EmptyResultDataAccessException; +import ru.entaxy.esb.system.common.aggregation.JdbcCamelCodec; + +import java.io.IOException; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.TimeUnit; + + +public class IgniteAggregationRepository extends ServiceSupport implements RecoverableAggregationRepository, OptimisticLockingAggregationRepository { + + private static final Logger LOG = LoggerFactory.getLogger(IgniteAggregationRepository.class); + public static final String AGGREGATION = "aggregation"; + public static final String AGGREGATION_COMPLETED = "aggregationCompleted"; + public static final int MAX_ATTEMPT_COUNT = 3; + + private JdbcOptimisticLockingExceptionMapper jdbcOptimisticLockingExceptionMapper = new DefaultJdbcOptimisticLockingExceptionMapper(); + private boolean returnOldExchange; + private final JdbcCamelCodec codec = new JdbcCamelCodec(); + private long recoveryInterval = 5000; + private boolean useRecovery = true; + private int maximumRedeliveries; + private String deadLetterUri; + private boolean allowSerializedHeaders; + private int backups = 2; + + private Ignite ignite; + private IgniteTransactions transactions; + + private IgniteCache aggregationCache; + private CacheConfiguration aggregationCfg; + + private IgniteCache aggregationCompleted; + private CacheConfiguration aggregationCompletedCfg; + + private BundleContext bundleContext; + + /** + * Creates an ignite aggregation repository + */ + public IgniteAggregationRepository() { + } + + /** + * Creates an ignite aggregation repository with the two mandatory parameters + */ + public IgniteAggregationRepository(BundleContext bundleContext, Ignite ignite) { + this.setBundleContext(bundleContext); + this.setIgnite(ignite); + } + + @Override + public Exchange add(final CamelContext camelContext, final String correlationId, + final Exchange oldExchange, final Exchange newExchange) throws OptimisticLockingException { + + try { + return add(camelContext, correlationId, newExchange); + } catch (Exception e) { + if (jdbcOptimisticLockingExceptionMapper != null && jdbcOptimisticLockingExceptionMapper.isOptimisticLocking(e)) { + throw new OptimisticLockingException(); + } else { + throw RuntimeCamelException.wrapRuntimeCamelException(e); + } + } + } + + @Override + public Exchange add(final CamelContext camelContext, final String correlationId, final Exchange exchange) { + Exchange result = null; + final String key = correlationId; + + try { + LOG.debug("Adding exchange with key: [{}]", key); + + boolean present = aggregationCache.get(key) != null; + + // Recover existing exchange with that ID + if (isReturnOldExchange() && present) { + result = get(key, camelContext); + } + + final byte[] data = codec.marshallExchange(camelContext, exchange, allowSerializedHeaders); + try (Transaction tx = transactions.txStart()) { + aggregationCache.put(key, data); + tx.commit(); + } + + } catch (Exception e) { + throw new RuntimeException("Error adding with key " + key, e); + } + + return result; + } + + public Exchange insert(final CamelContext camelContext, final String correlationId, final Exchange exchange) throws IOException { + Exchange result = null; + LOG.debug("Adding exchange with key: [{}]", correlationId); + + final byte[] data = codec.marshallExchange(camelContext, exchange, allowSerializedHeaders); + aggregationCompleted.put(correlationId, data); + + return result; + } + + @Override + public Exchange get(final CamelContext camelContext, final String correlationId) { + Exchange result = get(correlationId, camelContext); + + LOG.debug("Getting key [{}] -> {}", correlationId, result); + + return result; + } + + private Exchange get(final String key, final CamelContext camelContext) { + try { + final byte[] data = aggregationCache.get(key); + return codec.unmarshallExchange(camelContext, data); + } catch (EmptyResultDataAccessException | NullPointerException ex) { + return null; + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + @Override + public void remove(final CamelContext camelContext, final String correlationId, final Exchange exchange) { + final String confirmKey = exchange.getExchangeId(); + try (Transaction tx = transactions.txStart()) { + insert(camelContext, confirmKey, exchange); + if (!aggregationCache.remove(correlationId)) { + throw new RuntimeException("Error removing key " + correlationId + " from repository " + AGGREGATION); + } + tx.commit(); + } catch (Exception exception) { + throw new RuntimeException("Error removing key " + correlationId + " from repository " + AGGREGATION, exception); + } + } + + @Override + public void confirm(final CamelContext camelContext, final String exchangeId) { + confirm(camelContext, exchangeId, 0); + } + + private void confirm(final CamelContext camelContext, final String exchangeId, int attemptCount) { + if (attemptCount <= MAX_ATTEMPT_COUNT) { + try (Transaction tx = transactions.txStart()) { + aggregationCompleted.remove(exchangeId); + tx.commit(); + } catch (Exception exception) { + confirm(camelContext, exchangeId, ++attemptCount); + } + } + } + + @Override + public Set getKeys() { + Set keys = new HashSet<>(); + aggregationCache.query(new ScanQuery<>(null)).forEach(entry -> keys.add((String) entry.getKey())); + return keys; + } + + @Override + public Set scan(CamelContext camelContext) { + Set keys = new HashSet<>(); + aggregationCompleted.query(new ScanQuery<>(null)).forEach(entry -> keys.add((String) entry.getKey())); + return keys; + } + + @Override + public Exchange recover(CamelContext camelContext, String exchangeId) { + final byte[] data = aggregationCompleted.get(exchangeId); + Exchange answer = null; + try { + answer = codec.unmarshallExchange(camelContext, data); + } catch (IOException | ClassNotFoundException e) { + LOG.error("Exception in recovering exchangeId {}", exchangeId, e); + } + + LOG.debug("Recovering exchangeId [{}] -> {}", exchangeId, answer); + + return answer; + } + + /** + * If recovery is enabled then a background task is run every x'th time to scan for failed exchanges to recover + * and resubmit. By default this interval is 5000 millis. + * + * @param interval the interval + * @param timeUnit the time unit + */ + public void setRecoveryInterval(long interval, TimeUnit timeUnit) { + this.recoveryInterval = timeUnit.toMillis(interval); + } + + public void setRecoveryInterval(long interval) { + this.recoveryInterval = interval; + } + + public long getRecoveryIntervalInMillis() { + return recoveryInterval; + } + + public boolean isUseRecovery() { + return useRecovery; + } + + /** + * @param useRecovery Whether or not recovery is enabled. This option is by default true. When enabled the Camel + * Aggregator automatic recover failed aggregated exchange and have them resubmittedd + */ + public void setUseRecovery(boolean useRecovery) { + this.useRecovery = useRecovery; + } + + public int getMaximumRedeliveries() { + return maximumRedeliveries; + } + + public void setMaximumRedeliveries(int maximumRedeliveries) { + this.maximumRedeliveries = maximumRedeliveries; + } + + public String getDeadLetterUri() { + return deadLetterUri; + } + + /** + * @param deadLetterUri An endpoint uri for a Dead Letter Channel where exhausted recovered Exchanges will be + * moved. If this option is used then the maximumRedeliveries option must also be provided. + * Important note : if the deadletter route throws an exception, it will be send again to DLQ + * until it succeed ! + */ + public void setDeadLetterUri(String deadLetterUri) { + this.deadLetterUri = deadLetterUri; + } + + public boolean isReturnOldExchange() { + return returnOldExchange; + } + + /** + * @param returnOldExchange Whether the get operation should return the old existing Exchange if any existed. + * By default this option is false to optimize as we do not need the old exchange when + * aggregating + */ + public void setReturnOldExchange(boolean returnOldExchange) { + this.returnOldExchange = returnOldExchange; + } + + public boolean isAllowSerializedHeaders() { + return allowSerializedHeaders; + } + + public void setAllowSerializedHeaders(boolean allowSerializedHeaders) { + this.allowSerializedHeaders = allowSerializedHeaders; + } + + public JdbcOptimisticLockingExceptionMapper getJdbcOptimisticLockingExceptionMapper() { + return jdbcOptimisticLockingExceptionMapper; + } + + public void setJdbcOptimisticLockingExceptionMapper(JdbcOptimisticLockingExceptionMapper jdbcOptimisticLockingExceptionMapper) { + this.jdbcOptimisticLockingExceptionMapper = jdbcOptimisticLockingExceptionMapper; + } + + @Override + protected void doStart() throws Exception { + ObjectHelper.notNull(bundleContext, "BundleContext"); + ObjectHelper.notNull(ignite, "Ignite"); + + settingsIgnite(); + + // log number of existing exchanges + int current = getKeys().size(); + int completed = scan(null).size(); + + if (current > 0) { + LOG.info("On startup there are " + current + " aggregate exchanges (not completed) in repository: " + AGGREGATION); + } else { + LOG.info("On startup there are no existing aggregate exchanges (not completed) in repository: {}", AGGREGATION); + } + if (completed > 0) { + LOG.warn("On startup there are " + completed + " completed exchanges to be recovered in repository: " + AGGREGATION_COMPLETED); + } else { + LOG.info("On startup there are no completed exchanges to be recovered in repository: {}", AGGREGATION_COMPLETED); + } + } + + private void settingsIgnite() { + aggregationCfg = getCacheConfiguration(AGGREGATION); + aggregationCompletedCfg = getCacheConfiguration(AGGREGATION_COMPLETED); + + transactions = ignite.transactions(); + + aggregationCache = ignite.getOrCreateCache(aggregationCfg); + aggregationCompleted = ignite.getOrCreateCache(aggregationCompletedCfg); + } + + @NotNull + private CacheConfiguration getCacheConfiguration(String cacheName) { + CacheConfiguration cacheCfg = new CacheConfiguration<>(); + cacheCfg.setName(cacheName); + cacheCfg.setRebalanceMode(CacheRebalanceMode.SYNC); + cacheCfg.setCacheMode(CacheMode.REPLICATED); + cacheCfg.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL); + cacheCfg.setBackups(backups); + return cacheCfg; + } + + @NotNull + private TcpDiscoverySpi getTcpDiscoverySpi() { + TcpDiscoverySpi spi = new TcpDiscoverySpi(); + spi.setIpFinder(new TcpDiscoveryMulticastIpFinder()); + return spi; + } + + public void setBundleContext(BundleContext bundleContext) { + this.bundleContext = bundleContext; + } + + public void setBackups(int backups) { + this.backups = backups; + } + + public void setIgnite(Ignite ignite) { + this.ignite = ignite; + } + +} diff --git a/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/aggregation/repo/JdbcAggregationRepository.java b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/aggregation/repo/JdbcAggregationRepository.java new file mode 100644 index 00000000..80fe2b2b --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/aggregation/repo/JdbcAggregationRepository.java @@ -0,0 +1,655 @@ +/*- + * ~~~~~~licensing~~~~~~ + * system-commons + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.system.common.aggregation.repo; + +import org.apache.camel.CamelContext; +import org.apache.camel.Exchange; +import org.apache.camel.RuntimeCamelException; +import org.apache.camel.processor.aggregate.jdbc.DefaultJdbcOptimisticLockingExceptionMapper; +import org.apache.camel.processor.aggregate.jdbc.JdbcOptimisticLockingExceptionMapper; +import org.apache.camel.spi.OptimisticLockingAggregationRepository; +import org.apache.camel.spi.RecoverableAggregationRepository; +import org.apache.camel.support.service.ServiceSupport; +import org.apache.camel.util.ObjectHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.Constants; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.support.AbstractLobCreatingPreparedStatementCallback; +import org.springframework.jdbc.support.lob.DefaultLobHandler; +import org.springframework.jdbc.support.lob.LobCreator; +import org.springframework.jdbc.support.lob.LobHandler; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionDefinition; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.DefaultTransactionDefinition; +import org.springframework.transaction.support.TransactionCallbackWithoutResult; +import org.springframework.transaction.support.TransactionTemplate; +import ru.entaxy.esb.system.common.aggregation.JdbcCamelCodec; + +import javax.sql.DataSource; +import java.io.IOException; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Types; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +/** + * JDBC based {@link org.apache.camel.spi.AggregationRepository} JdbcAggregationRepository will only preserve any + * Serializable compatible data types. If a data type is not such a type its dropped and a WARN is logged. And it only + * persists the Message body and the Message headers. The Exchange properties are not persisted. + */ +public class JdbcAggregationRepository extends ServiceSupport + implements RecoverableAggregationRepository, OptimisticLockingAggregationRepository { + + protected static final String EXCHANGE = "exchange"; + protected static final String ID = "id"; + protected static final String BODY = "body"; + + // optimistic locking: version identifier needed to avoid the lost update problem + private static final String VERSION = "version"; + private static final String VERSION_PROPERTY = "CamelOptimisticLockVersion"; + + private static final Logger LOG = LoggerFactory.getLogger(JdbcAggregationRepository.class); + private static final Constants PROPAGATION_CONSTANTS = new Constants(TransactionDefinition.class); + + private JdbcOptimisticLockingExceptionMapper jdbcOptimisticLockingExceptionMapper + = new DefaultJdbcOptimisticLockingExceptionMapper(); + private PlatformTransactionManager transactionManager; + private DataSource dataSource; + private TransactionTemplate transactionTemplate; + private TransactionTemplate transactionTemplateReadOnly; + private int propagationBehavior = TransactionDefinition.PROPAGATION_REQUIRED; + private JdbcTemplate jdbcTemplate; + private LobHandler lobHandler = new DefaultLobHandler(); + private String repositoryName; + private boolean returnOldExchange; + private JdbcCamelCodec codec = new JdbcCamelCodec(); + private long recoveryInterval = 5000; + private boolean useRecovery = true; + private int maximumRedeliveries; + private String deadLetterUri; + private List headersToStoreAsText; + private boolean storeBodyAsText; + private boolean allowSerializedHeaders; + + /** + * Creates an aggregation repository + */ + public JdbcAggregationRepository() { + } + + /** + * Creates an aggregation repository with the three mandatory parameters + */ + public JdbcAggregationRepository(PlatformTransactionManager transactionManager, String repositoryName, + DataSource dataSource) { + this.setRepositoryName(repositoryName); + this.setTransactionManager(transactionManager); + this.setDataSource(dataSource); + } + + /** + * Sets the name of the repository + */ + public final void setRepositoryName(String repositoryName) { + this.repositoryName = repositoryName; + } + + public final void setTransactionManager(PlatformTransactionManager transactionManager) { + this.transactionManager = transactionManager; + } + + /** + * Sets the DataSource to use for accessing the database + */ + public void setDataSource(DataSource dataSource) { + this.dataSource = dataSource; + + jdbcTemplate = new JdbcTemplate(dataSource); + } + + @Override + public Exchange add( + final CamelContext camelContext, final String correlationId, + final Exchange oldExchange, final Exchange newExchange) + throws OptimisticLockingException { + + try { + return add(camelContext, correlationId, newExchange); + } catch (Exception e) { + if (jdbcOptimisticLockingExceptionMapper != null && jdbcOptimisticLockingExceptionMapper.isOptimisticLocking(e)) { + throw new OptimisticLockingException(); + } else { + throw RuntimeCamelException.wrapRuntimeCamelException(e); + } + } + } + + @Override + public Exchange add(final CamelContext camelContext, final String correlationId, final Exchange exchange) { + return transactionTemplate.execute(status -> { + Exchange result = null; + final String key = correlationId; + + try { + LOG.debug("Adding exchange with key {}", key); + + boolean present = jdbcTemplate.queryForObject( + "SELECT COUNT(1) FROM " + getRepositoryName() + " WHERE " + ID + " = ?", Integer.class, key) != 0; + + // Recover existing exchange with that ID + if (isReturnOldExchange() && present) { + result = get(key, getRepositoryName(), camelContext); + } + + if (present) { + long version = exchange.getProperty(VERSION_PROPERTY, Long.class); + LOG.debug("Updating record with key {} and version {}", key, version); + update(camelContext, correlationId, exchange, getRepositoryName(), version); + } else { + LOG.debug("Inserting record with key {}", key); + insert(camelContext, correlationId, exchange, getRepositoryName(), 1L); + } + + } catch (Exception e) { + throw new RuntimeException("Error adding to repository " + repositoryName + " with key " + key, e); + } + + return result; + }); + } + + /** + * Updates the current exchange details in the given repository table. + * + * @param camelContext Current CamelContext + * @param key Correlation key + * @param exchange Aggregated exchange + * @param repositoryName Table's name + * @param version Version identifier + */ + protected void update( + final CamelContext camelContext, final String key, final Exchange exchange, String repositoryName, Long version) + throws Exception { + StringBuilder queryBuilder = new StringBuilder() + .append("UPDATE ").append(repositoryName) + .append(" SET ") + .append(EXCHANGE).append(" = ?") + .append(", ") + .append(VERSION).append(" = ?"); + if (storeBodyAsText) { + queryBuilder.append(", ").append(BODY).append(" = ?"); + } + + if (hasHeadersToStoreAsText()) { + for (String headerName : headersToStoreAsText) { + queryBuilder.append(", ").append(headerName).append(" = ?"); + } + } + + queryBuilder.append(" WHERE ") + .append(ID).append(" = ?") + .append(" AND ") + .append(VERSION).append(" = ?"); + + String sql = queryBuilder.toString(); + updateHelper(camelContext, key, exchange, sql, version); + } + + /** + * Inserts a new record into the given repository table. Note: the exchange properties are NOT persisted. + * + * @param camelContext Current CamelContext + * @param correlationId Correlation key + * @param exchange Aggregated exchange to insert + * @param repositoryName Table's name + * @param version Version identifier + */ + protected void insert( + final CamelContext camelContext, final String correlationId, final Exchange exchange, String repositoryName, + Long version) + throws Exception { + // The default totalParameterIndex is 3 for ID, Exchange and version. Depending on logic this will be increased. + int totalParameterIndex = 3; + StringBuilder queryBuilder = new StringBuilder() + .append("INSERT INTO ").append(repositoryName) + .append('(').append(EXCHANGE) + .append(", ").append(ID) + .append(", ").append(VERSION); + + if (storeBodyAsText) { + queryBuilder.append(", ").append(BODY); + totalParameterIndex++; + } + + if (hasHeadersToStoreAsText()) { + for (String headerName : headersToStoreAsText) { + queryBuilder.append(", ").append(headerName); + totalParameterIndex++; + } + } + + queryBuilder.append(") VALUES ("); + + for (int i = 0; i < totalParameterIndex - 1; i++) { + queryBuilder.append("?, "); + } + queryBuilder.append("?)"); + + String sql = queryBuilder.toString(); + + insertHelper(camelContext, correlationId, exchange, sql, version); + } + + protected int insertHelper( + final CamelContext camelContext, final String key, final Exchange exchange, String sql, final Long version) + throws Exception { + final byte[] data = codec.marshallExchange(camelContext, exchange, allowSerializedHeaders); + Integer insertCount = jdbcTemplate.execute(sql, + new AbstractLobCreatingPreparedStatementCallback(getLobHandler()) { + @Override + protected void setValues(PreparedStatement ps, LobCreator lobCreator) throws SQLException { + int totalParameterIndex = 0; + lobCreator.setBlobAsBytes(ps, ++totalParameterIndex, data); + ps.setString(++totalParameterIndex, key); + ps.setLong(++totalParameterIndex, version); + if (storeBodyAsText) { + ps.setString(++totalParameterIndex, exchange.getIn().getBody(String.class)); + } + if (hasHeadersToStoreAsText()) { + for (String headerName : headersToStoreAsText) { + String headerValue = exchange.getIn().getHeader(headerName, String.class); + ps.setString(++totalParameterIndex, headerValue); + } + } + } + }); + return insertCount == null ? 0 : insertCount; + } + + protected int updateHelper( + final CamelContext camelContext, final String key, final Exchange exchange, String sql, final Long version) + throws Exception { + final byte[] data = codec.marshallExchange(camelContext, exchange, allowSerializedHeaders); + Integer updateCount = jdbcTemplate.execute(sql, + new AbstractLobCreatingPreparedStatementCallback(getLobHandler()) { + @Override + protected void setValues(PreparedStatement ps, LobCreator lobCreator) throws SQLException { + int totalParameterIndex = 0; + lobCreator.setBlobAsBytes(ps, ++totalParameterIndex, data); + ps.setLong(++totalParameterIndex, version + 1); + if (storeBodyAsText) { + ps.setString(++totalParameterIndex, exchange.getIn().getBody(String.class)); + } + if (hasHeadersToStoreAsText()) { + for (String headerName : headersToStoreAsText) { + String headerValue = exchange.getIn().getHeader(headerName, String.class); + ps.setString(++totalParameterIndex, headerValue); + } + } + ps.setString(++totalParameterIndex, key); + ps.setLong(++totalParameterIndex, version); + } + }); + if (updateCount == 1) { + return updateCount; + } else { + // Found stale version while updating record + throw new OptimisticLockingException(); + } + } + + @Override + public Exchange get(final CamelContext camelContext, final String correlationId) { + final String key = correlationId; + Exchange result = get(key, getRepositoryName(), camelContext); + LOG.debug("Getting key {} -> {}", key, result); + return result; + } + + private Exchange get(final String key, final String repositoryName, final CamelContext camelContext) { + return transactionTemplateReadOnly.execute(status -> { + try { + + Map columns = jdbcTemplate.queryForMap( + String.format("SELECT %1$s, %2$s FROM %3$s WHERE %4$s=?", EXCHANGE, VERSION, repositoryName, ID), + new Object[]{key}, new int[]{Types.VARCHAR}); + + byte[] marshalledExchange = (byte[]) columns.get(EXCHANGE); + long version = (long) columns.get(VERSION); + + Exchange result = codec.unmarshallExchange(camelContext, marshalledExchange); + result.setProperty(VERSION_PROPERTY, version); + return result; + + } catch (EmptyResultDataAccessException ex) { + return null; + } catch (IOException ex) { + // Rollback the transaction + throw new RuntimeException("Error getting key " + key + " from repository " + repositoryName, ex); + } catch (ClassNotFoundException ex) { + // Rollback the transaction + throw new RuntimeException(ex); + } + }); + } + + + @Override + public void remove(final CamelContext camelContext, final String correlationId, final Exchange exchange) { + transactionTemplate.execute(new TransactionCallbackWithoutResult() { + protected void doInTransactionWithoutResult(TransactionStatus status) { + final String key = correlationId; + final String confirmKey = exchange.getExchangeId(); + final long version = exchange.getProperty(VERSION_PROPERTY, Long.class); + try { + LOG.debug("Removing key {}", key); + + // добавлена проверка на корректное удаление из таблицы, т к возникала ситуация гонки на узлах. + // один узел уже удалил из completed, а второй в процессе, соответственно ошибки дублирования + // не появляется появляется дубликат в очереди + if (jdbcTemplate.update("DELETE FROM " + getRepositoryName() + " WHERE " + ID + " = ? AND " + VERSION + " = ?", + key, version) == 1) { + insert(camelContext, confirmKey, exchange, getRepositoryNameCompleted(), version); + } else { + throw new RuntimeException("Error removing key " + key + " from repository " + repositoryName); + } + + } catch (Exception e) { + throw new RuntimeException("Error removing key " + key + " from repository " + repositoryName, e); + } + } + }); + } + + @Override + public void confirm(final CamelContext camelContext, final String exchangeId) { + transactionTemplate.execute(new TransactionCallbackWithoutResult() { + protected void doInTransactionWithoutResult(TransactionStatus status) { + LOG.debug("Confirming exchangeId {}", exchangeId); + final String confirmKey = exchangeId; + + jdbcTemplate.update("DELETE FROM " + getRepositoryNameCompleted() + " WHERE " + ID + " = ?", + confirmKey); + + } + }); + } + + @Override + public Set getKeys() { + return getKeys(getRepositoryName()); + } + + @Override + public Set scan(CamelContext camelContext) { + return getKeys(getRepositoryNameCompleted()); + } + + /** + * Returns the keys in the given repository + * + * @param repositoryName The name of the table + * @return Set of keys in the given repository name + */ + protected Set getKeys(final String repositoryName) { + return transactionTemplateReadOnly.execute(status -> { + List keys = jdbcTemplate.query("SELECT " + ID + " FROM " + repositoryName, + (rs, rowNum) -> { + String id = rs.getString(ID); + LOG.trace("getKey {}", id); + return id; + }); + return new LinkedHashSet<>(keys); + }); + } + + @Override + public Exchange recover(CamelContext camelContext, String exchangeId) { + final String key = exchangeId; + Exchange answer = get(key, getRepositoryNameCompleted(), camelContext); + LOG.debug("Recovering exchangeId {} -> {}", key, answer); + return answer; + } + + /** + * If recovery is enabled then a background task is run every x'th time to scan for failed exchanges to recover and + * resubmit. By default this interval is 5000 millis. + */ + @Override + public void setRecoveryInterval(long interval, TimeUnit timeUnit) { + this.recoveryInterval = timeUnit.toMillis(interval); + } + + @Override + public void setRecoveryInterval(long interval) { + this.recoveryInterval = interval; + } + + @Override + public long getRecoveryIntervalInMillis() { + return recoveryInterval; + } + + @Override + public boolean isUseRecovery() { + return useRecovery; + } + + /** + * Whether or not recovery is enabled. This option is by default true. When enabled the Camel Aggregator automatic + * recover failed aggregated exchange and have them resubmitted. + */ + @Override + public void setUseRecovery(boolean useRecovery) { + this.useRecovery = useRecovery; + } + + @Override + public int getMaximumRedeliveries() { + return maximumRedeliveries; + } + + @Override + public void setMaximumRedeliveries(int maximumRedeliveries) { + this.maximumRedeliveries = maximumRedeliveries; + } + + @Override + public String getDeadLetterUri() { + return deadLetterUri; + } + + /** + * An endpoint uri for a Dead Letter Channel where exhausted recovered Exchanges will be moved. If this option is + * used then the maximumRedeliveries option must also be provided. Important note : if the deadletter route throws + * an exception, it will be send again to DLQ until it succeed ! + */ + @Override + public void setDeadLetterUri(String deadLetterUri) { + this.deadLetterUri = deadLetterUri; + } + + public boolean isReturnOldExchange() { + return returnOldExchange; + } + + /** + * Whether the get operation should return the old existing Exchange if any existed. By default this option is false + * to optimize as we do not need the old exchange when aggregating. + */ + public void setReturnOldExchange(boolean returnOldExchange) { + this.returnOldExchange = returnOldExchange; + } + + public void setJdbcCamelCodec(JdbcCamelCodec codec) { + this.codec = codec; + } + + public boolean hasHeadersToStoreAsText() { + return this.headersToStoreAsText != null && !this.headersToStoreAsText.isEmpty(); + } + + public List getHeadersToStoreAsText() { + return headersToStoreAsText; + } + + /** + * Allows to store headers as String which is human readable. By default this option is disabled, storing the + * headers in binary format. + * + * @param headersToStoreAsText the list of headers to store as String + */ + public void setHeadersToStoreAsText(List headersToStoreAsText) { + this.headersToStoreAsText = headersToStoreAsText; + } + + public boolean isStoreBodyAsText() { + return storeBodyAsText; + } + + /** + * Whether to store the message body as String which is human readable. By default this option is false storing the + * body in binary format. + */ + public void setStoreBodyAsText(boolean storeBodyAsText) { + this.storeBodyAsText = storeBodyAsText; + } + + public boolean isAllowSerializedHeaders() { + return allowSerializedHeaders; + } + + public void setAllowSerializedHeaders(boolean allowSerializedHeaders) { + this.allowSerializedHeaders = allowSerializedHeaders; + } + + public int getPropagationBehavior() { + return propagationBehavior; + } + + /** + * Sets propagation behavior to use with spring transaction templates which are used for database access. The + * default is TransactionDefinition.PROPAGATION_REQUIRED. + */ + public void setPropagationBehavior(int propagationBehavior) { + this.propagationBehavior = propagationBehavior; + } + + /** + * Sets propagation behavior to use with spring transaction templates which are used for database access. The + * default is TransactionDefinition.PROPAGATION_REQUIRED. This setter accepts names of the constants, like + * "PROPAGATION_REQUIRED". + * + * @param propagationBehaviorName + */ + public void setPropagationBehaviorName(String propagationBehaviorName) { + if (!propagationBehaviorName.startsWith(DefaultTransactionDefinition.PREFIX_PROPAGATION)) { + throw new IllegalArgumentException("Only propagation constants allowed"); + } + setPropagationBehavior(PROPAGATION_CONSTANTS.asNumber(propagationBehaviorName).intValue()); + } + + public LobHandler getLobHandler() { + return lobHandler; + } + + /** + * Sets a custom LobHandler to use + */ + public void setLobHandler(LobHandler lobHandler) { + this.lobHandler = lobHandler; + } + + public JdbcOptimisticLockingExceptionMapper getJdbcOptimisticLockingExceptionMapper() { + return jdbcOptimisticLockingExceptionMapper; + } + + public void setJdbcOptimisticLockingExceptionMapper( + JdbcOptimisticLockingExceptionMapper jdbcOptimisticLockingExceptionMapper) { + this.jdbcOptimisticLockingExceptionMapper = jdbcOptimisticLockingExceptionMapper; + } + + public String getRepositoryName() { + return repositoryName; + } + + public String getRepositoryNameCompleted() { + return getRepositoryName() + "_completed"; + } + + @Override + protected void doInit() throws Exception { + super.doInit(); + + ObjectHelper.notNull(repositoryName, "RepositoryName"); + ObjectHelper.notNull(transactionManager, "TransactionManager"); + ObjectHelper.notNull(dataSource, "DataSource"); + + transactionTemplate = new TransactionTemplate(transactionManager); + transactionTemplate.setPropagationBehavior(propagationBehavior); + + transactionTemplateReadOnly = new TransactionTemplate(transactionManager); + transactionTemplateReadOnly.setPropagationBehavior(propagationBehavior); + transactionTemplateReadOnly.setReadOnly(true); + } + + @Override + protected void doStart() throws Exception { + super.doStart(); + + // log number of existing exchanges + int current = getKeys().size(); + int completed = scan(null).size(); + + if (current > 0) { + LOG.info("On startup there are " + current + " aggregate exchanges (not completed) in repository: " + + getRepositoryName()); + } else { + LOG.info("On startup there are no existing aggregate exchanges (not completed) in repository: {}", + getRepositoryName()); + } + if (completed > 0) { + LOG.warn("On startup there are " + completed + " completed exchanges to be recovered in repository: " + + getRepositoryNameCompleted()); + } else { + LOG.info("On startup there are no completed exchanges to be recovered in repository: {}", + getRepositoryNameCompleted()); + } + } + + @Override + protected void doStop() throws Exception { + // noop + } + +} diff --git a/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/aggregation/repo/PostgresAggregationRepository.java b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/aggregation/repo/PostgresAggregationRepository.java new file mode 100644 index 00000000..ac3aa7bb --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/aggregation/repo/PostgresAggregationRepository.java @@ -0,0 +1,103 @@ +/*- + * ~~~~~~licensing~~~~~~ + * system-commons + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.system.common.aggregation.repo; + +import org.apache.camel.CamelContext; +import org.apache.camel.Exchange; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.transaction.PlatformTransactionManager; + +import javax.sql.DataSource; + +/** + * PostgreSQL specific {@link JdbcAggregationRepository} that deals with SQL Violation Exceptions using special + * {@code INSERT INTO .. ON CONFLICT DO NOTHING} claues. + */ +public class PostgresAggregationRepository extends JdbcAggregationRepository { + + /** + * Creates an aggregation repository + */ + public PostgresAggregationRepository() { + } + + /** + * Creates an aggregation repository with the three mandatory parameters + */ + public PostgresAggregationRepository(PlatformTransactionManager transactionManager, String repositoryName, + DataSource dataSource) { + super(transactionManager, repositoryName, dataSource); + } + + /** + * Inserts a new record into the given repository table + * + * @param camelContext the current CamelContext + * @param correlationId the correlation key + * @param exchange the aggregated exchange + * @param repositoryName The name of the table + */ + protected void insert( + final CamelContext camelContext, final String correlationId, final Exchange exchange, String repositoryName) + throws Exception { + // The default totalParameterIndex is 2 for ID and Exchange. Depending on logic this will be increased + int totalParameterIndex = 2; + StringBuilder queryBuilder = new StringBuilder() + .append("INSERT INTO ").append(repositoryName) + .append('(') + .append(EXCHANGE).append(", ") + .append(ID); + + if (isStoreBodyAsText()) { + queryBuilder.append(", ").append(BODY); + totalParameterIndex++; + } + + if (hasHeadersToStoreAsText()) { + for (String headerName : getHeadersToStoreAsText()) { + queryBuilder.append(", ").append(headerName); + totalParameterIndex++; + } + } + + queryBuilder.append(") VALUES ("); + + for (int i = 0; i < totalParameterIndex - 1; i++) { + queryBuilder.append("?, "); + } + queryBuilder.append("?)"); + + queryBuilder.append(" ON CONFLICT DO NOTHING"); + + String sql = queryBuilder.toString(); + + int updateCount = insertHelper(camelContext, correlationId, exchange, sql, 1L); + if (updateCount == 0 && getRepositoryName().equals(repositoryName)) { + throw new DataIntegrityViolationException("No row was inserted due to data violation"); + } + } + +} diff --git a/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/exception/BundleNotFound.java b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/exception/BundleNotFound.java new file mode 100644 index 00000000..89fccacc --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/exception/BundleNotFound.java @@ -0,0 +1,50 @@ +/*- + * ~~~~~~licensing~~~~~~ + * system-commons + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.system.common.exception; + +public class BundleNotFound extends RuntimeException { + + public BundleNotFound() { + super(); + } + + public BundleNotFound(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + + public BundleNotFound(String message, Throwable cause) { + super(message, cause); + } + + public BundleNotFound(String message) { + super(message); + } + + public BundleNotFound(Throwable cause) { + super(cause); + } + +} diff --git a/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/exception/ConnectorNotFound.java b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/exception/ConnectorNotFound.java new file mode 100644 index 00000000..9b2c5d75 --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/exception/ConnectorNotFound.java @@ -0,0 +1,50 @@ +/*- + * ~~~~~~licensing~~~~~~ + * system-commons + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.system.common.exception; + +public class ConnectorNotFound extends RuntimeException { + + public ConnectorNotFound() { + super(); + } + + public ConnectorNotFound(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + + public ConnectorNotFound(String message, Throwable cause) { + super(message, cause); + } + + public ConnectorNotFound(String message) { + super(message); + } + + public ConnectorNotFound(Throwable cause) { + super(cause); + } + +} diff --git a/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/exception/EsbNotFound.java b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/exception/EsbNotFound.java new file mode 100644 index 00000000..3c4288ce --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/exception/EsbNotFound.java @@ -0,0 +1,50 @@ +/*- + * ~~~~~~licensing~~~~~~ + * system-commons + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.system.common.exception; + +public class EsbNotFound extends RuntimeException { + + public EsbNotFound() { + super(); + } + + public EsbNotFound(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + + public EsbNotFound(String message, Throwable cause) { + super(message, cause); + } + + public EsbNotFound(String message) { + super(message); + } + + public EsbNotFound(Throwable cause) { + super(cause); + } + +} diff --git a/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/exception/ProfileNotFound.java b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/exception/ProfileNotFound.java new file mode 100644 index 00000000..12732128 --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/exception/ProfileNotFound.java @@ -0,0 +1,52 @@ +/*- + * ~~~~~~licensing~~~~~~ + * system-commons + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.system.common.exception; + +public class ProfileNotFound extends RuntimeException { + + private static final long serialVersionUID = 6701844035750412423L; + + public ProfileNotFound() { + super(); + } + + public ProfileNotFound(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + + public ProfileNotFound(String message, Throwable cause) { + super(message, cause); + } + + public ProfileNotFound(String message) { + super(message); + } + + public ProfileNotFound(Throwable cause) { + super(cause); + } + +} diff --git a/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/exception/TemplateNotFound.java b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/exception/TemplateNotFound.java new file mode 100644 index 00000000..364958ea --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/exception/TemplateNotFound.java @@ -0,0 +1,50 @@ +/*- + * ~~~~~~licensing~~~~~~ + * system-commons + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.system.common.exception; + +public class TemplateNotFound extends RuntimeException { + + public TemplateNotFound() { + super(); + } + + public TemplateNotFound(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + + public TemplateNotFound(String message, Throwable cause) { + super(message, cause); + } + + public TemplateNotFound(String message) { + super(message); + } + + public TemplateNotFound(Throwable cause) { + super(cause); + } + +} diff --git a/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/interceptor/SoapHeaderInterceptor.java b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/interceptor/SoapHeaderInterceptor.java new file mode 100644 index 00000000..4562ff27 --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/interceptor/SoapHeaderInterceptor.java @@ -0,0 +1,76 @@ +/*- + * ~~~~~~licensing~~~~~~ + * system-commons + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.system.common.interceptor; + +import org.apache.cxf.binding.soap.SoapMessage; +import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor; +import org.apache.cxf.headers.Header; +import org.apache.cxf.interceptor.Fault; +import org.apache.cxf.jaxb.JAXBDataBinding; +import org.apache.cxf.message.Message; +import org.apache.cxf.phase.Phase; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.xml.bind.JAXBException; +import javax.xml.namespace.QName; +import java.util.List; +import java.util.Map; + +public class SoapHeaderInterceptor extends AbstractSoapInterceptor { + + private static final Logger log = LoggerFactory.getLogger(SoapHeaderInterceptor.class); + + private static final String HEADER_USER_LOGIN = "X-ForwardedUser"; + private static final String HEADER_CREATED_BY = "createdBy"; + private String namespaceUri = ""; + + public SoapHeaderInterceptor() { + super(Phase.READ); + } + + public void handleMessage(SoapMessage message) throws Fault { + try { + Map> headers = (Map>) message.get(Message.PROTOCOL_HEADERS); + List
soapHeaders = message.getHeaders(); + soapHeaders.add(new Header(new QName(namespaceUri, HEADER_CREATED_BY), + getSystemName(headers), new JAXBDataBinding(String.class))); + message.put(Header.HEADER_LIST, soapHeaders); + } catch (JAXBException e) { + log.error("Error", e); + throw new Fault(e); + } + } + + private String getSystemName(Map> headers) { + List list = headers.get(HEADER_USER_LOGIN); + return list != null && !list.isEmpty() ? headers.get(HEADER_USER_LOGIN).get(0) : null; + } + + public void setNamespaceUri(String namespaceUri) { + this.namespaceUri = namespaceUri; + } +} diff --git a/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/util/CustomHeader.java b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/util/CustomHeader.java new file mode 100644 index 00000000..e156d4ec --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/util/CustomHeader.java @@ -0,0 +1,66 @@ +/*- + * ~~~~~~licensing~~~~~~ + * system-commons + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.system.common.util; + +public class CustomHeader { + + private String id; + private String type; + private String value; + + public CustomHeader() { + } + + public CustomHeader(String id, String type, String value) { + this.id = id; + this.type = type; + this.value = value; + } + + 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 getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/util/HeadersConverter.java b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/util/HeadersConverter.java new file mode 100644 index 00000000..0eb56e16 --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/util/HeadersConverter.java @@ -0,0 +1,189 @@ +/*- + * ~~~~~~licensing~~~~~~ + * system-commons + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.system.common.util; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import org.apache.camel.Exchange; +import org.apache.xerces.dom.DocumentImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class HeadersConverter { + protected static final Logger log = LoggerFactory.getLogger(HeadersConverter.class); + + private String customHeaders; + private String customHeaderPrefix; + private String namespace; + + public void xml2camelHeaders(Exchange exchange) { + NodeList nodes = exchange.getIn().getHeader(customHeaders, NodeList.class); + + if (nodes == null) { + log.warn(customHeaders + " not found"); + return; + } + + for (int i = 0; i < nodes.getLength(); ++i) { + Node child = nodes.item(i).getFirstChild(); + String headerName = ""; + String headerValue = ""; + while (child != null) { + if ("id".equals(child.getLocalName())) { + headerName = customHeaderPrefix + child.getTextContent(); + } else if ("value".equals(child.getLocalName())) { + headerValue = child.getTextContent(); + } + child = child.getNextSibling(); + } + if (!headerName.isEmpty()) { + exchange.getIn().setHeader(headerName, headerValue); + } + } + + log.debug("Parsed xml custom headers count {}", nodes.getLength()); + } + + public void camelHeaders2xml(Exchange exchange) { + Node item = null; + Node child = null; + Document xmlDoc = new DocumentImpl(); + Node list = xmlDoc.createElement("list"); + + for (Map.Entry entry : exchange.getIn().getHeaders().entrySet()) { + if (entry.getKey().startsWith(customHeaderPrefix)) { + String name = entry.getKey().substring(customHeaderPrefix.length()); + if (entry.getValue() == null) break; + String value = entry.getValue().toString(); + + item = xmlDoc.createElementNS(namespace, "customHeader"); + + child = xmlDoc.createElementNS(namespace, "id"); + child.appendChild(xmlDoc.createTextNode(name)); + item.appendChild(child); + + child = xmlDoc.createElementNS(namespace, "value"); + child.appendChild(xmlDoc.createTextNode(value)); + item.appendChild(child); + + list.appendChild(item); + } + } + + exchange.getIn().setHeader(customHeaders, list); + } + + public void xml2Json(Exchange exchange) { + NodeList nodes = exchange.getIn().getHeader(customHeaders, NodeList.class); + + if (nodes == null) { + log.warn(customHeaders + " not found"); + return; + } + + List customHeaders = new ArrayList<>(); + for (int i = 0; i < nodes.getLength(); ++i) { + Node child = nodes.item(i).getFirstChild(); + String headerName = ""; + String headerValue = ""; + String headerType = ""; + while (child != null) { + if ("id".equals(child.getLocalName())) { + headerName = child.getTextContent(); + } else if ("value".equals(child.getLocalName())) { + headerValue = child.getTextContent(); + } else if ("type".equals(child.getLocalName())) { + headerType = child.getTextContent(); + } + child = child.getNextSibling(); + } + if (!headerName.isEmpty()) { + customHeaders.add(new CustomHeader(headerName, headerType, headerValue)); + } + } + Gson gson = new Gson(); + exchange.getIn().setHeader(this.customHeaders, gson.toJson(customHeaders)); + + log.debug("Parsed xml custom headers count {}", nodes.getLength()); + } + + public void json2xml(Exchange exchange) { + String headers = exchange.getIn().getHeader(customHeaders, String.class); + + if (headers == null) { + log.warn(customHeaders + " not found"); + return; + } + + Gson gson = new Gson(); + List customHeaders = gson.fromJson(headers, new TypeToken>() { + }.getType()); + + Node item = null; + Node child = null; + Document xmlDoc = new DocumentImpl(); + Node list = xmlDoc.createElement("list"); + + for (CustomHeader customHeader : customHeaders) { + item = xmlDoc.createElementNS(namespace, "customHeader"); + + child = xmlDoc.createElementNS(namespace, "id"); + child.appendChild(xmlDoc.createTextNode(customHeader.getId())); + item.appendChild(child); + + child = xmlDoc.createElementNS(namespace, "type"); + child.appendChild(xmlDoc.createTextNode(customHeader.getType())); + item.appendChild(child); + + child = xmlDoc.createElementNS(namespace, "value"); + child.appendChild(xmlDoc.createTextNode(customHeader.getValue())); + item.appendChild(child); + + list.appendChild(item); + } + + exchange.getIn().setHeader(this.customHeaders, list); + } + + public void setCustomHeaderPrefix(String customHeaderPrefix) { + this.customHeaderPrefix = customHeaderPrefix; + } + + public void setCustomHeaders(String customHeaders) { + this.customHeaders = customHeaders; + } + + public void setNamespace(String namespace) { + this.namespace = namespace; + } +} diff --git a/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/util/PropertiesHelper.java b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/util/PropertiesHelper.java new file mode 100644 index 00000000..e5962385 --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/util/PropertiesHelper.java @@ -0,0 +1,157 @@ +/*- + * ~~~~~~licensing~~~~~~ + * system-commons + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.system.common.util; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +public class PropertiesHelper { + + private static final Log LOG = LogFactory.getLog(PropertiesHelper.class.getName()); + + private static final String EMPTY_STRING = ""; + + private String configPath; + private static final String karafEtcPath = System.getProperty("karaf.etc"); + private String configFile; + + private Properties properties; + + public PropertiesHelper() { + } + + public PropertiesHelper(String configPath) { + LOG.debug("Set custom path: " + configPath + " file: " + configFile); + this.configPath = configPath; + } + + public PropertiesHelper(String configPath, String configFile) { + LOG.debug("Load properties from custom path: " + configPath + " file: " + configFile); + this.configPath = configPath; + this.configFile = configFile; + loadProperties(configPath, configFile); + } + + public PropertiesHelper(String configFile, boolean loadKarafEtc) { + this.configFile = configFile; + LOG.debug("Load properties from karaf etc: " + karafEtcPath + " file: " + configFile); + if (loadKarafEtc) { + loadProperties(karafEtcPath, configFile); + LOG.debug("Loaded properties: " + (properties != null ? properties.size() : "null")); + } + } + + public Properties load() { + if (this.configPath != null && !this.configPath.isEmpty() + && this.configFile != null && !this.configFile.isEmpty()) { + return loadProperties(configPath, configFile); + } else if (this.configFile != null && !this.configFile.isEmpty()) { + return loadProperties(karafEtcPath, configFile); + } else { + throw new IllegalArgumentException("configPath OR configFile NOT SETTED"); + } + } + + protected Properties loadProperties(String path, String configFile) { + try (InputStream input = new FileInputStream(path + File.separator + configFile)) { + properties = new Properties(); + properties.load(input); + } catch (IOException ex) { + LOG.error(ex); + } + return properties; + } + + public long getInteger(String name) { + return getInteger(name, 0); + } + + public long getInteger(String name, int defaultValue) { + String value = this.properties.getProperty(name); + return value != null && !EMPTY_STRING.equals(value) ? Integer.valueOf(value) : defaultValue; + } + + public int getInteger(String name, String defaultValue) { + return Integer.valueOf(this.properties.getProperty(name, defaultValue)); + } + + public long getLong(String name) { + return getLong(name, 0L); + } + + public long getLong(String name, long defaultValue) { + String value = this.properties.getProperty(name); + return value != null && !EMPTY_STRING.equals(value) ? Long.valueOf(value) : defaultValue; + } + + public long getLong(String name, String defaultValue) { + return Long.valueOf(this.properties.getProperty(name, defaultValue)); + } + + public String getString(String name) { + return this.properties.getProperty(name, EMPTY_STRING); + } + + public String getString(String name, String defaultValue) { + return this.properties.getProperty(name, defaultValue); + } + + public String[] getStringArray(String name, String[] defaultValue) { + String value = this.properties.getProperty(name, EMPTY_STRING); + return !value.equals(EMPTY_STRING) ? value.split(",") : defaultValue; + } + + public String getConfigPath() { + return configPath; + } + + public void setConfigPath(String configPath) { + this.configPath = configPath; + } + + public String getConfigFile() { + return configFile; + } + + public void setConfigFile(String configFile) { + this.configFile = configFile; + } + + public Properties getProperties() { + return properties; + } + + public void setProperties(Properties properties) { + this.properties = properties; + } + +} diff --git a/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/util/SimpleOutHeaderFilterStrategy.java b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/util/SimpleOutHeaderFilterStrategy.java new file mode 100644 index 00000000..c4323e9d --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/util/SimpleOutHeaderFilterStrategy.java @@ -0,0 +1,56 @@ +/*- + * ~~~~~~licensing~~~~~~ + * system-commons + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.system.common.util; + +import org.apache.camel.Exchange; +import org.apache.camel.spi.HeaderFilterStrategy; + +import java.util.HashSet; +import java.util.Set; + +public class SimpleOutHeaderFilterStrategy implements HeaderFilterStrategy { + + private Set outFilter; + + public void setOutFilter(Set value) { + if (value == null) { + outFilter = new HashSet<>(); + } else { + outFilter = value; + } + } + + @Override + public boolean applyFilterToCamelHeaders(String headerName, Object headerValue, Exchange exchange) { + return !outFilter.contains(headerName); + } + + @Override + public boolean applyFilterToExternalHeaders(String headerName, Object headerValue, Exchange exchange) { + return false; + } + +} diff --git a/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/util/SystemHeadersConstants.java b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/util/SystemHeadersConstants.java new file mode 100644 index 00000000..ba94f6db --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/util/SystemHeadersConstants.java @@ -0,0 +1,38 @@ +/*- + * ~~~~~~licensing~~~~~~ + * system-commons + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.system.common.util; + +public class SystemHeadersConstants { + public static final String HEADER_USER_LOGIN = "X-ForwardedUser"; + public static final String HEADER_USER_ID = "X-ForwardedUserId"; + public static final String HEADER_SYSTEM_NAME = "X-SystemName"; + public static final String HEADER_SYSTEM_UUID = "X-SystemUuid"; + public static final String HEADER_SYSTEM_ID = "X-SystemId"; + public static final String HEADER_IS_DISPLAY_SERVICE_SERVICE = "NTX_IsDisplayServiceSchema"; + + private SystemHeadersConstants() { + } +} diff --git a/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/validator/ValidateInterceptor.java b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/validator/ValidateInterceptor.java new file mode 100644 index 00000000..49b12544 --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/validator/ValidateInterceptor.java @@ -0,0 +1,126 @@ +/*- + * ~~~~~~licensing~~~~~~ + * system-commons + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.system.common.validator; + +import java.io.IOException; +import java.util.List; + +import javax.xml.soap.SOAPMessage; +import javax.xml.stream.XMLStreamException; +import javax.xml.transform.dom.DOMSource; +import javax.xml.validation.Schema; +import javax.xml.validation.Validator; +import javax.xml.xpath.XPathExpressionException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.cxf.binding.soap.SoapMessage; +import org.apache.cxf.binding.soap.saaj.SAAJInInterceptor; +import org.apache.cxf.interceptor.Fault; +import org.apache.cxf.phase.AbstractPhaseInterceptor; +import org.apache.cxf.phase.Phase; +import org.apache.cxf.service.Service; +import org.apache.cxf.service.model.ServiceModelUtil; +import org.apache.cxf.ws.addressing.EndpointReferenceUtils; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.xml.sax.SAXException; + +@Deprecated(since = "1.10", forRemoval = true) +public class ValidateInterceptor extends AbstractPhaseInterceptor { + + private static final Log LOG = LogFactory.getLog(ValidateInterceptor.class); + + private final SAAJInInterceptor saajIn; + private final XmlParser xmlParser; + private boolean schemaValidationEnabled; + + public ValidateInterceptor() { + super(Phase.PRE_PROTOCOL); + saajIn = new SAAJInInterceptor(); + xmlParser = new XmlParser(); + + getAfter().add(SAAJInInterceptor.class.getName()); + } + + @Override + public void handleMessage(SoapMessage message) throws Fault { + try { + Node body = getMessageBody((DOMSource) getSOAPMessage(message).getSOAPPart().getContent()); + if (body != null) + validate(body, message); + else + throw new XMLStreamException("Can't find the tag \"Body\""); + } catch (RuntimeException re) { + throw re; + } catch (Exception e) { + throw new Fault(e); + } + } + + private Node getMessageBody(DOMSource source) throws XPathExpressionException { + Node node = source.getNode().cloneNode(true); + List nodeList = xmlParser.getNodes(node.getLastChild(), "Body"); + return !nodeList.isEmpty() ? nodeList.get(0) : null; + } + + private void validate(Node node, SoapMessage soapMessage) + throws IOException, SAXException, XPathExpressionException { + Validator validator = getValidator(soapMessage); + validator.validate(new DOMSource(getNodeForValidate(node))); + } + + private Node getNodeForValidate(Node node) throws XPathExpressionException { + if (schemaValidationEnabled && node.getLocalName().contains("packets")) { + Element element = (Element) node; + for (Node content : xmlParser.getNodes(element, "content")) { + content.getParentNode().removeChild(content); + } + return element; + } + return node; + } + + private Validator getValidator(SoapMessage soapMessage) { + Service service = ServiceModelUtil.getService(soapMessage.getExchange()); + Schema schema = + EndpointReferenceUtils.getSchema(service.getServiceInfos().get(0), soapMessage.getExchange().getBus()); + return schema.newValidator(); + } + + private SOAPMessage getSOAPMessage(SoapMessage smsg) { + SOAPMessage soapMessage = smsg.getContent(SOAPMessage.class); + if (soapMessage == null) { + saajIn.handleMessage(smsg); + soapMessage = smsg.getContent(SOAPMessage.class); + } + return soapMessage; + } + + public void setSchemaValidationEnabled(boolean schemaValidationEnabled) { + this.schemaValidationEnabled = schemaValidationEnabled; + } +} diff --git a/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/validator/XmlParser.java b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/validator/XmlParser.java new file mode 100644 index 00000000..fb8f86e5 --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime-legacy/src/main/java/ru/entaxy/esb/system/common/validator/XmlParser.java @@ -0,0 +1,56 @@ +/*- + * ~~~~~~licensing~~~~~~ + * system-commons + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.system.common.validator; + +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import javax.xml.xpath.*; +import java.util.ArrayList; +import java.util.List; + +public class XmlParser { + + public List getNodes(Node node, String elementName) throws XPathExpressionException { + XPath xpath = XPathFactory.newInstance().newXPath(); + + XPathExpression expr = xpath.compile("//*[local-name()='" + elementName + "']/child::node()"); + NodeList nodeList = (NodeList) expr.evaluate(node.getOwnerDocument(), XPathConstants.NODESET); + + return getNotNullNodes(nodeList); + } + + private List getNotNullNodes(NodeList nodeList) { + List result = new ArrayList<>(); + for (int i = 0; i < nodeList.getLength(); i++) { + Node node = nodeList.item(i); + if (node.getLocalName() != null) { + result.add(node); + } + } + return result; + } +} diff --git a/platform/runtime/core/core-support/core-support-runtime/pom.xml b/platform/runtime/core/core-support/core-support-runtime/pom.xml index 9209c1cf..fea5b574 100644 --- a/platform/runtime/core/core-support/core-support-runtime/pom.xml +++ b/platform/runtime/core/core-support/core-support-runtime/pom.xml @@ -4,7 +4,7 @@ ru.entaxy.esb.platform.runtime.core core-support - 1.10.0 + 1.11.0 core-support-runtime bundle diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/EntaxyResourceURLCachingClassLoader.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/EntaxyResourceURLCachingClassLoader.java index 6ced3879..e6175f2c 100644 --- a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/EntaxyResourceURLCachingClassLoader.java +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/EntaxyResourceURLCachingClassLoader.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * core-support-runtime * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property @@ -116,7 +116,9 @@ public class EntaxyResourceURLCachingClassLoader extends EntaxyResourceURLClassL for (URL scan: urlsToScan) { try { - URL toCheck = scan.toURI().resolve(classAsPath).toURL(); + URL fixedScan = new URL(scan.toString().replaceAll(" ", "%20")); + URL toCheck = new URL(fixedScan.toURI().resolve(classAsPath) + .toString().replaceAll("%20", " ")); log.info("\n\tCHECK URL :: " + toCheck.toString()); try (InputStream is = toCheck.openConnection().getInputStream() ) { diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/EntaxyResourceURLClassLoader.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/EntaxyResourceURLClassLoader.java index 0904aad3..ab0a61a8 100644 --- a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/EntaxyResourceURLClassLoader.java +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/EntaxyResourceURLClassLoader.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * core-support-runtime * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/EntaxyResourceUtils.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/EntaxyResourceUtils.java index 3aa0a3d0..f35e94ab 100644 --- a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/EntaxyResourceUtils.java +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/EntaxyResourceUtils.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * core-support-runtime * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/camel/CmPropertiesAccessorFunction.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/camel/CmPropertiesAccessorFunction.java index 0ba730b5..63f87187 100644 --- a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/camel/CmPropertiesAccessorFunction.java +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/camel/CmPropertiesAccessorFunction.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * core-support-runtime * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/camel/aggregation/JmsCamelAggregateExtension.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/camel/aggregation/JmsCamelAggregateExtension.java new file mode 100644 index 00000000..7050db9c --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/camel/aggregation/JmsCamelAggregateExtension.java @@ -0,0 +1,59 @@ +/*- + * ~~~~~~licensing~~~~~~ + * core-support-runtime + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.support.runtime.camel.aggregation; + +import org.apache.camel.Exchange; +import org.apache.camel.component.jms.JmsMessage; +import org.apache.camel.processor.aggregate.AggregateExtension; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.jms.JMSException; +import javax.jms.Session; + +public class JmsCamelAggregateExtension implements AggregateExtension { + + private static final Log LOG = LogFactory.getLog(JmsCamelAggregateExtension.class); + + @Override + public boolean checkExtension(Exchange exchange) { + return exchange instanceof JmsMessage; + } + + @Override + public Exchange doExtension(Exchange exchange) { + JmsMessage jms = exchange.getIn(JmsMessage.class); + Session session = jms.getJmsSession(); + try { + if (session != null && Session.CLIENT_ACKNOWLEDGE == session.getAcknowledgeMode()) { + jms.getJmsMessage().acknowledge(); + } + } catch (JMSException e) { + LOG.error("Error in CLIENT_ACKNOWLEDGE.", e); + } + return exchange; + } +} diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/camel/aggregation/MapAggregationStrategy.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/camel/aggregation/MapAggregationStrategy.java new file mode 100644 index 00000000..7951f25f --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/camel/aggregation/MapAggregationStrategy.java @@ -0,0 +1,207 @@ +/*- + * ~~~~~~licensing~~~~~~ + * core-support-runtime + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You 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. + */ +package ru.entaxy.platform.core.support.runtime.camel.aggregation; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.camel.AggregationStrategy; +import org.apache.camel.Exchange; + +import ru.entaxy.platform.base.support.CommonUtils; + +/** + * Aggregate result of pick expression into a single combined Exchange holding all the aggregated + * bodies in a {@link String} as the message body. + * + * This aggregation strategy can used in combination with + * {@link org.apache.camel.processor.Splitter} to batch messages + * + * @since 3.0.0 + */ +public class MapAggregationStrategy implements AggregationStrategy { + + protected enum VALUE_TYPE { + EXCHANGE, + MESSAGE, + BODY + } + + private static String DEFAULT_keySourceHeader = "AGGREGATION_MAP_KEY"; + + private String keySourceHeader = DEFAULT_keySourceHeader; + private String valueType = VALUE_TYPE.BODY.name(); + + /** + * Set keySourceHeader used for getting key + * + * @param keySourceHeader The header to use as key source. Default AGGREGATION_MAP_KEY + * @return + */ + public MapAggregationStrategy keySourceHeader(String keySourceHeader) { + this.keySourceHeader = keySourceHeader; + return this; + } + + /** + * Set valueType used for getting value + * + * @param valueType The string representing VALUE_TYPE enum element + * @return + */ + public MapAggregationStrategy valueType(String valueType) { + try { + this.valueType = VALUE_TYPE.valueOf(valueType).name(); + } catch (Exception e) { + this.valueType = VALUE_TYPE.BODY.name(); + } + return this; + } + + @Override + public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { + List> list; + + if (oldExchange == null) { + list = getList(newExchange); + } else { + list = getList(oldExchange); + } + + if (newExchange != null) { + + String key = getKey(newExchange); + + Object value = getValue(newExchange); + + if (CommonUtils.isValid(key)) { + List lst = new ArrayList<>(); + lst.add(key); + lst.add(value); + list.add(lst); + } + } + + return oldExchange != null ? oldExchange : newExchange; + } + + protected String getKey(Exchange exchange) { + + Object header = exchange.getIn().getHeader(keySourceHeader); + if (header == null) + header = exchange.getIn().getHeader(DEFAULT_keySourceHeader); + if (header == null) + return null; + return header.toString(); + + } + + protected Object getValue(Exchange exchange) { + + VALUE_TYPE vt = VALUE_TYPE.valueOf(valueType); + + switch (vt) { + case EXCHANGE: + return exchange; + case MESSAGE: + return exchange.getIn(); + default: + return exchange.getIn().getBody(); + } + + } + + @SuppressWarnings("unchecked") + private List> getList(Exchange exchange) { + List> list = (List>) exchange.getProperty(Exchange.GROUPED_EXCHANGE, List.class); + if (list == null) { + list = new ArrayList<>(); + exchange.setProperty(Exchange.GROUPED_EXCHANGE, list); + } + return list; + } + + + @SuppressWarnings("unchecked") + private Map getMap(Exchange exchange) { + Map map = (Map) exchange.getProperty(Exchange.GROUPED_EXCHANGE, Map.class); + if (map == null) { + map = new HashMap<>(); + exchange.setProperty(Exchange.GROUPED_EXCHANGE, map); + } + return map; + } + + @Override + public void onCompletion(Exchange exchange) { + + if (exchange != null) { + List> list = (List>) exchange.removeProperty(Exchange.GROUPED_EXCHANGE); + if (list != null) { + + Map map = new HashMap<>(); + for (List l : list) + map.put(l.get(0).toString(), l.get(1)); + + exchange.getIn().setBody(map); + } + } + + } + + public String getKeySourceHeader() { + return keySourceHeader; + } + + public void setKeySourceHeader(String keySourceHeader) { + this.keySourceHeader = keySourceHeader; + } + + public String getValueType() { + return valueType; + } + + public void setValueType(String valueType) { + this.valueType = valueType; + } + +} diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cluster/ClusterBundleDataProvider.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cluster/ClusterBundleDataProvider.java new file mode 100644 index 00000000..fc26e7b1 --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cluster/ClusterBundleDataProvider.java @@ -0,0 +1,109 @@ +/*- + * ~~~~~~licensing~~~~~~ + * core-support-runtime + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.support.runtime.cluster; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +import org.apache.karaf.cellar.bundle.BundleState; +import org.apache.karaf.cellar.bundle.Constants; +import org.apache.karaf.cellar.core.ClusterManager; +import org.apache.karaf.cellar.core.Configurations; +import org.apache.karaf.cellar.core.GroupManager; +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.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; + +@Component(service = ClusterBundleDataProvider.class, immediate = true) +public class ClusterBundleDataProvider { + + protected static ClusterBundleDataProvider INSTANCE = null; + + private static final Logger LOG = LoggerFactory.getLogger(ClusterBundleDataProvider.class); + + protected BundleContext bundleContext; + + @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC, + policyOption = ReferencePolicyOption.GREEDY) + volatile protected ClusterManager clusterManager; + + @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC, + policyOption = ReferencePolicyOption.GREEDY) + volatile protected GroupManager groupManager; + + @Activate + public void activate(ComponentContext componentContext) { + this.bundleContext = componentContext.getBundleContext(); + INSTANCE = this; + } + + public List getGroups(Bundle bundle) { + + List result = new ArrayList<>(); + + String symbolicName = bundle.getSymbolicName(); +// Изменено, потому что bundle.getVersion() съедает ведущие нули + String version = bundle.getHeaders().get(org.osgi.framework.Constants.BUNDLE_VERSION); + + Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); + + try { + Set groupNames = groupManager.listGroupNames(groupManager.getNode()); + for (String groupName : groupNames) { + @SuppressWarnings("unchecked") + Map clusterBundles = + clusterManager.getMap(Constants.BUNDLE_MAP + Configurations.SEPARATOR + groupName); + Optional bundleState = clusterBundles.values().stream() + .filter(state -> state.getSymbolicName().equals(symbolicName)) + .filter(state -> state.getVersion().equals(version)).findFirst(); + if (bundleState.isPresent()) { + result.add(groupName); + } else { + Optional bundleStateWithoutVersionFiltering = clusterBundles.values().stream() + .filter(state -> state.getSymbolicName().equals(symbolicName)).findFirst(); + if (bundleStateWithoutVersionFiltering.isPresent()) { + result.add("?" + groupName); + } + } + } + } catch (Exception e) { + LOG.error(String.format("Error getting groups for bundle [%s/%s]", symbolicName, version), e); + } + return result; + } + +} diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cluster/HazelcastLockClusterService.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cluster/HazelcastLockClusterService.java new file mode 100644 index 00000000..bc739f5a --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cluster/HazelcastLockClusterService.java @@ -0,0 +1,169 @@ +/*- + * ~~~~~~licensing~~~~~~ + * core-support-runtime + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.support.runtime.cluster; + +import java.util.concurrent.TimeUnit; + +import org.apache.camel.cluster.CamelClusterView; +import org.apache.camel.support.cluster.AbstractCamelClusterService; + +import com.hazelcast.core.HazelcastInstance; +import com.hazelcast.core.IMap; + + +@Deprecated(since = "1.10") +public class HazelcastLockClusterService extends AbstractCamelClusterService { + + private static final String DEFAULT_CACHE_NAME = "entaxy"; + private static final String DEFAULT_ID = "entaxy"; + + private HazelcastInstance hazelcastInstance; + private IMap cache; + private String cacheName; + + private long acquireLockDelay = 1; + private TimeUnit acquireLockDelayUnit = TimeUnit.SECONDS; + private long acquireLockInterval = 10; + private TimeUnit acquireLockIntervalUnit = TimeUnit.SECONDS; + private long healthInterval = 60; + private TimeUnit healthIntervalUnit = TimeUnit.SECONDS; + + public HazelcastLockClusterService(HazelcastInstance hazelcastInstance) { + this(hazelcastInstance, DEFAULT_CACHE_NAME); + } + + public HazelcastLockClusterService(HazelcastInstance hazelcastInstance, String cacheName) { + this.hazelcastInstance = hazelcastInstance; + this.cacheName = cacheName; + this.cache = hazelcastInstance.getMap(cacheName); + setId(DEFAULT_ID); + } + + @Override + protected CamelClusterView createView(String namespace) throws Exception { + return new HazelcastValueLockClusterView(this, namespace); + } + + public String getCacheName() { + return cacheName; + } + + public void setCacheName(String cacheName) { + this.cacheName = cacheName; + } + + public HazelcastInstance getHazelcastInstance() { + return hazelcastInstance; + } + + public void setHazelcastInstance(HazelcastInstance hazelcastInstance) { + this.hazelcastInstance = hazelcastInstance; + } + + public IMap getCache() { + return cache; + } + + public void setCache(IMap cache) { + this.cache = cache; + } + + public long getAcquireLockDelay() { + return acquireLockDelay; + } + + /** + * The time to wait before starting to try to acquire lock, default 1. + */ + public void setAcquireLockDelay(long acquireLockDelay) { + this.acquireLockDelay = acquireLockDelay; + } + + public void setAcquireLockDelay(long pollDelay, TimeUnit pollDelayUnit) { + setAcquireLockDelay(pollDelay); + setAcquireLockDelayUnit(pollDelayUnit); + } + + public TimeUnit getAcquireLockDelayUnit() { + return acquireLockDelayUnit; + } + + /** + * The time unit of the acquireLockDelay, default to TimeUnit.SECONDS. + */ + public void setAcquireLockDelayUnit(TimeUnit acquireLockDelayUnit) { + this.acquireLockDelayUnit = acquireLockDelayUnit; + } + + public long getAcquireLockInterval() { + return acquireLockInterval; + } + + /** + * The time to wait between attempts to try to acquire lock, default 10. + */ + public void setAcquireLockInterval(long acquireLockInterval) { + this.acquireLockInterval = acquireLockInterval; + } + + public void setAcquireLockInterval(long pollInterval, TimeUnit pollIntervalUnit) { + setAcquireLockInterval(pollInterval); + setAcquireLockIntervalUnit(pollIntervalUnit); + } + + public TimeUnit getAcquireLockIntervalUnit() { + return acquireLockIntervalUnit; + } + + /** + * The time unit of the acquireLockInterval, default to TimeUnit.SECONDS. + */ + public void setAcquireLockIntervalUnit(TimeUnit acquireLockIntervalUnit) { + this.acquireLockIntervalUnit = acquireLockIntervalUnit; + } + + public long getHealthInterval() { + return healthInterval; + } + + /** + * The time between current timestamp and leader's last visit, should be greater then acquireLockDelay+acquireLockInterval, default 60. + */ + public void setHealthInterval(long healthInterval) { + this.healthInterval = healthInterval; + } + + public TimeUnit getHealthIntervalUnit() { + return healthIntervalUnit; + } + + /** + * The time unit of the healthInterval, default to TimeUnit.SECONDS. + */ + public void setHealthIntervalUnit(TimeUnit healthIntervalUnit) { + this.healthIntervalUnit = healthIntervalUnit; + } +} diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cluster/HazelcastValueLockClusterView.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cluster/HazelcastValueLockClusterView.java new file mode 100644 index 00000000..f7b08c47 --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cluster/HazelcastValueLockClusterView.java @@ -0,0 +1,271 @@ +/*- + * ~~~~~~licensing~~~~~~ + * core-support-runtime + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.support.runtime.cluster; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +import org.apache.camel.CamelContext; +import org.apache.camel.cluster.CamelClusterMember; +import org.apache.camel.support.cluster.AbstractCamelClusterView; +import org.apache.camel.util.ObjectHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.hazelcast.core.HazelcastInstance; +import com.hazelcast.core.IMap; + +@Deprecated(since = "1.10") +public class HazelcastValueLockClusterView extends AbstractCamelClusterView { + + private static final transient Logger LOG = LoggerFactory.getLogger(HazelcastValueLockClusterView.class); + + private static final String LOCK_VALUE_DELIMITER = "_"; + + private HazelcastInstance hazelcastInstance; + private IMap cache; + private long healthInterval; + private TimeUnit healthIntervalUnit; + private String lockName; + + private final ClusterMember localMember; + private ScheduledExecutorService executor; + private ScheduledFuture task; + + private long currentId; + private volatile boolean leader; + + protected HazelcastValueLockClusterView(HazelcastLockClusterService cluster, String namespace) { + super(cluster, namespace); + + this.hazelcastInstance = cluster.getHazelcastInstance(); + this.cache = cluster.getCache(); + this.healthInterval = cluster.getHealthInterval(); + this.healthIntervalUnit = cluster.getHealthIntervalUnit(); + + this.currentId = hazelcastInstance.getAtomicLong(cluster.getCacheName()).getAndIncrement(); + + this.localMember = new ClusterMember(); + this.lockName = namespace; + } + + @Override + public Optional getLeader() { + return this.localMember.isLeader() ? Optional.of(this.localMember) : Optional.empty(); + } + + @Override + public CamelClusterMember getLocalMember() { + return this.localMember; + } + + @Override + public List getMembers() { + return new ArrayList() {{ add(localMember); }}; + } + + @Override + protected void doStart() throws Exception { + HazelcastLockClusterService service = getClusterService().unwrap(HazelcastLockClusterService.class); + executor = getExecutor(); + + task = executor.scheduleAtFixedRate(this::tryLock, + TimeUnit.MILLISECONDS.convert(service.getAcquireLockDelay(), service.getAcquireLockDelayUnit()), + TimeUnit.MILLISECONDS.convert(service.getAcquireLockInterval(), service.getAcquireLockIntervalUnit()), + TimeUnit.MILLISECONDS); + } + + protected ScheduledExecutorService getExecutor() { + if (executor == null) { + HazelcastLockClusterService service = getClusterService().unwrap(HazelcastLockClusterService.class); + // Camel context should be set at this stage. + final CamelContext context = ObjectHelper.notNull(getCamelContext(), "CamelContext"); + + executor = context.getExecutorServiceManager().newSingleThreadScheduledExecutor(this, "HazelcastLockClusterService-" + service.getId()); + } + + return executor; + } + + protected void tryLock() { + if (isStarting() || isStarted()) { + if (localMember.isLeader()) { + leaderHealth(); + } else if (!isLeaderHealthy()) { + tryLockProc(); + } else { + LOG.trace("The leader is healthy, but the jackals are on alert! Key {}", lockName); + } + } + } + + protected void leaderHealthWrite() { + cache.put(lockName, getLockValueNext()); + LOG.trace("Leader health refresh on lock {}", lockName); + } + + protected void leaderHealth() { + if (getLockOwnerId() == currentId) { + leaderHealthWrite(); + LOG.trace("Holding the lock on key {}", lockName); + } else { + LOG.error("Inconsistent lock on key {}. Leadership is reset!", lockName); + leader = false; + fireLeadershipChangedEvent(Optional.empty()); + } + } + + protected boolean isLeaderHealthy() { + boolean health = false; + if (cache.containsKey(lockName)) { + long leaderHealthCheck = getLockMilliseconds(); + long difference = healthIntervalUnit.convert(System.currentTimeMillis() - leaderHealthCheck, TimeUnit.MILLISECONDS); + health = difference < healthInterval; + } else { + LOG.warn("Empty leader's health key {}", lockName); + } + return health; + } + + protected void tryLockProc() { + LOG.debug("Try to acquire a lock on key {}", lockName); + + if (cache.tryLock(lockName)) { + leaderHealthWrite(); + if (getLockOwnerId() == currentId) { + leader = true; + fireLeadershipChangedEvent(Optional.ofNullable(localMember)); + LOG.info("Lock on key {} acquired", lockName); + } + cache.unlock(lockName); + } + + if (!localMember.isLeader()) { + LOG.debug("Lock on key {} NOT acquired", lockName); + leader = false; + fireLeadershipChangedEvent(Optional.empty()); + } + } + + protected String getLockValueNext() { + return String.valueOf(currentId) + LOCK_VALUE_DELIMITER + System.currentTimeMillis(); + } + + protected long getLockOwnerId() { + return getLockPart(cache.get(lockName), 0); + } + + protected long getLockMilliseconds() { + return getLockPart(cache.get(lockName), 1); + } + + protected long getLockPart(Object lockValue, int i) { + if (lockValue != null && lockValue instanceof String) { + String[] values = ((String)lockValue).split(LOCK_VALUE_DELIMITER); + if (values.length == 2) { + return Long.parseLong(values[i]); + } else { + throw new IllegalArgumentException("Lock value = " + lockValue + " in unknown format"); + } + } + return 0L; + } + + @Override + protected void doStop() throws Exception { + leader = false; + fireLeadershipChangedEvent(Optional.empty()); + closeInternal(); + shutdownExecutors(); + } + + protected void closeInternal() { + if (task != null) { + task.cancel(true); + } + tryUnlock(); + } + + protected void shutdownExecutors() { + CamelContext context = getCamelContext(); + if (executor != null) { + if (context != null) { + context.getExecutorServiceManager().shutdown(executor); + } else { + executor.shutdown(); + } + executor = null; + } + } + + protected void tryUnlock() { + LOG.debug("Unlock key {}", lockName); + try { + if (getLockOwnerId() == currentId && cache.tryLock(lockName)) { + try { + cache.delete(lockName); + LOG.trace("Leader lock {} is cleared", lockName); + } finally { + cache.unlock(lockName); + } + LOG.info("Unlocked key {}", lockName); + } else { + LOG.debug("Current thread is not owner of lock {}", lockName); + } + } catch (IllegalMonitorStateException e) { + LOG.trace("Unlock error", e); + } + } + + public boolean isLeader() { + return leader; + } + + public void setLeader(boolean leader) { + this.leader = leader; + } + + private final class ClusterMember implements CamelClusterMember { + @Override + public boolean isLeader() { + return leader; + } + + @Override + public boolean isLocal() { + return true; + } + + @Override + public String getId() { + return getClusterService().getId(); + } + } +} diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cluster/JGroupsLockClusterService.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cluster/JGroupsLockClusterService.java new file mode 100644 index 00000000..7e80a1c4 --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cluster/JGroupsLockClusterService.java @@ -0,0 +1,84 @@ +/*- + * ~~~~~~licensing~~~~~~ + * core-support-runtime + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.support.runtime.cluster; + +import java.util.concurrent.TimeUnit; + +import org.apache.camel.support.cluster.AbstractCamelClusterService; +import org.jgroups.blocks.locking.LockService; + +import ru.entaxy.platform.core.support.runtime.service.ServiceHolder; + +public class JGroupsLockClusterService extends AbstractCamelClusterService { + + private LockService lockService; + private long acquireLockDelay = 1; + private TimeUnit acquireLockDelayUnit = TimeUnit.SECONDS; + + public JGroupsLockClusterService(ServiceHolder lockService) throws Exception { + this.lockService = lockService.getService(); + } + + @Override + protected JGroupsLockClusterView createView(String namespace) throws Exception { + return new JGroupsLockClusterView(this, namespace); + } + + public LockService getLockService() throws Exception { + return lockService; + } + + public void setLockService(LockService lockService) { + this.lockService = lockService; + } + + public long getAcquireLockDelay() { + return acquireLockDelay; + } + + /** + * The time to wait before starting to try to acquire lock, default 1. + */ + public void setAcquireLockDelay(long acquireLockDelay) { + this.acquireLockDelay = acquireLockDelay; + } + + public void setAcquireLockDelay(long pollDelay, TimeUnit pollDelayUnit) { + setAcquireLockDelay(pollDelay); + setAcquireLockDelayUnit(pollDelayUnit); + } + + public TimeUnit getAcquireLockDelayUnit() { + return acquireLockDelayUnit; + } + + /** + * The time unit of the acquireLockDelay, default to TimeUnit.SECONDS. + */ + public void setAcquireLockDelayUnit(TimeUnit acquireLockDelayUnit) { + this.acquireLockDelayUnit = acquireLockDelayUnit; + } +} diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cluster/JGroupsLockClusterView.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cluster/JGroupsLockClusterView.java new file mode 100644 index 00000000..66a3d7d2 --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cluster/JGroupsLockClusterView.java @@ -0,0 +1,159 @@ +/*- + * ~~~~~~licensing~~~~~~ + * core-support-runtime + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.support.runtime.cluster; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.locks.Lock; + +import org.apache.camel.CamelContext; +import org.apache.camel.cluster.CamelClusterMember; +import org.apache.camel.cluster.CamelClusterService; +import org.apache.camel.support.cluster.AbstractCamelClusterView; +import org.apache.camel.util.ObjectHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class JGroupsLockClusterView extends AbstractCamelClusterView { + + private static final transient Logger LOG = LoggerFactory.getLogger(JGroupsLockClusterView.class); + private final CamelClusterMember localMember = new JGroupsLocalMember(); + private String lockName; + + private Lock lock; + private ScheduledExecutorService executor; + private volatile boolean isMaster; + + protected JGroupsLockClusterView(CamelClusterService cluster, String namespace) { + super(cluster, namespace); + lockName = namespace; + } + + @Override + public Optional getLeader() { + if (isMaster) { + return Optional.of(localMember); + } else { + return Optional.empty(); + } + } + + @Override + public CamelClusterMember getLocalMember() { + return localMember; + } + + @Override + public List getMembers() { + return new ArrayList() {{ add(localMember); }}; + } + + @Override + protected void doStart() throws Exception { + if (lock != null) { + lock.unlock(); + lock = null; + } + JGroupsLockClusterService service = getClusterService().unwrap(JGroupsLockClusterService.class); + lock = service.getLockService().getLock(lockName); + + // Camel context should be set at this stage. + final CamelContext context = ObjectHelper.notNull(getCamelContext(), "CamelContext"); + executor = context.getExecutorServiceManager().newSingleThreadScheduledExecutor(this, "JGroupsLockClusterView-" + getClusterService().getId() + "-" + lockName); + executor.schedule(new Runnable() { + @Override + public void run() { + LOG.info("Attempting to become master acquiring the lock for group: " + lockName + " in JGroups cluster"); + lock.lock(); + isMaster = true; + fireLeadershipChangedEvent(Optional.ofNullable(localMember)); + LOG.info("Became master by acquiring the lock for group: " + lockName + " in JGroups cluster"); + } + }, + service.getAcquireLockDelay(), + service.getAcquireLockDelayUnit()); + } + + @Override + protected void doStop() throws Exception { + LOG.trace("doStop: " + lockName); + stopProcess(); + } + + @Override + protected void doShutdown() throws Exception { + LOG.trace("doShutdown: " + lockName); + stopProcess(); + } + + protected void stopProcess() throws Exception { + shutdownExecutor(); + fireLeadershipChangedEvent(Optional.empty()); + clearLock(); + isMaster = false; + } + + private void clearLock() throws Exception { + if (lock != null && isMaster) { + LOG.trace("tryUnlock: " + lockName); + JGroupsLockClusterService service = getClusterService().unwrap(JGroupsLockClusterService.class); + service.getLockService().unlockForce(lockName); + LOG.debug("unlocked: " + lockName); + lock = null; + } + } + + private void shutdownExecutor() { + CamelContext context = getCamelContext(); + if (executor != null) { + if (context != null) { + context.getExecutorServiceManager().shutdown(executor); + } else { + executor.shutdown(); + } + executor = null; + } + } + + private final class JGroupsLocalMember implements CamelClusterMember { + @Override + public boolean isLeader() { + return isMaster; + } + + @Override + public boolean isLocal() { + return true; + } + + @Override + public String getId() { + return getClusterService().getId(); + } + } +} diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/BasicAuthenticationInterceptor.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/BasicAuthenticationInterceptor.java new file mode 100644 index 00000000..9feea1f8 --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/BasicAuthenticationInterceptor.java @@ -0,0 +1,73 @@ +/*- + * ~~~~~~licensing~~~~~~ + * core-support-runtime + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.support.runtime.cxf; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.cxf.common.util.Base64Utility; +import org.apache.cxf.interceptor.Fault; +import org.apache.cxf.message.Message; +import org.apache.cxf.phase.AbstractPhaseInterceptor; +import org.apache.cxf.phase.Phase; +import org.apache.cxf.transport.http.Headers; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class BasicAuthenticationInterceptor extends AbstractPhaseInterceptor { + private static final Log LOG = LogFactory.getLog(BasicAuthenticationInterceptor.class); + + private String login; + + private String password; + + private static final String BASIC = "Basic "; + private static final String AUTHORIZATION = "Authorization"; + + + public BasicAuthenticationInterceptor() { + super(Phase.SETUP); + } + + @Override + public void handleMessage(Message message) throws Fault { + String authorization = login + ":" + password; + String encodeAuthorization = Base64Utility.encode(authorization.getBytes()); + Map> headers = Headers.getSetProtocolHeaders(message); + List auth = new ArrayList<>(); + auth.add(BASIC + encodeAuthorization); + headers.put(AUTHORIZATION, auth); + } + + public void setLogin(String login) { + this.login = login; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyClassResolver.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyClassResolver.java new file mode 100644 index 00000000..0995c2c3 --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyClassResolver.java @@ -0,0 +1,212 @@ +/*- + * ~~~~~~licensing~~~~~~ + * core-support-runtime + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.support.runtime.cxf; + +import java.io.InputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; + +import org.apache.camel.CamelContext; +import org.apache.camel.CamelContextAware; +import org.apache.camel.spi.ClassResolver; +import org.apache.camel.util.CastUtils; +import org.osgi.framework.BundleContext; +import org.osgi.framework.wiring.BundleWiring; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ru.entaxy.platform.core.support.runtime.EntaxyResourceURLCachingClassLoader; +import ru.entaxy.platform.core.support.runtime.EntaxyResourceURLClassLoader; + +public class EntaxyClassResolver implements ClassResolver, CamelContextAware { + + private static final Logger log = LoggerFactory.getLogger(EntaxyClassResolver.class); + + protected List resourceFolders = new ArrayList<>(); + protected BundleContext bundleContext; + protected boolean useCache = false; + protected ClassLoader classLoader; + protected ClassResolver classResolver; + + public EntaxyClassResolver(BundleContext bundleContext, CamelContext camelContext, List resourceFolders) { + this(bundleContext, camelContext, resourceFolders, false); + } + + public EntaxyClassResolver(BundleContext bundleContext, CamelContext camelContext, List resourceFolders, boolean useCache) { + setBundleContext(bundleContext); + setResourceFolders(resourceFolders); + this.classLoader = createClassLoader(); + this.classResolver = camelContext.getClassResolver(); + + camelContext.setClassResolver(this); + } + + private Class tryLoadClass(String name) { + try { + log.trace("Loading class: {} using classloader: {}", name, classLoader); + return classLoader.loadClass(name); + } catch (ClassNotFoundException e) { + if (log.isTraceEnabled()) { + log.trace("Cannot load class: " + name + " using classloader: " + classLoader, e); + } + } + return null; + } + + protected ClassLoader createClassLoader() { + if (resourceFolders != null) { + EntaxyResourceURLClassLoader cl = null; + if (classLoader == null) { + if (useCache) { + cl = new EntaxyResourceURLCachingClassLoader(this.bundleContext==null + ?this.getClass().getClassLoader() + :this.bundleContext.getBundle().adapt(BundleWiring.class).getClassLoader() + ); + + } else { + cl = new EntaxyResourceURLClassLoader(this.bundleContext==null + ?this.getClass().getClassLoader() + :this.bundleContext.getBundle().adapt(BundleWiring.class).getClassLoader() + ); + } + cl.setResourcePath(resourceFolders); + } + return cl; + } + return null; + } + + @Override + public void setCamelContext(CamelContext camelContext) { + ((CamelContextAware) classResolver).setCamelContext(camelContext); + } + + @Override + public CamelContext getCamelContext() { + return ((CamelContextAware) classResolver).getCamelContext(); + } + + @Override + public Class resolveClass(String name) { + return classResolver.resolveClass(name); + } + + @Override + public Class resolveClass(String name, Class type) { + return classResolver.resolveClass(name, type); + } + + @Override + public Class resolveClass(String name, ClassLoader loader) { + return classResolver.resolveClass(name, loader); + } + + @Override + public Class resolveClass(String name, Class type, ClassLoader loader) { + return classResolver.resolveClass(name, type, loader); + } + + @Override + public Class resolveMandatoryClass(String name) throws ClassNotFoundException { + Class result = tryLoadClass(name); + if (result == null) + result = classResolver.resolveMandatoryClass(name); + return result; + } + + + @Override + public Class resolveMandatoryClass(String name, Class type) throws ClassNotFoundException { + Class result = CastUtils.cast(tryLoadClass(name)); + if (result == null) + result = classResolver.resolveMandatoryClass(name, type); + return result; + } + + @Override + public Class resolveMandatoryClass(String name, ClassLoader loader) throws ClassNotFoundException { + Class result = tryLoadClass(name); + if (result == null) + result = classResolver.resolveMandatoryClass(name, loader); + return result; + } + + @Override + public Class resolveMandatoryClass(String name, Class type, ClassLoader loader) + throws ClassNotFoundException { + Class result = CastUtils.cast(tryLoadClass(name)); + if (result == null) + result = classResolver.resolveMandatoryClass(name, type, loader); + return result; + } + + @Override + public InputStream loadResourceAsStream(String uri) { + return classResolver.loadResourceAsStream(uri); + } + + @Override + public URL loadResourceAsURL(String uri) { + return classResolver.loadResourceAsURL(uri); + } + + @Override + public Enumeration loadResourcesAsURL(String uri) { + return classResolver.loadResourcesAsURL(uri); + } + + @Override + public Enumeration loadAllResourcesAsURL(String uri) { + return classResolver.loadAllResourcesAsURL(uri); + } + + public List getResourceFolders() { + return resourceFolders; + } + + public void setResourceFolders(List resourceFolders) { + this.resourceFolders = resourceFolders; + } + + public BundleContext getBundleContext() { + return bundleContext; + } + + public void setBundleContext(BundleContext bundleContext) { + this.bundleContext = bundleContext; + } + + public boolean isUseCache() { + return useCache; + } + + public void setUseCache(boolean useCache) { + this.useCache = useCache; + } + +} diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfClassFolderUnwrapper.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfClassFolderUnwrapper.java index a728106a..92f741f2 100644 --- a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfClassFolderUnwrapper.java +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfClassFolderUnwrapper.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * core-support-runtime * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfClassHelper.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfClassHelper.java index 585a17d8..d462bd56 100644 --- a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfClassHelper.java +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfClassHelper.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * core-support-runtime * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfClassResourceUnwrapper.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfClassResourceUnwrapper.java index fff99c2b..5e020bc7 100644 --- a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfClassResourceUnwrapper.java +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfClassResourceUnwrapper.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * core-support-runtime * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfClassUnwrapper.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfClassUnwrapper.java index c590002e..bb9df148 100644 --- a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfClassUnwrapper.java +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfClassUnwrapper.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * core-support-runtime * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfDelegatingClassUnwrapper.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfDelegatingClassUnwrapper.java index 55a0f4c9..0c09654f 100644 --- a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfDelegatingClassUnwrapper.java +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfDelegatingClassUnwrapper.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * core-support-runtime * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfServiceBeanProxy.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfServiceBeanProxy.java index ca287275..abf94da5 100644 --- a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfServiceBeanProxy.java +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfServiceBeanProxy.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * core-support-runtime * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfServiceClassProxy.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfServiceClassProxy.java index c69beb42..767cd6ce 100644 --- a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfServiceClassProxy.java +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfServiceClassProxy.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * core-support-runtime * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfServiceClassProxyBean.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfServiceClassProxyBean.java index 71423953..af1d07db 100644 --- a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfServiceClassProxyBean.java +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfServiceClassProxyBean.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * core-support-runtime * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfSpringClassUnwrapper.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfSpringClassUnwrapper.java index 372d6610..da0c09b2 100644 --- a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfSpringClassUnwrapper.java +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/EntaxyCxfSpringClassUnwrapper.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * core-support-runtime * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/ExtJwtTokenSecurityContext.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/ExtJwtTokenSecurityContext.java new file mode 100644 index 00000000..0f0b4e9b --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/ExtJwtTokenSecurityContext.java @@ -0,0 +1,110 @@ +/*- + * ~~~~~~licensing~~~~~~ + * core-support-runtime + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.support.runtime.cxf; + +import org.apache.cxf.common.security.SimpleGroup; +import org.apache.cxf.common.security.SimplePrincipal; +import org.apache.cxf.helpers.CastUtils; +import org.apache.cxf.rs.security.jose.jwt.JwtToken; +import org.apache.cxf.rt.security.claims.Claim; +import org.apache.cxf.rt.security.claims.ClaimCollection; +import org.apache.cxf.rt.security.claims.ClaimsSecurityContext; + +import javax.security.auth.Subject; +import java.security.Principal; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class ExtJwtTokenSecurityContext implements ClaimsSecurityContext { + private final JwtToken token; + private final Principal principal; + private final Set roles; + private final ClaimCollection claims = new ClaimCollection(); + + public ExtJwtTokenSecurityContext(JwtToken jwt, String roleClaim, String regexp) { + principal = new SimplePrincipal(jwt.getClaims().getSubject()); + this.token = jwt; + if (roleClaim != null && jwt.getClaims().containsProperty(roleClaim)) { + roles = new HashSet<>(); + String role = jwt.getClaims().getStringProperty(roleClaim).trim(); + //TODO Think to remove regexp cz it is heavy operation + for (String r : role.split(regexp)) { + roles.add(new SimpleGroup(r)); + } + } else { + roles = Collections.emptySet(); + } + + // Parse JwtToken into ClaimCollection + jwt.getClaims().asMap().forEach((String name, Object values) -> { + Claim claim = new Claim(); + claim.setClaimType(name); + if (values instanceof List) { + claim.setValues(CastUtils.cast((List)values)); + } else { + claim.setValues(Collections.singletonList(values)); + } + claims.add(claim); + }); + } + + public JwtToken getToken() { + return token; + } + + @Override + public Subject getSubject() { + return null; + } + + @Override + public Set getUserRoles() { + return Collections.unmodifiableSet(roles); + } + + @Override + public Principal getUserPrincipal() { + return principal; + } + + @Override + public boolean isUserInRole(String role) { + for (Principal principalRole : roles) { + if (principalRole != principal && principalRole.getName().equals(role)) { + return true; + } + } + return false; + } + + @Override + public ClaimCollection getClaims() { + return claims; + } + +} diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/jose/ExtJwtAuthenticationFilter.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/jose/ExtJwtAuthenticationFilter.java new file mode 100644 index 00000000..2ac67656 --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/jose/ExtJwtAuthenticationFilter.java @@ -0,0 +1,108 @@ +/*- + * ~~~~~~licensing~~~~~~ + * core-support-runtime + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.support.runtime.cxf.jose; + +import org.apache.cxf.jaxrs.utils.JAXRSUtils; +import org.apache.cxf.message.Message; +import org.apache.cxf.message.MessageUtils; +import org.apache.cxf.rs.security.jose.common.JoseConstants; +import org.apache.cxf.rs.security.jose.common.JoseException; +import org.apache.cxf.rs.security.jose.jaxrs.JwtAuthenticationFilter; +import org.apache.cxf.rs.security.jose.jwa.SignatureAlgorithm; +import org.apache.cxf.rs.security.jose.jwt.JwtToken; +import org.apache.cxf.security.SecurityContext; +import ru.entaxy.platform.core.support.runtime.cxf.ExtJwtTokenSecurityContext; +import ru.entaxy.platform.core.support.runtime.cxf.security.AnonymousSecurityContext; + +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.core.HttpHeaders; +import java.io.IOException; +import java.util.List; + +public class ExtJwtAuthenticationFilter extends JwtAuthenticationFilter { + private static final String DEFAULT_AUTH_SCHEME = "JWT"; + private String expectedAuthScheme = DEFAULT_AUTH_SCHEME; + private String regexp; + + protected String getEncodedJwtToken(ContainerRequestContext requestContext) { + String auth = requestContext.getHeaderString(HttpHeaders.AUTHORIZATION); + String[] parts = auth == null ? null : auth.split(" "); + if (parts == null || !expectedAuthScheme.equals(parts[0]) || parts.length != 2) { + throw new JoseException(expectedAuthScheme + " scheme is expected"); + } + return parts[1]; + } + + public void filter(ContainerRequestContext requestContext) throws IOException { + if (!(requestContext.getSecurityContext() instanceof AnonymousSecurityContext) && !getHeaderDisplayServiceSchema(requestContext)) { + String encodedJwtToken = this.getEncodedJwtToken(requestContext); + JwtToken token = super.getJwtToken(encodedJwtToken); + SecurityContext securityContext = this.configureSecurityContext(token); + if (securityContext != null) { + JAXRSUtils.getCurrentMessage().put(SecurityContext.class, securityContext); + } + } + } + + private boolean getHeaderDisplayServiceSchema(ContainerRequestContext context) { + List ntxIsDisplayServiceSchema = context.getHeaders().get(AnonymousSecurityContext.HEADER_IS_DISPLAY_SERVICE_SERVICE); + if (ntxIsDisplayServiceSchema != null && !ntxIsDisplayServiceSchema.isEmpty()) + return Boolean.parseBoolean(ntxIsDisplayServiceSchema.get(0)); + return false; + } + + public void setExpectedAuthScheme(String expectedAuthScheme) { + this.expectedAuthScheme = expectedAuthScheme; + } + + protected SecurityContext configureSecurityContext(JwtToken jwt) { + Message m = JAXRSUtils.getCurrentMessage(); + boolean enableUnsignedJwt = + MessageUtils.getContextualBoolean(m, JoseConstants.ENABLE_UNSIGNED_JWT_PRINCIPAL, false); + + // The token must be signed/verified with a public key to set up the security context, + // unless we directly configure otherwise + if (jwt.getClaims().getSubject() != null + && (isVerifiedWithAPublicKey(jwt) || enableUnsignedJwt)) { + return new ExtJwtTokenSecurityContext(jwt, getRoleClaim(), regexp); + } + return null; + } + + private boolean isVerifiedWithAPublicKey(JwtToken jwt) { + if (isJwsRequired()) { + String alg = (String)jwt.getJwsHeader(JoseConstants.HEADER_ALGORITHM); + SignatureAlgorithm sigAlg = SignatureAlgorithm.getAlgorithm(alg); + return SignatureAlgorithm.isPublicKeyAlgorithm(sigAlg); + } + + return false; + } + + public void setRegexp(String regexp) { + this.regexp = regexp; + } +} diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/security/AnonymousSecurityContext.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/security/AnonymousSecurityContext.java new file mode 100644 index 00000000..4982aef4 --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/security/AnonymousSecurityContext.java @@ -0,0 +1,50 @@ +/*- + * ~~~~~~licensing~~~~~~ + * core-support-runtime + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.support.runtime.cxf.security; + +import org.apache.cxf.security.SecurityContext; +import org.apache.karaf.jaas.boot.principal.UserPrincipal; + +import java.security.Principal; + +public class AnonymousSecurityContext implements SecurityContext { + + public static final String HEADER_IS_DISPLAY_SERVICE_SERVICE = "NTX_IsDisplayServiceSchema"; + + public static final String ANONYMOUS_USER_NAME = "anonymous"; + + protected static Principal ANONYMOUS_USER = new UserPrincipal(ANONYMOUS_USER_NAME); + + @Override + public Principal getUserPrincipal() { + return ANONYMOUS_USER; + } + + @Override + public boolean isUserInRole(String role) { + return false; + } +} diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/security/oauth2/filters/DisplaySchemaOAuthRequestFilter.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/security/oauth2/filters/DisplaySchemaOAuthRequestFilter.java new file mode 100644 index 00000000..2c72f041 --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/cxf/security/oauth2/filters/DisplaySchemaOAuthRequestFilter.java @@ -0,0 +1,60 @@ +/*- + * ~~~~~~licensing~~~~~~ + * core-support-runtime + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.support.runtime.cxf.security.oauth2.filters; + +import org.apache.cxf.jaxrs.utils.JAXRSUtils; +import org.apache.cxf.rs.security.oauth2.filters.OAuthRequestFilter; +import ru.entaxy.platform.core.support.runtime.cxf.security.AnonymousSecurityContext; + +import javax.annotation.Priority; +import javax.ws.rs.Priorities; +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.PreMatching; +import javax.ws.rs.ext.Provider; +import java.util.List; + +@Provider +@PreMatching +// Priorities.AUTHORIZATION also works +@Priority(Priorities.AUTHENTICATION) +public class DisplaySchemaOAuthRequestFilter extends OAuthRequestFilter { + + @Override + public void filter(ContainerRequestContext context) { + if (!(context.getSecurityContext() instanceof AnonymousSecurityContext) + && !getHeaderDisplayServiceSchema(context)) { + validateRequest(JAXRSUtils.getCurrentMessage()); + } + } + + private boolean getHeaderDisplayServiceSchema(ContainerRequestContext context) { + List ntxIsDisplayServiceSchema = context.getHeaders().get(AnonymousSecurityContext.HEADER_IS_DISPLAY_SERVICE_SERVICE); + if (ntxIsDisplayServiceSchema != null && !ntxIsDisplayServiceSchema.isEmpty()) + return Boolean.parseBoolean(ntxIsDisplayServiceSchema.get(0)); + return false; + } + +} diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/hazelcast/HazelcastCallbackEntryExpiredListener.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/hazelcast/HazelcastCallbackEntryExpiredListener.java new file mode 100644 index 00000000..d02ec6fd --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/hazelcast/HazelcastCallbackEntryExpiredListener.java @@ -0,0 +1,60 @@ +/*- + * ~~~~~~licensing~~~~~~ + * core-support-runtime + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.support.runtime.hazelcast; + +import org.apache.camel.CamelContext; +import org.apache.camel.ProducerTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.hazelcast.core.EntryEvent; +import com.hazelcast.map.listener.EntryExpiredListener; + +public class HazelcastCallbackEntryExpiredListener implements EntryExpiredListener { + + private static final Logger LOG = LoggerFactory.getLogger(HazelcastCallbackEntryExpiredListener.class); + + private CamelContext camelContext; + private ProducerTemplate template; + private String callbackUrl; + + public HazelcastCallbackEntryExpiredListener(CamelContext camelContext, String callbackUrl) { + super(); + this.camelContext = camelContext; + this.callbackUrl = callbackUrl; + + template = camelContext.createProducerTemplate(); + + LOG.debug("HazelcastCallbackEntryExpiredListener initialized for callback " + callbackUrl); + } + + @Override + public void entryExpired(EntryEvent event) { + LOG.trace("HazelcastCallbackEntryExpiredListener initialized for callback " + event); + template.asyncSendBody(callbackUrl, event); + } + +} diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/hazelcast/HazelcastHelper.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/hazelcast/HazelcastHelper.java new file mode 100644 index 00000000..6d872468 --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/hazelcast/HazelcastHelper.java @@ -0,0 +1,136 @@ +/*- + * ~~~~~~licensing~~~~~~ + * core-support-runtime + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.support.runtime.hazelcast; + +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.hazelcast.core.HazelcastInstance; +import com.hazelcast.core.IMap; +import com.hazelcast.map.listener.MapListener; + +public class HazelcastHelper { + + private static final Logger LOG = LoggerFactory.getLogger(HazelcastHelper.class); + + public static final String DEFAULT_CACHE_PLATFORM = "platform"; + private HazelcastInstance hazelcastInstance; + private IMap cache; + private Map listenerIds; + + public HazelcastHelper(HazelcastInstance hazelcastInstance) { + this(hazelcastInstance, DEFAULT_CACHE_PLATFORM); + } + + public HazelcastHelper(HazelcastInstance hazelcastInstance, String cacheName) { + this(hazelcastInstance, DEFAULT_CACHE_PLATFORM, null, true); + } + + public HazelcastHelper(HazelcastInstance hazelcastInstance, List listeners) { + this(hazelcastInstance, DEFAULT_CACHE_PLATFORM, listeners, true); + } + + public HazelcastHelper(HazelcastInstance hazelcastInstance, String cacheName, List listeners, boolean activateListeners) { + super(); + LOG.debug("HazelcastHelper initialization for cache " + cacheName); + this.hazelcastInstance = hazelcastInstance; + this.cache = hazelcastInstance.getMap(cacheName); + listenerIds = new HashMap<>(); + + if (listeners != null && listeners.size() > 0) { + if (activateListeners) { + listeners.stream().forEach(l -> listenerIds.put(l, cache.addEntryListener(l, true))); + } else { + listeners.stream().forEach(l -> listenerIds.put(l, null)); + } + } + } + + public void destroy() { + LOG.debug("HazelcastHelper destroy actions for cache " + cache.getName()); + if (listenerIds != null && listenerIds.size() > 0) { + Collection ids = listenerIds.values(); + ids.stream().forEach(id -> cache.removeEntryListener(id)); + } + } + + public Object get(String key) { + return cache.get(key); + } + + public void put(String key, Object value) { + cache.put(key, value); + } + + public void put(String key, Object value, long ttl) { + cache.put(key, value, ttl, TimeUnit.SECONDS); + } + + public void put(String key, Object value, long ttl, TimeUnit timeUnit) { + cache.put(key, value, ttl, timeUnit); + } + + public void remove(String key) { + cache.remove(key); + } + + public void activateListeners() { + if (listenerIds != null && listenerIds.size() > 0) { + for (MapListener l : listenerIds.keySet()) { + if (listenerIds.get(l) == null) { + listenerIds.put(l, cache.addEntryListener(l, true)); + } + } + } + } + + public void addListener(MapListener listener) { + listenerIds.put(listener, cache.addEntryListener(listener, true)); + } + + public void removeListener(MapListener listener) { + if (listenerIds.containsKey(listener)) { + cache.removeEntryListener(listenerIds.get(listener)); + } else { + throw new IllegalArgumentException("Listener not registered"); + } + } + + public HazelcastInstance getHazelcastInstance() { + return hazelcastInstance; + } + + public void setHazelcastInstance(HazelcastInstance hazelcastInstance) { + this.hazelcastInstance = hazelcastInstance; + } + +} diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/helper/ServiceHelper.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/helper/ServiceHelper.java index 4e281502..e89350d9 100644 --- a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/helper/ServiceHelper.java +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/helper/ServiceHelper.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * core-support-runtime * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/ignite/IgniteInstanceIgniter.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/ignite/IgniteInstanceIgniter.java new file mode 100644 index 00000000..6c1d6233 --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/ignite/IgniteInstanceIgniter.java @@ -0,0 +1,214 @@ +/*- + * ~~~~~~licensing~~~~~~ + * core-support-runtime + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.support.runtime.ignite; + +import static org.apache.ignite.IgniteSystemProperties.IGNITE_QUIET; + +import java.io.File; + +import org.apache.camel.util.ObjectHelper; +import org.apache.ignite.Ignite; +import org.apache.ignite.Ignition; +import org.apache.ignite.cache.CacheAtomicityMode; +import org.apache.ignite.cache.CacheMode; +import org.apache.ignite.cache.CacheRebalanceMode; +import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.configuration.DataStorageConfiguration; +import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.configuration.TransactionConfiguration; +import org.apache.ignite.logger.jcl.JclLogger; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi; +import org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder; +import org.osgi.framework.BundleContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class IgniteInstanceIgniter { + + private static final Logger LOG = LoggerFactory.getLogger(IgniteInstanceIgniter.class); + + private BundleContext bundleContext; + private String workDirectory; + private long metricsLogFrequency; + + private String platformCacheName; + private String commonCacheName; + private String rebalanceMode; + private String cacheMode; + private String atomicityMode; + private int backups; + + private Ignite ignite; + + public IgniteInstanceIgniter() {} + + public void start() throws Exception { + ObjectHelper.notNull(bundleContext, "bundleContext"); + ObjectHelper.notNull(workDirectory, "workDirectory"); + + IgniteConfiguration cfg = createConfig(); + LOG.info("IgniteConfiguration created for workDirectory {}", workDirectory); + + CacheConfiguration platformCacheCfg = createCacheConfig(platformCacheName); + CacheConfiguration commonCacheCfg = createCacheConfig(commonCacheName); + cfg.setCacheConfiguration(platformCacheCfg, commonCacheCfg); + LOG.info("Common CacheConfiguration inited for cacheName {}", platformCacheName); + LOG.info("Common CacheConfiguration inited for cacheName {}", commonCacheName); + + System.setProperty(IGNITE_QUIET, "false"); + + ignite = Ignition.getOrStart(cfg); + ignite.cluster().active(true); + + ignite.getOrCreateCache(platformCacheCfg); + ignite.getOrCreateCache(commonCacheCfg); + + ignite.cluster().baselineAutoAdjustEnabled(true); + //default timeout 300s +// ignite.cluster().baselineAutoAdjustTimeout(30000); + LOG.info("Ignite instance initialized"); + + bundleContext.registerService(Ignite.class, ignite, null); + LOG.info("Ignite service published"); + } + + public void stop() throws Exception { + if (ignite != null) { + ignite.close(); + } + } + + protected CacheConfiguration createCacheConfig(String cacheName) { + CacheConfiguration cacheCfg = new CacheConfiguration<>(); + cacheCfg.setName(cacheName); + cacheCfg.setRebalanceMode(CacheRebalanceMode.valueOf(rebalanceMode)); + cacheCfg.setCacheMode(CacheMode.valueOf(cacheMode)); + cacheCfg.setAtomicityMode(CacheAtomicityMode.valueOf(atomicityMode)); + cacheCfg.setBackups(backups); + return cacheCfg; + } + + protected IgniteConfiguration createConfig() { + IgniteConfiguration cfg = new IgniteConfiguration(); +// cfg.setConsistentId(); + + TcpDiscoverySpi spi = new TcpDiscoverySpi(); +// spi.setIpFinder(new TcpDiscoverySharedFsIpFinder() {{setPath(workDirectory + "/addresses");}}); + spi.setIpFinder(new TcpDiscoveryMulticastIpFinder()); + cfg.setDiscoverySpi(spi); + + cfg.setGridLogger(new JclLogger()); + cfg.setTransactionConfiguration(new TransactionConfiguration()); + + //Persistence + DataStorageConfiguration storageCfg = new DataStorageConfiguration(); + storageCfg.getDefaultDataRegionConfiguration().setPersistenceEnabled(true); + cfg.setWorkDirectory(workDirectory); + cfg.setIgniteHome(workDirectory); + cfg.setDataStorageConfiguration(storageCfg); + + cfg.setMetricsLogFrequency(metricsLogFrequency); + + return cfg; + } + + public BundleContext getBundleContext() { + return bundleContext; + } + + public void setBundleContext(BundleContext bundleContext) { + this.bundleContext = bundleContext; + } + + public String getWorkDirectory() { + return workDirectory; + } + + public void setWorkDirectory(String workDirectory) { + if (workDirectory != null && + !workDirectory.startsWith(File.separator) && !workDirectory.contains(":")) { + workDirectory = System.getProperty("karaf.home", "/opt/karaf") + File.separator + workDirectory; + } + this.workDirectory = workDirectory; + } + + public long getMetricsLogFrequency() { + return metricsLogFrequency; + } + + public void setMetricsLogFrequency(long metricsLogFrequency) { + this.metricsLogFrequency = metricsLogFrequency; + } + + public String getPlatformCacheName() { + return platformCacheName; + } + + public void setPlatformCacheName(String platformCacheName) { + this.platformCacheName = platformCacheName; + } + + public String getCommonCacheName() { + return commonCacheName; + } + + public void setCommonCacheName(String commonCacheName) { + this.commonCacheName = commonCacheName; + } + + public String getRebalanceMode() { + return rebalanceMode; + } + + public void setRebalanceMode(String rebalanceMode) { + this.rebalanceMode = rebalanceMode; + } + + public String getCacheMode() { + return cacheMode; + } + + public void setCacheMode(String cacheMode) { + this.cacheMode = cacheMode; + } + + public String getAtomicityMode() { + return atomicityMode; + } + + public void setAtomicityMode(String atomicityMode) { + this.atomicityMode = atomicityMode; + } + + public int getBackups() { + return backups; + } + + public void setBackups(int backups) { + this.backups = backups; + } + +} diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/jackson/EntaxyObjectMapper.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/jackson/EntaxyObjectMapper.java new file mode 100644 index 00000000..2087335f --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/jackson/EntaxyObjectMapper.java @@ -0,0 +1,55 @@ +/*- + * ~~~~~~licensing~~~~~~ + * core-support-runtime + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.support.runtime.jackson; + +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.deser.DefaultDeserializationContext; +import com.fasterxml.jackson.databind.ser.DefaultSerializerProvider; +import com.fasterxml.jackson.datatype.joda.JodaModule; + +public class EntaxyObjectMapper extends ObjectMapper { + + public EntaxyObjectMapper() { + super(); + this.registerModule(new JodaModule()); + } + + public EntaxyObjectMapper(JsonFactory jf) { + super(jf); + this.registerModule(new JodaModule()); + } + + public EntaxyObjectMapper(ObjectMapper src) { + super(src); + this.registerModule(new JodaModule()); + } + + public EntaxyObjectMapper(JsonFactory jf, DefaultSerializerProvider sp, DefaultDeserializationContext dc) { + super(jf, sp, dc); + this.registerModule(new JodaModule()); + } +} diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/jackson/JacksonJsonProviderFactory.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/jackson/JacksonJsonProviderFactory.java new file mode 100644 index 00000000..63915bba --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/jackson/JacksonJsonProviderFactory.java @@ -0,0 +1,71 @@ +/*- + * ~~~~~~licensing~~~~~~ + * core-support-runtime + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.support.runtime.jackson; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.joda.JodaModule; +import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; + +import javax.ws.rs.core.MediaType; + +public class JacksonJsonProviderFactory { + + private boolean acceptSingleValueAsArray; + + private boolean failOnUnknownProperties; + + private boolean addJodaModule; + + public JacksonJsonProvider create() { + JacksonJsonProvider provider = new JacksonJsonProvider(); + + if (acceptSingleValueAsArray) + provider.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY); + + if (!failOnUnknownProperties) + provider.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + + if (addJodaModule) { + ObjectMapper mapper = provider.locateMapper(ObjectMapper.class, MediaType.APPLICATION_JSON_TYPE); + mapper.registerModule(new JodaModule()); + } + + return provider; + } + + public void setAcceptSingleValueAsArray(boolean acceptSingleValueAsArray) { + this.acceptSingleValueAsArray = acceptSingleValueAsArray; + } + + public void setFailOnUnknownProperties(boolean failOnUnknownProperties) { + this.failOnUnknownProperties = failOnUnknownProperties; + } + + public void setAddJodaModule(boolean addJodaModule) { + this.addJodaModule = addJodaModule; + } +} diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/jgroups/JGroupsLockServiceIgniter.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/jgroups/JGroupsLockServiceIgniter.java new file mode 100644 index 00000000..83b12321 --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/jgroups/JGroupsLockServiceIgniter.java @@ -0,0 +1,108 @@ +/*- + * ~~~~~~licensing~~~~~~ + * core-support-runtime + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.support.runtime.jgroups; + +import org.apache.camel.util.ObjectHelper; +import org.jgroups.JChannel; +import org.jgroups.blocks.locking.LockService; +import org.osgi.framework.BundleContext; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ru.entaxy.platform.core.support.runtime.service.ServiceHolderHelper; + +@Component(service = JGroupsLockServiceIgniter.class, immediate = true) +public class JGroupsLockServiceIgniter extends ServiceHolderHelper { + private static final Logger LOG = LoggerFactory.getLogger(JGroupsLockServiceIgniter.class); + + private static final String DEFAULT_JGROUPS_CONFIG = "etc/jgroups.locking.xml"; + private static final String DEFAULT_JGROUPS_CLUSTERNAME = "jgroups-master"; + + private String jgroupsConfig; + private String jgroupsClusterName; + + private JChannel channel; + private LockService lockService; + + private BundleContext bundleContext; + + @Activate + public JGroupsLockServiceIgniter(BundleContext bundleContext) { + this(DEFAULT_JGROUPS_CONFIG, DEFAULT_JGROUPS_CLUSTERNAME, bundleContext); + } + + public JGroupsLockServiceIgniter(String jgroupsConfig, String jgroupsClusterName, BundleContext bundleContext) { + this.jgroupsConfig = jgroupsConfig; + this.jgroupsClusterName = jgroupsClusterName; + this.bundleContext = bundleContext; + } + + @Activate + public void start() throws Exception { + ObjectHelper.notNull(jgroupsConfig, "jgroupsConfig"); + ObjectHelper.notNull(jgroupsClusterName, "jgroupsClusterName"); + ObjectHelper.notNull(bundleContext, "bundleContext"); + init(); + publish(); + LOG.info("JGroups ServiceHolder published"); + } + + protected void init() throws Exception { + channel = new JChannel(jgroupsConfig); + lockService = new LockService(channel); + channel.connect(jgroupsClusterName); + LOG.info("JGroups LockService instance initialized"); + } + + public void stop() throws Exception { + if (channel != null) { + channel.disconnect(); + channel.close(); + channel = null; + } + } + + @Override + public LockService getService() throws Exception { + return lockService; + } + + @Override + protected Class getGenericType() { + return LockService.class; + } + + @Override + public BundleContext getBundleContext() { + return bundleContext; + } + + public void setBundleContext(BundleContext bundleContext) { + this.bundleContext = bundleContext; + } +} diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/metadata/AbstractConsumerAwareMetadataStorage.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/metadata/AbstractConsumerAwareMetadataStorage.java index 948d5b80..a553506f 100644 --- a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/metadata/AbstractConsumerAwareMetadataStorage.java +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/metadata/AbstractConsumerAwareMetadataStorage.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * object-producer-core * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/metadata/ExchangeEnricher.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/metadata/ExchangeEnricher.java index 44b677e5..d0ebac64 100644 --- a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/metadata/ExchangeEnricher.java +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/metadata/ExchangeEnricher.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * object-producer-core * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/metadata/MetadataStorage.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/metadata/MetadataStorage.java index 66c6f637..026909fc 100644 --- a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/metadata/MetadataStorage.java +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/metadata/MetadataStorage.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * object-producer-core * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/metadata/MetadataStorageConsumer.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/metadata/MetadataStorageConsumer.java index e4588642..83cbfa01 100644 --- a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/metadata/MetadataStorageConsumer.java +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/metadata/MetadataStorageConsumer.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * object-producer-core * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/metadata/MetadataStorageEmpty.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/metadata/MetadataStorageEmpty.java index e6df69be..359e208d 100644 --- a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/metadata/MetadataStorageEmpty.java +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/metadata/MetadataStorageEmpty.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * object-producer-core * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/metadata/MetadataStorageImpl.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/metadata/MetadataStorageImpl.java index 40ef89d6..6d569e37 100644 --- a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/metadata/MetadataStorageImpl.java +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/metadata/MetadataStorageImpl.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * object-producer-core * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/metadata/MetadataStorageWrapper.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/metadata/MetadataStorageWrapper.java index 54b55624..07fd27da 100644 --- a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/metadata/MetadataStorageWrapper.java +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/metadata/MetadataStorageWrapper.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * object-producer-core * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/objects/resources/ObjectResourcesProvider.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/objects/resources/ObjectResourcesProvider.java index 77ed395d..84ba9b7a 100644 --- a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/objects/resources/ObjectResourcesProvider.java +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/objects/resources/ObjectResourcesProvider.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * core-support-runtime * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/service/ServiceHolder.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/service/ServiceHolder.java new file mode 100644 index 00000000..8d9fb68d --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/service/ServiceHolder.java @@ -0,0 +1,34 @@ +/*- + * ~~~~~~licensing~~~~~~ + * core-support-runtime + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.support.runtime.service; + +public interface ServiceHolder { + + public static final String PROP_INTERNAL_TYPE = "internalType"; + + T getService() throws Exception; + +} diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/service/ServiceHolderHelper.java b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/service/ServiceHolderHelper.java new file mode 100644 index 00000000..a9b419e0 --- /dev/null +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/java/ru/entaxy/platform/core/support/runtime/service/ServiceHolderHelper.java @@ -0,0 +1,49 @@ +/*- + * ~~~~~~licensing~~~~~~ + * core-support-runtime + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.platform.core.support.runtime.service; + +import java.util.Dictionary; +import java.util.Hashtable; + +import org.osgi.framework.BundleContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public abstract class ServiceHolderHelper implements ServiceHolder { + + private static final Logger LOG = LoggerFactory.getLogger(ServiceHolderHelper.class); + + public abstract BundleContext getBundleContext(); + protected abstract Class getGenericType(); + + protected void publish() { + Dictionary props = new Hashtable<>(); + props.put(PROP_INTERNAL_TYPE, getGenericType().getName()); + getBundleContext().registerService(ServiceHolder.class, this, props); + LOG.debug("ServiceHolder published: " + getGenericType().getName()); + } + +} diff --git a/platform/runtime/core/core-support/core-support-runtime/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/platform/runtime/core/core-support/core-support-runtime/src/main/resources/OSGI-INF/blueprint/blueprint.xml index 7180235b..9bae1288 100644 --- a/platform/runtime/core/core-support/core-support-runtime/src/main/resources/OSGI-INF/blueprint/blueprint.xml +++ b/platform/runtime/core/core-support/core-support-runtime/src/main/resources/OSGI-INF/blueprint/blueprint.xml @@ -3,7 +3,7 @@ ~~~~~~licensing~~~~~~ schema-impl ========== - Copyright (C) 2020 - 2024 EmDev LLC + Copyright (C) 2020 - 2025 EmDev LLC ========== You may not use this file except in accordance with the License Terms of the Copyright Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property @@ -34,22 +34,26 @@ placeholder-prefix="$ignite{"> - + + + - + + + diff --git a/platform/runtime/core/core-support/pom.xml b/platform/runtime/core/core-support/pom.xml index 0ad3b0ce..37e9c43f 100644 --- a/platform/runtime/core/core-support/pom.xml +++ b/platform/runtime/core/core-support/pom.xml @@ -3,7 +3,7 @@ ru.entaxy.esb.platform.runtime core - 1.10.0 + 1.11.0 ru.entaxy.esb.platform.runtime.core core-support diff --git a/platform/runtime/core/error-handling/LICENSE.txt b/platform/runtime/core/error-handling/LICENSE.txt new file mode 100644 index 00000000..4ae94b75 --- /dev/null +++ b/platform/runtime/core/error-handling/LICENSE.txt @@ -0,0 +1,175 @@ + ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ + +Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой) +версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего +Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН +7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова, +д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу +https://www.emdev.ru/about (далее - Компания). + +Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями» +(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения, +Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в +настоящем документе, в противном случае, он должен не использовать или не получать доступ +к Программному обеспечению. + + 1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ + +a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии +или редакции, исключительные права на которую принадлежат Правообладателю. +b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные +права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ +для ЭВМ № 2021610848 от 19.01.2021 года. +c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта +https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО. +d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также +личные неимущественные права авторов произведений на результат интеллектуальной деятельности. +e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование +ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка +включает предоставление Пользователю неисключительного права использования ПО, в том числе +получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение +патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается +Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается +для каждого Пользователя индивидуально в Сертификате. +f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром), +подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное +обеспечение в ограниченном объёме и на определённый период времени. +g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО, +предоставленных Пользователю согласно условиям Подписки. +h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного +обеспечения. +i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий +из одного или нескольких файлов, который может быть прочтён человеком. +j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля +программы, полученный в результате обработки исходного кода, еще не связанный в полную программу. +Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый +продукт. +k) Некоммерческое использование – индивидуальное личное использование Пользователем программного +обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации +возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая +выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения. + + 2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ + +2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного +обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом +воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения +в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ. +2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит +неисключительный характер. +2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию, +лицензия на ограниченное использование Программного обеспечения. +2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования +имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан +обратиться в службу поддержки Правообладателя по адресу: https://entaxy.ru/ для изменения +вида лицензии с Базовой бесплатной версии на Подписки. +2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для +пробного использования программного обеспечения – не ограничен. +2.6. Использование Пользователем настоящего программного обеспечения в целях разработки, +модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю, +без разрешения Правообладателя не допускается. + + 3. АВТОРСКОЕ ПРАВО. + +3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение +и любые его копии принадлежат Правообладателю. +3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента, +к которому можно получить доступ с помощью Программного обеспечения, является собственностью +соответствующего владельца контента и защищается применимым законодательством об авторском +праве или другими законами и договорами об интеллектуальной собственности. +3.3. Условия использования Программного обеспечения. +Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь +придерживается следующих условий: +3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять +какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании +Программного обеспечения или на нем. +3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать, +расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать +Программное обеспечение. +3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования +ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне. +3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено +использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам. + + 4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС» + +4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю +на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с +использованием Пользователем: +4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в +Программное обеспечение; +4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями +настоящего соглашения; +4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием, +или данными, не предоставленными Пользователю Правообладателем; +4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем. + + +5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ +ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ +И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ +ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ +И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ +ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО. + + 6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ. +НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ +ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ, +ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ; +ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ. +ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ +ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ; +КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ +ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ. + + 7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ: +Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия +(включая, но не ограничиваясь) по: +-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код) + Программного обеспечения; +-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный +код Программного обеспечения, за исключением тех изменений, которые вносятся средствами, +включёнными в Программное обеспечение и описанными непосредственно в документации к нему; +-созданию условий для использования Программного обеспечения лицами, не имеющими прав на +использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство +третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа +к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку; +-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию). + + 8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА. + +8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из +лицензионных продуктов, используемых на законных основаниях, а +именно https://entaxy.ru/libs/licenses/root-aggregated.deps. +8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть +совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения. +8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться +Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения, +содержащих все изменения и дополнения программного обеспечения. + + 9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ. + +9.1. Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым +программным обеспечением. +9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно +с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм +«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public. +9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий +пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя, +прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер +ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства +Российской Федерации. + + 10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ. + +10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет +право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб, +недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий +пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере +2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения +исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy). +10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое +законодательство – Российской Федерации. +10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным, +остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать +исполнять свои обязанности в соответствии с этими положениями. diff --git a/platform/runtime/core/error-handling/error-handler/LICENSE.txt b/platform/runtime/core/error-handling/error-handler/LICENSE.txt new file mode 100644 index 00000000..4ae94b75 --- /dev/null +++ b/platform/runtime/core/error-handling/error-handler/LICENSE.txt @@ -0,0 +1,175 @@ + ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ + +Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой) +версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего +Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН +7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова, +д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу +https://www.emdev.ru/about (далее - Компания). + +Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями» +(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения, +Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в +настоящем документе, в противном случае, он должен не использовать или не получать доступ +к Программному обеспечению. + + 1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ + +a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии +или редакции, исключительные права на которую принадлежат Правообладателю. +b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные +права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ +для ЭВМ № 2021610848 от 19.01.2021 года. +c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта +https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО. +d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также +личные неимущественные права авторов произведений на результат интеллектуальной деятельности. +e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование +ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка +включает предоставление Пользователю неисключительного права использования ПО, в том числе +получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение +патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается +Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается +для каждого Пользователя индивидуально в Сертификате. +f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром), +подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное +обеспечение в ограниченном объёме и на определённый период времени. +g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО, +предоставленных Пользователю согласно условиям Подписки. +h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного +обеспечения. +i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий +из одного или нескольких файлов, который может быть прочтён человеком. +j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля +программы, полученный в результате обработки исходного кода, еще не связанный в полную программу. +Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый +продукт. +k) Некоммерческое использование – индивидуальное личное использование Пользователем программного +обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации +возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая +выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения. + + 2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ + +2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного +обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом +воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения +в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ. +2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит +неисключительный характер. +2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию, +лицензия на ограниченное использование Программного обеспечения. +2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования +имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан +обратиться в службу поддержки Правообладателя по адресу: https://entaxy.ru/ для изменения +вида лицензии с Базовой бесплатной версии на Подписки. +2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для +пробного использования программного обеспечения – не ограничен. +2.6. Использование Пользователем настоящего программного обеспечения в целях разработки, +модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю, +без разрешения Правообладателя не допускается. + + 3. АВТОРСКОЕ ПРАВО. + +3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение +и любые его копии принадлежат Правообладателю. +3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента, +к которому можно получить доступ с помощью Программного обеспечения, является собственностью +соответствующего владельца контента и защищается применимым законодательством об авторском +праве или другими законами и договорами об интеллектуальной собственности. +3.3. Условия использования Программного обеспечения. +Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь +придерживается следующих условий: +3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять +какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании +Программного обеспечения или на нем. +3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать, +расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать +Программное обеспечение. +3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования +ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне. +3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено +использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам. + + 4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС» + +4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю +на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с +использованием Пользователем: +4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в +Программное обеспечение; +4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями +настоящего соглашения; +4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием, +или данными, не предоставленными Пользователю Правообладателем; +4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем. + + +5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ +ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ +И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ +ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ +И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ +ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО. + + 6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ. +НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ +ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ, +ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ; +ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ. +ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ +ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ; +КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ +ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ. + + 7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ: +Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия +(включая, но не ограничиваясь) по: +-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код) + Программного обеспечения; +-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный +код Программного обеспечения, за исключением тех изменений, которые вносятся средствами, +включёнными в Программное обеспечение и описанными непосредственно в документации к нему; +-созданию условий для использования Программного обеспечения лицами, не имеющими прав на +использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство +третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа +к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку; +-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию). + + 8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА. + +8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из +лицензионных продуктов, используемых на законных основаниях, а +именно https://entaxy.ru/libs/licenses/root-aggregated.deps. +8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть +совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения. +8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться +Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения, +содержащих все изменения и дополнения программного обеспечения. + + 9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ. + +9.1. Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым +программным обеспечением. +9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно +с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм +«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public. +9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий +пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя, +прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер +ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства +Российской Федерации. + + 10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ. + +10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет +право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб, +недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий +пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере +2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения +исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy). +10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое +законодательство – Российской Федерации. +10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным, +остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать +исполнять свои обязанности в соответствии с этими положениями. diff --git a/platform/runtime/core/error-handling/error-handler/README.md b/platform/runtime/core/error-handling/error-handler/README.md new file mode 100644 index 00000000..392da85c --- /dev/null +++ b/platform/runtime/core/error-handling/error-handler/README.md @@ -0,0 +1,116 @@ +# SYSTEM :: ENTAXY :: CORE :: COMMON ERROR HANDLER + +Централизованный обработчик ошибок для формирования кодов ошибок, их синхронного возврата клиенту и для асинхронного дублирования более подробного описания ошибки (для клиента и для Центральной Базы Интеграции). + +## Установка и настройка +Установка модуля происходит через фичу: +``` +feature:install error-handler +``` +Фича включена в общий установочный скрипт и будет устанавливаться вместе с остальными модулями. +Во время установки фичи в караф копируются файлы конфигурации: +``` +ru.entaxy.esb.error.cfg (основная конфигурация) +ru.entaxy.esb.error.code.cfg (справочник исключений с маппингом на коды ошибок) +ru.entaxy.esb.error.text.cfg (справочник кодов ошибок с маппингом на текстовые сообщения) +``` +Есть возможность настройки маппинга уровней журналирования через файл конфигурации `ru.entaxy.esb.error.severity.cfg`. +### ru.entaxy.esb.error.cfg (основная конфигурация) +``` +# асинхронный пакет с ошибкой отправляется от имени: +# false - системы, вызвавшей ошибку в шине +# true - шины (система с идентификатором "-1") +error.bus.always_at_source=false + +# асинхронный пакет с ошибкой в поле description содержит: +# false - сообщение из маппинга в файле ru.entaxy.esb.error.text.cfg +# true - содержит сообщение, сохранённое в исключении +error.description.exception_message=true + +# имя очереди для отправки пакета с ошибкой при недоступности системы, указанной в свойстве error.system.name +error.queue.name=error + +# имя системы для отправки пакета с ошибкой, подразумевается система ЦБИ +error.system.name=error + +# true - включает в пакет с ошибкой весь stacktrace исключения +error.stacktrace.show=true + +# свойство автоматического запуска тестового маршрута, который при старте модуля бросает исключение java.lang.IllegalArgumentException: Test exception thrown +error.test-route.startup=false +``` +### ru.entaxy.esb.error.code.cfg (справочник исключений с маппингом на коды ошибок) +Справочник содержит соответствие имён классов исключений и http кодов ошибок. И будет наполняться по мере использования шины в разных ситуациях. Для исключения, имя которого ещё не указано в этом файле, будет возвращаться http код `520` (Unknown Error). +``` +DefaultException=520 +com.ctc.wstx.exc.WstxParsingException=400 +java.security.AccessControlException=403 +javax.ws.rs.ForbiddenException=403 +ConnectorNotFound=424 +ru.entaxy.esb.system.common.exception.DefaultException=520 +ProfileNotFound=424 +# и т.д. +``` +### ru.entaxy.esb.error.text.cfg (справочник кодов ошибок с маппингом на текстовые сообщения) +Если в основной конфигурации свойство `error.description.exception_message` установлено в `false`, то описание ошибки отправляется из этого файла в соответствие с кодом http ошибки. +``` +# 1xx: Informational +# 2xx: Success +200=OK + +# 3xx: Redirection +# 4xx: Client Error +400=Bad Request +403=Forbidden +424=Failed Dependency + +# 5xx: Server Error +520=Unknown Error +# и т.д. +``` +## Подключение обработчика ошибок +Для подключения обработчика ошибок к маршрутам какого-либо модуля необходимо выполнить следующие шаги: +1. Добавить в модуль обработки ошибок в директорию `src/main/resources/xslt/operation` новый xslt для формирования ответа с ошибкой. Файл должен называться по имени операции, для которой будет формироваться ответ. Например `sendToJMS.xsl`. +1. Добавить в `camelContext` аттрибут `errorHandlerRef="commonErrorHandler"` и внутри зарегистрировать обработчик и политику повторной доставки: +```xml + + + + + + +``` +Для контекстов, содержащих конечные точки cxf, необходимо: +- через `pom.xml` импортировать интерцептор для перехвата ошибок (SoapFault) +```xml + + ru.entaxy.esb.system.core.common.error.handler.interceptor, + ... + +``` +- добавить интерцептор в `cxfEndpoint` и bean с указанием в первом аргументе идентификатора `camelContext` +```xml + + + + + + + + + + + +``` +- в `camelContext` добавить маршрут +```xml + + + + + + +``` diff --git a/platform/runtime/core/error-handling/error-handler/pom.xml b/platform/runtime/core/error-handling/error-handler/pom.xml new file mode 100644 index 00000000..eceff91e --- /dev/null +++ b/platform/runtime/core/error-handling/error-handler/pom.xml @@ -0,0 +1,48 @@ + + + + 4.0.0 + + + ru.entaxy.platform.core + error-handling + 1.11.0 + + + ru.entaxy.platform.core.error-handling + error-handler + bundle + + ENTAXY :: PLATFORM :: CORE :: ERROR HANDLER + ENTAXY :: PLATFORM :: CORE :: ERROR HANDLER + + + + ru.entaxy.esb.system.core.common.error.handler.interceptor + + + org.apache.commons.lang3.exception, + * + + + + + + + + + ru.entaxy.esb.platform.runtime.core + core-support-runtime-legacy + ${project.version} + + + org.apache.camel + camel-core + + + org.apache.camel + camel-cxf + + + diff --git a/platform/runtime/core/error-handling/error-handler/src/main/cfg/generated/fragments.xml b/platform/runtime/core/error-handling/error-handler/src/main/cfg/generated/fragments.xml new file mode 100644 index 00000000..434bf082 --- /dev/null +++ b/platform/runtime/core/error-handling/error-handler/src/main/cfg/generated/fragments.xml @@ -0,0 +1,13 @@ + + + mvn:ru.entaxy.platform.core.error-handling/error-handler/1.11.0/cfg/ru.entaxy.esb.error + + + + mvn:ru.entaxy.platform.core.error-handling/error-handler/1.11.0/cfg/ru.entaxy.esb.error.code + + + + mvn:ru.entaxy.platform.core.error-handling/error-handler/1.11.0/cfg/ru.entaxy.esb.error.text + + \ No newline at end of file diff --git a/platform/runtime/core/error-handling/error-handler/src/main/cfg/ru.entaxy.esb.error.cfg b/platform/runtime/core/error-handling/error-handler/src/main/cfg/ru.entaxy.esb.error.cfg new file mode 100644 index 00000000..9d55fb89 --- /dev/null +++ b/platform/runtime/core/error-handling/error-handler/src/main/cfg/ru.entaxy.esb.error.cfg @@ -0,0 +1,49 @@ +### +# ~~~~~~licensing~~~~~~ +# karaf-features +# ========== +# Copyright (C) 2020 - 2025 EmDev LLC +# ========== +# You may not use this file except in accordance with the License Terms of the Copyright +# Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property +# rights to the Software and any copies are the property of the Copyright Holder. Unless +# it is explicitly allowed the Copyright Holder, the User is prohibited from using the +# Software for commercial purposes to provide services to third parties. +# +# The Copyright Holder hereby declares that the Software is provided on an "AS IS". +# Under no circumstances does the Copyright Holder guarantee or promise that the +# Software provided by him will be suitable or not suitable for the specific purposes +# of the User, that the Software will meet all commercial and personal subjective +# expectations of the User, that the Software will work properly, without technical +# errors, quickly and uninterruptedly. +# +# Under no circumstances shall the Copyright Holder or its Affiliates is not liable +# to the User for any direct or indirect losses of the User, his expenses or actual +# damage, including, downtime; loss of bussines; lost profit; lost earnings; loss +# or damage to data, property, etc. +# ~~~~~~/licensing~~~~~~ +### +# асинхронный пакет с ошибкой отправляется от имени: +# false - системы, вызвавшей ошибку в шине +# true - шины (система с идентификатором "-1") +error.bus.always_at_source=false + +# асинхронный пакет с ошибкой в поле description содержит: +# false - сообщение из маппинга в файле ru.entaxy.esb.error.text.cfg +# true - содержит сообщение, сохранённое в исключении +error.description.exception_message=true + +# имя очереди для отправки пакета с ошибкой при недоступности системы, указанной в свойстве error.system.name +error.queue.name=error + +# имя системы для отправки пакета с ошибкой +error.system.name=error + +# true - включает в асинхронный пакет с ошибкой весь stacktrace исключения +error.asynch.stacktrace.show=true + +# false - включает в синхронный ответ с ошибкой весь stacktrace исключения +error.synch.stacktrace.show=false + +# свойство автоматического запуска тестового маршрута, который при старте модуля бросает исключение java.lang.IllegalArgumentException: Test exception thrown +error.test-route.startup=false diff --git a/platform/runtime/core/error-handling/error-handler/src/main/cfg/ru.entaxy.esb.error.code.cfg b/platform/runtime/core/error-handling/error-handler/src/main/cfg/ru.entaxy.esb.error.code.cfg new file mode 100644 index 00000000..2dfc12ad --- /dev/null +++ b/platform/runtime/core/error-handling/error-handler/src/main/cfg/ru.entaxy.esb.error.code.cfg @@ -0,0 +1,48 @@ +### +# ~~~~~~licensing~~~~~~ +# karaf-features +# ========== +# Copyright (C) 2020 - 2025 EmDev LLC +# ========== +# You may not use this file except in accordance with the License Terms of the Copyright +# Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property +# rights to the Software and any copies are the property of the Copyright Holder. Unless +# it is explicitly allowed the Copyright Holder, the User is prohibited from using the +# Software for commercial purposes to provide services to third parties. +# +# The Copyright Holder hereby declares that the Software is provided on an "AS IS". +# Under no circumstances does the Copyright Holder guarantee or promise that the +# Software provided by him will be suitable or not suitable for the specific purposes +# of the User, that the Software will meet all commercial and personal subjective +# expectations of the User, that the Software will work properly, without technical +# errors, quickly and uninterruptedly. +# +# Under no circumstances shall the Copyright Holder or its Affiliates is not liable +# to the User for any direct or indirect losses of the User, his expenses or actual +# damage, including, downtime; loss of bussines; lost profit; lost earnings; loss +# or damage to data, property, etc. +# ~~~~~~/licensing~~~~~~ +### +# Справочник содержит соответствие имён классов исключений и http кодов ошибок. +# И будет наполняться по мере использования шины в разных ситуациях. +# Для исключения, имя которого ещё не указано в этом файле, +# будет возвращаться http код 520 (Unknown Error). +# согласование кодов ошибок происходит в https://docs.google.com/spreadsheets/d/1rvRyiSN-khuuRSJenwP5g7Q-ilbctOGCFgDfdM-abEk/edit#gid=1202937725 +DefaultException=520 + +com.ctc.wstx.exc.WstxParsingException=400 + +java.lang.NullPointerException=418 +java.security.AccessControlException=403 + +org.apache.cxf.interceptor.security.AuthenticationException=401 +javax.ws.rs.ForbiddenException=403 +org.apache.cxf.interceptor.security.AccessDeniedException=403 + +org.apache.camel.language.bean.RuntimeBeanExpressionException=500 + +ConnectorNotFound=424 +ru.entaxy.esb.system.common.exception.DefaultException=520 +ProfileNotFound=424 + +java.io.FileNotFoundException=404 diff --git a/platform/runtime/core/error-handling/error-handler/src/main/cfg/ru.entaxy.esb.error.text.cfg b/platform/runtime/core/error-handling/error-handler/src/main/cfg/ru.entaxy.esb.error.text.cfg new file mode 100644 index 00000000..2b244d28 --- /dev/null +++ b/platform/runtime/core/error-handling/error-handler/src/main/cfg/ru.entaxy.esb.error.text.cfg @@ -0,0 +1,39 @@ +### +# ~~~~~~licensing~~~~~~ +# karaf-features +# ========== +# Copyright (C) 2020 - 2025 EmDev LLC +# ========== +# You may not use this file except in accordance with the License Terms of the Copyright +# Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property +# rights to the Software and any copies are the property of the Copyright Holder. Unless +# it is explicitly allowed the Copyright Holder, the User is prohibited from using the +# Software for commercial purposes to provide services to third parties. +# +# The Copyright Holder hereby declares that the Software is provided on an "AS IS". +# Under no circumstances does the Copyright Holder guarantee or promise that the +# Software provided by him will be suitable or not suitable for the specific purposes +# of the User, that the Software will meet all commercial and personal subjective +# expectations of the User, that the Software will work properly, without technical +# errors, quickly and uninterruptedly. +# +# Under no circumstances shall the Copyright Holder or its Affiliates is not liable +# to the User for any direct or indirect losses of the User, his expenses or actual +# damage, including, downtime; loss of bussines; lost profit; lost earnings; loss +# or damage to data, property, etc. +# ~~~~~~/licensing~~~~~~ +### +# 1xx: Informational +# 2xx: Success +200=OK + +# 3xx: Redirection +# 4xx: Client Error +400=Bad Request +401=Unauthorized +403=Forbidden +418=I’m a teapot +424=Failed Dependency + +# 5xx: Server Error +520=Unknown Error diff --git a/platform/runtime/core/error-handling/error-handler/src/main/java/ru/entaxy/esb/system/core/common/error/handler/interceptor/EntaxyCxfFaultInterceptor.java b/platform/runtime/core/error-handling/error-handler/src/main/java/ru/entaxy/esb/system/core/common/error/handler/interceptor/EntaxyCxfFaultInterceptor.java new file mode 100644 index 00000000..01495bb4 --- /dev/null +++ b/platform/runtime/core/error-handling/error-handler/src/main/java/ru/entaxy/esb/system/core/common/error/handler/interceptor/EntaxyCxfFaultInterceptor.java @@ -0,0 +1,214 @@ +/*- + * ~~~~~~licensing~~~~~~ + * error-handler + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.system.core.common.error.handler.interceptor; + +import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.ProducerTemplate; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.cxf.binding.soap.SoapMessage; +import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor; +import org.apache.cxf.endpoint.Endpoint; +import org.apache.cxf.interceptor.Fault; +import org.apache.cxf.message.Exchange; +import org.apache.cxf.message.Message; +import org.apache.cxf.phase.Phase; +import org.apache.cxf.transport.Conduit; +import org.apache.cxf.transport.http.Headers; + +/** + * + * Prepare soap response and send back to calling system. + * Body can be simple string. + * + * Example: + * + * + * + * + * + * + * + * + * append bean to cxf service description + * + * + * + * + * + */ +public class EntaxyCxfFaultInterceptor extends AbstractSoapInterceptor { + + private static final Log LOG = LogFactory.getLog(EntaxyCxfFaultInterceptor.class); + + private final ProducerTemplate template; + /** + * endpoint to custom error handler route for + * preparing soap response + */ + private final String endpointUri; + /** + * wrap with soap envelope + */ + private boolean wrap = false; + /** + * wrapper endpoint, can be custom + */ + private String wrapEndpoint = "direct-vm:soap-wrap"; + /** + * 1 line logging: + * + */ + private boolean log = false; + /** + * use service logging key + */ + private boolean loggingKeyUse = false; + /** + * default header with logging key + */ + private String loggingKeyHeader = "NTX_loggingKey"; + + public EntaxyCxfFaultInterceptor(CamelContext camelContext, String endpointUri) { + super(Phase.POST_PROTOCOL); + this.template = camelContext.createProducerTemplate(); + this.endpointUri = endpointUri; + } + + public void handleMessage(SoapMessage message) { + LOG.debug("EntaxyCxfFaultInterceptor.handleMessage invocation"); + Map headers = prepareHeaders(message); + logging(headers); + String response = template.requestBodyAndHeaders(this.endpointUri, "", headers, String.class); + if (wrap) { + response = template.requestBodyAndHeaders(this.wrapEndpoint, response, headers, String.class); + } + LOG.debug("EntaxyCxfFaultInterceptor.handleMessage result from camel: \n" + response); + sendErrorResponse(message, 200, response, headers); + } + + protected void logging(Map headers) { + if (log) { + Fault fault = (Fault) headers.get("NTX_ERROR_HANDLER_SoapFault"); + StringBuilder errorMessage = new StringBuilder(); + if (loggingKeyUse && headers.get(loggingKeyHeader) != null) { + errorMessage.append(headers.get(loggingKeyHeader)); + errorMessage.append(" "); + } + errorMessage.append(fault.getCause().getMessage()); + LOG.error(errorMessage); + } + } + + protected Map prepareHeaders(SoapMessage message) { + Map> inHeaders = Headers.getSetProtocolHeaders(message); + + Map headers = new HashMap<>(); + Object value; + for (Map.Entry> e : inHeaders.entrySet()) { + if (e.getValue() != null && e.getValue().size() == 1 && e.getValue().get(0) instanceof String) { + value = e.getValue().get(0); + } else { + value = e.getValue(); + } + headers.put(e.getKey(), value); + } + + Fault fault = (Fault) message.getContent(Exception.class); + headers.put("NTX_ERROR_HANDLER_SoapFault", fault); + return headers; + } + + + protected void sendErrorResponse(Message message, int responseCode, String ret, Map headers) { + Message outMessage = getOutMessage(message); + outMessage.put(Message.ENCODING, StandardCharsets.UTF_8.name()); + outMessage.put(Message.RESPONSE_CODE, responseCode); + // Clear the response headers + @SuppressWarnings("rawtypes") + Map responseHeaders = (Map) outMessage.get(Message.PROTOCOL_HEADERS); + if (responseHeaders != null) { + responseHeaders.clear(); + } + message.getInterceptorChain().abort(); + try { + getConduit(message).prepare(outMessage); + write(outMessage, ret); + } catch (IOException e) { + LOG.warn(e.getMessage(), e); + } + } + + protected Message getOutMessage(Message inMessage) { + Exchange exchange = inMessage.getExchange(); + Message outMessage = exchange.getOutMessage(); + if (outMessage == null) { + Endpoint endpoint = exchange.get(Endpoint.class); + outMessage = endpoint.getBinding().createMessage(); + exchange.setOutMessage(outMessage); + } + outMessage.putAll(inMessage); + return outMessage; + } + + protected Conduit getConduit(Message inMessage) throws IOException { + Exchange exchange = inMessage.getExchange(); + Conduit conduit = exchange.getDestination().getBackChannel(inMessage); + exchange.setConduit(conduit); + return conduit; + } + + protected void write(Message outMessage, String ret) throws IOException { + try (OutputStream os = outMessage.getContent(OutputStream.class);) { + os.write(ret.getBytes(StandardCharsets.UTF_8)); + os.flush(); + } + } + + public void setWrap(boolean wrap) { + this.wrap = wrap; + } + public void setWrapEndpoint(String wrapEndpoint) { + this.wrapEndpoint = wrapEndpoint; + } + public void setLog(boolean log) { + this.log = log; + } + public void setLoggingKeyUse(boolean loggingKeyUse) { + this.loggingKeyUse = loggingKeyUse; + } + public void setLoggingKeyHeader(String loggingKeyHeader) { + this.loggingKeyHeader = loggingKeyHeader; + } + +} diff --git a/platform/runtime/core/error-handling/error-handler/src/main/java/ru/entaxy/esb/system/core/common/error/handler/interceptor/HandleOutFaultInterceptor.java b/platform/runtime/core/error-handling/error-handler/src/main/java/ru/entaxy/esb/system/core/common/error/handler/interceptor/HandleOutFaultInterceptor.java new file mode 100644 index 00000000..9bdb09ce --- /dev/null +++ b/platform/runtime/core/error-handling/error-handler/src/main/java/ru/entaxy/esb/system/core/common/error/handler/interceptor/HandleOutFaultInterceptor.java @@ -0,0 +1,155 @@ +/*- + * ~~~~~~licensing~~~~~~ + * error-handler + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.system.core.common.error.handler.interceptor; + +import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.ProducerTemplate; +import org.apache.camel.component.cxf.common.message.CxfConstants; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.cxf.binding.soap.SoapMessage; +import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor; +import org.apache.cxf.endpoint.Endpoint; +import org.apache.cxf.interceptor.Fault; +import org.apache.cxf.message.Exchange; +import org.apache.cxf.message.Message; +import org.apache.cxf.phase.Phase; +import org.apache.cxf.transport.Conduit; +import org.apache.cxf.transport.http.Headers; + +import ru.entaxy.esb.system.common.util.SystemHeadersConstants; + +public class HandleOutFaultInterceptor extends AbstractSoapInterceptor { + private static final Log LOG = LogFactory.getLog(HandleOutFaultInterceptor.class); + + private final ProducerTemplate template; + private final String endpointUri; + + public HandleOutFaultInterceptor(CamelContext camelContext, String endpointUri) { + super(Phase.POST_PROTOCOL); + this.template = camelContext.createProducerTemplate(); + this.endpointUri = endpointUri; + } + + + public void handleMessage(SoapMessage message) { + LOG.debug("HandleOutFaultInterceptor.handleMessage invocation"); + // String inMessage = message.getExchange().getInMessage().getContent(String.class); + // Fault fault = (Fault) message.getContent(Exception.class); + Map headers = prepareHeaders(message); + String response = template.requestBodyAndHeaders(this.endpointUri, "", headers, String.class); + LOG.debug("HandleOutFaultInterceptor.handleMessage result from camel: \n" + response); + sendErrorResponse(message, 200, response); + } + + private Map prepareHeaders(SoapMessage message) { + Fault fault = (Fault) message.getContent(Exception.class); + Map headers = new HashMap(); + headers.put("NTX_ERROR_HANDLER_SoapFault", fault); + // headers.put("ERROR_HANDLER_EXCEPTION", fault.getCause()); + // headers.put("NTX_ERROR_HANDLER_ExceptionClass", fault.getCause().getClass().getName()); + // headers.put("NTX_ERROR_HANDLER_ExceptionMessage", fault.getCause().getMessage()); + headers.put(CxfConstants.OPERATION_NAME, getOperationName(message)); + try { + addSystemHeaders(message, headers); + } catch (Exception e) { + LOG.info("Unable to add source system information to headers in HandleOutFaultInterceptor"); + } + return headers; + } + + private void addSystemHeaders(SoapMessage message, Map headers) { + Message inMessage = message.getExchange().getInMessage(); + Map> inHeaders = Headers.getSetProtocolHeaders(inMessage); + headers.put(SystemHeadersConstants.HEADER_SYSTEM_NAME, + inHeaders.get(SystemHeadersConstants.HEADER_SYSTEM_NAME).get(0)); + headers.put(SystemHeadersConstants.HEADER_SYSTEM_ID, + inHeaders.get(SystemHeadersConstants.HEADER_SYSTEM_ID).get(0)); + } + + private String getOperationName(SoapMessage message) { + String operation = ""; + try { + operation = message.getExchange().getBindingOperationInfo().getOperationInfo().getName().getLocalPart(); + } catch (Exception e) { + LOG.error(e); + } + LOG.debug("operation name: " + operation); + return operation; + } + + private void sendErrorResponse(Message message, int responseCode, String ret) { + Message outMessage = getOutMessage(message); + outMessage.put(Message.RESPONSE_CODE, responseCode); + // Set the response headers + Map responseHeaders = (Map) outMessage.get(Message.PROTOCOL_HEADERS); + if (responseHeaders != null) { + responseHeaders.clear(); + responseHeaders.put("CAMEL_ERROR", Arrays.asList(ret)); + } + message.getInterceptorChain().abort(); + try { + getConduit(message).prepare(outMessage); + write(outMessage, ret); + } catch (IOException e) { + LOG.warn(e.getMessage(), e); + } + } + + private Message getOutMessage(Message inMessage) { + Exchange exchange = inMessage.getExchange(); + Message outMessage = exchange.getOutMessage(); + if (outMessage == null) { + Endpoint endpoint = exchange.get(Endpoint.class); + outMessage = endpoint.getBinding().createMessage(); + exchange.setOutMessage(outMessage); + } + outMessage.putAll(inMessage); + return outMessage; + } + + private Conduit getConduit(Message inMessage) throws IOException { + Exchange exchange = inMessage.getExchange(); + Conduit conduit = exchange.getDestination().getBackChannel(inMessage); + exchange.setConduit(conduit); + return conduit; + } + + private void write(Message outMessage, String ret) throws IOException { + OutputStream os = outMessage.getContent(OutputStream.class); + os.write(ret.getBytes(StandardCharsets.UTF_8)); + os.flush(); + os.close(); + } +} diff --git a/platform/runtime/core/error-handling/error-handler/src/main/java/ru/entaxy/esb/system/core/common/error/handler/processor/ErrorProcessor.java b/platform/runtime/core/error-handling/error-handler/src/main/java/ru/entaxy/esb/system/core/common/error/handler/processor/ErrorProcessor.java new file mode 100644 index 00000000..5b47674c --- /dev/null +++ b/platform/runtime/core/error-handling/error-handler/src/main/java/ru/entaxy/esb/system/core/common/error/handler/processor/ErrorProcessor.java @@ -0,0 +1,45 @@ +/*- + * ~~~~~~licensing~~~~~~ + * error-handler + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.system.core.common.error.handler.processor; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.ProducerTemplate; + +public class ErrorProcessor implements Processor { + + @Override + public void process(Exchange exchange) throws Exception { + + String body = exchange.getIn().getBody(String.class); + Exception cause = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class); + exchange.getIn().setBody("ErrorProcessor: \n" + cause.getMessage()); + + ProducerTemplate template = exchange.getContext().createProducerTemplate(); +// template.send("xslt:xslt/CreateUniversalErrorPacket.xsl", exchange); + template.send("direct-vm:commonErrorEndpoint", exchange); + } +} diff --git a/platform/runtime/core/error-handling/error-handler/src/main/java/ru/entaxy/esb/system/core/common/error/handler/util/Timestamp.java b/platform/runtime/core/error-handling/error-handler/src/main/java/ru/entaxy/esb/system/core/common/error/handler/util/Timestamp.java new file mode 100644 index 00000000..848b9372 --- /dev/null +++ b/platform/runtime/core/error-handling/error-handler/src/main/java/ru/entaxy/esb/system/core/common/error/handler/util/Timestamp.java @@ -0,0 +1,36 @@ +/*- + * ~~~~~~licensing~~~~~~ + * error-handler + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.system.core.common.error.handler.util; + +public class Timestamp { + public String currentTimeMillis(String body) { + return String.valueOf(System.currentTimeMillis()); + } + + public String unixTime(String body) { + return String.valueOf(System.currentTimeMillis() / 1000L); + } +} diff --git a/platform/runtime/core/error-handling/error-handler/src/main/resources/OSGI-INF/blueprint/common-error-handler-context.xml b/platform/runtime/core/error-handling/error-handler/src/main/resources/OSGI-INF/blueprint/common-error-handler-context.xml new file mode 100644 index 00000000..7041f64a --- /dev/null +++ b/platform/runtime/core/error-handling/error-handler/src/main/resources/OSGI-INF/blueprint/common-error-handler-context.xml @@ -0,0 +1,489 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Oops... some test error occurred]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + + + + + + + ${headers.NTX_ERROR_HANDLER_GenerateResponseEndpoint} != null + + + + ${headers.NTX_ERROR_HANDLER_SYNC_TYPE} == "application/json" + + + + + + + + + + + + + + + + ${properties:error.asynch.stacktrace.show} + + + ${properties:error.synch.stacktrace.show} + + + + ${exception} != null + + ${exception.class.name} + + + ${exception.message} + + + + ${header.NTX_ERROR_HANDLER_asynch_Stacktrace} == "true" || ${header.NTX_ERROR_HANDLER_synch_Stacktrace} == "true" + + + ${exception.stacktrace} + + + + + ${header.NTX_ERROR_HANDLER_SoapFault} != null + + ${header.NTX_ERROR_HANDLER_SoapFault.cause} != null + + ${header.NTX_ERROR_HANDLER_SoapFault.cause} + + + + + ${header.NTX_ERROR_HANDLER_SoapFault.class.name} + + + ${header.NTX_ERROR_HANDLER_SoapFault.message} + + + + ${header.NTX_ERROR_HANDLER_asynch_Stacktrace} == "true" || ${header.NTX_ERROR_HANDLER_synch_Stacktrace} == "true" + + + ${body} + + + + ${body} + + + ${exchangeProperty.bodyHolder} + + + + + + ru.entaxy.esb.system.common.exception.DefaultException + + + Something wrong + + + + + + ${header.NTX_ERROR_HANDLER_ExceptionClass} + + + ${properties:${header.NTX_ERROR_HANDLER_ExceptionClass}} + + + java.lang.Exception + + + ${properties:ru.entaxy.esb.system.common.exception.DefaultException} + + + + + + + + ${properties:error.description.exception_message} == "true" + + ${header.NTX_ERROR_HANDLER_ExceptionMessage} + + + + + ${properties:${header.NTX_ERROR_HANDLER_ResponseCode}} + + + + + + + + + + + + + + + + + + + + java.lang.Exception + + + + + + + + + + ${headers.X-SystemName} != "esb" + + + + java.lang.Exception + + + + + + + + + + + + + + + + esb + + + + + + + + ${bean:uuidGenerator.toString} + + + ВыгрузкаДанныхКаноническийФормат + + + application/xml + + + String + + + xs:string + + + + + + + + ${properties:error.system.name} + + + + + ${headers.ENTAXY_Source} != null && ${headers.ENTAXY_Source} != "" + + + ${headers.ENTAXY_Source} + + + ${headers.ENTAXY_Source} + + + + ${headers.NTX_SystemId} != null && ${headers.NTX_SystemId} != "" + + ${headers.NTX_SystemId} + + + ${headers.NTX_SystemId} + + + + ${headers.X-SystemName} != null && ${headers.X-SystemName} != "" + + ${headers.X-SystemName} + + + ${headers.X-SystemName} + + + + + esb + + + esb + + + + + + ${headers.X-SystemName} == null || ${headers.X-SystemName} == "" + + esb + + + + + + ${headers.X-SystemId} == null || ${headers.X-SystemId} == "" + + -1 + + + + + + ${properties:error.bus.always_at_source} == "true" + + esb + + + esb + + + -1 + + + + + + ${bean:uuidGenerator.toString} + + + + ${bean:timestamp?method=currentTimeMillis} + + + ${headers.NTX_ERROR_HANDLER_SeverityLevel} == null + + ERROR + + + + + + + + ]]> + + + + + ${headers.operationName} && ${headers.operationName.length()} > 0 + + + + java.lang.Exception + + + + + + + + + + + + + + + + ${headers.operationName} + + + + + java.lang.Exception + + + + + + + + + + + + + + + + + + java.lang.Exception + + + + + ${body} + + + ${null} + + + + + + + diff --git a/platform/runtime/core/error-handling/error-handler/src/main/resources/ftl/DefaultResponse.ftl b/platform/runtime/core/error-handling/error-handler/src/main/resources/ftl/DefaultResponse.ftl new file mode 100644 index 00000000..ed73d926 --- /dev/null +++ b/platform/runtime/core/error-handling/error-handler/src/main/resources/ftl/DefaultResponse.ftl @@ -0,0 +1,48 @@ +[#-- + + ~~~~~~licensing~~~~~~ + error-handler + ========== + Copyright (C) 2020 - 2025 EmDev LLC + ========== + You may not use this file except in accordance with the License Terms of + the Copyright + Holder located at: https://entaxy.ru/eula . All copyrights, all + intellectual property + rights to the Software and any copies are the property of the Copyright + Holder. Unless + it is explicitly allowed the Copyright Holder, the User is prohibited + from using the + Software for commercial purposes to provide services to third parties. + + The Copyright Holder hereby declares that the Software is provided on an + "AS IS". + Under no circumstances does the Copyright Holder guarantee or promise + that the + Software provided by him will be suitable or not suitable for the + specific purposes + of the User, that the Software will meet all commercial and personal + subjective + expectations of the User, that the Software will work properly, without + technical + errors, quickly and uninterruptedly. + + Under no circumstances shall the Copyright Holder or its Affiliates is + not liable + to the User for any direct or indirect losses of the User, his expenses + or actual + damage, including, downtime; loss of business; lost profit; lost + earnings; loss + or damage to data, property, etc. + ~~~~~~/licensing~~~~~~ + +--] +{ + "status" : "[=headers.NTX_ERROR_HANDLER_ResponseCode]" +[#if headers.NTX_ERROR_HANDLER_ResponseText?has_content] + , "description" : "[=headers.NTX_ERROR_HANDLER_ResponseText]" +[/#if] +[#if headers.NTX_ERROR_HANDLER_synch_Stacktrace == "true" && headers.NTX_ERROR_HANDLER_Stacktrace?has_content] + , "stacktrace" : "[=headers.NTX_ERROR_HANDLER_Stacktrace]" +[/#if] +} \ No newline at end of file diff --git a/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/DefaultResponse.xsl b/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/DefaultResponse.xsl new file mode 100644 index 00000000..e63e7b3f --- /dev/null +++ b/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/DefaultResponse.xsl @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/UniversalErrorPacket.xsl b/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/UniversalErrorPacket.xsl new file mode 100644 index 00000000..fa341305 --- /dev/null +++ b/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/UniversalErrorPacket.xsl @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ http://www.entaxy.ru/ServiceInterface/1.0 + 2020-05-20T07:19:59 + 1 +
+ + <Справочник.События> + <КлючевыеСвойства> + <Ссылка> + + + + + + + + + + + + + + + + + + + + Packet.Validation + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
diff --git a/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/WrapSoapEnvelope.xsl b/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/WrapSoapEnvelope.xsl new file mode 100644 index 00000000..4cc549ca --- /dev/null +++ b/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/WrapSoapEnvelope.xsl @@ -0,0 +1,37 @@ + + + + + + + + + + + + + diff --git a/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/operation/ConfirmGettingPackets.xsl b/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/operation/ConfirmGettingPackets.xsl new file mode 100644 index 00000000..a38952ef --- /dev/null +++ b/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/operation/ConfirmGettingPackets.xsl @@ -0,0 +1,36 @@ + + + + + + + + + diff --git a/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/operation/GetPackets.xsl b/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/operation/GetPackets.xsl new file mode 100644 index 00000000..a38952ef --- /dev/null +++ b/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/operation/GetPackets.xsl @@ -0,0 +1,36 @@ + + + + + + + + + diff --git a/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/operation/PutPackets.xsl b/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/operation/PutPackets.xsl new file mode 100644 index 00000000..a38952ef --- /dev/null +++ b/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/operation/PutPackets.xsl @@ -0,0 +1,36 @@ + + + + + + + + + diff --git a/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/operation/sendAcknowledge.xsl b/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/operation/sendAcknowledge.xsl new file mode 100644 index 00000000..00aed8f9 --- /dev/null +++ b/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/operation/sendAcknowledge.xsl @@ -0,0 +1,30 @@ + + + + + + diff --git a/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/operation/sendToJMS.xsl b/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/operation/sendToJMS.xsl new file mode 100644 index 00000000..00aed8f9 --- /dev/null +++ b/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/operation/sendToJMS.xsl @@ -0,0 +1,30 @@ + + + + + + diff --git a/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/operation/type/response.xsl b/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/operation/type/response.xsl new file mode 100644 index 00000000..f7f9c459 --- /dev/null +++ b/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/operation/type/response.xsl @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/soapWrap.xsl b/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/soapWrap.xsl new file mode 100644 index 00000000..f653c56a --- /dev/null +++ b/platform/runtime/core/error-handling/error-handler/src/main/resources/xslt/soapWrap.xsl @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + diff --git a/platform/runtime/core/error-handling/pom.xml b/platform/runtime/core/error-handling/pom.xml new file mode 100644 index 00000000..290d8dc4 --- /dev/null +++ b/platform/runtime/core/error-handling/pom.xml @@ -0,0 +1,18 @@ + + 4.0.0 + + ru.entaxy.esb.platform.runtime + core + 1.11.0 + + ru.entaxy.platform.core + error-handling + pom + ENTAXY :: PLATFORM :: CORE :: ERROR HANDLING + ENTAXY :: PLATFORM :: CORE :: ERROR HANDLING + + + error-handler + + + diff --git a/platform/runtime/core/infrastructure/file-upload/LICENSE.txt b/platform/runtime/core/infrastructure/file-upload/LICENSE.txt new file mode 100644 index 00000000..4ae94b75 --- /dev/null +++ b/platform/runtime/core/infrastructure/file-upload/LICENSE.txt @@ -0,0 +1,175 @@ + ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ + +Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой) +версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего +Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН +7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова, +д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу +https://www.emdev.ru/about (далее - Компания). + +Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями» +(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения, +Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в +настоящем документе, в противном случае, он должен не использовать или не получать доступ +к Программному обеспечению. + + 1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ + +a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии +или редакции, исключительные права на которую принадлежат Правообладателю. +b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные +права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ +для ЭВМ № 2021610848 от 19.01.2021 года. +c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта +https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО. +d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также +личные неимущественные права авторов произведений на результат интеллектуальной деятельности. +e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование +ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка +включает предоставление Пользователю неисключительного права использования ПО, в том числе +получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение +патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается +Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается +для каждого Пользователя индивидуально в Сертификате. +f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром), +подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное +обеспечение в ограниченном объёме и на определённый период времени. +g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО, +предоставленных Пользователю согласно условиям Подписки. +h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного +обеспечения. +i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий +из одного или нескольких файлов, который может быть прочтён человеком. +j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля +программы, полученный в результате обработки исходного кода, еще не связанный в полную программу. +Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый +продукт. +k) Некоммерческое использование – индивидуальное личное использование Пользователем программного +обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации +возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая +выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения. + + 2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ + +2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного +обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом +воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения +в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ. +2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит +неисключительный характер. +2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию, +лицензия на ограниченное использование Программного обеспечения. +2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования +имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан +обратиться в службу поддержки Правообладателя по адресу: https://entaxy.ru/ для изменения +вида лицензии с Базовой бесплатной версии на Подписки. +2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для +пробного использования программного обеспечения – не ограничен. +2.6. Использование Пользователем настоящего программного обеспечения в целях разработки, +модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю, +без разрешения Правообладателя не допускается. + + 3. АВТОРСКОЕ ПРАВО. + +3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение +и любые его копии принадлежат Правообладателю. +3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента, +к которому можно получить доступ с помощью Программного обеспечения, является собственностью +соответствующего владельца контента и защищается применимым законодательством об авторском +праве или другими законами и договорами об интеллектуальной собственности. +3.3. Условия использования Программного обеспечения. +Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь +придерживается следующих условий: +3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять +какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании +Программного обеспечения или на нем. +3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать, +расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать +Программное обеспечение. +3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования +ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне. +3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено +использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам. + + 4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС» + +4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю +на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с +использованием Пользователем: +4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в +Программное обеспечение; +4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями +настоящего соглашения; +4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием, +или данными, не предоставленными Пользователю Правообладателем; +4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем. + + +5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ +ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ +И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ +ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ +И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ +ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО. + + 6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ. +НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ +ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ, +ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ; +ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ. +ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ +ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ; +КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ +ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ. + + 7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ: +Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия +(включая, но не ограничиваясь) по: +-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код) + Программного обеспечения; +-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный +код Программного обеспечения, за исключением тех изменений, которые вносятся средствами, +включёнными в Программное обеспечение и описанными непосредственно в документации к нему; +-созданию условий для использования Программного обеспечения лицами, не имеющими прав на +использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство +третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа +к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку; +-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию). + + 8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА. + +8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из +лицензионных продуктов, используемых на законных основаниях, а +именно https://entaxy.ru/libs/licenses/root-aggregated.deps. +8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть +совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения. +8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться +Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения, +содержащих все изменения и дополнения программного обеспечения. + + 9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ. + +9.1. Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым +программным обеспечением. +9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно +с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм +«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public. +9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий +пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя, +прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер +ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства +Российской Федерации. + + 10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ. + +10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет +право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб, +недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий +пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере +2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения +исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy). +10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое +законодательство – Российской Федерации. +10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным, +остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать +исполнять свои обязанности в соответствии с этими положениями. diff --git a/platform/runtime/core/infrastructure/file-upload/pom.xml b/platform/runtime/core/infrastructure/file-upload/pom.xml new file mode 100644 index 00000000..091e2375 --- /dev/null +++ b/platform/runtime/core/infrastructure/file-upload/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + + + ru.entaxy.esb.platform.runtime.core + infrastructure + 1.11.0 + + + ru.entaxy.platform.core.infrastructure + file-upload + bundle + + ENTAXY :: CORE :: INFRASTRUCTURE :: FILE UPLOAD + ENTAXY :: CORE :: INFRASTRUCTURE :: FILE UPLOAD + + + + org.apache.cxf.jaxrs.impl, + org.apache.camel.component.cxf.jaxrs.blueprint, + org.apache.camel.component.cxf.blueprint, + * + + + + + + + org.apache.camel + camel-cxf + + + + org.osgi + org.osgi.service.component.annotations + + + ru.entaxy.esb.platform.runtime.base + base-support + ${project.version} + + + ru.entaxy.esb.platform.runtime.base.resources + resources-api + ${project.version} + + + + diff --git a/platform/runtime/core/infrastructure/file-upload/src/main/java/ru/entaxy/esb/system/management/file/upload/FileUploadProcessor.java b/platform/runtime/core/infrastructure/file-upload/src/main/java/ru/entaxy/esb/system/management/file/upload/FileUploadProcessor.java new file mode 100644 index 00000000..1f171dc4 --- /dev/null +++ b/platform/runtime/core/infrastructure/file-upload/src/main/java/ru/entaxy/esb/system/management/file/upload/FileUploadProcessor.java @@ -0,0 +1,79 @@ +/*- + * ~~~~~~licensing~~~~~~ + * file-upload + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.system.management.file.upload; +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.cxf.jaxrs.ext.multipart.Attachment; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ru.entaxy.esb.resources.EntaxyResource; +import ru.entaxy.esb.resources.EntaxyResourceService; + +import javax.activation.DataHandler; +import javax.ws.rs.core.MultivaluedMap; +import java.io.InputStream; + +public class FileUploadProcessor implements Processor { + + private static final Logger log = LoggerFactory.getLogger(FileUploadProcessor.class); + + private EntaxyResourceService entaxyResourceService; + + public void setEntaxyResourceService(EntaxyResourceService entaxyResourceService) { + this.entaxyResourceService = entaxyResourceService; + } + + @Override + public void process(Exchange exchange) throws Exception { + Attachment attachment = exchange.getIn().getBody(Attachment.class); + DataHandler dataHandler = attachment.getDataHandler(); + + InputStream inputStream = null; + EntaxyResource entaxyResource = null; + + try { + MultivaluedMap map = attachment.getHeaders(); + + inputStream = dataHandler.getInputStream(); + + String protocol = (String) exchange.getIn().getHeader("protocol"); + String path = (String) exchange.getIn().getHeader("path"); + String location = protocol + ":" + path; + + entaxyResource = entaxyResourceService.getResource(location); + + /* For now we allow resource reloading */ + // if (!entaxyResource.exists()) { + entaxyResource.save(inputStream); + // } + } catch (Exception e) { + log.error("Error while uploading file: " + e.getMessage()); + } finally { + inputStream.close(); + } + exchange.getMessage().setBody(entaxyResource.getName()); + } +} diff --git a/platform/runtime/core/infrastructure/file-upload/src/main/java/ru/entaxy/esb/system/management/file/upload/FileUploadService.java b/platform/runtime/core/infrastructure/file-upload/src/main/java/ru/entaxy/esb/system/management/file/upload/FileUploadService.java new file mode 100644 index 00000000..89b1bd38 --- /dev/null +++ b/platform/runtime/core/infrastructure/file-upload/src/main/java/ru/entaxy/esb/system/management/file/upload/FileUploadService.java @@ -0,0 +1,52 @@ +/*- + * ~~~~~~licensing~~~~~~ + * file-upload + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.system.management.file.upload; + +import org.apache.cxf.jaxrs.ext.multipart.Attachment; +import org.apache.cxf.jaxrs.ext.multipart.Multipart; + +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; + +@Path("/") +public interface FileUploadService { + + @POST + @Path("/upload/file") + @Consumes(MediaType.MULTIPART_FORM_DATA) + @Produces(MediaType.TEXT_PLAIN) + public String uploadFile(Attachment attachment); + + @POST + @Path("/upload/resource") + @Consumes(MediaType.MULTIPART_FORM_DATA) + @Produces(MediaType.TEXT_PLAIN) + public String uploadResource( + @Multipart(value = "protocol") String protocol, + @Multipart(value = "path") String path, + @Multipart(value = "file") Attachment attachment + ); +} diff --git a/platform/runtime/core/infrastructure/file-upload/src/main/java/ru/entaxy/esb/system/management/file/upload/FileUploadServiceImpl.java b/platform/runtime/core/infrastructure/file-upload/src/main/java/ru/entaxy/esb/system/management/file/upload/FileUploadServiceImpl.java new file mode 100644 index 00000000..4b54f033 --- /dev/null +++ b/platform/runtime/core/infrastructure/file-upload/src/main/java/ru/entaxy/esb/system/management/file/upload/FileUploadServiceImpl.java @@ -0,0 +1,44 @@ +/*- + * ~~~~~~licensing~~~~~~ + * file-upload + * ========== + * Copyright (C) 2020 - 2025 EmDev LLC + * ========== + * You may not use this file except in accordance with the License Terms of the Copyright + * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property + * rights to the Software and any copies are the property of the Copyright Holder. Unless + * it is explicitly allowed the Copyright Holder, the User is prohibited from using the + * Software for commercial purposes to provide services to third parties. + * + * The Copyright Holder hereby declares that the Software is provided on an "AS IS". + * Under no circumstances does the Copyright Holder guarantee or promise that the + * Software provided by him will be suitable or not suitable for the specific purposes + * of the User, that the Software will meet all commercial and personal subjective + * expectations of the User, that the Software will work properly, without technical + * errors, quickly and uninterruptedly. + * + * Under no circumstances shall the Copyright Holder or its Affiliates is not liable + * to the User for any direct or indirect losses of the User, his expenses or actual + * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss + * or damage to data, property, etc. + * ~~~~~~/licensing~~~~~~ + */ +package ru.entaxy.esb.system.management.file.upload; + +import org.apache.cxf.jaxrs.ext.multipart.Attachment; +import org.apache.cxf.jaxrs.ext.multipart.Multipart; + +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; + +@Path("/") +public class FileUploadServiceImpl { + + @POST + @Path("/post") + @Consumes(MediaType.MULTIPART_FORM_DATA) + @Produces(MediaType.TEXT_PLAIN) + public String uploadFile(@Multipart(value = "file") Attachment attachment) { + return "I got it"; + }; +} diff --git a/platform/runtime/core/infrastructure/file-upload/src/main/resources/OSGI-INF/blueprint/camel-context.xml b/platform/runtime/core/infrastructure/file-upload/src/main/resources/OSGI-INF/blueprint/camel-context.xml new file mode 100644 index 00000000..00e450c8 --- /dev/null +++ b/platform/runtime/core/infrastructure/file-upload/src/main/resources/OSGI-INF/blueprint/camel-context.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/platform/runtime/core/infrastructure/pom.xml b/platform/runtime/core/infrastructure/pom.xml index a34f8aec..83464c75 100644 --- a/platform/runtime/core/infrastructure/pom.xml +++ b/platform/runtime/core/infrastructure/pom.xml @@ -5,7 +5,7 @@ ru.entaxy.esb.platform.runtime core - 1.10.0 + 1.11.0 ru.entaxy.esb.platform.runtime.core diff --git a/platform/runtime/core/infrastructure/schema/pom.xml b/platform/runtime/core/infrastructure/schema/pom.xml index 0c3160d8..6076b694 100644 --- a/platform/runtime/core/infrastructure/schema/pom.xml +++ b/platform/runtime/core/infrastructure/schema/pom.xml @@ -3,7 +3,7 @@ ru.entaxy.esb.platform.runtime.core infrastructure - 1.10.0 + 1.11.0 4.0.0 pom diff --git a/platform/runtime/core/infrastructure/schema/schema-api/pom.xml b/platform/runtime/core/infrastructure/schema/schema-api/pom.xml index 9e232796..8ee67d9f 100644 --- a/platform/runtime/core/infrastructure/schema/schema-api/pom.xml +++ b/platform/runtime/core/infrastructure/schema/schema-api/pom.xml @@ -3,7 +3,7 @@ ru.entaxy.esb.platform.runtime.core.infrastructure schema - 1.10.0 + 1.11.0 4.0.0 diff --git a/platform/runtime/core/infrastructure/schema/schema-api/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/api/ResourceService.java b/platform/runtime/core/infrastructure/schema/schema-api/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/api/ResourceService.java index 0107a3d5..f02f9cb2 100644 --- a/platform/runtime/core/infrastructure/schema/schema-api/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/api/ResourceService.java +++ b/platform/runtime/core/infrastructure/schema/schema-api/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/api/ResourceService.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * schema-api * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/infrastructure/schema/schema-api/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/api/entity/Resource.java b/platform/runtime/core/infrastructure/schema/schema-api/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/api/entity/Resource.java index 8d61b2b6..63b48f68 100644 --- a/platform/runtime/core/infrastructure/schema/schema-api/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/api/entity/Resource.java +++ b/platform/runtime/core/infrastructure/schema/schema-api/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/api/entity/Resource.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * schema-api * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/infrastructure/schema/schema-api/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/api/entity/ResourceInfo.java b/platform/runtime/core/infrastructure/schema/schema-api/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/api/entity/ResourceInfo.java index d3f3ffb9..97540469 100644 --- a/platform/runtime/core/infrastructure/schema/schema-api/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/api/entity/ResourceInfo.java +++ b/platform/runtime/core/infrastructure/schema/schema-api/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/api/entity/ResourceInfo.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * schema-api * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/infrastructure/schema/schema-component/pom.xml b/platform/runtime/core/infrastructure/schema/schema-component/pom.xml index b7d187f2..44c74921 100644 --- a/platform/runtime/core/infrastructure/schema/schema-component/pom.xml +++ b/platform/runtime/core/infrastructure/schema/schema-component/pom.xml @@ -3,7 +3,7 @@ ru.entaxy.esb.platform.runtime.core.infrastructure schema - 1.10.0 + 1.11.0 4.0.0 diff --git a/platform/runtime/core/infrastructure/schema/schema-component/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/component/ValidatingProcessor.java b/platform/runtime/core/infrastructure/schema/schema-component/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/component/ValidatingProcessor.java index 4eeb3dd7..95c4065c 100644 --- a/platform/runtime/core/infrastructure/schema/schema-component/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/component/ValidatingProcessor.java +++ b/platform/runtime/core/infrastructure/schema/schema-component/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/component/ValidatingProcessor.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * schema-component * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/infrastructure/schema/schema-component/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/component/ValidatorWithDBStorageComponent.java b/platform/runtime/core/infrastructure/schema/schema-component/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/component/ValidatorWithDBStorageComponent.java index f69e168f..23077c23 100644 --- a/platform/runtime/core/infrastructure/schema/schema-component/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/component/ValidatorWithDBStorageComponent.java +++ b/platform/runtime/core/infrastructure/schema/schema-component/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/component/ValidatorWithDBStorageComponent.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * schema-component * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/infrastructure/schema/schema-component/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/component/ValidatorWithDBStorageEndpoint.java b/platform/runtime/core/infrastructure/schema/schema-component/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/component/ValidatorWithDBStorageEndpoint.java index b030cbfc..1cd72ce6 100644 --- a/platform/runtime/core/infrastructure/schema/schema-component/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/component/ValidatorWithDBStorageEndpoint.java +++ b/platform/runtime/core/infrastructure/schema/schema-component/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/component/ValidatorWithDBStorageEndpoint.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * schema-component * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/infrastructure/schema/schema-component/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/component/ValidatorWithDBStorageProducer.java b/platform/runtime/core/infrastructure/schema/schema-component/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/component/ValidatorWithDBStorageProducer.java index e65e9e21..834e6fcc 100644 --- a/platform/runtime/core/infrastructure/schema/schema-component/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/component/ValidatorWithDBStorageProducer.java +++ b/platform/runtime/core/infrastructure/schema/schema-component/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/component/ValidatorWithDBStorageProducer.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * schema-component * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/infrastructure/schema/schema-component/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/component/exception/SchemaNotFoundException.java b/platform/runtime/core/infrastructure/schema/schema-component/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/component/exception/SchemaNotFoundException.java index 26986758..01da0d91 100644 --- a/platform/runtime/core/infrastructure/schema/schema-component/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/component/exception/SchemaNotFoundException.java +++ b/platform/runtime/core/infrastructure/schema/schema-component/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/component/exception/SchemaNotFoundException.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * schema-component * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/infrastructure/schema/schema-component/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/component/util/SchemaReaderFromDB.java b/platform/runtime/core/infrastructure/schema/schema-component/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/component/util/SchemaReaderFromDB.java index 783779a1..ad7919a2 100644 --- a/platform/runtime/core/infrastructure/schema/schema-component/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/component/util/SchemaReaderFromDB.java +++ b/platform/runtime/core/infrastructure/schema/schema-component/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/component/util/SchemaReaderFromDB.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * schema-component * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/infrastructure/schema/schema-component/src/main/resources/log4j2.properties b/platform/runtime/core/infrastructure/schema/schema-component/src/main/resources/log4j2.properties index 916ef685..6c62baa2 100644 --- a/platform/runtime/core/infrastructure/schema/schema-component/src/main/resources/log4j2.properties +++ b/platform/runtime/core/infrastructure/schema/schema-component/src/main/resources/log4j2.properties @@ -2,7 +2,7 @@ # ~~~~~~licensing~~~~~~ # schema-component # ========== -# Copyright (C) 2020 - 2024 EmDev LLC +# Copyright (C) 2020 - 2025 EmDev LLC # ========== # You may not use this file except in accordance with the License Terms of the Copyright # Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/infrastructure/schema/schema-impl/pom.xml b/platform/runtime/core/infrastructure/schema/schema-impl/pom.xml index f473e46c..d87c59fc 100644 --- a/platform/runtime/core/infrastructure/schema/schema-impl/pom.xml +++ b/platform/runtime/core/infrastructure/schema/schema-impl/pom.xml @@ -4,7 +4,7 @@ ru.entaxy.esb.platform.runtime.core.infrastructure schema - 1.10.0 + 1.11.0 4.0.0 diff --git a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/exception/ResourceInfoNotFound.java b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/exception/ResourceInfoNotFound.java index bd1303c3..3c8d035d 100644 --- a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/exception/ResourceInfoNotFound.java +++ b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/exception/ResourceInfoNotFound.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * schema-impl * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/exception/ResourceNotFound.java b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/exception/ResourceNotFound.java index 075297e3..fcb1562c 100644 --- a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/exception/ResourceNotFound.java +++ b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/exception/ResourceNotFound.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * schema-impl * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/impl/OpenApiResourceMetadata.java b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/impl/OpenApiResourceMetadata.java index ba4b7496..cf3d2149 100644 --- a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/impl/OpenApiResourceMetadata.java +++ b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/impl/OpenApiResourceMetadata.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * schema-impl * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property diff --git a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/impl/OpenApiResourceProcessor.java b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/impl/OpenApiResourceProcessor.java index 6b1094d9..a8f163ac 100644 --- a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/impl/OpenApiResourceProcessor.java +++ b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/impl/OpenApiResourceProcessor.java @@ -2,7 +2,7 @@ * ~~~~~~licensing~~~~~~ * schema-impl * ========== - * Copyright (C) 2020 - 2024 EmDev LLC + * Copyright (C) 2020 - 2025 EmDev LLC * ========== * You may not use this file except in accordance with the License Terms of the Copyright * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property @@ -30,9 +30,19 @@ import java.io.IOException; import java.io.InputStream; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.*; -import java.util.stream.Collectors; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; import java.util.Map.Entry; +import java.util.Set; +import java.util.UUID; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; @@ -50,12 +60,13 @@ import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.PathItem; import io.swagger.v3.oas.models.PathItem.HttpMethod; +import io.swagger.v3.oas.models.parameters.RequestBody; import ru.entaxy.esb.platform.runtime.base.connecting.generator.Generated; import ru.entaxy.esb.resources.EntaxyResource; import ru.entaxy.esb.resources.EntaxyResource.RESOURCE_SCOPE; import ru.entaxy.esb.resources.EntaxyResourceMetadata; -import ru.entaxy.esb.resources.EntaxyResourceProcessor; import ru.entaxy.esb.resources.EntaxyResourceMetadata.MetadataSection; +import ru.entaxy.esb.resources.EntaxyResourceProcessor; import ru.entaxy.platform.base.objects.EntaxyObject; import ru.entaxy.platform.base.support.CommonUtils; import ru.entaxy.platform.base.support.JSONUtils; @@ -194,7 +205,8 @@ public class OpenApiResourceProcessor implements EntaxyResourceProcessor { if (!generationResult.isFinished() && generationResult.isCurrentPhaseOk()) { OpenAPI api = (OpenAPI)generationResult.properties.get("api"); generationResult.generator.setApiTitleConverted( - api.getInfo().getTitle().replace(' ', '_').replace('-', '_').replace('.', '_') + api.getInfo().getTitle().replace(' ', '_').replace('-', '_') + .replace('.', '_').replaceAll("\\(|\\)", "_") .toLowerCase()); generationResult.generator.setApiVersionConverted( api.getInfo().getVersion().replace('.', '_')); @@ -253,6 +265,28 @@ public class OpenApiResourceProcessor implements EntaxyResourceProcessor { if (oper.getValue().getOperationId() == null) { operation = entry.getKey() + "/" + oper.getKey().name().toLowerCase(); } + String path = entry.getKey(); + String parameter; + boolean pathParameterized = false; + JsonArray pathParameters = new JsonArray(); + Pattern p = Pattern.compile("^(?
.*)\\{(?[^\\.]+)\\}(?.*)$");
+			        Matcher m = p.matcher(path);
+			        while (m.find()) {
+			            parameter = "NTX_CLIENT_" + m.group("param");
+			            path = m.group("pre") + "${exchangeProperty." + parameter + "}" + m.group("tail");
+			            m = p.matcher(path);
+			            pathParameterized = true;
+			            pathParameters.add(parameter);
+			        }
+			        operationId.add("pathParameters", pathParameters);
+			        operationId.addProperty("pathParameterized", pathParameterized);
+			        operationId.addProperty("pathProcessed", path);
+					
+					RequestBody requestBody = oper.getValue().getRequestBody();
+					if (requestBody != null &&
+					        requestBody.getContent() != null && requestBody.getContent().size() > 0) {
+					    operationId.addProperty("contentType", requestBody.getContent().keySet().stream().findFirst().get());
+					}
 					operationId.addProperty("original", oper.getValue().getOperationId());
 					operationId.addProperty("operationIdCamelCase", toCamelCase(operation));
 					pathData.add(oper.getKey().name(), operationId);
diff --git a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/impl/ResourceServiceImpl.java b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/impl/ResourceServiceImpl.java
index fa2b1dc2..374ddcca 100644
--- a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/impl/ResourceServiceImpl.java
+++ b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/impl/ResourceServiceImpl.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * schema-impl
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/impl/ServiceHelper.java b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/impl/ServiceHelper.java
index 6dfba350..c69e2d32 100644
--- a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/impl/ServiceHelper.java
+++ b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/impl/ServiceHelper.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * schema-impl
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/impl/WSDLResourceMetadata.java b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/impl/WSDLResourceMetadata.java
index 0b30a865..e1b67f3f 100644
--- a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/impl/WSDLResourceMetadata.java
+++ b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/impl/WSDLResourceMetadata.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * schema-impl
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/impl/WSDLResourceProcessor.java b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/impl/WSDLResourceProcessor.java
index 6270a714..e74fea30 100644
--- a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/impl/WSDLResourceProcessor.java
+++ b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/impl/WSDLResourceProcessor.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * schema-impl
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
@@ -240,7 +240,7 @@ public class WSDLResourceProcessor implements EntaxyResourceProcessor {
 		@Override
 		public void execute() {
 			
-			log.info("\n\t ****** RUNNING EXECUTION \n[{}]\ninstructions: {}", currentObject, instructions);
+			log.debug("\n\t ****** RUNNING EXECUTION \n[{}]\ninstructions: {}", currentObject, instructions);
 			
 			ProducerResult result = ServiceHelper.getInstance().getEntaxyProducerService()
 					.produce(currentObject, instructions);
diff --git a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/resolver/resource/CxfDBResourceResolver.java b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/resolver/resource/CxfDBResourceResolver.java
index 582a3192..9f13fadb 100644
--- a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/resolver/resource/CxfDBResourceResolver.java
+++ b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/resolver/resource/CxfDBResourceResolver.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * schema-impl
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/resolver/resource/DBResolverSettings.java b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/resolver/resource/DBResolverSettings.java
index c16a0b1d..d48b6941 100644
--- a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/resolver/resource/DBResolverSettings.java
+++ b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/resolver/resource/DBResolverSettings.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * schema-impl
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/resolver/resource/DBResourceResolver.java b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/resolver/resource/DBResourceResolver.java
index 1f134f84..6907fbac 100644
--- a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/resolver/resource/DBResourceResolver.java
+++ b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/resolver/resource/DBResourceResolver.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * schema-impl
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/resolver/resource/ResourceLoader.java b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/resolver/resource/ResourceLoader.java
index e1219297..5c77dfcb 100644
--- a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/resolver/resource/ResourceLoader.java
+++ b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/resolver/resource/ResourceLoader.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * schema-impl
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/resolver/resource/ResourceRegistryURLResolver.java b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/resolver/resource/ResourceRegistryURLResolver.java
index 81e59ff3..d2cfef4c 100644
--- a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/resolver/resource/ResourceRegistryURLResolver.java
+++ b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/resolver/resource/ResourceRegistryURLResolver.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * schema-impl
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/resolver/resource/SchemaRegistryHelper.java b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/resolver/resource/SchemaRegistryHelper.java
index b650d960..4040e455 100644
--- a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/resolver/resource/SchemaRegistryHelper.java
+++ b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/resolver/resource/SchemaRegistryHelper.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * schema-impl
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/resources/OSGI-INF/blueprint/blueprint.xml
index d04f5fc7..5b2a4c08 100644
--- a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/resources/OSGI-INF/blueprint/blueprint.xml
+++ b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/resources/OSGI-INF/blueprint/blueprint.xml
@@ -3,7 +3,7 @@
   ~~~~~~licensing~~~~~~
   schema-impl
   ==========
-  Copyright (C) 2020 - 2024 EmDev LLC
+  Copyright (C) 2020 - 2025 EmDev LLC
   ==========
   You may not use this file except in accordance with the License Terms of the Copyright
   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/resources/hibernate.cfg.xml b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/resources/hibernate.cfg.xml
index d2f85347..a8829147 100644
--- a/platform/runtime/core/infrastructure/schema/schema-impl/src/main/resources/hibernate.cfg.xml
+++ b/platform/runtime/core/infrastructure/schema/schema-impl/src/main/resources/hibernate.cfg.xml
@@ -3,7 +3,7 @@
   ~~~~~~licensing~~~~~~
   schema-impl
   ==========
-  Copyright (C) 2020 - 2024 EmDev LLC
+  Copyright (C) 2020 - 2025 EmDev LLC
   ==========
   You may not use this file except in accordance with the License Terms of the Copyright
   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-soap/pom.xml b/platform/runtime/core/infrastructure/schema/schema-soap/pom.xml
index 75c61ca5..72ad6cca 100644
--- a/platform/runtime/core/infrastructure/schema/schema-soap/pom.xml
+++ b/platform/runtime/core/infrastructure/schema/schema-soap/pom.xml
@@ -3,7 +3,7 @@
     
         ru.entaxy.esb.platform.runtime.core.infrastructure
         schema
-        1.10.0
+        1.11.0
     
     4.0.0
 
diff --git a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/RegistrySchemaServiceImpl.java b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/RegistrySchemaServiceImpl.java
index f07349fb..ed6345ec 100644
--- a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/RegistrySchemaServiceImpl.java
+++ b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/RegistrySchemaServiceImpl.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * schema-soap
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/EditedResourceInfoFullType.java b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/EditedResourceInfoFullType.java
index 9b8a3238..01749c25 100644
--- a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/EditedResourceInfoFullType.java
+++ b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/EditedResourceInfoFullType.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * schema-soap
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/FullResourceType.java b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/FullResourceType.java
index 98995864..8563f773 100644
--- a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/FullResourceType.java
+++ b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/FullResourceType.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * schema-soap
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/GetResourceInfoList.java b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/GetResourceInfoList.java
index a29e73d4..470ddc56 100644
--- a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/GetResourceInfoList.java
+++ b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/GetResourceInfoList.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * schema-soap
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/GetResourceInfoListByFullNameRequest.java b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/GetResourceInfoListByFullNameRequest.java
index 0f873523..29120629 100644
--- a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/GetResourceInfoListByFullNameRequest.java
+++ b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/GetResourceInfoListByFullNameRequest.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * schema-soap
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/GetResourceInfoListByFullPathRequest.java b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/GetResourceInfoListByFullPathRequest.java
index 58b4e2d3..fc95c886 100644
--- a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/GetResourceInfoListByFullPathRequest.java
+++ b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/GetResourceInfoListByFullPathRequest.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * schema-soap
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/GetResourceInfoListByNameRequest.java b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/GetResourceInfoListByNameRequest.java
index dd791495..bd15e7e9 100644
--- a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/GetResourceInfoListByNameRequest.java
+++ b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/GetResourceInfoListByNameRequest.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * schema-soap
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/GetResourceInfoListByNamespaceRequest.java b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/GetResourceInfoListByNamespaceRequest.java
index 4d5508e9..5a41055a 100644
--- a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/GetResourceInfoListByNamespaceRequest.java
+++ b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/GetResourceInfoListByNamespaceRequest.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * schema-soap
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/GetResourceInfoListByPathRequest.java b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/GetResourceInfoListByPathRequest.java
index 8c7beb03..52bfa9af 100644
--- a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/GetResourceInfoListByPathRequest.java
+++ b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/GetResourceInfoListByPathRequest.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * schema-soap
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/GetResourceInfoListRequest.java b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/GetResourceInfoListRequest.java
index ec0e3f58..53c267bf 100644
--- a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/GetResourceInfoListRequest.java
+++ b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/GetResourceInfoListRequest.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * schema-soap
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/LoadResourceType.java b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/LoadResourceType.java
index a13b457f..d8e06f67 100644
--- a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/LoadResourceType.java
+++ b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/LoadResourceType.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * schema-soap
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/ObjectFactory.java b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/ObjectFactory.java
index 8f3069bb..fd20aa31 100644
--- a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/ObjectFactory.java
+++ b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/ObjectFactory.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * schema-soap
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/RegistrySchemaService.java b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/RegistrySchemaService.java
index a5a06d79..36ba6580 100644
--- a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/RegistrySchemaService.java
+++ b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/RegistrySchemaService.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * schema-soap
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/RegistrySchemaService_Service.java b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/RegistrySchemaService_Service.java
index 88ff306f..fd1a3fa5 100644
--- a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/RegistrySchemaService_Service.java
+++ b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/RegistrySchemaService_Service.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * schema-soap
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/ResourceInfoFullType.java b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/ResourceInfoFullType.java
index a07bd622..1d3cbadc 100644
--- a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/ResourceInfoFullType.java
+++ b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/ResourceInfoFullType.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * schema-soap
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/ResourceInfoType.java b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/ResourceInfoType.java
index f940d885..31a67954 100644
--- a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/ResourceInfoType.java
+++ b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/ResourceInfoType.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * schema-soap
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/ResourceType.java b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/ResourceType.java
index 03fad1c9..2f905821 100644
--- a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/ResourceType.java
+++ b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/ResourceType.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * schema-soap
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/package-info.java b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/package-info.java
index 9b1f67c7..2ff58b83 100644
--- a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/package-info.java
+++ b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/cxf/package-info.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * schema-soap
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/mapper/ResourceMapper.java b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/mapper/ResourceMapper.java
index 9429461b..117494f3 100644
--- a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/mapper/ResourceMapper.java
+++ b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/java/ru/entaxy/esb/platform/runtime/core/infrastructure/schema/soap/mapper/ResourceMapper.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * schema-soap
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/non-packaged-resources/etc/ru.entaxy.esb.platform.runtime.core.infrastructure.schema.cfg b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/non-packaged-resources/etc/ru.entaxy.esb.platform.runtime.core.infrastructure.schema.cfg
index 86b5a111..d9f36bc8 100644
--- a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/non-packaged-resources/etc/ru.entaxy.esb.platform.runtime.core.infrastructure.schema.cfg
+++ b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/non-packaged-resources/etc/ru.entaxy.esb.platform.runtime.core.infrastructure.schema.cfg
@@ -2,7 +2,7 @@
 # ~~~~~~licensing~~~~~~
 # karaf-features
 # ==========
-# Copyright (C) 2020 - 2024 EmDev LLC
+# Copyright (C) 2020 - 2025 EmDev LLC
 # ==========
 # You may not use this file except in accordance with the License Terms of the Copyright
 # Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/resources/OSGI-INF/blueprint/blueprint.xml
index f0cc3a8b..202abf18 100644
--- a/platform/runtime/core/infrastructure/schema/schema-soap/src/main/resources/OSGI-INF/blueprint/blueprint.xml
+++ b/platform/runtime/core/infrastructure/schema/schema-soap/src/main/resources/OSGI-INF/blueprint/blueprint.xml
@@ -3,7 +3,7 @@
   ~~~~~~licensing~~~~~~
   schema-soap
   ==========
-  Copyright (C) 2020 - 2024 EmDev LLC
+  Copyright (C) 2020 - 2025 EmDev LLC
   ==========
   You may not use this file except in accordance with the License Terms of the Copyright
   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/artifact-loader/LICENSE.txt b/platform/runtime/core/initializer/artifact-loader/LICENSE.txt
new file mode 100644
index 00000000..4ae94b75
--- /dev/null
+++ b/platform/runtime/core/initializer/artifact-loader/LICENSE.txt
@@ -0,0 +1,175 @@
+                                 ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ
+
+Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой)
+версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего
+Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН
+7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова,
+д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу
+https://www.emdev.ru/about (далее - Компания).
+
+Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями»
+(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения,
+Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в
+настоящем документе, в противном случае, он должен не использовать или не получать доступ
+к Программному обеспечению.
+
+                                    1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ
+
+a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии
+или редакции, исключительные права на которую принадлежат Правообладателю.
+b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные
+права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ
+для ЭВМ № 2021610848 от 19.01.2021 года.
+c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта
+https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО.
+d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также
+личные неимущественные права авторов произведений на результат интеллектуальной деятельности.
+e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование
+ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка
+включает предоставление Пользователю неисключительного права использования ПО, в том числе
+получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение
+патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается
+Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается
+для каждого Пользователя индивидуально в Сертификате.
+f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром),
+подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное
+обеспечение в ограниченном объёме и на определённый период времени.
+g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО,
+предоставленных Пользователю согласно условиям Подписки.
+h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного
+обеспечения.
+i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий
+из одного или нескольких файлов, который может быть прочтён человеком.
+j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля
+программы, полученный в результате обработки исходного кода, еще не связанный в полную программу.
+Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый
+продукт.
+k) Некоммерческое использование – индивидуальное личное использование Пользователем программного
+обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации
+возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая
+выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения.
+
+                    2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
+
+2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного
+обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом
+воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения
+в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ.
+2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит
+неисключительный характер.
+2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию,
+лицензия на ограниченное использование Программного обеспечения.
+2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования
+имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан
+обратиться в службу поддержки Правообладателя по адресу:  https://entaxy.ru/ для изменения
+вида лицензии с Базовой бесплатной версии на Подписки.
+2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для
+пробного использования программного обеспечения – не ограничен.
+2.6. Использование Пользователем настоящего программного обеспечения в целях разработки,
+модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю,
+без разрешения Правообладателя не допускается.
+
+                                3. АВТОРСКОЕ ПРАВО.
+
+3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение
+и любые его копии принадлежат Правообладателю.
+3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента,
+к которому можно получить доступ с помощью Программного обеспечения, является собственностью
+соответствующего владельца контента и защищается применимым законодательством об авторском
+праве или другими законами и договорами об интеллектуальной собственности.
+3.3. Условия использования Программного обеспечения.
+Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь
+придерживается следующих условий:
+3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять
+какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании
+Программного обеспечения или на нем.
+3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать,
+расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать
+Программное обеспечение.
+3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования
+ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне.
+3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено
+использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам.
+
+                    4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС»
+
+4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю
+на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с
+использованием Пользователем:
+4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в
+Программное обеспечение;
+4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями
+настоящего соглашения;
+4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием,
+или данными, не предоставленными Пользователю Правообладателем;
+4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем.
+
+
+5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ
+ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ
+И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ
+ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ
+И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ
+ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО.
+
+                        6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ.
+НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ
+ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ,
+ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ;
+ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ.
+ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ
+ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ;
+КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ
+ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ.
+
+                        7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ:
+Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия
+(включая, но не ограничиваясь) по:
+-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код)
+ Программного обеспечения;
+-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный
+код Программного обеспечения, за исключением тех изменений, которые вносятся средствами,
+включёнными в Программное обеспечение и описанными непосредственно в документации к нему;
+-созданию условий для использования Программного обеспечения лицами, не имеющими прав на
+использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство
+третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа
+к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку;
+-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию).
+
+                    8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА.
+
+8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из
+лицензионных продуктов, используемых на законных основаниях, а
+именно https://entaxy.ru/libs/licenses/root-aggregated.deps.
+8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть
+совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения.
+8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться
+Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения,
+содержащих все изменения и дополнения программного обеспечения.
+
+                        9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ.
+
+9.1.  Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым
+программным обеспечением.
+9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно
+с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм
+«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public.
+9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий
+пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя,
+прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер
+ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства
+Российской Федерации.
+
+                                10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ.
+
+10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет
+право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб,
+недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий
+пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере
+2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения
+исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy).
+10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое
+законодательство – Российской Федерации.
+10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным,
+остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать
+исполнять свои обязанности в соответствии с этими положениями.
diff --git a/platform/runtime/core/initializer/artifact-loader/pom.xml b/platform/runtime/core/initializer/artifact-loader/pom.xml
new file mode 100644
index 00000000..a50e732b
--- /dev/null
+++ b/platform/runtime/core/initializer/artifact-loader/pom.xml
@@ -0,0 +1,35 @@
+
+  4.0.0
+  
+    ru.entaxy.esb.platform.runtime.core
+    initializer
+    1.11.0
+  
+  ru.entaxy.esb.platform.runtime.core.initializer
+  artifact-loader
+  bundle
+  ENTAXY :: PLATFORM :: RUNTIME :: CORE :: INITIALIZER :: artifact loader
+  ENTAXY :: PLATFORM :: RUNTIME :: CORE :: INITIALIZER :: artifact loader
+  
+  
+	  
+		  ru.entaxy.platform.initializer.artifactloader
+	   	
+  
+  
+  
+    
+        ru.entaxy.esb.platform.runtime.core.initializer
+        init-manager
+        ${project.version}
+        compile
+ 	
+ 	
+		 ru.entaxy.esb.platform.runtime.core
+		 artifact-management
+		 ${project.version}
+	 
+  
+	
+  
+
diff --git a/platform/runtime/core/initializer/artifact-loader/src/main/java/ru/entaxy/platform/initializer/artifactloader/ArtifactDeployer.java b/platform/runtime/core/initializer/artifact-loader/src/main/java/ru/entaxy/platform/initializer/artifactloader/ArtifactDeployer.java
new file mode 100644
index 00000000..5d7fdd47
--- /dev/null
+++ b/platform/runtime/core/initializer/artifact-loader/src/main/java/ru/entaxy/platform/initializer/artifactloader/ArtifactDeployer.java
@@ -0,0 +1,255 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * artifact-loader
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.initializer.artifactloader;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.WatchEvent;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+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.esb.platform.runtime.core.initializer.api.Initialized;
+import ru.entaxy.platform.base.support.SimpleFileWatcher;
+import ru.entaxy.platform.core.artifact.Artifact;
+import ru.entaxy.platform.core.artifact.Artifacts;
+import ru.entaxy.platform.core.artifact.DeployedArtifact;
+import ru.entaxy.platform.core.artifact.service.ArtifactService;
+
+@Component(service = ArtifactDeployer.class, immediate = true)
+public class ArtifactDeployer implements SimpleFileWatcher.WatcherCallback {
+
+    public static final Logger log = LoggerFactory.getLogger(ArtifactDeployer.class);
+
+    public static final String ROOT_PATH = "init/artifacts";
+
+    public static final String LOCAL_PATH = "local";
+
+    public static final String SHARED_PATH = "shared";
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC,
+            policyOption = ReferencePolicyOption.GREEDY, target = "(id=repositories)")
+    volatile Initialized repositoriesInitializedMarker;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    ArtifactService artifactService;
+
+    protected ExecutorService executor = Executors.newSingleThreadExecutor();
+
+    protected SimpleFileWatcher artifactWatcher = null;
+
+    protected Path rootPath;
+
+    protected static Map sources = new HashMap<>();
+
+    protected static Map pathPrefixes = new HashMap<>();
+
+    @Activate
+    public void activate() {
+
+        sources.put(LOCAL_PATH, false);
+        sources.put(SHARED_PATH, true);
+
+    }
+
+    public void start() {
+
+        Path watchPath = Paths.get(System.getProperty("karaf.etc"), ROOT_PATH);
+        try {
+            artifactWatcher = new SimpleFileWatcher(watchPath);
+            artifactWatcher.setWatcherCallback(this);
+            executor.submit(artifactWatcher);
+        } catch (IOException e) {
+            log.error("FAILED creating file watcher for ArtifactDeployer", e);
+        }
+
+        // do the initial job
+
+        File rootFolder = new File(System.getProperty("karaf.etc"));
+        if (rootFolder.exists()) {
+            rootPath = Paths.get(rootFolder.getAbsolutePath(), ROOT_PATH);
+            log.debug("\n\t-->> Root path: [{}]", rootPath.toString());
+
+            for (Entry entry : sources.entrySet()) {
+                Path currentPath = Paths.get(rootPath.toString(), entry.getKey());
+                pathPrefixes.put(currentPath.toAbsolutePath().toString(), entry.getValue());
+            }
+
+            scan(rootPath);
+
+        }
+
+    }
+
+    protected static String getPrefix(File f) {
+        String filePath = f.getAbsolutePath();
+        for (String prefix : pathPrefixes.keySet())
+            if (filePath.startsWith(prefix))
+                return prefix;
+        return null;
+    }
+
+    protected static class FileData {
+
+        public File file;
+        public String prefix;
+        public boolean isShared;
+
+        public Artifact artifact;
+
+        public DeployedArtifact deployedArtifact;
+
+        public FileData(File f) {
+            file = f;
+            prefix = getPrefix(f);
+            isShared = pathPrefixes.getOrDefault(prefix, false);
+        }
+
+        public FileData setArtifact(Artifact artifact) {
+            this.artifact = artifact;
+            return this;
+        }
+
+        public FileData setDeployedArtifact(DeployedArtifact deployedArtifact) {
+            this.deployedArtifact = deployedArtifact;
+            return this;
+        }
+
+
+
+    }
+
+    protected void scan(Path pathToScan) {
+
+        if (!pathToScan.toFile().exists() || !pathToScan.toFile().isDirectory())
+            return;
+
+        log.info("SCANNING: [{}]", pathToScan);
+
+        try (Stream pathStream = Files.walk(pathToScan)) {
+            List fileDataList = pathStream
+                    .map(p -> p.toFile())
+                    .filter(f -> f.exists())
+                    .filter(f -> !f.isDirectory())
+                    .map(f -> new FileData(f))
+                    .filter(fd -> fd.prefix != null)
+                    .map(fd -> fd.setArtifact(Artifacts.fromFile(fd.file, fd.prefix)))
+                    .filter(fd -> fd.artifact != null)
+                    .collect(Collectors.toList());
+            List deployed = fileDataList.stream()
+                    .map(fd -> fd.setDeployedArtifact(fd.isShared ? artifactService.deployShared(fd.artifact)
+                            : artifactService.deployLocal(fd.artifact)))
+                    .filter(fd -> (fd.deployedArtifact != null))
+                    .collect(Collectors.toList());
+            for (FileData fd : deployed)
+                log.info("Deployed [initial] {} artifact: [{}]", fd.isShared ? "shared" : "local",
+                        fd.deployedArtifact.getLocation());
+        } catch (IOException e) {
+            log.error("Error processing files", e);
+        }
+
+    }
+
+    @Deactivate
+    public void deactivate() {
+        executor.shutdown();
+        if (artifactWatcher != null) {
+            artifactWatcher.close();
+        }
+    }
+
+    /* -- WatcherCallback implementation */
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public void fileCreated(WatchEvent event, Path directory) {
+        Path name = ((WatchEvent) event).context();
+        Path fileFullPath = directory.resolve(name);
+
+        Path fileRelPath = rootPath.relativize(fileFullPath);
+        Path fileRelTargetPath = null;
+        Path fileRootPath = null;
+
+        boolean deployShared = true;
+
+        // check if it's shared artifact
+        if (fileRelPath != null && fileRelPath.toString().startsWith(SHARED_PATH)) {
+            fileRootPath = Paths.get(rootPath.toString(), SHARED_PATH);
+            try {
+                fileRelPath = fileRootPath.relativize(fileFullPath);
+                log.debug("NEW SHARED FILE: [{}] -> [{}]", fileFullPath, fileRelPath);
+            } catch (IllegalArgumentException ignore) {
+                // not shared artifact
+            }
+        } else if (fileRelPath != null && fileRelPath.toString().startsWith(LOCAL_PATH)) {
+            fileRootPath = Paths.get(rootPath.toString(), LOCAL_PATH);
+            try {
+                fileRelPath = fileRootPath.relativize(fileFullPath);
+                log.debug("NEW SHARED FILE: [{}] -> [{}]", fileFullPath, fileRelPath);
+                deployShared = false;
+            } catch (IllegalArgumentException ignore) {
+                // not shared artifact
+            }
+        } else {
+            log.warn("File NOT LOCAL or SHARED -> ingoring: [{}]", fileFullPath);
+            return;
+        }
+
+        Artifact artifact = Artifacts.fromFile(fileFullPath.toFile(), fileRootPath.toString());
+        DeployedArtifact deployedArtifact =
+                deployShared ? artifactService.deployShared(artifact) : artifactService.deployLocal(artifact);
+        log.info("Deployed {} artifact: [{}]", deployShared ? "shared" : "local", deployedArtifact.getLocation());
+    }
+
+    @Override
+    public void directoryCreated(WatchEvent event, Path directory) {
+
+        Path name = ((WatchEvent) event).context();
+        Path dirFullPath = directory.resolve(name);
+
+        log.info("DIRECTORY CREATED: [{}]", dirFullPath.toAbsolutePath().toString());
+
+        scan(dirFullPath);
+    }
+}
diff --git a/platform/runtime/core/initializer/artifact-loader/src/main/java/ru/entaxy/platform/initializer/artifactloader/ArtifactInstaller.java b/platform/runtime/core/initializer/artifact-loader/src/main/java/ru/entaxy/platform/initializer/artifactloader/ArtifactInstaller.java
new file mode 100644
index 00000000..03daa42c
--- /dev/null
+++ b/platform/runtime/core/initializer/artifact-loader/src/main/java/ru/entaxy/platform/initializer/artifactloader/ArtifactInstaller.java
@@ -0,0 +1,381 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * artifact-loader
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.initializer.artifactloader;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.WatchEvent;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.apache.camel.tooling.model.Strings;
+import org.apache.felix.utils.properties.Properties;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import ru.entaxy.platform.base.support.CommonUtils;
+import ru.entaxy.platform.base.support.SimpleFileWatcher;
+import ru.entaxy.platform.core.artifact.Artifact;
+import ru.entaxy.platform.core.artifact.ArtifactCoordinates;
+import ru.entaxy.platform.core.artifact.Artifacts;
+import ru.entaxy.platform.core.artifact.DeployedArtifact;
+import ru.entaxy.platform.core.artifact.installer.builder.InstallationResult;
+import ru.entaxy.platform.core.artifact.installer.builder.Installer;
+import ru.entaxy.platform.core.artifact.installer.builder.typed.CommonBundleInstaller;
+import ru.entaxy.platform.core.artifact.repository.impl.DeployedArtifactImpl;
+import ru.entaxy.platform.core.artifact.service.ArtifactService;
+
+@Component(service = ArtifactInstaller.class, immediate = true)
+public class ArtifactInstaller implements SimpleFileWatcher.WatcherCallback {
+
+    public static final Logger log = LoggerFactory.getLogger(ArtifactInstaller.class);
+
+    public static final String ROOT_PATH = "init/install";
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected ArtifactService artifactService;
+
+    protected ExecutorService watchExecutor = Executors.newSingleThreadExecutor();
+
+    protected ExecutorService installExecutor = Executors.newCachedThreadPool();
+
+    protected boolean installThreadIsRunning = false;
+
+    protected Object installThreadLock = new Object();
+
+    // protected List currentTasks = Collections.synchronizedList(new
+    // ArrayList<>());
+
+    protected final Map currentTasks = new HashMap<>();
+
+    protected final Object currentTasksLock = new Object();
+
+    protected SimpleFileWatcher installPropertiesWatcher = null;
+
+    protected Path rootPath;
+
+
+    @Activate
+    public void activate() {
+        watchExecutor = Executors.newSingleThreadExecutor();
+        installExecutor = Executors.newCachedThreadPool();
+    }
+
+    @Deactivate
+    public void deactivate() {
+        watchExecutor.shutdown();
+        installExecutor.shutdown();
+    }
+
+    public void start() {
+
+        rootPath = Paths.get(System.getProperty("karaf.etc"), ROOT_PATH);
+
+        try {
+            installPropertiesWatcher = new SimpleFileWatcher(rootPath);
+            installPropertiesWatcher.setWatcherCallback(this);
+            watchExecutor.submit(installPropertiesWatcher);
+        } catch (IOException e) {
+            log.error("FAILED creating file watcher for ArtifactDeployer", e);
+        }
+
+        // do the initial job
+
+        try (Stream pathStream = Files.walk(rootPath)) {
+            List fileList = pathStream
+                    .map(p -> p.toFile())
+                    .filter(f -> f.exists())
+                    .filter(f -> !f.isDirectory())
+                    .collect(Collectors.toList());
+            for (File f : fileList) {
+                log.info("INITIAL processing file: " + f.getAbsolutePath());
+                List tasks = parseProperties(f.getAbsoluteFile().toPath());
+                if (tasks != null && !tasks.isEmpty())
+                    submitTasks(tasks);
+            }
+
+        } catch (Exception e) {
+            log.error("Error processing files", e);
+        }
+
+
+    }
+
+    protected List parseProperties(Path propertiesFile) {
+
+        List result = new ArrayList<>();
+
+        Properties properties;
+        try {
+
+            List lines = Files.readAllLines(propertiesFile);
+
+            for (String line : lines) {
+                if (Strings.isNullOrEmpty(line))
+                    continue;
+                if (line.startsWith("#"))
+                    continue;
+                String[] parsed = line.split("=");
+                if (parsed.length < 2) {
+                    log.warn("incorrect line [{}] in file [{}]", line, propertiesFile);
+                    continue;
+                }
+                String url = parsed[0].trim();
+                String paramsData = parsed[1].trim();
+                InstallationTask task = InstallationTask.parseParams(paramsData);
+                task.artifactUrl = url;
+                task.createArtifacts();
+                result.add(task);
+            }
+
+            /*
+            properties = new Properties(propertiesFile.toFile());
+            
+            for (Entry entry : properties.entrySet()) {
+                String url = entry.getKey();
+                String paramsData = entry.getValue();
+                InstallationTask task = InstallationTask.parseParams(paramsData);
+                task.artifactUrl = url;
+                task.createArtifacts();
+                result.add(task);
+            }
+            */
+        } catch (IOException e) {
+            log.error("Failed reading file [" + propertiesFile.toString() + "]", e);
+        }
+
+        return result;
+
+    }
+
+    protected void submitTasks(List tasks) {
+        log.info("SUBMITTING TASKS: " + tasks.size());
+        int newTasks = 0;
+        synchronized (currentTasksLock) {
+            for (InstallationTask task : tasks)
+                if (!this.currentTasks.containsKey(task.artifactUrl)) {
+                    this.currentTasks.putIfAbsent(task.artifactUrl, task);
+                    newTasks++;
+                }
+        }
+        log.debug("TOTAL TASKS: " + this.currentTasks.size() + "; NEW TASKS: " + newTasks);
+        if (newTasks == 0)
+            return;
+        synchronized (installThreadLock) {
+            if (!installThreadIsRunning) {
+                log.debug("STARTING INSTALLER");
+                startInstaller();
+            } else {
+                log.debug("INSTALLER ALREADY STARTED");
+            }
+        }
+    }
+
+    protected void startInstaller() {
+        if (installExecutor.isTerminated() || installExecutor.isShutdown()) {
+            log.debug("INSTALLER IS TERMINATED -> RECREATING");
+            installExecutor = Executors.newCachedThreadPool();
+        }
+
+        installExecutor.submit(new InstallerWorker());
+    }
+
+    /* -- WatcherCallback implementation */
+
+    @Override
+    public void fileCreated(WatchEvent event, Path directory) {
+        Path name = ((WatchEvent) event).context();
+        Path fileFullPath = directory.resolve(name);
+        log.info("NEW FILE FOUND: [{}]", fileFullPath);
+
+        // let the file be finished:
+        // on Windows it can happen that we read new file
+        // while it's not finished so being empty
+        try {
+            Thread.sleep(1000);
+        } catch (InterruptedException ignore) {
+            // NOOP
+        }
+
+        List tasks = parseProperties(fileFullPath);
+        log.debug("TASKS: [{}]", tasks == null ? 0 : tasks.size());
+        if (tasks != null && !tasks.isEmpty())
+            submitTasks(tasks);
+    }
+
+    protected class InstallerWorker implements Runnable {
+
+        @Override
+        public void run() {
+
+            synchronized (installThreadLock) {
+                if (installThreadIsRunning) {
+                    log.debug(" >> ANOTHER THREAD IS ALREADY RUNNING");
+                    return;
+                }
+                installThreadIsRunning = true;
+            }
+
+            List completed = new ArrayList<>();
+
+            List expired = new ArrayList<>();
+
+            log.debug(" >> TOTAL TASKS: " + currentTasks.size());
+
+            Map localMap = new HashMap<>();
+
+            synchronized (currentTasksLock) {
+                localMap.putAll(currentTasks);
+            }
+
+            while (!localMap.isEmpty()) {
+
+                for (InstallationTask task : localMap.values()) {
+
+                    log.debug(" >> EXECUTING task for [{}]", task.artifactUrl);
+
+                    Installer installer = task.installShared ? artifactService.installers().cluster()
+                            : artifactService.installers().local();
+
+                    installer.artifact(task.deployedArtifact);
+
+                    CommonBundleInstaller bundleInstaller = installer.typed(CommonBundleInstaller.class);
+                    InstallationResult result =
+                            bundleInstaller.installOnlyIfMissing()
+                                    .forceInstall()
+                                    .start().startLevel(task.startLevel).install();
+
+                    if (result != null && result.isSuccessful()) {
+                        completed.add(task);
+                        log.info("Successfully installed: [{}]", task.artifactUrl);
+                    } else {
+                        task.retriesCount--;
+                        if (task.retriesCount <= 0) {
+                            expired.add(task);
+                            log.warn("Installation failed: expired: [{}]", task.artifactUrl);
+                            if (!result.isSuccessful() && CommonUtils.isValid(result.getMessage()))
+                                log.error("Installation error for [{}]: {}", task.artifactUrl, result.getMessage());
+
+                        }
+                    }
+
+                }
+
+                synchronized (currentTasksLock) {
+                    for (InstallationTask task : completed)
+                        currentTasks.remove(task.artifactUrl);
+                    for (InstallationTask task : expired)
+                        currentTasks.remove(task.artifactUrl);
+                    log.debug(" >> TOTAL TASKS LEFT: " + currentTasks.size());
+                    localMap.clear();
+                    localMap.putAll(currentTasks);
+                }
+
+                if (localMap.isEmpty()) {
+                    log.debug(" >> EXITING");
+                    break;
+                } else {
+                    log.debug(" >> CONTINUE");
+                }
+
+                try {
+                    Thread.sleep(1000);
+                } catch (InterruptedException e) {
+                    log.debug("Interrupted");
+                }
+            }
+            synchronized (installThreadLock) {
+                installThreadIsRunning = false;
+            }
+
+        }
+
+    }
+
+    protected static class InstallationTask {
+
+        protected static final String SHARED_TARGET = "shared";
+
+        public static InstallationTask parseParams(String data) {
+            InstallationTask result = new InstallationTask();
+
+            String[] values = data.split(";");
+            result.installShared = values[0].equals(SHARED_TARGET);
+
+            if (values.length > 1)
+                result.artifactCategory = values[1].trim();
+
+            if (values.length > 2)
+                try {
+                    result.startLevel = Integer.parseInt(values[2].trim());
+                } catch (Exception ignore) {
+
+                }
+
+            return result;
+        }
+
+        String artifactUrl = "";
+
+        boolean installShared = true;
+
+        String artifactCategory = "jar";
+
+        int startLevel = 100;
+
+        Artifact artifact;
+
+        DeployedArtifact deployedArtifact;
+
+        int retriesCount = 100;
+
+        public void createArtifacts() {
+
+            Artifact artifact = Artifacts.create(artifactCategory);
+
+            artifact.getCoordinates().set(ArtifactCoordinates.fromUrl(artifactUrl));
+
+            deployedArtifact = new DeployedArtifactImpl(artifact, "mvn:" + artifactUrl);
+
+        }
+
+    }
+
+}
diff --git a/platform/runtime/core/initializer/artifact-loader/src/main/java/ru/entaxy/platform/initializer/artifactloader/ArtifactLoader.java b/platform/runtime/core/initializer/artifact-loader/src/main/java/ru/entaxy/platform/initializer/artifactloader/ArtifactLoader.java
new file mode 100644
index 00000000..455f79e3
--- /dev/null
+++ b/platform/runtime/core/initializer/artifact-loader/src/main/java/ru/entaxy/platform/initializer/artifactloader/ArtifactLoader.java
@@ -0,0 +1,58 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * artifact-loader
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.initializer.artifactloader;
+
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+
+import ru.entaxy.esb.platform.runtime.core.initializer.api.AbstractStandaloneInitializer;
+import ru.entaxy.esb.platform.runtime.core.initializer.api.StandaloneInitializer;
+
+@Component(service = ArtifactLoader.class, immediate = true)
+@StandaloneInitializer(id = "artifacts")
+public class ArtifactLoader extends AbstractStandaloneInitializer {
+
+    @Reference
+    ArtifactDeployer artifactDeployer;
+
+    @Reference
+    ArtifactInstaller artifactInstaller;
+
+    @Activate
+    public void activate() {
+        artifactDeployer.start();
+        artifactInstaller.start();
+        register();
+    }
+
+    @Deactivate
+    public void deactivate() {
+
+    }
+
+}
diff --git a/platform/runtime/core/initializer/connection-initializer/pom.xml b/platform/runtime/core/initializer/connection-initializer/pom.xml
index 79dc7bfc..0a3c851b 100644
--- a/platform/runtime/core/initializer/connection-initializer/pom.xml
+++ b/platform/runtime/core/initializer/connection-initializer/pom.xml
@@ -4,7 +4,7 @@
     
         ru.entaxy.esb.platform.runtime.core
         initializer
-        1.10.0
+        1.11.0
     
 
     4.0.0
diff --git a/platform/runtime/core/initializer/connection-initializer/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/connection/ConnectionInitializer.java b/platform/runtime/core/initializer/connection-initializer/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/connection/ConnectionInitializer.java
index c6f34e35..14e0c188 100644
--- a/platform/runtime/core/initializer/connection-initializer/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/connection/ConnectionInitializer.java
+++ b/platform/runtime/core/initializer/connection-initializer/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/connection/ConnectionInitializer.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * connection-initializer
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/connection-initializer/src/main/non-packaged-resources/etc/init/broker-connections.json b/platform/runtime/core/initializer/connection-initializer/src/main/non-packaged-resources/etc/init/broker-connections.json
new file mode 100644
index 00000000..cac2229a
--- /dev/null
+++ b/platform/runtime/core/initializer/connection-initializer/src/main/non-packaged-resources/etc/init/broker-connections.json
@@ -0,0 +1,14 @@
+{
+	"connections": [
+		{
+			"factoryId": "artemis-connection",
+			"objectId": "entaxy-broker",
+			"properties": {
+				"connectionString": "(tcp://localhost:61616)",
+				"camel_username": "entaxy",
+				"camel_password": "entaxy",
+				"isPlatform": true
+			}
+		}
+	]
+}
\ No newline at end of file
diff --git a/platform/runtime/core/initializer/connection-initializer/src/main/non-packaged-resources/etc/init/db-connections.json b/platform/runtime/core/initializer/connection-initializer/src/main/non-packaged-resources/etc/init/db-connections.json
new file mode 100644
index 00000000..b2d7d736
--- /dev/null
+++ b/platform/runtime/core/initializer/connection-initializer/src/main/non-packaged-resources/etc/init/db-connections.json
@@ -0,0 +1,20 @@
+{
+	"connections": [
+		{
+			"factoryId": "jdbc-connection",
+			"objectId": "entaxy-db-storage",
+			"properties": {
+				"dataSourceName": "entaxy.esb.storage",
+				"isPlatform": true
+			}
+		},
+		{
+			"factoryId": "jdbc-connection",
+			"objectId": "entaxy-db-cache",
+			"properties": {
+				"dataSourceName": "entaxy.esb.cache",
+				"isPlatform": true
+			}
+		}
+	]
+}
diff --git a/platform/runtime/core/initializer/core-initializer/pom.xml b/platform/runtime/core/initializer/core-initializer/pom.xml
index 8fe74bad..2fb49656 100644
--- a/platform/runtime/core/initializer/core-initializer/pom.xml
+++ b/platform/runtime/core/initializer/core-initializer/pom.xml
@@ -3,7 +3,7 @@
   
     ru.entaxy.esb.platform.runtime.core
     initializer
-    1.10.0
+    1.11.0
   
   ru.entaxy.esb.platform.runtime.core.initializer
   core-initializer
diff --git a/platform/runtime/core/initializer/core-initializer/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/core/CoreInitializer.java b/platform/runtime/core/initializer/core-initializer/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/core/CoreInitializer.java
index ae1177c0..f1ff2572 100644
--- a/platform/runtime/core/initializer/core-initializer/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/core/CoreInitializer.java
+++ b/platform/runtime/core/initializer/core-initializer/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/core/CoreInitializer.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * core-initializer
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/datasources-initializer/pom.xml b/platform/runtime/core/initializer/datasources-initializer/pom.xml
index 6d34531f..99a8389d 100644
--- a/platform/runtime/core/initializer/datasources-initializer/pom.xml
+++ b/platform/runtime/core/initializer/datasources-initializer/pom.xml
@@ -3,7 +3,7 @@
   
     ru.entaxy.esb.platform.runtime.core
     initializer
-    1.10.0
+    1.11.0
   
   ru.entaxy.esb.platform.runtime.core.initializer
   datasources-initializer
diff --git a/platform/runtime/core/initializer/datasources-initializer/src/main/assembly/datasources.xml b/platform/runtime/core/initializer/datasources-initializer/src/main/assembly/datasources.xml
index 49933c94..b679bee5 100644
--- a/platform/runtime/core/initializer/datasources-initializer/src/main/assembly/datasources.xml
+++ b/platform/runtime/core/initializer/datasources-initializer/src/main/assembly/datasources.xml
@@ -3,7 +3,7 @@
   ~~~~~~licensing~~~~~~
   entaxy-assembly
   ==========
-  Copyright (C) 2020 - 2024 EmDev LLC
+  Copyright (C) 2020 - 2025 EmDev LLC
   ==========
   You may not use this file except in accordance with the License Terms of the Copyright
   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/datasources-initializer/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/datasources/DataSourcesCollector.java b/platform/runtime/core/initializer/datasources-initializer/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/datasources/DataSourcesCollector.java
index 0a932ac7..a59a5dbc 100644
--- a/platform/runtime/core/initializer/datasources-initializer/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/datasources/DataSourcesCollector.java
+++ b/platform/runtime/core/initializer/datasources-initializer/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/datasources/DataSourcesCollector.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * datasources-initializer
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/datasources-initializer/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/datasources/DataSourcesInitializer.java b/platform/runtime/core/initializer/datasources-initializer/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/datasources/DataSourcesInitializer.java
index cfa0f4a6..ca7a0e1b 100644
--- a/platform/runtime/core/initializer/datasources-initializer/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/datasources/DataSourcesInitializer.java
+++ b/platform/runtime/core/initializer/datasources-initializer/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/datasources/DataSourcesInitializer.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * datasources-initializer
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/datasources-initializer/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/datasources/DataSourcesStandaloneInitializer.java b/platform/runtime/core/initializer/datasources-initializer/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/datasources/DataSourcesStandaloneInitializer.java
new file mode 100644
index 00000000..c6a221d5
--- /dev/null
+++ b/platform/runtime/core/initializer/datasources-initializer/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/datasources/DataSourcesStandaloneInitializer.java
@@ -0,0 +1,59 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * datasources-initializer
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.platform.runtime.core.initializer.datasources;
+
+import javax.sql.DataSource;
+
+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.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ReferencePolicy;
+import org.osgi.service.component.annotations.ReferencePolicyOption;
+
+import ru.entaxy.esb.platform.runtime.core.initializer.api.AbstractStandaloneInitializer;
+import ru.entaxy.esb.platform.runtime.core.initializer.api.StandaloneInitializer;
+
+@Component(service = DataSourcesStandaloneInitializer.class, immediate = true)
+@StandaloneInitializer(id = "datasources")
+public class DataSourcesStandaloneInitializer extends AbstractStandaloneInitializer {
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC,
+            policyOption = ReferencePolicyOption.GREEDY, target = "(osgi.jndi.service.name=entaxy.esb.storage)")
+    volatile DataSource storage;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC,
+            policyOption = ReferencePolicyOption.GREEDY, target = "(osgi.jndi.service.name=entaxy.esb.cache)")
+    volatile DataSource cache;
+
+    @Activate
+    public void activate(ComponentContext componentContext) {
+        setBundleContext(componentContext.getBundleContext());
+        register();
+    }
+
+}
diff --git a/platform/runtime/core/initializer/datasources-initializer/src/main/non-packaged-resources/etc/org.ops4j.datasource-entaxy.esb.cache.cfg.h2 b/platform/runtime/core/initializer/datasources-initializer/src/main/non-packaged-resources/etc/org.ops4j.datasource-entaxy.esb.cache.cfg.h2
index df908bb5..5e392281 100644
--- a/platform/runtime/core/initializer/datasources-initializer/src/main/non-packaged-resources/etc/org.ops4j.datasource-entaxy.esb.cache.cfg.h2
+++ b/platform/runtime/core/initializer/datasources-initializer/src/main/non-packaged-resources/etc/org.ops4j.datasource-entaxy.esb.cache.cfg.h2
@@ -2,7 +2,7 @@
 # ~~~~~~licensing~~~~~~
 # h2-adapter
 # ==========
-# Copyright (C) 2020 - 2024 EmDev LLC
+# Copyright (C) 2020 - 2025 EmDev LLC
 # ==========
 # You may not use this file except in accordance with the License Terms of the Copyright
 # Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/datasources-initializer/src/main/non-packaged-resources/etc/org.ops4j.datasource-entaxy.esb.cache.cfg.pg b/platform/runtime/core/initializer/datasources-initializer/src/main/non-packaged-resources/etc/org.ops4j.datasource-entaxy.esb.cache.cfg.pg
index 14465198..22220631 100644
--- a/platform/runtime/core/initializer/datasources-initializer/src/main/non-packaged-resources/etc/org.ops4j.datasource-entaxy.esb.cache.cfg.pg
+++ b/platform/runtime/core/initializer/datasources-initializer/src/main/non-packaged-resources/etc/org.ops4j.datasource-entaxy.esb.cache.cfg.pg
@@ -2,7 +2,7 @@
 # ~~~~~~licensing~~~~~~
 # datasources-initializer
 # ==========
-# Copyright (C) 2020 - 2024 EmDev LLC
+# Copyright (C) 2020 - 2025 EmDev LLC
 # ==========
 # You may not use this file except in accordance with the License Terms of the Copyright
 # Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/datasources-initializer/src/main/non-packaged-resources/etc/org.ops4j.datasource-entaxy.esb.storage.cfg.h2 b/platform/runtime/core/initializer/datasources-initializer/src/main/non-packaged-resources/etc/org.ops4j.datasource-entaxy.esb.storage.cfg.h2
index 56608ab3..e0ee23b5 100644
--- a/platform/runtime/core/initializer/datasources-initializer/src/main/non-packaged-resources/etc/org.ops4j.datasource-entaxy.esb.storage.cfg.h2
+++ b/platform/runtime/core/initializer/datasources-initializer/src/main/non-packaged-resources/etc/org.ops4j.datasource-entaxy.esb.storage.cfg.h2
@@ -2,7 +2,7 @@
 # ~~~~~~licensing~~~~~~
 # h2-adapter
 # ==========
-# Copyright (C) 2020 - 2024 EmDev LLC
+# Copyright (C) 2020 - 2025 EmDev LLC
 # ==========
 # You may not use this file except in accordance with the License Terms of the Copyright
 # Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/datasources-initializer/src/main/non-packaged-resources/etc/org.ops4j.datasource-entaxy.esb.storage.cfg.pg b/platform/runtime/core/initializer/datasources-initializer/src/main/non-packaged-resources/etc/org.ops4j.datasource-entaxy.esb.storage.cfg.pg
index c3a2369e..f7f73a45 100644
--- a/platform/runtime/core/initializer/datasources-initializer/src/main/non-packaged-resources/etc/org.ops4j.datasource-entaxy.esb.storage.cfg.pg
+++ b/platform/runtime/core/initializer/datasources-initializer/src/main/non-packaged-resources/etc/org.ops4j.datasource-entaxy.esb.storage.cfg.pg
@@ -2,7 +2,7 @@
 # ~~~~~~licensing~~~~~~
 # datasources-initializer
 # ==========
-# Copyright (C) 2020 - 2024 EmDev LLC
+# Copyright (C) 2020 - 2025 EmDev LLC
 # ==========
 # You may not use this file except in accordance with the License Terms of the Copyright
 # Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/datasources-initializer/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/platform/runtime/core/initializer/datasources-initializer/src/main/resources/OSGI-INF/blueprint/blueprint.xml
index f1ba488b..8767354e 100644
--- a/platform/runtime/core/initializer/datasources-initializer/src/main/resources/OSGI-INF/blueprint/blueprint.xml
+++ b/platform/runtime/core/initializer/datasources-initializer/src/main/resources/OSGI-INF/blueprint/blueprint.xml
@@ -3,7 +3,7 @@
   ~~~~~~licensing~~~~~~
   datasources-initializer
   ==========
-  Copyright (C) 2020 - 2024 EmDev LLC
+  Copyright (C) 2020 - 2025 EmDev LLC
   ==========
   You may not use this file except in accordance with the License Terms of the Copyright
   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/init-manager/pom.xml b/platform/runtime/core/initializer/init-manager/pom.xml
index aca7bf99..e2eac0f9 100644
--- a/platform/runtime/core/initializer/init-manager/pom.xml
+++ b/platform/runtime/core/initializer/init-manager/pom.xml
@@ -3,7 +3,7 @@
   
     ru.entaxy.esb.platform.runtime.core
     initializer
-    1.10.0
+    1.11.0
   
   ru.entaxy.esb.platform.runtime.core.initializer
   init-manager
diff --git a/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/Activator.java b/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/Activator.java
index 0d3be04a..e81a34c8 100644
--- a/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/Activator.java
+++ b/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/Activator.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * init-manager
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/InitManager.java b/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/InitManager.java
index b41fcf4b..d4057255 100644
--- a/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/InitManager.java
+++ b/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/InitManager.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * init-manager
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/InitializerTracker.java b/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/InitializerTracker.java
index 9bd22429..61c5e695 100644
--- a/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/InitializerTracker.java
+++ b/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/InitializerTracker.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * init-manager
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/api/AbstractInitializer.java b/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/api/AbstractInitializer.java
index 28688955..69f7aa6d 100644
--- a/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/api/AbstractInitializer.java
+++ b/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/api/AbstractInitializer.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * init-manager
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/api/AbstractStandaloneInitializer.java b/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/api/AbstractStandaloneInitializer.java
new file mode 100644
index 00000000..c435ace9
--- /dev/null
+++ b/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/api/AbstractStandaloneInitializer.java
@@ -0,0 +1,85 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * init-manager
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.platform.runtime.core.initializer.api;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.ServiceRegistration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class AbstractStandaloneInitializer implements Initialized {
+
+    private static final Logger log = LoggerFactory.getLogger(AbstractStandaloneInitializer.class);
+
+    protected String initializerId;
+    protected BundleContext bundleContext;
+    protected ServiceRegistration serviceRegistration;
+
+    protected AbstractStandaloneInitializer() {
+        super();
+        if (getClass().isAnnotationPresent(StandaloneInitializer.class)) {
+            StandaloneInitializer anno = getClass().getAnnotation(StandaloneInitializer.class);
+            this.initializerId = anno.id();
+        }
+    }
+
+    public String getInitializerId() {
+        return initializerId;
+    }
+
+    public void setInitializerId(String initializerId) {
+        this.initializerId = initializerId;
+    }
+
+    public BundleContext getBundleContext() {
+        return bundleContext;
+    }
+
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    protected BundleContext getCurrentBundleContext() {
+        if (this.bundleContext != null)
+            return bundleContext;
+        return FrameworkUtil.getBundle(Initialized.class).getBundleContext();
+    }
+
+    protected void register() {
+        try {
+            Dictionary props = new Hashtable<>();
+            props.put(PROP_INITIALIZER_ID, initializerId);
+            serviceRegistration = getCurrentBundleContext().registerService(Initialized.class, this, props);
+        } catch (Exception e) {
+            log.error("Error registering service for initializer[" + initializerId + "]", e);
+        }
+    }
+
+}
diff --git a/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/api/Initialized.java b/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/api/Initialized.java
new file mode 100644
index 00000000..f04ebe5f
--- /dev/null
+++ b/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/api/Initialized.java
@@ -0,0 +1,38 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * init-manager
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.platform.runtime.core.initializer.api;
+
+/**
+ * Marker interface to provide information of successful initialization. Service with the interface
+ * is exposed to be used as a dependency in other components.
+ * 
+ * Initializer ID get be retrieved via service property 'id'
+ */
+public interface Initialized {
+
+    String PROP_INITIALIZER_ID = "id";
+
+}
diff --git a/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/api/Initializer.java b/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/api/Initializer.java
index 0c598331..af37a50d 100644
--- a/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/api/Initializer.java
+++ b/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/api/Initializer.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * init-manager
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/api/InitializerException.java b/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/api/InitializerException.java
index d53b1da3..3d2712d9 100644
--- a/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/api/InitializerException.java
+++ b/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/api/InitializerException.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * init-manager
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/api/StandaloneInitializer.java b/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/api/StandaloneInitializer.java
new file mode 100644
index 00000000..85989112
--- /dev/null
+++ b/platform/runtime/core/initializer/init-manager/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/api/StandaloneInitializer.java
@@ -0,0 +1,40 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * init-manager
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.platform.runtime.core.initializer.api;
+
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+@Retention(RUNTIME)
+@Target(TYPE)
+public @interface StandaloneInitializer {
+
+    String id();
+
+}
diff --git a/platform/runtime/core/initializer/pom.xml b/platform/runtime/core/initializer/pom.xml
index 2a41f871..6a5d669d 100644
--- a/platform/runtime/core/initializer/pom.xml
+++ b/platform/runtime/core/initializer/pom.xml
@@ -3,7 +3,7 @@
   
     ru.entaxy.esb.platform.runtime
     core
-    1.10.0
+    1.11.0
   
   ru.entaxy.esb.platform.runtime.core
   initializer
diff --git a/platform/runtime/core/initializer/storage-initializer/cache/pom.xml b/platform/runtime/core/initializer/storage-initializer/cache/pom.xml
index b31315b5..b1f39bc9 100644
--- a/platform/runtime/core/initializer/storage-initializer/cache/pom.xml
+++ b/platform/runtime/core/initializer/storage-initializer/cache/pom.xml
@@ -5,7 +5,7 @@
     
         storage-initializer
         ru.entaxy.esb.platform.runtime.core.initializer
-        1.10.0
+        1.11.0
     
 
     ru.entaxy.esb.platform.runtime.core.initializer.storage.initializer
diff --git a/platform/runtime/core/initializer/storage-initializer/cache/src/main/resources/OSGI-INF/blueprint/camel-contex.xml b/platform/runtime/core/initializer/storage-initializer/cache/src/main/resources/OSGI-INF/blueprint/camel-contex.xml
index b8a32314..85ee5dcd 100644
--- a/platform/runtime/core/initializer/storage-initializer/cache/src/main/resources/OSGI-INF/blueprint/camel-contex.xml
+++ b/platform/runtime/core/initializer/storage-initializer/cache/src/main/resources/OSGI-INF/blueprint/camel-contex.xml
@@ -3,7 +3,7 @@
   ~~~~~~licensing~~~~~~
   storage-cache
   ==========
-  Copyright (C) 2020 - 2024 EmDev LLC
+  Copyright (C) 2020 - 2025 EmDev LLC
   ==========
   You may not use this file except in accordance with the License Terms of the Copyright
   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/storage-initializer/cache/src/main/resources/db/changelog.xml b/platform/runtime/core/initializer/storage-initializer/cache/src/main/resources/db/changelog.xml
index e64bbda8..2f4b7360 100644
--- a/platform/runtime/core/initializer/storage-initializer/cache/src/main/resources/db/changelog.xml
+++ b/platform/runtime/core/initializer/storage-initializer/cache/src/main/resources/db/changelog.xml
@@ -2,7 +2,7 @@
   ~~~~~~licensing~~~~~~
   storage-cache
   ==========
-  Copyright (C) 2020 - 2024 EmDev LLC
+  Copyright (C) 2020 - 2025 EmDev LLC
   ==========
   You may not use this file except in accordance with the License Terms of the Copyright
   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/storage-initializer/cache/src/main/resources/db/changeset/001-aggregation-table-create.xml b/platform/runtime/core/initializer/storage-initializer/cache/src/main/resources/db/changeset/001-aggregation-table-create.xml
index c4e09125..68c72497 100644
--- a/platform/runtime/core/initializer/storage-initializer/cache/src/main/resources/db/changeset/001-aggregation-table-create.xml
+++ b/platform/runtime/core/initializer/storage-initializer/cache/src/main/resources/db/changeset/001-aggregation-table-create.xml
@@ -3,7 +3,7 @@
   ~~~~~~licensing~~~~~~
   storage-cache
   ==========
-  Copyright (C) 2020 - 2024 EmDev LLC
+  Copyright (C) 2020 - 2025 EmDev LLC
   ==========
   You may not use this file except in accordance with the License Terms of the Copyright
   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/storage-initializer/cache/src/main/resources/db/changeset/002-quartz.xml b/platform/runtime/core/initializer/storage-initializer/cache/src/main/resources/db/changeset/002-quartz.xml
index 40dd29a0..c4a3177b 100644
--- a/platform/runtime/core/initializer/storage-initializer/cache/src/main/resources/db/changeset/002-quartz.xml
+++ b/platform/runtime/core/initializer/storage-initializer/cache/src/main/resources/db/changeset/002-quartz.xml
@@ -2,7 +2,7 @@
   ~~~~~~licensing~~~~~~
   storage-cache
   ==========
-  Copyright (C) 2020 - 2024 EmDev LLC
+  Copyright (C) 2020 - 2025 EmDev LLC
   ==========
   You may not use this file except in accordance with the License Terms of the Copyright
   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/pom.xml b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/pom.xml
index 96f35c8d..c480d452 100644
--- a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/pom.xml
+++ b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/pom.xml
@@ -5,7 +5,7 @@
     
         storage-initializer
         ru.entaxy.esb.platform.runtime.core.initializer
-        1.10.0
+        1.11.0
     
 
     ru.entaxy.esb.platform.runtime.core.initializer.storage.initializer
diff --git a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/OSGI-INF/blueprint/camel-contex.xml b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/OSGI-INF/blueprint/camel-contex.xml
index 50fbe8dc..905a7b89 100644
--- a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/OSGI-INF/blueprint/camel-contex.xml
+++ b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/OSGI-INF/blueprint/camel-contex.xml
@@ -3,7 +3,7 @@
   ~~~~~~licensing~~~~~~
   storage-esb_entaxy
   ==========
-  Copyright (C) 2020 - 2024 EmDev LLC
+  Copyright (C) 2020 - 2025 EmDev LLC
   ==========
   You may not use this file except in accordance with the License Terms of the Copyright
   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changelog.xml b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changelog.xml
index 8799f3e7..5883c030 100644
--- a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changelog.xml
+++ b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changelog.xml
@@ -2,7 +2,7 @@
   ~~~~~~licensing~~~~~~
   storage-esb_entaxy
   ==========
-  Copyright (C) 2020 - 2024 EmDev LLC
+  Copyright (C) 2020 - 2025 EmDev LLC
   ==========
   You may not use this file except in accordance with the License Terms of the Copyright
   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/001-storage-table-create.xml b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/001-storage-table-create.xml
index a49f4c75..fff0bbf8 100644
--- a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/001-storage-table-create.xml
+++ b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/001-storage-table-create.xml
@@ -3,7 +3,7 @@
   ~~~~~~licensing~~~~~~
   storage-esb_entaxy
   ==========
-  Copyright (C) 2020 - 2024 EmDev LLC
+  Copyright (C) 2020 - 2025 EmDev LLC
   ==========
   You may not use this file except in accordance with the License Terms of the Copyright
   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/002-service_registry-table-create.xml b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/002-service_registry-table-create.xml
index bc0c758e..a869c039 100644
--- a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/002-service_registry-table-create.xml
+++ b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/002-service_registry-table-create.xml
@@ -3,7 +3,7 @@
   ~~~~~~licensing~~~~~~
   storage-esb_entaxy
   ==========
-  Copyright (C) 2020 - 2024 EmDev LLC
+  Copyright (C) 2020 - 2025 EmDev LLC
   ==========
   You may not use this file except in accordance with the License Terms of the Copyright
   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/003-bundle-table-create.xml b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/003-bundle-table-create.xml
index 9815a306..03efc505 100644
--- a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/003-bundle-table-create.xml
+++ b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/003-bundle-table-create.xml
@@ -3,7 +3,7 @@
   ~~~~~~licensing~~~~~~
   storage-esb_entaxy
   ==========
-  Copyright (C) 2020 - 2024 EmDev LLC
+  Copyright (C) 2020 - 2025 EmDev LLC
   ==========
   You may not use this file except in accordance with the License Terms of the Copyright
   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/004-system-table-create.xml b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/004-system-table-create.xml
index 94569d05..7553c14c 100644
--- a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/004-system-table-create.xml
+++ b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/004-system-table-create.xml
@@ -3,7 +3,7 @@
   ~~~~~~licensing~~~~~~
   storage-esb_entaxy
   ==========
-  Copyright (C) 2020 - 2024 EmDev LLC
+  Copyright (C) 2020 - 2025 EmDev LLC
   ==========
   You may not use this file except in accordance with the License Terms of the Copyright
   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/005-basic_auth_accounts-table-create.xml b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/005-basic_auth_accounts-table-create.xml
index dca20e73..0bf8a79f 100644
--- a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/005-basic_auth_accounts-table-create.xml
+++ b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/005-basic_auth_accounts-table-create.xml
@@ -3,7 +3,7 @@
   ~~~~~~licensing~~~~~~
   storage-esb_entaxy
   ==========
-  Copyright (C) 2020 - 2024 EmDev LLC
+  Copyright (C) 2020 - 2025 EmDev LLC
   ==========
   You may not use this file except in accordance with the License Terms of the Copyright
   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/006-event_topic-table-create.xml b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/006-event_topic-table-create.xml
index fbb6c7e5..23129347 100644
--- a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/006-event_topic-table-create.xml
+++ b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/006-event_topic-table-create.xml
@@ -3,7 +3,7 @@
   ~~~~~~licensing~~~~~~
   storage-esb_entaxy
   ==========
-  Copyright (C) 2020 - 2024 EmDev LLC
+  Copyright (C) 2020 - 2025 EmDev LLC
   ==========
   You may not use this file except in accordance with the License Terms of the Copyright
   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/007-system_subscription_registry-table-create.xml b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/007-system_subscription_registry-table-create.xml
index 1a2e5e00..e42128d4 100644
--- a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/007-system_subscription_registry-table-create.xml
+++ b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/007-system_subscription_registry-table-create.xml
@@ -3,7 +3,7 @@
   ~~~~~~licensing~~~~~~
   storage-esb_entaxy
   ==========
-  Copyright (C) 2020 - 2024 EmDev LLC
+  Copyright (C) 2020 - 2025 EmDev LLC
   ==========
   You may not use this file except in accordance with the License Terms of the Copyright
   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/008-connector-table-create.xml b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/008-connector-table-create.xml
index 3ef01cf0..fdde3a45 100644
--- a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/008-connector-table-create.xml
+++ b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/008-connector-table-create.xml
@@ -3,7 +3,7 @@
   ~~~~~~licensing~~~~~~
   storage-esb_entaxy
   ==========
-  Copyright (C) 2020 - 2024 EmDev LLC
+  Copyright (C) 2020 - 2025 EmDev LLC
   ==========
   You may not use this file except in accordance with the License Terms of the Copyright
   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/009-export-allowed-create-table.xml b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/009-export-allowed-create-table.xml
index c749dad0..27b4ef0a 100644
--- a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/009-export-allowed-create-table.xml
+++ b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/009-export-allowed-create-table.xml
@@ -3,7 +3,7 @@
   ~~~~~~licensing~~~~~~
   storage-esb_entaxy
   ==========
-  Copyright (C) 2020 - 2024 EmDev LLC
+  Copyright (C) 2020 - 2025 EmDev LLC
   ==========
   You may not use this file except in accordance with the License Terms of the Copyright
   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/010-permission-table-create.xml b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/010-permission-table-create.xml
index 08256082..5688ba4b 100644
--- a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/010-permission-table-create.xml
+++ b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/010-permission-table-create.xml
@@ -3,7 +3,7 @@
   ~~~~~~licensing~~~~~~
   storage-esb_entaxy
   ==========
-  Copyright (C) 2020 - 2024 EmDev LLC
+  Copyright (C) 2020 - 2025 EmDev LLC
   ==========
   You may not use this file except in accordance with the License Terms of the Copyright
   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/011-admin-account.xml b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/011-admin-account.xml
index a2ada828..d3a2e91a 100644
--- a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/011-admin-account.xml
+++ b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/011-admin-account.xml
@@ -3,7 +3,7 @@
   ~~~~~~licensing~~~~~~
   storage-esb_entaxy
   ==========
-  Copyright (C) 2020 - 2024 EmDev LLC
+  Copyright (C) 2020 - 2025 EmDev LLC
   ==========
   You may not use this file except in accordance with the License Terms of the Copyright
   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/012-alter-version-on-string.xml b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/012-alter-version-on-string.xml
index dfe7c0c6..f8929a47 100644
--- a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/012-alter-version-on-string.xml
+++ b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/012-alter-version-on-string.xml
@@ -3,7 +3,7 @@
   ~~~~~~licensing~~~~~~
   storage-esb_entaxy
   ==========
-  Copyright (C) 2020 - 2024 EmDev LLC
+  Copyright (C) 2020 - 2025 EmDev LLC
   ==========
   You may not use this file except in accordance with the License Terms of the Copyright
   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/013-admin-topic-permission.xml b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/013-admin-topic-permission.xml
index fe2e9edb..83b912f0 100644
--- a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/013-admin-topic-permission.xml
+++ b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/013-admin-topic-permission.xml
@@ -3,7 +3,7 @@
   ~~~~~~licensing~~~~~~
   storage-esb_entaxy
   ==========
-  Copyright (C) 2020 - 2024 EmDev LLC
+  Copyright (C) 2020 - 2025 EmDev LLC
   ==========
   You may not use this file except in accordance with the License Terms of the Copyright
   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/014-alter-tables-topic-subscription.xml b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/014-alter-tables-topic-subscription.xml
index dda0cefb..f22566f2 100644
--- a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/014-alter-tables-topic-subscription.xml
+++ b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/014-alter-tables-topic-subscription.xml
@@ -3,7 +3,7 @@
   ~~~~~~licensing~~~~~~
   storage-esb_entaxy
   ==========
-  Copyright (C) 2020 - 2024 EmDev LLC
+  Copyright (C) 2020 - 2025 EmDev LLC
   ==========
   You may not use this file except in accordance with the License Terms of the Copyright
   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/015-schema-table-create.xml b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/015-schema-table-create.xml
index 0f4b5470..a093d98a 100644
--- a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/015-schema-table-create.xml
+++ b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/015-schema-table-create.xml
@@ -3,7 +3,7 @@
   ~~~~~~licensing~~~~~~
   storage-esb_entaxy
   ==========
-  Copyright (C) 2020 - 2024 EmDev LLC
+  Copyright (C) 2020 - 2025 EmDev LLC
   ==========
   You may not use this file except in accordance with the License Terms of the Copyright
   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/016-temp-add-permission-to-universal.xml b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/016-temp-add-permission-to-universal.xml
index 89f39aaf..a92683cb 100644
--- a/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/016-temp-add-permission-to-universal.xml
+++ b/platform/runtime/core/initializer/storage-initializer/esb_entaxy/src/main/resources/db/changeset/016-temp-add-permission-to-universal.xml
@@ -3,7 +3,7 @@
   ~~~~~~licensing~~~~~~
   storage-esb_entaxy
   ==========
-  Copyright (C) 2020 - 2024 EmDev LLC
+  Copyright (C) 2020 - 2025 EmDev LLC
   ==========
   You may not use this file except in accordance with the License Terms of the Copyright
   Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/storage-initializer/liquibase-updater/pom.xml b/platform/runtime/core/initializer/storage-initializer/liquibase-updater/pom.xml
index 6bc911a8..1df1b919 100644
--- a/platform/runtime/core/initializer/storage-initializer/liquibase-updater/pom.xml
+++ b/platform/runtime/core/initializer/storage-initializer/liquibase-updater/pom.xml
@@ -3,7 +3,7 @@
     
         storage-initializer
         ru.entaxy.esb.platform.runtime.core.initializer
-        1.10.0
+        1.11.0
     
     4.0.0
 
diff --git a/platform/runtime/core/initializer/storage-initializer/liquibase-updater/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/storage/initializer/liquibase/updater/LiquibaseUpdater.java b/platform/runtime/core/initializer/storage-initializer/liquibase-updater/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/storage/initializer/liquibase/updater/LiquibaseUpdater.java
index 69d431cb..074c4c86 100644
--- a/platform/runtime/core/initializer/storage-initializer/liquibase-updater/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/storage/initializer/liquibase/updater/LiquibaseUpdater.java
+++ b/platform/runtime/core/initializer/storage-initializer/liquibase-updater/src/main/java/ru/entaxy/esb/platform/runtime/core/initializer/storage/initializer/liquibase/updater/LiquibaseUpdater.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * liquibase-updater
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/initializer/storage-initializer/pom.xml b/platform/runtime/core/initializer/storage-initializer/pom.xml
index c61d9943..81b82331 100644
--- a/platform/runtime/core/initializer/storage-initializer/pom.xml
+++ b/platform/runtime/core/initializer/storage-initializer/pom.xml
@@ -3,7 +3,7 @@
     
         ru.entaxy.esb.platform.runtime.core
         initializer
-        1.10.0
+        1.11.0
     
     4.0.0
 
diff --git a/platform/runtime/core/management/cluster-node-management/pom.xml b/platform/runtime/core/management/cluster-node-management/pom.xml
index 5bc04e64..9c8d49d9 100644
--- a/platform/runtime/core/management/cluster-node-management/pom.xml
+++ b/platform/runtime/core/management/cluster-node-management/pom.xml
@@ -3,7 +3,7 @@
   
     ru.entaxy.esb.platform.runtime.core
     management
-    1.10.0
+    1.11.0
   
   ru.entaxy.esb.platform.runtime.core.management
   cluster-node-management
diff --git a/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/Attributes.java b/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/Attributes.java
index a1ec723e..4e8eade5 100644
--- a/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/Attributes.java
+++ b/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/Attributes.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * cluster-node-management
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/ClusterUtils.java b/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/ClusterUtils.java
index 92b5f314..76ff2175 100644
--- a/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/ClusterUtils.java
+++ b/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/ClusterUtils.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * cluster-node-management
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/impl/Activator.java b/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/impl/Activator.java
index 560395c4..2c1d6bc9 100644
--- a/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/impl/Activator.java
+++ b/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/impl/Activator.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * cluster-node-management
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/impl/ClusterLocalNodeDataProviderImpl.java b/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/impl/ClusterLocalNodeDataProviderImpl.java
index 6a7b0ba9..929eeae1 100644
--- a/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/impl/ClusterLocalNodeDataProviderImpl.java
+++ b/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/impl/ClusterLocalNodeDataProviderImpl.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * cluster-node-management
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/impl/ClusterNodeMBeanImpl.java b/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/impl/ClusterNodeMBeanImpl.java
index a92b6845..906f245b 100644
--- a/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/impl/ClusterNodeMBeanImpl.java
+++ b/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/impl/ClusterNodeMBeanImpl.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * cluster-node-management
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/impl/MemberAwareDataProvider.java b/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/impl/MemberAwareDataProvider.java
index cea5a301..55ab19de 100644
--- a/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/impl/MemberAwareDataProvider.java
+++ b/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/impl/MemberAwareDataProvider.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * cluster-node-management
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/impl/MemberMBeanManager.java b/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/impl/MemberMBeanManager.java
index 684cf089..fcd61fcd 100644
--- a/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/impl/MemberMBeanManager.java
+++ b/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/impl/MemberMBeanManager.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * cluster-node-management
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/impl/ServiceHelper.java b/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/impl/ServiceHelper.java
index 6e406d75..583a94eb 100644
--- a/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/impl/ServiceHelper.java
+++ b/platform/runtime/core/management/cluster-node-management/src/main/java/ru/entaxy/esb/platform/core/management/cluster/node/impl/ServiceHelper.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * cluster-node-management
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/management/config-management/LICENSE.txt b/platform/runtime/core/management/config-management/LICENSE.txt
new file mode 100644
index 00000000..4ae94b75
--- /dev/null
+++ b/platform/runtime/core/management/config-management/LICENSE.txt
@@ -0,0 +1,175 @@
+                                 ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ
+
+Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой)
+версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего
+Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН
+7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова,
+д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу
+https://www.emdev.ru/about (далее - Компания).
+
+Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями»
+(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения,
+Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в
+настоящем документе, в противном случае, он должен не использовать или не получать доступ
+к Программному обеспечению.
+
+                                    1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ
+
+a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии
+или редакции, исключительные права на которую принадлежат Правообладателю.
+b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные
+права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ
+для ЭВМ № 2021610848 от 19.01.2021 года.
+c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта
+https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО.
+d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также
+личные неимущественные права авторов произведений на результат интеллектуальной деятельности.
+e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование
+ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка
+включает предоставление Пользователю неисключительного права использования ПО, в том числе
+получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение
+патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается
+Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается
+для каждого Пользователя индивидуально в Сертификате.
+f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром),
+подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное
+обеспечение в ограниченном объёме и на определённый период времени.
+g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО,
+предоставленных Пользователю согласно условиям Подписки.
+h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного
+обеспечения.
+i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий
+из одного или нескольких файлов, который может быть прочтён человеком.
+j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля
+программы, полученный в результате обработки исходного кода, еще не связанный в полную программу.
+Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый
+продукт.
+k) Некоммерческое использование – индивидуальное личное использование Пользователем программного
+обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации
+возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая
+выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения.
+
+                    2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
+
+2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного
+обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом
+воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения
+в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ.
+2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит
+неисключительный характер.
+2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию,
+лицензия на ограниченное использование Программного обеспечения.
+2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования
+имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан
+обратиться в службу поддержки Правообладателя по адресу:  https://entaxy.ru/ для изменения
+вида лицензии с Базовой бесплатной версии на Подписки.
+2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для
+пробного использования программного обеспечения – не ограничен.
+2.6. Использование Пользователем настоящего программного обеспечения в целях разработки,
+модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю,
+без разрешения Правообладателя не допускается.
+
+                                3. АВТОРСКОЕ ПРАВО.
+
+3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение
+и любые его копии принадлежат Правообладателю.
+3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента,
+к которому можно получить доступ с помощью Программного обеспечения, является собственностью
+соответствующего владельца контента и защищается применимым законодательством об авторском
+праве или другими законами и договорами об интеллектуальной собственности.
+3.3. Условия использования Программного обеспечения.
+Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь
+придерживается следующих условий:
+3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять
+какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании
+Программного обеспечения или на нем.
+3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать,
+расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать
+Программное обеспечение.
+3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования
+ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне.
+3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено
+использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам.
+
+                    4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС»
+
+4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю
+на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с
+использованием Пользователем:
+4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в
+Программное обеспечение;
+4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями
+настоящего соглашения;
+4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием,
+или данными, не предоставленными Пользователю Правообладателем;
+4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем.
+
+
+5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ
+ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ
+И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ
+ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ
+И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ
+ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО.
+
+                        6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ.
+НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ
+ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ,
+ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ;
+ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ.
+ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ
+ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ;
+КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ
+ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ.
+
+                        7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ:
+Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия
+(включая, но не ограничиваясь) по:
+-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код)
+ Программного обеспечения;
+-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный
+код Программного обеспечения, за исключением тех изменений, которые вносятся средствами,
+включёнными в Программное обеспечение и описанными непосредственно в документации к нему;
+-созданию условий для использования Программного обеспечения лицами, не имеющими прав на
+использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство
+третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа
+к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку;
+-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию).
+
+                    8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА.
+
+8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из
+лицензионных продуктов, используемых на законных основаниях, а
+именно https://entaxy.ru/libs/licenses/root-aggregated.deps.
+8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть
+совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения.
+8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться
+Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения,
+содержащих все изменения и дополнения программного обеспечения.
+
+                        9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ.
+
+9.1.  Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым
+программным обеспечением.
+9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно
+с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм
+«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public.
+9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий
+пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя,
+прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер
+ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства
+Российской Федерации.
+
+                                10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ.
+
+10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет
+право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб,
+недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий
+пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере
+2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения
+исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy).
+10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое
+законодательство – Российской Федерации.
+10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным,
+остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать
+исполнять свои обязанности в соответствии с этими положениями.
diff --git a/platform/runtime/core/management/config-management/pom.xml b/platform/runtime/core/management/config-management/pom.xml
new file mode 100644
index 00000000..d25ab6c4
--- /dev/null
+++ b/platform/runtime/core/management/config-management/pom.xml
@@ -0,0 +1,38 @@
+
+  4.0.0
+  
+    ru.entaxy.esb.platform.runtime.core
+    management
+    1.11.0
+  
+  ru.entaxy.esb.platform.runtime.core.management
+  config-management
+  bundle
+
+  ENTAXY :: PLATFORM :: RUNTIME :: CORE :: MANAGEMENT :: CONFIG MANAGEMENT
+  ENTAXY :: PLATFORM :: RUNTIME :: CORE :: MANAGEMENT :: CONFIG MANAGEMENT
+  
+  
+	  ru.entaxy.platform.config.management
+	  ru.entaxy.platform.config.management.impl
+  
+  
+  
+	  	
+	  		ru.entaxy.esb.platform.runtime.base
+	  		management-core
+	  		${project.version}
+	  	
+		
+			ru.entaxy.esb.platform.runtime.core.management
+			object-management
+			${project.version}
+		
+		
+		ru.entaxy.esb.platform.runtime.core.objects-implementations.config-implementation
+			config-runtime
+			${project.version}
+	  		  	
+  
+  
+
diff --git a/platform/runtime/core/management/config-management/src/main/java/ru/entaxy/platform/config/management/ConfigMBean.java b/platform/runtime/core/management/config-management/src/main/java/ru/entaxy/platform/config/management/ConfigMBean.java
new file mode 100644
index 00000000..86dd5e1b
--- /dev/null
+++ b/platform/runtime/core/management/config-management/src/main/java/ru/entaxy/platform/config/management/ConfigMBean.java
@@ -0,0 +1,43 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * config-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.config.management;
+
+import ru.entaxy.esb.platform.base.management.core.api.Attribute;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanAnnotated;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanExportPolicy;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBean;
+
+@MBeanAnnotated(policy = MBeanExportPolicy.ANNOTATED_ONLY)
+public interface ConfigMBean extends EntaxyRuntimeObjectMBean {
+
+    String SUBQUALIFIER_KEY = "config";
+
+    @Attribute(desc = "Configuration PID")
+    default String getPid() {
+        return getObjectId();
+    }
+
+}
diff --git a/platform/runtime/core/management/config-management/src/main/java/ru/entaxy/platform/config/management/ConfigsMBean.java b/platform/runtime/core/management/config-management/src/main/java/ru/entaxy/platform/config/management/ConfigsMBean.java
new file mode 100644
index 00000000..b31dbe52
--- /dev/null
+++ b/platform/runtime/core/management/config-management/src/main/java/ru/entaxy/platform/config/management/ConfigsMBean.java
@@ -0,0 +1,44 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * config-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.config.management;
+
+import ru.entaxy.esb.platform.base.management.core.ManagementCore;
+import ru.entaxy.esb.platform.base.management.core.Qualifier;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanAnnotated;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanExportPolicy;
+import ru.entaxy.platform.config.runtime.ObjectConfig;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectContainerMBean;
+
+@MBeanAnnotated(policy = MBeanExportPolicy.ANNOTATED_ONLY)
+public interface ConfigsMBean extends EntaxyRuntimeObjectContainerMBean {
+
+    String CONFIG_RUNTIME_TYPE = ObjectConfig.CONFIG_OBJECT_TYPE;
+
+    Qualifier QUALIFIER = ManagementCore.Q_RUNTIME.qualifier("category", "configs");
+
+    String SUBQUALIFIER = QUALIFIER.getValue().substring(ManagementCore.Q_RUNTIME.getValue().length() + 1);
+
+}
diff --git a/platform/runtime/core/management/config-management/src/main/java/ru/entaxy/platform/config/management/ObjectConfigMBean.java b/platform/runtime/core/management/config-management/src/main/java/ru/entaxy/platform/config/management/ObjectConfigMBean.java
new file mode 100644
index 00000000..a18c3109
--- /dev/null
+++ b/platform/runtime/core/management/config-management/src/main/java/ru/entaxy/platform/config/management/ObjectConfigMBean.java
@@ -0,0 +1,40 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * config-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.config.management;
+
+import ru.entaxy.esb.platform.base.management.core.api.Attribute;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanAnnotated;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanExportPolicy;
+
+@MBeanAnnotated(policy = MBeanExportPolicy.ANNOTATED_ONLY)
+public interface ObjectConfigMBean extends ConfigMBean {
+
+    @Attribute(desc = "Target object being configured by this config")
+    default String getTarget() {
+        return getRuntimeObject().getAttributeOrDefault("target", "").toString();
+    }
+
+}
diff --git a/platform/runtime/core/management/config-management/src/main/java/ru/entaxy/platform/config/management/impl/ConfigMBeanFactory.java b/platform/runtime/core/management/config-management/src/main/java/ru/entaxy/platform/config/management/impl/ConfigMBeanFactory.java
new file mode 100644
index 00000000..3f1d394d
--- /dev/null
+++ b/platform/runtime/core/management/config-management/src/main/java/ru/entaxy/platform/config/management/impl/ConfigMBeanFactory.java
@@ -0,0 +1,72 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * config-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.config.management.impl;
+
+import java.util.Collections;
+import java.util.List;
+
+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;
+
+import ru.entaxy.platform.config.management.ConfigsMBean;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeItemMBean;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBean;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBeanFactory;
+import ru.entaxy.platform.core.management.object.MBeanFactory;
+import ru.entaxy.platform.core.management.object.factory.AbstractMBeanFactory;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+
+@MBeanFactory(id = "vaults-factory", supportedTypes = {ConfigsMBean.CONFIG_RUNTIME_TYPE})
+@Component(service = EntaxyRuntimeObjectMBeanFactory.class, immediate = true)
+public class ConfigMBeanFactory extends AbstractMBeanFactory {
+
+    private static final Logger LOG = LoggerFactory.getLogger(ConfigMBeanFactory.class);
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    ConfigsMBeanImpl configsMBean;
+
+    @Override
+    public  T createMBean(EntaxyRuntimeObject entaxyRuntimeObject) {
+        try {
+            if (entaxyRuntimeObject.getIncomiingSubordRelations().isEmpty())
+                return (T) new ConfigMBeanImpl(entaxyRuntimeObject);
+            else
+                return (T) new ObjectConfigMBeanImpl(entaxyRuntimeObject);
+        } catch (Exception e) {
+            LOG.error("Error creating MBean for [" + entaxyRuntimeObject.getObjectFullId() + "]", e);
+        }
+        return null;
+    }
+
+    @Override
+    public List createMBeans() {
+        return Collections.singletonList(configsMBean);
+    }
+
+}
diff --git a/platform/runtime/core/management/config-management/src/main/java/ru/entaxy/platform/config/management/impl/ConfigMBeanImpl.java b/platform/runtime/core/management/config-management/src/main/java/ru/entaxy/platform/config/management/impl/ConfigMBeanImpl.java
new file mode 100644
index 00000000..8adb0501
--- /dev/null
+++ b/platform/runtime/core/management/config-management/src/main/java/ru/entaxy/platform/config/management/impl/ConfigMBeanImpl.java
@@ -0,0 +1,63 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * config-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.config.management.impl;
+
+import javax.management.NotCompliantMBeanException;
+
+import ru.entaxy.esb.platform.base.management.core.Qualifier;
+import ru.entaxy.esb.platform.base.management.core.api.EntaxyRuntimeTyped;
+import ru.entaxy.platform.config.management.ConfigMBean;
+import ru.entaxy.platform.config.management.ConfigsMBean;
+import ru.entaxy.platform.core.management.object.ObjectMBean;
+import ru.entaxy.platform.core.management.object.factory.AbstractObjectMBean;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+
+@EntaxyRuntimeTyped(name = ConfigsMBean.CONFIG_RUNTIME_TYPE)
+@ObjectMBean(subQualifierName = ConfigMBean.SUBQUALIFIER_KEY)
+public class ConfigMBeanImpl extends AbstractObjectMBean
+        implements ConfigMBean {
+
+    public ConfigMBeanImpl(EntaxyRuntimeObject entaxyRuntimeObject)
+            throws NotCompliantMBeanException {
+        super((Class) ConfigMBean.class, entaxyRuntimeObject);
+    }
+
+    protected ConfigMBeanImpl(Class mbeanInterface, EntaxyRuntimeObject entaxyRuntimeObject)
+            throws NotCompliantMBeanException {
+        super(mbeanInterface, entaxyRuntimeObject);
+    }
+
+    @Override
+    public Qualifier getJMXQualifier() {
+        return ConfigsMBean.QUALIFIER.qualifier(ConfigMBean.SUBQUALIFIER_KEY, getObjectId());
+    }
+
+    @Override
+    public String getJMXSubQualifier() {
+        return ConfigMBean.SUBQUALIFIER_KEY.concat("=")
+                .concat(getObjectId());
+    }
+}
diff --git a/platform/runtime/core/management/config-management/src/main/java/ru/entaxy/platform/config/management/impl/ConfigsMBeanImpl.java b/platform/runtime/core/management/config-management/src/main/java/ru/entaxy/platform/config/management/impl/ConfigsMBeanImpl.java
new file mode 100644
index 00000000..e5247326
--- /dev/null
+++ b/platform/runtime/core/management/config-management/src/main/java/ru/entaxy/platform/config/management/impl/ConfigsMBeanImpl.java
@@ -0,0 +1,56 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * config-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.config.management.impl;
+
+import javax.management.NotCompliantMBeanException;
+
+import org.osgi.service.component.annotations.Component;
+
+import ru.entaxy.esb.platform.base.management.core.Qualifier;
+import ru.entaxy.platform.config.management.ConfigsMBean;
+import ru.entaxy.platform.core.management.object.ContainerMBean;
+import ru.entaxy.platform.core.management.object.factory.AbstractObjectContainerMBean;
+
+@Component(service = ConfigsMBeanImpl.class, immediate = true)
+@ContainerMBean(id = "configs", subQualifierValue = "configs")
+public class ConfigsMBeanImpl extends AbstractObjectContainerMBean
+        implements ConfigsMBean {
+
+    public ConfigsMBeanImpl() throws NotCompliantMBeanException {
+        super(ConfigsMBean.class);
+    }
+
+    @Override
+    public Qualifier getJMXQualifier() {
+        return ConfigsMBean.QUALIFIER;
+    }
+
+    @Override
+    public String getJMXSubQualifier() {
+        return ConfigsMBean.SUBQUALIFIER;
+    }
+
+}
diff --git a/platform/runtime/core/management/config-management/src/main/java/ru/entaxy/platform/config/management/impl/ObjectConfigMBeanImpl.java b/platform/runtime/core/management/config-management/src/main/java/ru/entaxy/platform/config/management/impl/ObjectConfigMBeanImpl.java
new file mode 100644
index 00000000..f6896615
--- /dev/null
+++ b/platform/runtime/core/management/config-management/src/main/java/ru/entaxy/platform/config/management/impl/ObjectConfigMBeanImpl.java
@@ -0,0 +1,44 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * config-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.config.management.impl;
+
+import javax.management.NotCompliantMBeanException;
+
+import ru.entaxy.platform.config.management.ObjectConfigMBean;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+
+public class ObjectConfigMBeanImpl extends ConfigMBeanImpl implements ObjectConfigMBean {
+
+    public ObjectConfigMBeanImpl(EntaxyRuntimeObject entaxyRuntimeObject) throws NotCompliantMBeanException {
+        super(ObjectConfigMBean.class, entaxyRuntimeObject);
+    }
+
+    @Override
+    public String getParentSubPath() {
+        return "";
+    }
+
+}
diff --git a/platform/runtime/core/management/connection-management/pom.xml b/platform/runtime/core/management/connection-management/pom.xml
index b955f59d..0b8fe084 100644
--- a/platform/runtime/core/management/connection-management/pom.xml
+++ b/platform/runtime/core/management/connection-management/pom.xml
@@ -5,7 +5,7 @@
     
         ru.entaxy.esb.platform.runtime.core
         management
-        1.10.0
+        1.11.0
     
 
     ru.entaxy.esb.platform.runtime.core.management
diff --git a/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/ConnectionMBean.java b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/ConnectionMBean.java
new file mode 100644
index 00000000..e941c430
--- /dev/null
+++ b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/ConnectionMBean.java
@@ -0,0 +1,76 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * connection-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.platform.core.management.connection.to_remove;
+
+import ru.entaxy.esb.platform.base.management.core.api.RuntimeTypedMBean;
+
+public interface ConnectionMBean extends RuntimeTypedMBean {
+	
+	public static final String CONNECTION_KEY = "connection";
+	
+	/*
+	 * connection name
+	 */
+	public String getName();
+	
+	/*
+	 * if connection is platform one or user defined
+	 */
+	public boolean isPlatform();
+	
+	/*
+	 * status of the bundle if connection is deplyed
+	 */
+	public String getStatus();
+	
+	/*
+	 * if the connection local or shared (cluster)
+	 */
+	public boolean isLocal();
+	
+	/*
+	 * if the connection is shared (single malt)
+	 * or prototype-like (blended)
+	 */
+	public boolean isShared();
+	
+	/*
+	 * if the connection is deployed or only defined
+	 */
+	public boolean isDeployed();
+	
+	/*
+	 * bundle id for single malt connection
+	 * null for blended
+	 */
+	public String getBundleId();
+
+	/*
+	 * connection label
+	 */
+	public String getLabel();
+	
+}
diff --git a/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/ConnectionsMBean.java b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/ConnectionsMBean.java
new file mode 100644
index 00000000..82f53813
--- /dev/null
+++ b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/ConnectionsMBean.java
@@ -0,0 +1,46 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * connection-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.platform.core.management.connection.to_remove;
+
+import ru.entaxy.esb.platform.base.management.core.api.MBeanAnnotated;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanExportPolicy;
+import ru.entaxy.esb.platform.base.management.core.api.Operation;
+import ru.entaxy.esb.platform.base.management.core.api.Parameter;
+
+@MBeanAnnotated(policy = MBeanExportPolicy.ANNOTATION_ENRICH)
+public interface ConnectionsMBean {
+	
+	public static final String CAPABILITY_NAMESPACE = "entaxy.runtime.connection";
+	
+	public static final String CONNECTIONS_KEY = "category";
+	
+	public static final String CONNECTIONS_KEY_VALUE = "connections";
+
+	@Operation(desc = "Gets connection's configuration")
+	public String getConnectionConfig(
+			@Parameter(name = "connectionName", desc = "Connection name") String connectionName) throws Exception;
+
+}
diff --git a/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/impl/ConnectionMBeanImpl.java b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/impl/ConnectionMBeanImpl.java
new file mode 100644
index 00000000..e2d929a4
--- /dev/null
+++ b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/impl/ConnectionMBeanImpl.java
@@ -0,0 +1,105 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * connection-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.platform.core.management.connection.to_remove.impl;
+
+import javax.management.NotCompliantMBeanException;
+import javax.management.StandardMBean;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+
+import ru.entaxy.esb.platform.base.management.core.api.EntaxyRuntimeTyped;
+import ru.entaxy.esb.platform.core.management.connection.to_remove.ConnectionMBean;
+
+//@TODO move string to constant
+@EntaxyRuntimeTyped(name = "entaxy.runtime.connection")
+public class ConnectionMBeanImpl extends StandardMBean implements ConnectionMBean {
+
+	protected ManagedConnection connection;
+	
+	protected BundleContext bundleContext;
+	
+	public ConnectionMBeanImpl(BundleContext bundleContext, ManagedConnection connection) throws NotCompliantMBeanException {
+		super(ConnectionMBean.class);
+		this.bundleContext = bundleContext;
+		this.connection = connection;
+	}
+
+	@Override
+	public String getName() {
+		return connection.getName();
+	}
+
+	@Override
+	public boolean isPlatform() {
+		return connection.isPlatform();
+	}
+
+	@Override
+	public String getStatus() {
+		int state = this.bundleContext.getBundle(connection.getBundleId()).getState();
+		switch (state) {
+		case Bundle.ACTIVE:
+			return "Active";
+		case Bundle.INSTALLED:
+			return "Installed";
+		case Bundle.RESOLVED:
+			return "Resolved";
+		case Bundle.STARTING:
+			return "Starting";
+		case Bundle.STOPPING:
+			return "Stopping";
+		default:
+			return "Unknown";
+		}
+	}
+
+	@Override
+	public boolean isLocal() {
+		return connection.isLocal;
+	}
+
+	@Override
+	public boolean isShared() {
+		return connection.isShared();
+	}
+	
+	@Override
+	public boolean isDeployed() {
+		return connection.isDeployed;
+	}
+
+	@Override
+	public String getBundleId() {
+		return connection.getBundleId() + "";
+	}
+
+	@Override
+	public String getLabel() {
+		return connection.getLabel();
+	}
+	
+}
diff --git a/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/impl/ConnectionsMBeanImpl.java b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/impl/ConnectionsMBeanImpl.java
new file mode 100644
index 00000000..10170abf
--- /dev/null
+++ b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/impl/ConnectionsMBeanImpl.java
@@ -0,0 +1,145 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * connection-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.platform.core.management.connection.to_remove.impl;
+
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Map;
+
+import javax.management.NotCompliantMBeanException;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import ru.entaxy.esb.platform.base.management.core.ManagementCore;
+import ru.entaxy.esb.platform.base.management.core.Qualifier;
+import ru.entaxy.esb.platform.base.management.core.api.AnnotatedMBean;
+import ru.entaxy.esb.platform.core.management.connection.to_remove.ConnectionMBean;
+import ru.entaxy.esb.platform.core.management.connection.to_remove.ConnectionsMBean;
+import ru.entaxy.esb.platform.core.management.connection.to_remove.tracker.DeployedConnectionTracker;
+import ru.entaxy.platform.base.objects.EntaxyObjectService;
+
+/*
+
+@Component(
+		service = {ConnectionsMBean.class, DynamicMBean.class, MBeanRegistration.class},
+		property = {ManagementCore.JMX_OBJECTNAME 
+				+ "=" + ManagementCore.Q_RUNTIME_S  
+				+ "," + ConnectionsMBean.CONNECTIONS_KEY
+				+ "=" + ConnectionsMBean.CONNECTIONS_KEY_VALUE},
+		scope = ServiceScope.SINGLETON,
+		immediate = true		
+		)
+*/
+
+
+public class ConnectionsMBeanImpl extends AnnotatedMBean
+		implements ConnectionsMBean, ManagedConnectionsListener {
+
+	private static final Logger log = LoggerFactory.getLogger(ConnectionsMBeanImpl.class);
+	
+	public static final Qualifier Q_CONNECTIONS = ManagementCore.Q_RUNTIME
+			.qualifier(ConnectionsMBean.CONNECTIONS_KEY, ConnectionsMBean.CONNECTIONS_KEY_VALUE); 
+	
+	protected BundleContext bundleContext;
+	
+	protected DeployedConnectionTracker tracker;
+
+	@Reference(cardinality = ReferenceCardinality.MANDATORY)
+	EntaxyObjectService entaxyObjectService;
+
+	protected static class ManagedConnectionDescriptor {
+		
+		ManagedConnection connection;
+		ServiceRegistration registration;
+		
+	}
+	
+	protected Map managed = new HashMap<>();
+	
+	public ConnectionsMBeanImpl() throws NotCompliantMBeanException {
+		super(ConnectionsMBean.class);
+	}
+	
+	@Activate
+	public void activate(ComponentContext componentContext) {
+		this.bundleContext = componentContext.getBundleContext();
+		tracker = new DeployedConnectionTracker(bundleContext, this);
+		tracker.open();
+	}
+
+	@Deactivate
+	public void deactivate() {
+		tracker.close();
+	}
+	
+	@Override
+	public void added(ManagedConnections connections) {
+		Hashtable props = new Hashtable<>();
+		// String jmxObjectName = "jmx.objectname";
+		// String objectName = "ru.entaxy.esb:group=platform,category=connections,connection=";
+		for (ManagedConnection connection: connections.managedConnections) {
+			if (managed.containsKey(connection.getName()))
+				this.managed.get(connection.getName()).registration.unregister();
+			try {
+				ConnectionMBeanImpl service = new ConnectionMBeanImpl(bundleContext, connection);
+				ManagedConnectionDescriptor descriptor = new ManagedConnectionDescriptor();
+				descriptor.connection = connection;
+				props.put(ManagementCore.JMX_OBJECTNAME
+						, Q_CONNECTIONS.qualifier(ConnectionMBean.CONNECTION_KEY
+								, connection.getName()).getValue());
+				descriptor.registration = bundleContext.registerService(ConnectionMBean.class
+						, service
+						, props);
+				managed.put(connection.getName(), descriptor);
+			} catch (Exception e) {
+				log.error("Error adding connection [" + connection.getName() + "]", e);
+			}
+		}
+	}
+	
+	@Override
+	public void removed(ManagedConnections connections) {
+		for (ManagedConnection connection: connections.managedConnections) {
+			if (managed.containsKey(connection.getName())) {
+				this.managed.get(connection.getName()).registration.unregister();
+				this.managed.remove(connection.getName());
+			}
+		}
+	}
+
+    @Override
+    public String getConnectionConfig(String connectionName) throws Exception {
+        return entaxyObjectService.findObject(connectionName, "entaxy.runtime.connection").getConfiguration();
+    }
+}
diff --git a/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/impl/ManagedConnection.java b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/impl/ManagedConnection.java
new file mode 100644
index 00000000..6eaae26f
--- /dev/null
+++ b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/impl/ManagedConnection.java
@@ -0,0 +1,116 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * connection-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.platform.core.management.connection.to_remove.impl;
+
+public class ManagedConnection {
+	
+	protected String name;
+	protected boolean isPlatform;
+	protected boolean isLocal;
+	protected boolean isShared;
+	protected long bundleId;
+	protected boolean isDeployed;
+	protected String label;
+	
+	public String getName() {
+		return name;
+	}
+	public boolean isPlatform() {
+		return isPlatform;
+	}
+	public boolean isLocal() {
+		return isLocal;
+	}
+	public boolean isShared() {
+		return isShared;
+	}
+	public long getBundleId() {
+		return bundleId;
+	}
+	public boolean isDeployed() {
+		return isDeployed;
+	}
+	public String getLabel() {
+		return label;
+	}
+	
+	public void setName(String name) {
+		this.name = name;
+	}
+	public void setPlatform(boolean isPlatform) {
+		this.isPlatform = isPlatform;
+	}
+	public void setLocal(boolean isLocal) {
+		this.isLocal = isLocal;
+	}
+	public void setShared(boolean isShared) {
+		this.isShared = isShared;
+	}
+	public void setBundleId(long bundleId) {
+		this.bundleId = bundleId;
+	}
+	public void setDeployed(boolean isDeployed) {
+		this.isDeployed = isDeployed;
+	}
+	public void setLabel(String label) {
+		this.label = label;
+	}
+	
+	public ManagedConnection name(String name) {
+		setName(name);
+		return this;
+	}
+	
+	public ManagedConnection platform(boolean isPlatform) {
+		setPlatform(isPlatform);
+		return this;
+	}
+	
+	public ManagedConnection local(boolean isLocal) {
+		setLocal(isLocal);
+		return this;
+	}
+
+	public ManagedConnection shared(boolean isShared) {
+		setShared(isShared);
+		return this;
+	}
+	
+	public ManagedConnection bundleId(long bundleId) {
+		setBundleId(bundleId);
+		return this;
+	}
+	
+	public ManagedConnection deployed(boolean deployed) {
+		setDeployed(deployed);
+		return this;
+	}
+
+	public ManagedConnection label(String label) {
+		setLabel(label);
+		return this;
+	}
+}
diff --git a/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/impl/ManagedConnections.java b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/impl/ManagedConnections.java
new file mode 100644
index 00000000..7c8cfc15
--- /dev/null
+++ b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/impl/ManagedConnections.java
@@ -0,0 +1,35 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * connection-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.platform.core.management.connection.to_remove.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ManagedConnections {
+
+	public List managedConnections = new ArrayList<>();
+	
+}
diff --git a/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/impl/ManagedConnectionsListener.java b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/impl/ManagedConnectionsListener.java
new file mode 100644
index 00000000..64171a22
--- /dev/null
+++ b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/impl/ManagedConnectionsListener.java
@@ -0,0 +1,33 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * connection-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.platform.core.management.connection.to_remove.impl;
+
+public interface ManagedConnectionsListener {
+
+	public void added(ManagedConnections connections);
+	public void removed(ManagedConnections connections);
+	
+}
diff --git a/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/tracker/DeployedConnectionCustomizer.java b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/tracker/DeployedConnectionCustomizer.java
new file mode 100644
index 00000000..5ce46ec3
--- /dev/null
+++ b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/tracker/DeployedConnectionCustomizer.java
@@ -0,0 +1,102 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * connection-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.platform.core.management.connection.to_remove.tracker;
+
+import java.util.List;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.wiring.BundleCapability;
+import org.osgi.framework.wiring.BundleRevision;
+import org.osgi.util.tracker.BundleTrackerCustomizer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import ru.entaxy.esb.platform.core.management.connection.to_remove.ConnectionsMBean;
+import ru.entaxy.esb.platform.core.management.connection.to_remove.impl.ManagedConnection;
+import ru.entaxy.esb.platform.core.management.connection.to_remove.impl.ManagedConnections;
+import ru.entaxy.esb.platform.core.management.connection.to_remove.impl.ManagedConnectionsListener;
+import ru.entaxy.platform.base.support.CommonUtils;
+
+public class DeployedConnectionCustomizer implements BundleTrackerCustomizer {
+
+	private static final Logger log = LoggerFactory.getLogger(DeployedConnectionCustomizer.class);
+	
+	protected ManagedConnectionsListener listener;
+	
+	public DeployedConnectionCustomizer(ManagedConnectionsListener listener) {
+		this.listener = listener;
+	}
+	
+	@Override
+	public ManagedConnections addingBundle(Bundle bundle, BundleEvent event) {
+		log.debug("INSPECTING: " + bundle.getBundleId());
+		BundleRevision revision = bundle.adapt(BundleRevision.class);
+		if (revision == null)
+			return null;
+		log.debug("REVISION FOUND: " + bundle.getBundleId());
+		List capabilities = revision.getDeclaredCapabilities(ConnectionsMBean.CAPABILITY_NAMESPACE);
+		if ((capabilities==null) || (capabilities.size()==0))
+			return null;
+		log.debug("CAPABILITIES FOUND: " + bundle.getBundleId());
+		ManagedConnections result = new ManagedConnections();
+		for (BundleCapability capability: capabilities) {
+			Object val = capability.getAttributes().get("name");
+			String name = val==null?"":val.toString();
+			log.debug("CAPABILITIES/NAME [" + name + "] : " + bundle.getBundleId());
+			if (!CommonUtils.isValid(name))
+				continue;
+			val = capability.getAttributes().get("platform");
+			boolean isPlatform = val==null?false:"true".equals(val.toString());
+			val = capability.getAttributes().get("label");
+			String label = val == null ? "" : val.toString();
+			ManagedConnection mc = (new ManagedConnection())
+					.name(name)
+					.platform(isPlatform)
+					.deployed(true)
+					.local(isPlatform)
+					.shared(true)
+					.bundleId(bundle.getBundleId())
+					.label(label);
+			result.managedConnections.add(mc);
+		}
+		listener.added(result);
+		return result;
+	}
+
+	@Override
+	public void modifiedBundle(Bundle bundle, BundleEvent event, ManagedConnections object) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void removedBundle(Bundle bundle, BundleEvent event, ManagedConnections object) {
+		log.debug("BUNDLE [{}] REMOVING", bundle.getBundleId());
+		listener.removed(object);
+	}
+
+}
diff --git a/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/tracker/DeployedConnectionTracker.java b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/tracker/DeployedConnectionTracker.java
new file mode 100644
index 00000000..2e771d01
--- /dev/null
+++ b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/esb/platform/core/management/connection/to_remove/tracker/DeployedConnectionTracker.java
@@ -0,0 +1,43 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * connection-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.platform.core.management.connection.to_remove.tracker;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.BundleTracker;
+
+import ru.entaxy.esb.platform.core.management.connection.to_remove.impl.ManagedConnections;
+import ru.entaxy.esb.platform.core.management.connection.to_remove.impl.ManagedConnectionsListener;
+
+public class DeployedConnectionTracker extends BundleTracker {
+
+	public DeployedConnectionTracker(BundleContext bundleContext, ManagedConnectionsListener listener) {
+		super(bundleContext
+				, Bundle.ACTIVE | Bundle.INSTALLED | Bundle.RESOLVED | Bundle.STARTING | Bundle.STOPPING
+				, new DeployedConnectionCustomizer(listener));
+	}
+	
+}
diff --git a/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/ConnectionMBean.java b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/ConnectionMBean.java
new file mode 100644
index 00000000..43192e2b
--- /dev/null
+++ b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/ConnectionMBean.java
@@ -0,0 +1,85 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * connection-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.connection;
+
+import ru.entaxy.esb.platform.base.management.core.api.Attribute;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanAnnotated;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanExportPolicy;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBean;
+
+@MBeanAnnotated(policy = MBeanExportPolicy.ANNOTATED_ONLY)
+public interface ConnectionMBean extends EntaxyRuntimeObjectMBean {
+
+    public static final String CONNECTION_KEY = "connection";
+
+    /*
+     * connection name
+     */
+    @Attribute
+    default String getName() {
+        return getObjectId();
+    };
+
+    /*
+     * if connection is platform one or user defined
+     */
+    @Attribute
+    public boolean isPlatform();
+
+    /*
+     * status of the bundle if connection is deplyed
+     */
+    @Attribute
+    public String getStatus();
+
+    /*
+     * if the connection local or shared (cluster)
+     */
+    @Attribute
+    public boolean isLocal();
+
+    /*
+     * if the connection is shared (single malt) or prototype-like (blended)
+     */
+    @Attribute
+    public boolean isShared();
+
+    /*
+     * if the connection is deployed or only defined
+     */
+    @Attribute
+    public boolean isDeployed();
+
+    /*
+     * connection label
+     */
+    @Deprecated(since = "1.10", forRemoval = true)
+    @Attribute
+    default String getLabel() {
+        return getObjectLabel();
+    };
+
+}
diff --git a/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/ConnectionsMBean.java b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/ConnectionsMBean.java
new file mode 100644
index 00000000..fbcd17e0
--- /dev/null
+++ b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/ConnectionsMBean.java
@@ -0,0 +1,59 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * connection-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.connection;
+
+import ru.entaxy.esb.platform.base.management.core.api.MBeanAnnotated;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanExportPolicy;
+import ru.entaxy.esb.platform.base.management.core.api.Operation;
+import ru.entaxy.esb.platform.base.management.core.api.Parameter;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectContainerMBean;
+
+@MBeanAnnotated(policy = MBeanExportPolicy.ANNOTATED_ONLY)
+public interface ConnectionsMBean extends EntaxyRuntimeObjectContainerMBean {
+
+    public static final String CONNECTION_TYPE = "entaxy.runtime.connection";
+
+    public static final String CONNECTIONS_KEY = "category";
+
+    public static final String CONNECTIONS_KEY_VALUE = "connections";
+
+    @Operation(desc = "Gets connection's configuration")
+    public String getConnectionConfig(
+            @Parameter(name = "connectionName", desc = "Connection name") String connectionName) throws Exception;
+
+    @Operation(desc = "Start connection")
+    void startConnection(
+            @Parameter(name = "idOrName", desc = "Id or name of the connection") String idOrName) throws Exception;
+
+    @Operation(desc = "Stop connection")
+    void stopConnection(
+            @Parameter(name = "idOrName", desc = "Id or name of the connection") String idOrName) throws Exception;
+
+    @Operation(desc = "Uninstall connection")
+    void uninstallConnection(
+            @Parameter(name = "idOrName", desc = "Id or name of the connection") String idOrName) throws Exception;
+
+}
diff --git a/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/impl/ConnectionMBeanFactory.java b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/impl/ConnectionMBeanFactory.java
new file mode 100644
index 00000000..69e2cace
--- /dev/null
+++ b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/impl/ConnectionMBeanFactory.java
@@ -0,0 +1,75 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * connection-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.connection.impl;
+
+import java.util.Collections;
+import java.util.List;
+
+import javax.management.NotCompliantMBeanException;
+
+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.ReferencePolicyOption;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeItemMBean;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBean;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBeanFactory;
+import ru.entaxy.platform.core.management.object.MBeanFactory;
+import ru.entaxy.platform.core.management.object.factory.AbstractMBeanFactory;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+
+
+@MBeanFactory(id = "connection-factory", supportedTypes = {"entaxy.runtime.connection", "entaxy.runtime.connection.*"})
+@Component(service = EntaxyRuntimeObjectMBeanFactory.class, immediate = true)
+public class ConnectionMBeanFactory extends AbstractMBeanFactory {
+
+    private static final Logger log = LoggerFactory.getLogger(ConnectionMBeanFactory.class);
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY, policyOption = ReferencePolicyOption.GREEDY)
+    ConnectionsMBeanImpl connectionsMBean;
+
+    @Override
+    public  T createMBean(EntaxyRuntimeObject entaxyRuntimeObject) {
+        ConnectionMBeanImpl beanImpl;
+        try {
+            beanImpl = new ConnectionMBeanImpl(entaxyRuntimeObject);
+            beanImpl.setParentMBean(connectionsMBean);
+        } catch (NotCompliantMBeanException e) {
+            log.error("Error creating ProfileMBeanImpl for [" + entaxyRuntimeObject.getObjectFullId() + "]", e);
+            return null;
+        }
+        return (T) beanImpl;
+    }
+
+    @Override
+    public List createMBeans() {
+        return Collections.singletonList(connectionsMBean);
+    }
+
+}
diff --git a/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/impl/ConnectionMBeanImpl.java b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/impl/ConnectionMBeanImpl.java
new file mode 100644
index 00000000..d616abb8
--- /dev/null
+++ b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/impl/ConnectionMBeanImpl.java
@@ -0,0 +1,76 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * connection-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.connection.impl;
+
+import javax.management.NotCompliantMBeanException;
+
+import ru.entaxy.esb.platform.base.management.core.api.EntaxyRuntimeTyped;
+import ru.entaxy.platform.core.management.connection.ConnectionMBean;
+import ru.entaxy.platform.core.management.object.ObjectMBean;
+import ru.entaxy.platform.core.management.object.factory.AbstractObjectMBean;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+
+// @TODO move string to constant
+@EntaxyRuntimeTyped(name = "entaxy.runtime.connection")
+@ObjectMBean(subQualifierName = "connection")
+public class ConnectionMBeanImpl extends AbstractObjectMBean implements ConnectionMBean {
+
+    public ConnectionMBeanImpl(EntaxyRuntimeObject entaxyRuntimeObject)
+            throws NotCompliantMBeanException {
+        super(ConnectionMBean.class, entaxyRuntimeObject);
+    }
+
+    @Override
+    public String getJMXSubQualifierValue() {
+        return getObjectId();
+    }
+
+    @Override
+    public boolean isPlatform() {
+        return entaxyRuntimeObject.getAttributeOrDefault("platform", "false").toString().equals("true");
+    }
+
+    @Override
+    public String getStatus() {
+        return getBundleState();
+    }
+
+    @Override
+    public boolean isLocal() {
+        return isPlatform();
+    }
+
+    @Override
+    public boolean isShared() {
+        return true;
+    }
+
+    @Override
+    public boolean isDeployed() {
+        return true;
+    }
+
+}
diff --git a/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/impl/ConnectionsMBeanImpl.java b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/impl/ConnectionsMBeanImpl.java
new file mode 100644
index 00000000..6b04eaa5
--- /dev/null
+++ b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/impl/ConnectionsMBeanImpl.java
@@ -0,0 +1,108 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * connection-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.connection.impl;
+
+import javax.management.NotCompliantMBeanException;
+
+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.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ServiceScope;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import ru.entaxy.esb.platform.base.management.core.ManagementCore;
+import ru.entaxy.esb.platform.base.management.core.Qualifier;
+import ru.entaxy.platform.base.objects.EntaxyObjectService;
+import ru.entaxy.platform.core.management.connection.ConnectionsMBean;
+import ru.entaxy.platform.core.management.object.ContainerMBean;
+import ru.entaxy.platform.core.management.object.factory.AbstractObjectContainerMBean;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObjectManager;
+
+@Component(
+        service = {ConnectionsMBeanImpl.class},
+        scope = ServiceScope.SINGLETON,
+        immediate = true)
+@ContainerMBean(id = "connections", subQualifierName = "category", subQualifierValue = "connections")
+public class ConnectionsMBeanImpl extends AbstractObjectContainerMBean
+        implements ConnectionsMBean {
+
+    private static final Logger log = LoggerFactory.getLogger(ConnectionsMBeanImpl.class);
+
+    public static final Qualifier Q_CONNECTIONS = ManagementCore.Q_RUNTIME
+            .qualifier(ConnectionsMBean.CONNECTIONS_KEY, ConnectionsMBean.CONNECTIONS_KEY_VALUE);
+
+    protected BundleContext bundleContext;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    EntaxyObjectService entaxyObjectService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    EntaxyRuntimeObjectManager entaxyRuntimeObjectManager;
+
+
+    public ConnectionsMBeanImpl() throws NotCompliantMBeanException {
+        super(ConnectionsMBean.class);
+    }
+
+    @Activate
+    public void activate(ComponentContext componentContext) {
+        this.bundleContext = componentContext.getBundleContext();
+    }
+
+    @Deactivate
+    public void deactivate() {}
+
+
+    @Override
+    public String getConnectionConfig(String connectionName) throws Exception {
+        return entaxyObjectService.findObject(connectionName, ConnectionsMBean.CONNECTION_TYPE).getConfiguration();
+    }
+
+    @Override
+    public void startConnection(String idOrName) throws Exception {
+        entaxyRuntimeObjectManager
+                .start(entaxyObjectService.findObject(idOrName, ConnectionsMBean.CONNECTION_TYPE).getObjectFullId());
+    }
+
+    @Override
+    public void stopConnection(String idOrName) throws Exception {
+        entaxyRuntimeObjectManager
+                .stopForced(entaxyObjectService.findObject(idOrName, ConnectionsMBean.CONNECTION_TYPE)
+                        .getObjectFullId());
+    }
+
+    @Override
+    public void uninstallConnection(String idOrName) throws Exception {
+        entaxyRuntimeObjectManager
+                .uninstallForced(entaxyObjectService.findObject(idOrName, ConnectionsMBean.CONNECTION_TYPE)
+                        .getObjectFullId());
+    }
+}
diff --git a/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/DeployedLegacyConnectionCustomizer.java b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/DeployedLegacyConnectionCustomizer.java
new file mode 100644
index 00000000..857a83ab
--- /dev/null
+++ b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/DeployedLegacyConnectionCustomizer.java
@@ -0,0 +1,105 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * connection-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.connection.support.legacy;
+
+import java.util.List;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.wiring.BundleCapability;
+import org.osgi.framework.wiring.BundleRevision;
+import org.osgi.util.tracker.BundleTrackerCustomizer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import ru.entaxy.platform.base.support.CommonUtils;
+
+public class DeployedLegacyConnectionCustomizer implements BundleTrackerCustomizer {
+
+    private static final Logger log = LoggerFactory.getLogger(DeployedLegacyConnectionCustomizer.class);
+
+    public static final String CAPABILITY_NAMESPACE = "entaxy.runtime.connection";
+
+    protected ManagedLegacyConnectionsListener listener;
+
+    public DeployedLegacyConnectionCustomizer(ManagedLegacyConnectionsListener listener) {
+        this.listener = listener;
+    }
+
+    @Override
+    public ManagedLegacyConnections addingBundle(Bundle bundle, BundleEvent event) {
+        log.debug("INSPECTING: " + bundle.getBundleId());
+        BundleRevision revision = bundle.adapt(BundleRevision.class);
+        if (revision == null)
+            return null;
+        log.debug("REVISION FOUND: " + bundle.getBundleId());
+        List capabilities = revision.getDeclaredCapabilities(CAPABILITY_NAMESPACE);
+        if ((capabilities == null) || (capabilities.size() == 0))
+            return null;
+        log.debug("CAPABILITIES FOUND: " + bundle.getBundleId());
+        ManagedLegacyConnections result = new ManagedLegacyConnections();
+        for (BundleCapability capability : capabilities) {
+
+            // process only legacy connections
+            if (capability.getAttributes().containsKey("objectId") && capability.getAttributes().containsKey("factory"))
+                continue;
+
+            Object val = capability.getAttributes().get("name");
+            String name = val == null ? "" : val.toString();
+            log.debug("CAPABILITIES/NAME [" + name + "] : " + bundle.getBundleId());
+            if (!CommonUtils.isValid(name))
+                continue;
+            val = capability.getAttributes().get("platform");
+            boolean isPlatform = val == null ? false : "true".equals(val.toString());
+            val = capability.getAttributes().get("label");
+            String label = val == null ? "" : val.toString();
+            ManagedLegacyConnection mc = (new ManagedLegacyConnection())
+                    .name(name)
+                    .platform(isPlatform)
+                    .deployed(true)
+                    .local(isPlatform)
+                    .shared(true)
+                    .bundleId(bundle.getBundleId())
+                    .label(label);
+            result.managedConnections.add(mc);
+        }
+        listener.added(result);
+        return result;
+    }
+
+    @Override
+    public void modifiedBundle(Bundle bundle, BundleEvent event, ManagedLegacyConnections object) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void removedBundle(Bundle bundle, BundleEvent event, ManagedLegacyConnections object) {
+        log.debug("BUNDLE [{}] REMOVING", bundle.getBundleId());
+        listener.removed(object);
+    }
+
+}
diff --git a/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/DeployedLegacyConnectionTracker.java b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/DeployedLegacyConnectionTracker.java
new file mode 100644
index 00000000..0ae9736e
--- /dev/null
+++ b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/DeployedLegacyConnectionTracker.java
@@ -0,0 +1,39 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * connection-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.connection.support.legacy;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.BundleTracker;
+
+public class DeployedLegacyConnectionTracker extends BundleTracker {
+
+    public DeployedLegacyConnectionTracker(BundleContext bundleContext, ManagedLegacyConnectionsListener listener) {
+        super(bundleContext, Bundle.ACTIVE | Bundle.INSTALLED | Bundle.RESOLVED | Bundle.STARTING | Bundle.STOPPING,
+                new DeployedLegacyConnectionCustomizer(listener));
+    }
+
+}
diff --git a/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/LegacyConnectionMBean.java b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/LegacyConnectionMBean.java
new file mode 100644
index 00000000..4dcb5bd0
--- /dev/null
+++ b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/LegacyConnectionMBean.java
@@ -0,0 +1,76 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * connection-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.connection.support.legacy;
+
+import ru.entaxy.esb.platform.base.management.core.api.RuntimeTypedMBean;
+
+public interface LegacyConnectionMBean extends RuntimeTypedMBean {
+	
+	public static final String CONNECTION_KEY = "connection";
+	
+	/*
+	 * connection name
+	 */
+	public String getName();
+	
+	/*
+	 * if connection is platform one or user defined
+	 */
+	public boolean isPlatform();
+	
+	/*
+	 * status of the bundle if connection is deplyed
+	 */
+	public String getStatus();
+	
+	/*
+	 * if the connection local or shared (cluster)
+	 */
+	public boolean isLocal();
+	
+	/*
+	 * if the connection is shared (single malt)
+	 * or prototype-like (blended)
+	 */
+	public boolean isShared();
+	
+	/*
+	 * if the connection is deployed or only defined
+	 */
+	public boolean isDeployed();
+	
+	/*
+	 * bundle id for single malt connection
+	 * null for blended
+	 */
+	public String getBundleId();
+
+	/*
+	 * connection label
+	 */
+	public String getLabel();
+	
+}
diff --git a/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/LegacyConnectionMBeanImpl.java b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/LegacyConnectionMBeanImpl.java
new file mode 100644
index 00000000..f85c6552
--- /dev/null
+++ b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/LegacyConnectionMBeanImpl.java
@@ -0,0 +1,106 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * connection-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.connection.support.legacy;
+
+import javax.management.NotCompliantMBeanException;
+import javax.management.StandardMBean;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+
+import ru.entaxy.esb.platform.base.management.core.api.EntaxyRuntimeTyped;
+
+
+// @TODO move string to constant
+@EntaxyRuntimeTyped(name = "entaxy.runtime.connection")
+public class LegacyConnectionMBeanImpl extends StandardMBean implements LegacyConnectionMBean {
+
+    protected ManagedLegacyConnection connection;
+
+    protected BundleContext bundleContext;
+
+    public LegacyConnectionMBeanImpl(BundleContext bundleContext, ManagedLegacyConnection connection)
+            throws NotCompliantMBeanException {
+        super(LegacyConnectionMBean.class);
+        this.bundleContext = bundleContext;
+        this.connection = connection;
+    }
+
+    @Override
+    public String getName() {
+        return connection.getName();
+    }
+
+    @Override
+    public boolean isPlatform() {
+        return connection.isPlatform();
+    }
+
+    @Override
+    public String getStatus() {
+        int state = this.bundleContext.getBundle(connection.getBundleId()).getState();
+        switch (state) {
+            case Bundle.ACTIVE:
+                return "Active";
+            case Bundle.INSTALLED:
+                return "Installed";
+            case Bundle.RESOLVED:
+                return "Resolved";
+            case Bundle.STARTING:
+                return "Starting";
+            case Bundle.STOPPING:
+                return "Stopping";
+            default:
+                return "Unknown";
+        }
+    }
+
+    @Override
+    public boolean isLocal() {
+        return connection.isLocal;
+    }
+
+    @Override
+    public boolean isShared() {
+        return connection.isShared();
+    }
+
+    @Override
+    public boolean isDeployed() {
+        return connection.isDeployed;
+    }
+
+    @Override
+    public String getBundleId() {
+        return connection.getBundleId() + "";
+    }
+
+    @Override
+    public String getLabel() {
+        return connection.getLabel();
+    }
+
+}
diff --git a/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/LegacyConnectionsManager.java b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/LegacyConnectionsManager.java
new file mode 100644
index 00000000..794543c8
--- /dev/null
+++ b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/LegacyConnectionsManager.java
@@ -0,0 +1,125 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * connection-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.connection.support.legacy;
+
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Map;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+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.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ServiceScope;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import ru.entaxy.esb.platform.base.management.core.ManagementCore;
+import ru.entaxy.esb.platform.base.management.core.Qualifier;
+import ru.entaxy.esb.platform.core.management.connection.to_remove.ConnectionMBean;
+import ru.entaxy.esb.platform.core.management.connection.to_remove.ConnectionsMBean;
+import ru.entaxy.platform.base.objects.EntaxyObjectService;
+
+@Component(
+        service = {LegacyConnectionsManager.class},
+        scope = ServiceScope.SINGLETON,
+        immediate = true)
+public class LegacyConnectionsManager implements ManagedLegacyConnectionsListener {
+
+    private static final Logger log = LoggerFactory.getLogger(LegacyConnectionsManager.class);
+
+    public static final Qualifier Q_CONNECTIONS = ManagementCore.Q_RUNTIME
+            .qualifier(ConnectionsMBean.CONNECTIONS_KEY, ConnectionsMBean.CONNECTIONS_KEY_VALUE);
+
+    protected BundleContext bundleContext;
+
+    protected DeployedLegacyConnectionTracker tracker;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    EntaxyObjectService entaxyObjectService;
+
+    protected static class ManagedConnectionDescriptor {
+
+        ManagedLegacyConnection connection;
+        ServiceRegistration registration;
+
+    }
+
+    protected Map managed = new HashMap<>();
+
+    public LegacyConnectionsManager() {
+        super();
+    }
+
+    @Activate
+    public void activate(ComponentContext componentContext) {
+        this.bundleContext = componentContext.getBundleContext();
+        tracker = new DeployedLegacyConnectionTracker(bundleContext, this);
+        tracker.open();
+    }
+
+    @Deactivate
+    public void deactivate() {
+        tracker.close();
+    }
+
+    @Override
+    public void added(ManagedLegacyConnections connections) {
+        Hashtable props = new Hashtable<>();
+        // String jmxObjectName = "jmx.objectname";
+        // String objectName = "ru.entaxy.esb:group=platform,category=connections,connection=";
+        for (ManagedLegacyConnection connection : connections.managedConnections) {
+            if (managed.containsKey(connection.getName()))
+                this.managed.get(connection.getName()).registration.unregister();
+            try {
+                LegacyConnectionMBeanImpl service = new LegacyConnectionMBeanImpl(bundleContext, connection);
+                ManagedConnectionDescriptor descriptor = new ManagedConnectionDescriptor();
+                descriptor.connection = connection;
+                props.put(ManagementCore.JMX_OBJECTNAME,
+                        Q_CONNECTIONS.qualifier(ConnectionMBean.CONNECTION_KEY, connection.getName()).getValue());
+                descriptor.registration = bundleContext.registerService(LegacyConnectionMBean.class, service, props);
+                managed.put(connection.getName(), descriptor);
+            } catch (Exception e) {
+                log.error("Error adding connection [" + connection.getName() + "]", e);
+            }
+        }
+    }
+
+    @Override
+    public void removed(ManagedLegacyConnections connections) {
+        for (ManagedLegacyConnection connection : connections.managedConnections) {
+            if (managed.containsKey(connection.getName())) {
+                this.managed.get(connection.getName()).registration.unregister();
+                this.managed.remove(connection.getName());
+            }
+        }
+    }
+
+}
diff --git a/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/ManagedLegacyConnection.java b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/ManagedLegacyConnection.java
new file mode 100644
index 00000000..8089ad26
--- /dev/null
+++ b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/ManagedLegacyConnection.java
@@ -0,0 +1,116 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * connection-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.connection.support.legacy;
+
+public class ManagedLegacyConnection {
+	
+	protected String name;
+	protected boolean isPlatform;
+	protected boolean isLocal;
+	protected boolean isShared;
+	protected long bundleId;
+	protected boolean isDeployed;
+	protected String label;
+	
+	public String getName() {
+		return name;
+	}
+	public boolean isPlatform() {
+		return isPlatform;
+	}
+	public boolean isLocal() {
+		return isLocal;
+	}
+	public boolean isShared() {
+		return isShared;
+	}
+	public long getBundleId() {
+		return bundleId;
+	}
+	public boolean isDeployed() {
+		return isDeployed;
+	}
+	public String getLabel() {
+		return label;
+	}
+	
+	public void setName(String name) {
+		this.name = name;
+	}
+	public void setPlatform(boolean isPlatform) {
+		this.isPlatform = isPlatform;
+	}
+	public void setLocal(boolean isLocal) {
+		this.isLocal = isLocal;
+	}
+	public void setShared(boolean isShared) {
+		this.isShared = isShared;
+	}
+	public void setBundleId(long bundleId) {
+		this.bundleId = bundleId;
+	}
+	public void setDeployed(boolean isDeployed) {
+		this.isDeployed = isDeployed;
+	}
+	public void setLabel(String label) {
+		this.label = label;
+	}
+	
+	public ManagedLegacyConnection name(String name) {
+		setName(name);
+		return this;
+	}
+	
+	public ManagedLegacyConnection platform(boolean isPlatform) {
+		setPlatform(isPlatform);
+		return this;
+	}
+	
+	public ManagedLegacyConnection local(boolean isLocal) {
+		setLocal(isLocal);
+		return this;
+	}
+
+	public ManagedLegacyConnection shared(boolean isShared) {
+		setShared(isShared);
+		return this;
+	}
+	
+	public ManagedLegacyConnection bundleId(long bundleId) {
+		setBundleId(bundleId);
+		return this;
+	}
+	
+	public ManagedLegacyConnection deployed(boolean deployed) {
+		setDeployed(deployed);
+		return this;
+	}
+
+	public ManagedLegacyConnection label(String label) {
+		setLabel(label);
+		return this;
+	}
+}
diff --git a/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/ManagedLegacyConnections.java b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/ManagedLegacyConnections.java
new file mode 100644
index 00000000..354f6b50
--- /dev/null
+++ b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/ManagedLegacyConnections.java
@@ -0,0 +1,35 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * connection-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.connection.support.legacy;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ManagedLegacyConnections {
+
+    public List managedConnections = new ArrayList<>();
+
+}
diff --git a/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/ManagedLegacyConnectionsListener.java b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/ManagedLegacyConnectionsListener.java
new file mode 100644
index 00000000..0fb1f79f
--- /dev/null
+++ b/platform/runtime/core/management/connection-management/src/main/java/ru/entaxy/platform/core/management/connection/support/legacy/ManagedLegacyConnectionsListener.java
@@ -0,0 +1,34 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * connection-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.connection.support.legacy;
+
+public interface ManagedLegacyConnectionsListener {
+
+    public void added(ManagedLegacyConnections connections);
+
+    public void removed(ManagedLegacyConnections connections);
+
+}
diff --git a/platform/runtime/core/management/connector-management/pom.xml b/platform/runtime/core/management/connector-management/pom.xml
index 585cc4ae..f7e14ab2 100644
--- a/platform/runtime/core/management/connector-management/pom.xml
+++ b/platform/runtime/core/management/connector-management/pom.xml
@@ -7,7 +7,7 @@
     
         ru.entaxy.esb.platform.runtime.core
         management
-        1.10.0
+        1.11.0
     
 
     ru.entaxy.esb.platform.runtime.core.management
diff --git a/platform/runtime/core/management/connector-management/src/main/java/ru/entaxy/esb/platform/core/management/connector/ConnectorsMBean.java b/platform/runtime/core/management/connector-management/src/main/java/ru/entaxy/esb/platform/core/management/connector/ConnectorsMBean.java
index 0468fcfa..a6cd1dc2 100644
--- a/platform/runtime/core/management/connector-management/src/main/java/ru/entaxy/esb/platform/core/management/connector/ConnectorsMBean.java
+++ b/platform/runtime/core/management/connector-management/src/main/java/ru/entaxy/esb/platform/core/management/connector/ConnectorsMBean.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * connector-management
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/management/connector-management/src/main/java/ru/entaxy/esb/platform/core/management/connector/impl/ConnectorsMBeanImpl.java b/platform/runtime/core/management/connector-management/src/main/java/ru/entaxy/esb/platform/core/management/connector/impl/ConnectorsMBeanImpl.java
index eb3fd7a1..0038b187 100644
--- a/platform/runtime/core/management/connector-management/src/main/java/ru/entaxy/esb/platform/core/management/connector/impl/ConnectorsMBeanImpl.java
+++ b/platform/runtime/core/management/connector-management/src/main/java/ru/entaxy/esb/platform/core/management/connector/impl/ConnectorsMBeanImpl.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * connector-management
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/management/node-management/pom.xml b/platform/runtime/core/management/node-management/pom.xml
index 56d37cbe..c1e89178 100644
--- a/platform/runtime/core/management/node-management/pom.xml
+++ b/platform/runtime/core/management/node-management/pom.xml
@@ -3,7 +3,7 @@
   
     ru.entaxy.esb.platform.runtime.core
     management
-    1.10.0
+    1.11.0
   
   ru.entaxy.esb.platform.runtime.core.management
   node-management
diff --git a/platform/runtime/core/management/node-management/src/main/java/ru/entaxy/esb/platform/core/management/node/ClusterLocalNodeDataProvider.java b/platform/runtime/core/management/node-management/src/main/java/ru/entaxy/esb/platform/core/management/node/ClusterLocalNodeDataProvider.java
index 8ba0901c..73a148bc 100644
--- a/platform/runtime/core/management/node-management/src/main/java/ru/entaxy/esb/platform/core/management/node/ClusterLocalNodeDataProvider.java
+++ b/platform/runtime/core/management/node-management/src/main/java/ru/entaxy/esb/platform/core/management/node/ClusterLocalNodeDataProvider.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * node-management
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/management/node-management/src/main/java/ru/entaxy/esb/platform/core/management/node/ClusterNodeMBean.java b/platform/runtime/core/management/node-management/src/main/java/ru/entaxy/esb/platform/core/management/node/ClusterNodeMBean.java
index bd026d62..1d9b0392 100644
--- a/platform/runtime/core/management/node-management/src/main/java/ru/entaxy/esb/platform/core/management/node/ClusterNodeMBean.java
+++ b/platform/runtime/core/management/node-management/src/main/java/ru/entaxy/esb/platform/core/management/node/ClusterNodeMBean.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * node-management
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/management/node-management/src/main/java/ru/entaxy/esb/platform/core/management/node/LocalNodeMBean.java b/platform/runtime/core/management/node-management/src/main/java/ru/entaxy/esb/platform/core/management/node/LocalNodeMBean.java
index 41bdd8d9..4daaafca 100644
--- a/platform/runtime/core/management/node-management/src/main/java/ru/entaxy/esb/platform/core/management/node/LocalNodeMBean.java
+++ b/platform/runtime/core/management/node-management/src/main/java/ru/entaxy/esb/platform/core/management/node/LocalNodeMBean.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * node-management
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/management/node-management/src/main/java/ru/entaxy/esb/platform/core/management/node/NodeDataProvider.java b/platform/runtime/core/management/node-management/src/main/java/ru/entaxy/esb/platform/core/management/node/NodeDataProvider.java
index d6427f88..08015ed1 100644
--- a/platform/runtime/core/management/node-management/src/main/java/ru/entaxy/esb/platform/core/management/node/NodeDataProvider.java
+++ b/platform/runtime/core/management/node-management/src/main/java/ru/entaxy/esb/platform/core/management/node/NodeDataProvider.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * node-management
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/management/node-management/src/main/java/ru/entaxy/esb/platform/core/management/node/NodeDataProviderAware.java b/platform/runtime/core/management/node-management/src/main/java/ru/entaxy/esb/platform/core/management/node/NodeDataProviderAware.java
index 678fcea1..96ae8124 100644
--- a/platform/runtime/core/management/node-management/src/main/java/ru/entaxy/esb/platform/core/management/node/NodeDataProviderAware.java
+++ b/platform/runtime/core/management/node-management/src/main/java/ru/entaxy/esb/platform/core/management/node/NodeDataProviderAware.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * node-management
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/management/node-management/src/main/java/ru/entaxy/esb/platform/core/management/node/NodeMBean.java b/platform/runtime/core/management/node-management/src/main/java/ru/entaxy/esb/platform/core/management/node/NodeMBean.java
index dd364d24..4f2e50cc 100644
--- a/platform/runtime/core/management/node-management/src/main/java/ru/entaxy/esb/platform/core/management/node/NodeMBean.java
+++ b/platform/runtime/core/management/node-management/src/main/java/ru/entaxy/esb/platform/core/management/node/NodeMBean.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * node-management
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/management/node-management/src/main/java/ru/entaxy/esb/platform/core/management/node/impl/LocalNodeMBeanImpl.java b/platform/runtime/core/management/node-management/src/main/java/ru/entaxy/esb/platform/core/management/node/impl/LocalNodeMBeanImpl.java
index ce0ee350..b3d6be00 100644
--- a/platform/runtime/core/management/node-management/src/main/java/ru/entaxy/esb/platform/core/management/node/impl/LocalNodeMBeanImpl.java
+++ b/platform/runtime/core/management/node-management/src/main/java/ru/entaxy/esb/platform/core/management/node/impl/LocalNodeMBeanImpl.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * node-management
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/management/object-management/LICENSE.txt b/platform/runtime/core/management/object-management/LICENSE.txt
new file mode 100644
index 00000000..4ae94b75
--- /dev/null
+++ b/platform/runtime/core/management/object-management/LICENSE.txt
@@ -0,0 +1,175 @@
+                                 ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ
+
+Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой)
+версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего
+Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН
+7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова,
+д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу
+https://www.emdev.ru/about (далее - Компания).
+
+Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями»
+(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения,
+Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в
+настоящем документе, в противном случае, он должен не использовать или не получать доступ
+к Программному обеспечению.
+
+                                    1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ
+
+a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии
+или редакции, исключительные права на которую принадлежат Правообладателю.
+b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные
+права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ
+для ЭВМ № 2021610848 от 19.01.2021 года.
+c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта
+https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО.
+d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также
+личные неимущественные права авторов произведений на результат интеллектуальной деятельности.
+e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование
+ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка
+включает предоставление Пользователю неисключительного права использования ПО, в том числе
+получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение
+патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается
+Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается
+для каждого Пользователя индивидуально в Сертификате.
+f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром),
+подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное
+обеспечение в ограниченном объёме и на определённый период времени.
+g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО,
+предоставленных Пользователю согласно условиям Подписки.
+h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного
+обеспечения.
+i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий
+из одного или нескольких файлов, который может быть прочтён человеком.
+j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля
+программы, полученный в результате обработки исходного кода, еще не связанный в полную программу.
+Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый
+продукт.
+k) Некоммерческое использование – индивидуальное личное использование Пользователем программного
+обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации
+возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая
+выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения.
+
+                    2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
+
+2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного
+обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом
+воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения
+в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ.
+2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит
+неисключительный характер.
+2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию,
+лицензия на ограниченное использование Программного обеспечения.
+2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования
+имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан
+обратиться в службу поддержки Правообладателя по адресу:  https://entaxy.ru/ для изменения
+вида лицензии с Базовой бесплатной версии на Подписки.
+2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для
+пробного использования программного обеспечения – не ограничен.
+2.6. Использование Пользователем настоящего программного обеспечения в целях разработки,
+модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю,
+без разрешения Правообладателя не допускается.
+
+                                3. АВТОРСКОЕ ПРАВО.
+
+3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение
+и любые его копии принадлежат Правообладателю.
+3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента,
+к которому можно получить доступ с помощью Программного обеспечения, является собственностью
+соответствующего владельца контента и защищается применимым законодательством об авторском
+праве или другими законами и договорами об интеллектуальной собственности.
+3.3. Условия использования Программного обеспечения.
+Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь
+придерживается следующих условий:
+3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять
+какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании
+Программного обеспечения или на нем.
+3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать,
+расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать
+Программное обеспечение.
+3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования
+ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне.
+3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено
+использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам.
+
+                    4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС»
+
+4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю
+на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с
+использованием Пользователем:
+4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в
+Программное обеспечение;
+4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями
+настоящего соглашения;
+4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием,
+или данными, не предоставленными Пользователю Правообладателем;
+4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем.
+
+
+5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ
+ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ
+И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ
+ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ
+И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ
+ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО.
+
+                        6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ.
+НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ
+ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ,
+ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ;
+ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ.
+ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ
+ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ;
+КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ
+ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ.
+
+                        7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ:
+Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия
+(включая, но не ограничиваясь) по:
+-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код)
+ Программного обеспечения;
+-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный
+код Программного обеспечения, за исключением тех изменений, которые вносятся средствами,
+включёнными в Программное обеспечение и описанными непосредственно в документации к нему;
+-созданию условий для использования Программного обеспечения лицами, не имеющими прав на
+использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство
+третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа
+к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку;
+-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию).
+
+                    8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА.
+
+8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из
+лицензионных продуктов, используемых на законных основаниях, а
+именно https://entaxy.ru/libs/licenses/root-aggregated.deps.
+8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть
+совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения.
+8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться
+Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения,
+содержащих все изменения и дополнения программного обеспечения.
+
+                        9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ.
+
+9.1.  Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым
+программным обеспечением.
+9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно
+с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм
+«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public.
+9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий
+пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя,
+прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер
+ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства
+Российской Федерации.
+
+                                10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ.
+
+10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет
+право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб,
+недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий
+пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере
+2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения
+исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy).
+10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое
+законодательство – Российской Федерации.
+10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным,
+остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать
+исполнять свои обязанности в соответствии с этими положениями.
diff --git a/platform/runtime/core/management/object-management/pom.xml b/platform/runtime/core/management/object-management/pom.xml
new file mode 100644
index 00000000..f54aa5a2
--- /dev/null
+++ b/platform/runtime/core/management/object-management/pom.xml
@@ -0,0 +1,39 @@
+
+  4.0.0
+  
+    ru.entaxy.esb.platform.runtime.core
+    management
+    1.11.0
+  
+  ru.entaxy.esb.platform.runtime.core.management
+  object-management
+  bundle
+  ENTAXY :: CORE :: MANAGEMENT :: OBJECT
+  ENTAXY :: CORE :: MANAGEMENT :: OBJECT
+  
+  
+	  
+		  ru.entaxy.platform.core.management.object,
+		  ru.entaxy.platform.core.management.object.factory
+	  
+	  
+		  ru.entaxy.platform.core.management.object.impl,
+		  ru.entaxy.platform.core.management.object.factory.impl,
+		  ru.entaxy.platform.core.management.object.shell
+	  
+	  none
+  
+  
+  
+	  
+	  	ru.entaxy.esb.platform.runtime.core
+	  	object-runtime-core
+	  	${project.version}
+	  
+	  
+	  	org.apache.karaf.bundle
+	  	org.apache.karaf.bundle.core
+	  	${karaf.version}
+	  
+   
+
diff --git a/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/ContainerMBean.java b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/ContainerMBean.java
new file mode 100644
index 00000000..bde3a69c
--- /dev/null
+++ b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/ContainerMBean.java
@@ -0,0 +1,46 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.object;
+
+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;
+
+@Inherited
+@Retention(RUNTIME)
+@Target(TYPE)
+public @interface ContainerMBean {
+
+    String id() default "";
+
+    String subQualifierName() default EntaxyRuntimeObjectContainerMBean.JMX_QUALIFIER_NAME;
+
+    String subQualifierValue();
+
+}
diff --git a/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/EntaxyRuntimeItemMBean.java b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/EntaxyRuntimeItemMBean.java
new file mode 100644
index 00000000..4fb078a2
--- /dev/null
+++ b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/EntaxyRuntimeItemMBean.java
@@ -0,0 +1,162 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.object;
+
+import java.util.Map;
+
+import ru.entaxy.esb.platform.base.management.core.ManagementCore;
+import ru.entaxy.esb.platform.base.management.core.Qualifier;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanAnnotated;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanExportPolicy;
+
+@MBeanAnnotated(policy = MBeanExportPolicy.ANNOTATED_ONLY)
+public interface EntaxyRuntimeItemMBean {
+
+    String JMX_SUBPATH_QUALIFIER = "subgroup";
+
+    String JMX_SUBQUALIFIER_AUTO = "@AUTO@";
+
+    EntaxyRuntimeItemMBean DEFAULT_PARENT_MBEAN = new EntaxyRuntimeItemMBean() {
+
+        @Override
+        public Class getMBeanClass() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        public String getJMXSubQualifier() {
+            return ManagementCore.Q_RUNTIME_S;
+        };
+
+        @Override
+        public String getJMXSubQualifierValue() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public String getJMXSubQualifierName() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public Qualifier getJMXQualifier() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public String getId() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        public EntaxyRuntimeItemMBean getParentMBean() {
+            return null;
+        }
+
+        @Override
+        public void setParentMBean(EntaxyRuntimeItemMBean mBean) {
+            // TODO Auto-generated method stub
+
+        }
+
+        @Override
+        public void setParentSubPath(String subPath) {
+            // TODO Auto-generated method stub
+
+        }
+
+        @Override
+        public void setJMXSubQualifierName(String name) {
+            // TODO Auto-generated method stub
+
+        }
+
+        @Override
+        public void setJMXSubQualifierValue(String value) {
+            // TODO Auto-generated method stub
+
+        }
+
+        @Override
+        public Map getChildMBeans() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        @Override
+        public void addChildMBean(EntaxyRuntimeItemMBean mBean) {
+            // TODO Auto-generated method stub
+
+        }
+
+        @Override
+        public void removeChildMBean(EntaxyRuntimeItemMBean mBean) {
+            // TODO Auto-generated method stub
+
+        }
+
+    };
+
+
+    Qualifier getJMXQualifier();
+
+    default String getJMXSubQualifier() {
+        return getJMXSubQualifierName().concat("=").concat(getJMXSubQualifierValue());
+    };
+
+    default EntaxyRuntimeItemMBean getParentMBean() {
+        return DEFAULT_PARENT_MBEAN;
+    };
+
+    void setParentMBean(EntaxyRuntimeItemMBean mBean);
+
+    default String getParentSubPath() {
+        return "";
+    };
+
+    void setParentSubPath(String subPath);
+
+    Map getChildMBeans();
+
+    void addChildMBean(EntaxyRuntimeItemMBean mBean);
+
+    void removeChildMBean(EntaxyRuntimeItemMBean mBean);
+
+    String getJMXSubQualifierName();
+
+    void setJMXSubQualifierName(String name);
+
+    String getJMXSubQualifierValue();
+
+    void setJMXSubQualifierValue(String value);
+
+    String getId();
+
+    Class getMBeanClass();
+}
diff --git a/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/EntaxyRuntimeObjectContainerMBean.java b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/EntaxyRuntimeObjectContainerMBean.java
new file mode 100644
index 00000000..a6d60008
--- /dev/null
+++ b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/EntaxyRuntimeObjectContainerMBean.java
@@ -0,0 +1,38 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.object;
+
+import ru.entaxy.esb.platform.base.management.core.api.MBeanAnnotated;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanExportPolicy;
+
+@MBeanAnnotated(policy = MBeanExportPolicy.ANNOTATED_ONLY)
+public interface EntaxyRuntimeObjectContainerMBean extends EntaxyRuntimeItemMBean {
+
+    String JMX_QUALIFIER_NAME = "category";
+
+    String JMX_DEFAULT_CATEGORY = "objects";
+
+}
diff --git a/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/EntaxyRuntimeObjectMBean.java b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/EntaxyRuntimeObjectMBean.java
new file mode 100644
index 00000000..972d4686
--- /dev/null
+++ b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/EntaxyRuntimeObjectMBean.java
@@ -0,0 +1,99 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.object;
+
+import java.util.Map;
+
+import javax.management.MBeanOperationInfo;
+
+import ru.entaxy.esb.platform.base.management.core.api.Attribute;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanAnnotated;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanExportPolicy;
+import ru.entaxy.esb.platform.base.management.core.api.Operation;
+import ru.entaxy.esb.platform.base.management.core.api.RuntimeTypedMBean;
+import ru.entaxy.esb.platform.base.management.core.utils.BundleAwareMBean;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+
+@MBeanAnnotated(policy = MBeanExportPolicy.ANNOTATED_ONLY)
+public interface EntaxyRuntimeObjectMBean extends EntaxyRuntimeItemMBean, BundleAwareMBean, RuntimeTypedMBean {
+
+    public static final String DEFAULT_OBJECT_SUBQUALIFIER = "object";
+
+    EntaxyRuntimeObject getRuntimeObject();
+
+    @Override
+    default String getJMXSubQualifierName() {
+        if (this.getClass().isAnnotationPresent(ObjectMBean.class))
+            return this.getClass().getAnnotation(ObjectMBean.class).subQualifierName();
+        return DEFAULT_OBJECT_SUBQUALIFIER;
+    }
+
+    @Attribute(desc = "Managed bean Id")
+    String getId();
+
+    @Deprecated(since = "1.10.0", forRemoval = true)
+    @Attribute(desc = "Object Name")
+    String getName();
+
+    @Attribute(desc = "Object Id")
+    String getObjectId();
+
+    @Attribute(desc = "Object Type")
+    String getObjectType();
+
+    @Attribute(desc = "Object full Id")
+    String getObjectFullId();
+
+    @Attribute(desc = "Object label")
+    public String getObjectLabel();
+
+    @Attribute(desc = "Display name")
+    public String getDisplayName();
+
+    @Attribute(desc = "Object factory Id")
+    String getFactoryId();
+
+    @Attribute(desc = "Object scope")
+    String getScope();
+
+    @Attribute(desc = "Object owner for private objects")
+    String getOwner();
+
+    @Attribute(desc = "Object container Id")
+    String getContainerId();
+
+    @Attribute(desc = "Object is provided via capability descriptor")
+    boolean isProvided();
+
+    @Attribute(desc = "Object is ghost: assumed by relations but not present")
+    boolean isGhost();
+
+    @Operation(desc = "Gets JSON configuration of the object", impact = MBeanOperationInfo.INFO)
+    String readConfiguration();
+
+    @Operation(desc = "Reads extended data of the object", impact = MBeanOperationInfo.INFO)
+    Map> readExtendedData();
+}
diff --git a/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/EntaxyRuntimeObjectMBeanCustomizer.java b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/EntaxyRuntimeObjectMBeanCustomizer.java
new file mode 100644
index 00000000..9f108ca6
--- /dev/null
+++ b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/EntaxyRuntimeObjectMBeanCustomizer.java
@@ -0,0 +1,45 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.object;
+
+import java.util.List;
+
+public interface EntaxyRuntimeObjectMBeanCustomizer {
+
+    public interface Customized {
+
+        EntaxyRuntimeObjectMBean getCustomizedMBean();
+
+        List getAdditionalMBeans();
+    }
+
+    String getId();
+
+    boolean isAccepted(EntaxyRuntimeObjectMBean bean);
+
+    Customized customize(EntaxyRuntimeObjectMBean bean);
+
+}
diff --git a/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/EntaxyRuntimeObjectMBeanFactory.java b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/EntaxyRuntimeObjectMBeanFactory.java
new file mode 100644
index 00000000..d5b116d4
--- /dev/null
+++ b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/EntaxyRuntimeObjectMBeanFactory.java
@@ -0,0 +1,56 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.object;
+
+import java.util.List;
+
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+
+public interface EntaxyRuntimeObjectMBeanFactory {
+
+    String JMX_QUALIFIER_NAME = "category";
+
+    String JMX_DEFAULT_CATEGORY = "objects";
+
+    String getId();
+
+    default String getCategory() {
+        return JMX_DEFAULT_CATEGORY;
+    };
+
+    default String getJMXSubQualifier() {
+        return JMX_QUALIFIER_NAME.concat("=").concat(getCategory());
+    }
+
+    List getSupportedTypes();
+
+     T createMBean(EntaxyRuntimeObject entaxyRuntimeObject);
+
+    //  T createMBeanContainerForType(String
+    // entaxyObjectType);
+
+    List createMBeans();
+}
diff --git a/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/MBeanFactory.java b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/MBeanFactory.java
new file mode 100644
index 00000000..de67b1dd
--- /dev/null
+++ b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/MBeanFactory.java
@@ -0,0 +1,43 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.object;
+
+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;
+
+@Inherited
+@Retention(RUNTIME)
+@Target(TYPE)
+public @interface MBeanFactory {
+
+    String[] supportedTypes();
+
+    String id();
+}
diff --git a/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/ObjectMBean.java b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/ObjectMBean.java
new file mode 100644
index 00000000..978a5486
--- /dev/null
+++ b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/ObjectMBean.java
@@ -0,0 +1,40 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.object;
+
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+@Retention(RUNTIME)
+@Target(TYPE)
+public @interface ObjectMBean {
+
+    String subQualifierName();
+
+}
diff --git a/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/AbstractMBeanFactory.java b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/AbstractMBeanFactory.java
new file mode 100644
index 00000000..ae86a855
--- /dev/null
+++ b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/AbstractMBeanFactory.java
@@ -0,0 +1,62 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.object.factory;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBeanFactory;
+import ru.entaxy.platform.core.management.object.MBeanFactory;
+
+public abstract class AbstractMBeanFactory implements EntaxyRuntimeObjectMBeanFactory {
+
+    protected String id;
+
+    protected List supportedTypes = new ArrayList<>();
+
+    protected AbstractMBeanFactory() {
+        super();
+        this.id = this.getClass().getSimpleName();
+        if (this.getClass().isAnnotationPresent(MBeanFactory.class)) {
+            MBeanFactory anno = this.getClass().getAnnotation(MBeanFactory.class);
+            this.id = anno.id();
+            supportedTypes.addAll(Arrays.asList(anno.supportedTypes()));
+        }
+
+    }
+
+    @Override
+    public String getId() {
+        return this.id;
+    }
+
+    @Override
+    public List getSupportedTypes() {
+        return this.supportedTypes;
+    }
+
+}
diff --git a/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/AbstractObjectContainerMBean.java b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/AbstractObjectContainerMBean.java
new file mode 100644
index 00000000..254a8905
--- /dev/null
+++ b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/AbstractObjectContainerMBean.java
@@ -0,0 +1,54 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.object.factory;
+
+import javax.management.NotCompliantMBeanException;
+
+import ru.entaxy.esb.platform.base.management.core.Qualifier;
+import ru.entaxy.platform.core.management.object.ContainerMBean;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectContainerMBean;
+
+public abstract class AbstractObjectContainerMBean
+        extends AbstractObjectItemMBean
+        implements EntaxyRuntimeObjectContainerMBean {
+
+    protected AbstractObjectContainerMBean(Class mbeanInterface) throws NotCompliantMBeanException {
+        super(mbeanInterface);
+        if (this.getClass().isAnnotationPresent(ContainerMBean.class)) {
+            ContainerMBean anno = this.getClass().getAnnotation(ContainerMBean.class);
+            jmxSubQualifierName = anno.subQualifierName();
+            jmxSubQualifierValue = anno.subQualifierValue();
+            id = anno.id();
+        }
+    }
+
+    @Override
+    public Qualifier getJMXQualifier() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+}
diff --git a/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/AbstractObjectItemMBean.java b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/AbstractObjectItemMBean.java
new file mode 100644
index 00000000..cf808411
--- /dev/null
+++ b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/AbstractObjectItemMBean.java
@@ -0,0 +1,134 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.object.factory;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.management.NotCompliantMBeanException;
+
+import ru.entaxy.esb.platform.base.management.core.Qualifier;
+import ru.entaxy.esb.platform.base.management.core.api.AnnotatedMBean;
+import ru.entaxy.platform.base.support.CommonUtils;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeItemMBean;
+
+public abstract class AbstractObjectItemMBean extends AnnotatedMBean
+        implements EntaxyRuntimeItemMBean {
+
+    protected String jmxSubQualifierName;
+    protected String jmxSubQualifierValue;
+
+    protected String id;
+
+    protected EntaxyRuntimeItemMBean parentMBean;
+    protected String parentSubPath;
+
+    protected Map children = new HashMap<>();
+
+    protected AbstractObjectItemMBean(Class mbeanInterface) throws NotCompliantMBeanException {
+        super(mbeanInterface);
+    }
+
+    @Override
+    public Qualifier getJMXQualifier() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public String getJMXSubQualifierName() {
+        return jmxSubQualifierName;
+    }
+
+    @Override
+    public void setJMXSubQualifierName(String name) {
+        jmxSubQualifierName = name;
+    }
+
+    @Override
+    public String getJMXSubQualifierValue() {
+        return jmxSubQualifierValue;
+    }
+
+    @Override
+    public void setJMXSubQualifierValue(String value) {
+        jmxSubQualifierValue = value;
+    }
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public Class getMBeanClass() {
+        return this.interfaceClass;
+    }
+
+    @Override
+    public EntaxyRuntimeItemMBean getParentMBean() {
+        if (this.parentMBean != null)
+            return this.parentMBean;
+        return EntaxyRuntimeItemMBean.super.getParentMBean();
+    }
+
+    @Override
+    public void setParentMBean(EntaxyRuntimeItemMBean mBean) {
+        if (this.parentMBean != null)
+            this.parentMBean.removeChildMBean(this);
+        this.parentMBean = mBean;
+        if (parentMBean != null)
+            this.parentMBean.addChildMBean(this);
+    }
+
+    @Override
+    public String getParentSubPath() {
+        if (CommonUtils.isValid(this.parentSubPath))
+            return this.parentSubPath;
+        return EntaxyRuntimeItemMBean.super.getParentSubPath();
+    }
+
+    @Override
+    public void setParentSubPath(String parentSubPath) {
+        this.parentSubPath = parentSubPath;
+    }
+
+    @Override
+    public Map getChildMBeans() {
+        return this.children;
+    }
+
+    @Override
+    public void addChildMBean(EntaxyRuntimeItemMBean mBean) {
+        children.put(mBean.getId(), mBean);
+    }
+
+    @Override
+    public void removeChildMBean(EntaxyRuntimeItemMBean mBean) {
+        children.remove(mBean.getId());
+    }
+
+}
diff --git a/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/AbstractObjectMBean.java b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/AbstractObjectMBean.java
new file mode 100644
index 00000000..7f2f0348
--- /dev/null
+++ b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/AbstractObjectMBean.java
@@ -0,0 +1,215 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.object.factory;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.management.NotCompliantMBeanException;
+
+import org.apache.karaf.bundle.core.BundleInfo;
+import org.apache.karaf.bundle.core.BundleState;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.ServiceReference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import ru.entaxy.platform.base.support.CommonUtils;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBean;
+import ru.entaxy.platform.core.management.object.factory.impl.ServiceHelper;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObjectService;
+
+public abstract class AbstractObjectMBean
+        extends AbstractObjectItemMBean
+        implements EntaxyRuntimeObjectMBean {
+
+    private static final Logger LOG = LoggerFactory.getLogger(AbstractObjectMBean.class);
+
+    protected EntaxyRuntimeObject entaxyRuntimeObject;
+
+    protected AbstractObjectMBean(Class mbeanInterface, EntaxyRuntimeObject entaxyRuntimeObject)
+            throws NotCompliantMBeanException {
+        super(mbeanInterface);
+        this.entaxyRuntimeObject = entaxyRuntimeObject;
+    }
+
+    @Override
+    public String getJMXSubQualifierName() {
+        if (CommonUtils.isValid(this.jmxSubQualifierName))
+            return this.jmxSubQualifierName;
+        return EntaxyRuntimeObjectMBean.super.getJMXSubQualifierName();
+    }
+
+    @Override
+    public String getJMXSubQualifierValue() {
+        return entaxyRuntimeObject.getObjectFullId().replace(':', '_');
+    }
+
+    @Override
+    public long getBundleId() {
+        if (entaxyRuntimeObject.getBundleInfo() != null)
+            return entaxyRuntimeObject.getBundleInfo().getBundleId();
+        return -1;
+    }
+
+    @Override
+    public String getBundleState() {
+        if (getBundleId() < 0)
+            return BundleState.Unknown.name();
+        BundleInfo bi = ServiceHelper.getInstance().getBundleInfo(getBundleId());
+        if (bi == null)
+            return BundleState.Unknown.name();
+        return bi.getState().name();
+    }
+
+    @Override
+    public String getBundleSymbolicName() {
+        if (entaxyRuntimeObject.isGhost())
+            return "";
+        if (entaxyRuntimeObject.getContainer() == null)
+            return "";
+        return entaxyRuntimeObject.getContainer().getName();
+    }
+
+    @Override
+    public String getId() {
+        if (entaxyRuntimeObject != null)
+            return entaxyRuntimeObject.getObjectFullId();
+        return super.getId();
+    }
+
+    @Override
+    public void refreshBundleInfo() {
+        // TODO Auto-generated method stub
+    }
+
+    @Override
+    public EntaxyRuntimeObject getRuntimeObject() {
+        return this.entaxyRuntimeObject;
+    }
+
+    @Override
+    public String getName() {
+        return entaxyRuntimeObject.getAttributeOrDefault("name", getObjectId()).toString();
+    };
+
+    @Override
+    public String getObjectId() {
+        return this.entaxyRuntimeObject.getId();
+    }
+
+    @Override
+    public String getObjectType() {
+        return this.entaxyRuntimeObject.getType();
+    }
+
+    @Override
+    public String getObjectFullId() {
+        return this.entaxyRuntimeObject.getObjectFullId();
+    }
+
+    @Override
+    public String getDisplayName() {
+        return this.entaxyRuntimeObject.getDisplayName();
+    }
+
+    @Override
+    public String getObjectLabel() {
+        return entaxyRuntimeObject.getAttributeOrDefault("label", "").toString();
+    }
+
+    @Override
+    public String getFactoryId() {
+        return this.entaxyRuntimeObject.getFactoryId();
+    }
+
+    @Override
+    public String getContainerId() {
+        return "" + getBundleId();
+    }
+
+    @Override
+    public String getScope() {
+        return this.entaxyRuntimeObject.getScope();
+    }
+
+    @Override
+    public String getOwner() {
+        return this.entaxyRuntimeObject.getOwner();
+    }
+
+    @Override
+    public String getRuntimeType() {
+        if (entaxyRuntimeObject != null)
+            return entaxyRuntimeObject.getType();
+        return EntaxyRuntimeObjectMBean.super.getRuntimeType();
+    }
+
+    @Override
+    public boolean isProvided() {
+        if (entaxyRuntimeObject != null)
+            return entaxyRuntimeObject.isProvided();
+        return false;
+    }
+
+    @Override
+    public boolean isGhost() {
+        if (entaxyRuntimeObject != null)
+            return entaxyRuntimeObject.isGhost();
+        return true;
+    }
+
+    @Override
+    public String readConfiguration() {
+        if (entaxyRuntimeObject != null)
+            return entaxyRuntimeObject.getConfiguration();
+        return "";
+    }
+
+    @Override
+    public Map> readExtendedData() {
+        try {
+            BundleContext bundleContext = FrameworkUtil.getBundle(EntaxyRuntimeObjectService.class).getBundleContext();
+            ServiceReference ref =
+                    bundleContext.getServiceReference(EntaxyRuntimeObjectService.class);
+            EntaxyRuntimeObjectService objectService = bundleContext.getService(ref);
+
+            Map> result = objectService.getExtendedObjectInfo(entaxyRuntimeObject);
+
+            bundleContext.ungetService(ref);
+            LOG.debug("Object: " + entaxyRuntimeObject.getObjectFullId() +", readExtendedData: " + result.toString());
+
+            if (result != null)
+                return result;
+
+        } catch (Exception e) {
+            LOG.error(String.format("Error reading extended data for [%s]", entaxyRuntimeObject.getObjectFullId()), e);
+        }
+        return new HashMap<>();
+    }
+}
diff --git a/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/ObjectsContainerMBean.java b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/ObjectsContainerMBean.java
new file mode 100644
index 00000000..58e25578
--- /dev/null
+++ b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/ObjectsContainerMBean.java
@@ -0,0 +1,65 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.object.factory;
+
+import ru.entaxy.esb.platform.base.management.core.api.MBeanAnnotated;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanExportPolicy;
+import ru.entaxy.esb.platform.base.management.core.api.Operation;
+import ru.entaxy.esb.platform.base.management.core.api.Parameter;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectContainerMBean;
+
+@MBeanAnnotated(policy = MBeanExportPolicy.ANNOTATED_ONLY)
+public interface ObjectsContainerMBean extends EntaxyRuntimeObjectContainerMBean {
+
+    @Operation(desc = "Refreshes full object tree")
+    void refresh();
+
+    @Operation(desc = "Start bundle")
+    String startBundle(
+            @Parameter(name = "idOrName", desc = "Id or name of the object") String idOrName,
+            @Parameter(name = "runtimeType", desc = "Runtime type of the object") String runtimeType,
+            @Parameter(name = "forced", desc = "Operation flag for forced processing") boolean forced,
+            @Parameter(name = "soft", desc = "Operation flag for soft processing") boolean soft) throws Exception;
+
+    @Operation(desc = "Stop bundle")
+    String stopBundle(
+            @Parameter(name = "idOrName", desc = "Id or name of the object") String idOrName,
+            @Parameter(name = "runtimeType", desc = "Runtime type of the object") String runtimeType,
+            @Parameter(name = "forced", desc = "Operation flag for forced processing") boolean forced,
+            @Parameter(name = "soft", desc = "Operation flag for soft processing") boolean soft) throws Exception;
+
+    @Operation(desc = "Uninstall bundle")
+    String uninstallBundle(
+            @Parameter(name = "idOrName", desc = "Id or name of the object") String idOrName,
+            @Parameter(name = "runtimeType", desc = "Runtime type of the object") String runtimeType,
+            @Parameter(name = "forced", desc = "Operation flag for forced processing") boolean forced,
+            @Parameter(name = "soft", desc = "Operation flag for soft processing") boolean soft) throws Exception;
+
+    @Operation(desc = "Find objects by osgi filter")
+    String findObjects(
+            @Parameter(name = "osgiFilter", desc = "OSGI filter") String osgiFilter) throws Exception;
+
+}
diff --git a/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/impl/EntaxyObjectMBeanFactory.java b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/impl/EntaxyObjectMBeanFactory.java
new file mode 100644
index 00000000..ce3592a5
--- /dev/null
+++ b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/impl/EntaxyObjectMBeanFactory.java
@@ -0,0 +1,88 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.object.factory.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.management.NotCompliantMBeanException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeItemMBean;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBean;
+import ru.entaxy.platform.core.management.object.MBeanFactory;
+import ru.entaxy.platform.core.management.object.factory.AbstractMBeanFactory;
+import ru.entaxy.platform.core.management.object.impl.EntaxyRuntimeObjectMBeanManager;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+
+@MBeanFactory(id = "root-object-factory", supportedTypes = {"*"})
+// @Component(service = EntaxyRuntimeObjectMBeanFactory.class, immediate = true)
+public class EntaxyObjectMBeanFactory extends AbstractMBeanFactory {
+
+    private static final Logger log = LoggerFactory.getLogger(EntaxyObjectMBeanFactory.class);
+
+    protected ObjectsContainerMBeanImpl objectsContainerMBeanImpl;
+
+    protected EntaxyRuntimeObjectMBeanManager objectMBeanManager;
+
+    public EntaxyObjectMBeanFactory(EntaxyRuntimeObjectMBeanManager objectMBeanManager) {
+        super();
+        this.objectMBeanManager = objectMBeanManager;
+        try {
+            objectsContainerMBeanImpl = new ObjectsContainerMBeanImpl();
+        } catch (NotCompliantMBeanException e) {
+            log.error("Error creating MBean for ObjectsContainerMBean", e);
+        }
+    }
+
+    public void activate() {}
+
+    @Override
+    public  T createMBean(EntaxyRuntimeObject entaxyRuntimeObject) {
+        try {
+            EntaxyRuntimeObjectMBeanImpl result = new EntaxyRuntimeObjectMBeanImpl(entaxyRuntimeObject);
+            if (objectsContainerMBeanImpl != null)
+                result.setParentMBean(objectsContainerMBeanImpl);
+            return (T) result;
+        } catch (NotCompliantMBeanException e) {
+            log.error("Error creating MBean for [" + entaxyRuntimeObject.getObjectFullId() + "]", e);
+            return null;
+        }
+    }
+
+    @Override
+    public List createMBeans() {
+        List result = new ArrayList<>();
+        if (objectsContainerMBeanImpl != null) {
+            objectsContainerMBeanImpl.manager = objectMBeanManager;
+            result.add(objectsContainerMBeanImpl);
+        }
+        return result;
+    }
+
+}
diff --git a/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/impl/EntaxyRuntimeObjectMBeanImpl.java b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/impl/EntaxyRuntimeObjectMBeanImpl.java
new file mode 100644
index 00000000..98773432
--- /dev/null
+++ b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/impl/EntaxyRuntimeObjectMBeanImpl.java
@@ -0,0 +1,41 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.object.factory.impl;
+
+import javax.management.NotCompliantMBeanException;
+
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBean;
+import ru.entaxy.platform.core.management.object.factory.AbstractObjectMBean;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+
+public class EntaxyRuntimeObjectMBeanImpl extends AbstractObjectMBean
+        implements EntaxyRuntimeObjectMBean {
+
+    public EntaxyRuntimeObjectMBeanImpl(EntaxyRuntimeObject entaxyRuntimeObject) throws NotCompliantMBeanException {
+        super(EntaxyRuntimeObjectMBean.class, entaxyRuntimeObject);
+    }
+
+}
diff --git a/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/impl/ObjectsContainerMBeanImpl.java b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/impl/ObjectsContainerMBeanImpl.java
new file mode 100644
index 00000000..e2848d48
--- /dev/null
+++ b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/impl/ObjectsContainerMBeanImpl.java
@@ -0,0 +1,150 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.object.factory.impl;
+
+import javax.management.NotCompliantMBeanException;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import ru.entaxy.platform.base.support.CommonUtils;
+import ru.entaxy.platform.base.support.JSONUtils;
+import ru.entaxy.platform.core.management.object.ContainerMBean;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBeanFactory;
+import ru.entaxy.platform.core.management.object.factory.AbstractObjectContainerMBean;
+import ru.entaxy.platform.core.management.object.factory.ObjectsContainerMBean;
+import ru.entaxy.platform.core.management.object.impl.EntaxyRuntimeObjectMBeanManager;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObjectManager.OperationResult;
+
+import java.util.stream.Collectors;
+
+@ContainerMBean(id = "objects", subQualifierValue = EntaxyRuntimeObjectMBeanFactory.JMX_DEFAULT_CATEGORY)
+public class ObjectsContainerMBeanImpl extends AbstractObjectContainerMBean
+        implements ObjectsContainerMBean {
+
+    protected EntaxyRuntimeObjectMBeanManager manager;
+
+    protected ObjectsContainerMBeanImpl() throws NotCompliantMBeanException {
+        super(ObjectsContainerMBean.class);
+    }
+
+    @Override
+    public void refresh() {
+        manager.refresh();
+    }
+
+    @Override
+    public String startBundle(String idOrName, String runtimeType, boolean forced, boolean soft) throws Exception {
+        if (ServiceHelper.getInstance() == null) {
+            throw new IllegalStateException("Service helper is not initialized");
+        }
+
+        String objectFullId = ServiceHelper.getInstance()
+                .entaxyObjectService.findObject(idOrName, runtimeType).getObjectFullId();
+
+        OperationResult result;
+
+        if (forced) {
+            result = ServiceHelper.getInstance().entaxyRuntimeObjectManager.startForced(objectFullId);
+        } else if (soft) {
+            result = ServiceHelper.getInstance().entaxyRuntimeObjectManager.startSoft(objectFullId);
+        } else {
+            result = ServiceHelper.getInstance().entaxyRuntimeObjectManager.start(objectFullId);
+        }
+
+        return getOutput(result);
+    }
+
+    @Override
+    public String stopBundle(String idOrName, String runtimeType, boolean forced, boolean soft) throws Exception {
+        if (ServiceHelper.getInstance() == null) {
+            throw new IllegalStateException("Service helper is not initialized");
+        }
+
+        String objectFullId = ServiceHelper.getInstance()
+                .entaxyObjectService.findObject(idOrName, runtimeType).getObjectFullId();
+
+        OperationResult result;
+
+        if (forced) {
+            result = ServiceHelper.getInstance().entaxyRuntimeObjectManager.stopForced(objectFullId);
+        } else if (soft) {
+            result = ServiceHelper.getInstance().entaxyRuntimeObjectManager.stopSoft(objectFullId);
+        } else {
+            result = ServiceHelper.getInstance().entaxyRuntimeObjectManager.stop(objectFullId);
+        }
+
+        return getOutput(result);
+    }
+
+    @Override
+    public String uninstallBundle(String idOrName, String runtimeType, boolean forced, boolean soft) throws Exception {
+        if (ServiceHelper.getInstance() == null) {
+            throw new IllegalStateException("Service helper is not initialized");
+        }
+
+        String objectFullId = ServiceHelper.getInstance()
+                .entaxyObjectService.findObject(idOrName, runtimeType).getObjectFullId();
+
+        OperationResult result;
+
+        if (forced) {
+            result = ServiceHelper.getInstance().entaxyRuntimeObjectManager.uninstallForced(objectFullId);
+        } else if (soft) {
+            result = ServiceHelper.getInstance().entaxyRuntimeObjectManager.uninstallSoft(objectFullId);
+        } else {
+            result = ServiceHelper.getInstance().entaxyRuntimeObjectManager.uninstall(objectFullId);
+        }
+
+        return getOutput(result);
+    }
+
+    private String getOutput(OperationResult result) {
+        JsonObject jsonObject = new JsonObject();
+
+        jsonObject.addProperty("result", result.getResult().name());
+        if (!result.getAffected().isEmpty()) {
+            JsonArray affectedArray = new JsonArray();
+            for (String key : result.getAffected().keySet()) {
+                JsonObject affected = new JsonObject();
+                affected.addProperty("objectId", key);
+                affected.addProperty("action", result.getAffected().get(key).name());
+                affectedArray.add(affected);
+            }
+            jsonObject.addProperty("affected", affectedArray.toString());
+        }
+        if (CommonUtils.isValid(result.getMessage())) {
+            jsonObject.addProperty("message", result.getMessage());
+        }
+
+        return jsonObject.toString();
+    }
+
+    public String findObjects(String osgiFilter) throws Exception {
+        return JSONUtils.GSON.toJson(manager.findObjects(osgiFilter).stream().map(object -> {
+            return object.getObjectFullId();
+        }).collect(Collectors.toList()));
+    }
+}
diff --git a/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/impl/ServiceHelper.java b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/impl/ServiceHelper.java
new file mode 100644
index 00000000..5a41884a
--- /dev/null
+++ b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/factory/impl/ServiceHelper.java
@@ -0,0 +1,81 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.object.factory.impl;
+
+import org.apache.karaf.bundle.core.BundleInfo;
+import org.apache.karaf.bundle.core.BundleService;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.annotations.*;
+import ru.entaxy.platform.base.objects.EntaxyObjectService;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObjectManager;
+
+@Component(service = ServiceHelper.class, immediate = true)
+public class ServiceHelper {
+
+    private static ServiceHelper INSTANCE;
+
+    public static ServiceHelper getInstance() {
+        return INSTANCE;
+    }
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC,
+            policyOption = ReferencePolicyOption.GREEDY)
+    volatile public EntaxyObjectService entaxyObjectService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC,
+            policyOption = ReferencePolicyOption.GREEDY)
+    volatile public EntaxyRuntimeObjectManager entaxyRuntimeObjectManager;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    BundleService bundleService;
+
+    BundleContext bundleContext;
+
+    @Activate
+    public void activate(ComponentContext componentContext) {
+        INSTANCE = this;
+        this.bundleContext = componentContext.getBundleContext();
+    }
+
+    @Deactivate
+    public void deactivate() {
+        INSTANCE = null;
+    }
+
+    public BundleService getBundleService() {
+        return bundleService;
+    }
+
+    public BundleInfo getBundleInfo(long id) {
+        Bundle b = FrameworkUtil.getBundle(getClass()).getBundleContext().getBundle(id);
+        if (b == null)
+            return null;
+        return bundleService.getInfo(b);
+    }
+}
diff --git a/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/impl/EntaxyRuntimeItemMBeanInfo.java b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/impl/EntaxyRuntimeItemMBeanInfo.java
new file mode 100644
index 00000000..5a05f414
--- /dev/null
+++ b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/impl/EntaxyRuntimeItemMBeanInfo.java
@@ -0,0 +1,133 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.object.impl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import org.osgi.framework.BundleContext;
+
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeItemMBean;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBeanFactory;
+
+public class EntaxyRuntimeItemMBeanInfo {
+
+    public enum ItemStatus {
+        NEW,
+        ACTIVE,
+        REREGISTER,
+        RECREATE,
+        REMOVE,
+        UNKNOWN
+    }
+
+    public MBeanHolder mbeanHolder = null;
+    boolean isVirtual = false;
+
+    protected BundleContext bundleContext;
+
+    public ItemStatus itemStatus = ItemStatus.UNKNOWN;
+
+    public ItemStatus status() {
+        return itemStatus;
+    }
+
+    public ItemStatus status(ItemStatus newStatus) {
+        if (newStatus == null)
+            return status(ItemStatus.UNKNOWN);
+        this.itemStatus = newStatus;
+        return status();
+    }
+
+    public boolean isInStatus(ItemStatus checkStatus) {
+        return this.itemStatus.equals(checkStatus);
+    }
+
+    EntaxyRuntimeItemMBeanInfo parentMBeanInfo;
+
+    List> children = new ArrayList<>();
+
+    protected EntaxyRuntimeObjectMBeanFactory factory;
+
+    public String getId() {
+        return mbeanHolder == null ? "" : mbeanHolder.mbean.getId();
+    }
+
+    public boolean createHolder(T mbean) {
+        mbeanHolder = MBeanHolder.create(mbean);
+        return isCreated();
+    }
+
+    public boolean isCreated() {
+        if (mbeanHolder == null)
+            return false;
+        return mbeanHolder.mbean != null;
+    }
+
+    public boolean isRegistered() {
+        return isCreated() && (mbeanHolder.registration != null);
+    }
+
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    public void register(BundleContext bundleContext) {
+        setBundleContext(bundleContext);
+        register();
+    }
+
+    public void register() {
+        try {
+            if (this.mbeanHolder.bundleContext == null)
+                this.mbeanHolder.bundleContext = this.bundleContext;
+            this.mbeanHolder.register();
+        } catch (Exception ignore) {
+            // NOOP
+        }
+    }
+
+    public void unregister() {
+        try {
+            this.mbeanHolder.unregister();
+        } catch (Exception ignore) {
+            // NOOP
+        }
+    }
+
+    public Map getAllChildMBeans() {
+        if (this.mbeanHolder != null)
+            return this.mbeanHolder.mbean.getChildMBeans();
+        return Collections.emptyMap();
+    };
+
+    public Map getPrimaryChildMBeans() {
+        return getAllChildMBeans();
+    };
+
+}
diff --git a/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/impl/EntaxyRuntimeObjectContainerMBeanInfo.java b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/impl/EntaxyRuntimeObjectContainerMBeanInfo.java
new file mode 100644
index 00000000..e4ed0b7b
--- /dev/null
+++ b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/impl/EntaxyRuntimeObjectContainerMBeanInfo.java
@@ -0,0 +1,33 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.object.impl;
+
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectContainerMBean;
+
+public class EntaxyRuntimeObjectContainerMBeanInfo
+        extends EntaxyRuntimeItemMBeanInfo {
+
+}
diff --git a/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/impl/EntaxyRuntimeObjectMBeanCustomizerHolder.java b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/impl/EntaxyRuntimeObjectMBeanCustomizerHolder.java
new file mode 100644
index 00000000..ccf38c35
--- /dev/null
+++ b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/impl/EntaxyRuntimeObjectMBeanCustomizerHolder.java
@@ -0,0 +1,43 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.object.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBeanCustomizer;
+
+public class EntaxyRuntimeObjectMBeanCustomizerHolder {
+
+    public EntaxyRuntimeObjectMBeanCustomizer customizer;
+
+    public List> mbeanInfo = new ArrayList<>();
+
+    public EntaxyRuntimeObjectMBeanCustomizerHolder(EntaxyRuntimeObjectMBeanCustomizer customizer) {
+        this.customizer = customizer;
+    }
+
+}
diff --git a/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/impl/EntaxyRuntimeObjectMBeanInfo.java b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/impl/EntaxyRuntimeObjectMBeanInfo.java
new file mode 100644
index 00000000..3fa9c231
--- /dev/null
+++ b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/impl/EntaxyRuntimeObjectMBeanInfo.java
@@ -0,0 +1,119 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.object.impl;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeItemMBean;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBean;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeRelation;
+
+public class EntaxyRuntimeObjectMBeanInfo extends EntaxyRuntimeItemMBeanInfo {
+
+    public enum LOAD_STATUS {
+        AUTO_LOADED,
+        LOADED,
+        NONE
+    }
+
+    public EntaxyRuntimeObjectMBeanInfo(EntaxyRuntimeObject runtimeObject) {
+        this.runtimeObject = runtimeObject;
+    }
+
+    String foundPattern;
+
+    EntaxyRuntimeObject runtimeObject;
+
+    EntaxyRuntimeObject parentObject;
+
+    EntaxyRuntimeRelation relationFromParent;
+
+    LOAD_STATUS loadStatus = LOAD_STATUS.NONE;
+
+    Map> secondaryBeans = new HashMap<>();
+
+    public boolean isGhost() {
+        return this.runtimeObject.isGhost();
+    }
+
+    public void resetStatus() {
+        this.loadStatus = LOAD_STATUS.NONE;
+    }
+
+    public void makeAutoLoaded() {
+        this.loadStatus = LOAD_STATUS.AUTO_LOADED;
+    }
+
+    public boolean isAutoLoaded() {
+        return LOAD_STATUS.AUTO_LOADED.equals(this.loadStatus);
+    }
+
+    public void makeLoaded() {
+        this.loadStatus = LOAD_STATUS.LOADED;
+    }
+
+    public boolean isLoaded() {
+        return LOAD_STATUS.LOADED.equals(this.loadStatus);
+    }
+
+    public boolean isUpdatedByLoad() {
+        return !LOAD_STATUS.NONE.equals(this.loadStatus);
+    }
+
+    public void register() {
+        super.register();
+        for (String key : secondaryBeans.keySet()) {
+            List list = secondaryBeans.get(key);
+            for (EntaxyRuntimeObjectMBeanInfo sMBean : list)
+                sMBean.register(this.bundleContext);
+        }
+    }
+
+    public void unregister() {
+        for (String key : secondaryBeans.keySet()) {
+            List list = secondaryBeans.get(key);
+            for (EntaxyRuntimeObjectMBeanInfo sMBean : list)
+                sMBean.unregister();
+        }
+        super.unregister();
+    }
+
+    @Override
+    public Map getPrimaryChildMBeans() {
+        final List secondariesIds =
+                secondaryBeans.values().stream().flatMap(list -> list.stream())
+                        .map(bi -> bi.mbeanHolder.mbean.getId())
+                        .collect(Collectors.toList());
+        Map result =
+                getAllChildMBeans().entrySet().stream().filter(e -> !secondariesIds.contains(e.getValue().getId()))
+                        .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue()));
+        return result;
+    }
+}
diff --git a/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/impl/EntaxyRuntimeObjectMBeanManager.java b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/impl/EntaxyRuntimeObjectMBeanManager.java
new file mode 100644
index 00000000..6be7de85
--- /dev/null
+++ b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/impl/EntaxyRuntimeObjectMBeanManager.java
@@ -0,0 +1,734 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.object.impl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.CollectionType;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+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.platform.base.objects.EntaxyObject.OBJECT_RELATION;
+import ru.entaxy.platform.base.support.CommonUtils;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeItemMBean;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBean;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBeanCustomizer;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBeanCustomizer.Customized;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBeanFactory;
+import ru.entaxy.platform.core.management.object.factory.impl.EntaxyObjectMBeanFactory;
+import ru.entaxy.platform.core.management.object.impl.EntaxyRuntimeItemMBeanInfo.ItemStatus;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObjectManager;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObjectService;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeRelation;
+
+@Component(service = EntaxyRuntimeObjectMBeanManager.class, immediate = true)
+public class EntaxyRuntimeObjectMBeanManager implements EntaxyRuntimeObjectService.Listener {
+
+    private static final Logger log = LoggerFactory.getLogger(EntaxyRuntimeObjectMBeanManager.class);
+
+    private static final String TYPE_WILDCARD = "*";
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC,
+            policyOption = ReferencePolicyOption.GREEDY)
+    volatile EntaxyRuntimeObjectService entaxyRuntimeObjectService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC,
+            policyOption = ReferencePolicyOption.GREEDY)
+    volatile EntaxyRuntimeObjectManager entaxyRuntimeObjectManager;
+
+    protected static class FactorySearchResult {
+
+        public static FactorySearchResult create(EntaxyRuntimeObjectMBeanFactory factory, String pattern) {
+            return new FactorySearchResult(factory, pattern);
+        }
+
+        EntaxyRuntimeObjectMBeanFactory factory;
+        String pattern;
+
+        protected FactorySearchResult(EntaxyRuntimeObjectMBeanFactory factory, String pattern) {
+            this.factory = factory;
+            this.pattern = pattern;
+        }
+
+    }
+
+    protected Map factoriesMap = new HashMap<>();
+
+    protected Map> infoById = new HashMap<>();
+
+    protected Map customizersMap =
+            new HashMap<>();
+
+    // protected Map> infoByJMXObjectName = new HashMap<>();
+
+    protected List toRemove = new ArrayList<>();
+
+    protected BundleContext bundleContext;
+
+    protected boolean activated = false;
+
+    protected Object lock = new Object();
+
+    @Activate
+    public EntaxyRuntimeObjectMBeanManager(BundleContext bundleContext) {
+        super();
+        this.bundleContext = bundleContext;
+
+        // add root factory
+        addFactory(new EntaxyObjectMBeanFactory(this));
+    }
+
+
+    @Activate
+    public void activate(ComponentContext componentContext) {
+        // this.bundleContext = componentContext.getBundleContext();
+        activated = true;
+        synchronized (lock) {
+            entaxyRuntimeObjectService.addListener(this);
+            loadCurrentObjects();
+        }
+
+    }
+
+
+    @Deactivate
+    public void deactivate() {
+        entaxyRuntimeObjectService.removeListener(this);
+    }
+
+    @Reference(cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC,
+            policyOption = ReferencePolicyOption.GREEDY,
+            collectionType = CollectionType.SERVICE, unbind = "removeFactory")
+    public void addFactory(EntaxyRuntimeObjectMBeanFactory factory) {
+        synchronized (lock) {
+            for (String pattern : factory.getSupportedTypes()) {
+                factoriesMap.put(pattern, factory);
+            }
+            List mbeans = factory.createMBeans();
+            if (mbeans != null)
+                for (EntaxyRuntimeItemMBean mbean : mbeans) {
+                    EntaxyRuntimeItemMBeanInfo mbeanInfo = MBeanUtils.createMBeanInfo(mbean);
+                    if (!mbeanInfo.isCreated()) {
+                        log.error("Error creating MBeanInfo for mbean [{}]", mbean.getId());
+                        continue;
+                    }
+                    if (infoById.containsKey(mbeanInfo.getId())) {
+                        try {
+                            infoById.get(mbeanInfo.getId()).unregister();
+                        } catch (Exception ignore) {
+                            // ignore
+                        }
+                    }
+                    infoById.put(mbeanInfo.getId(), mbeanInfo);
+                    mbeanInfo.register(bundleContext);
+                }
+
+
+            // review all created mbeans if they suit newly added factory
+
+            List infoToRecreate = new ArrayList<>();
+            List> infoToReregister = new ArrayList<>();
+
+            for (EntaxyRuntimeItemMBeanInfo itemInfo : infoById.values()) {
+                if (!(itemInfo instanceof EntaxyRuntimeObjectMBeanInfo))
+                    continue;
+                EntaxyRuntimeObjectMBeanInfo mBeanInfo = (EntaxyRuntimeObjectMBeanInfo) itemInfo;
+                FactorySearchResult result = findFactory(mBeanInfo.runtimeObject);
+                if (result.factory.getId().equals(factory.getId()))
+                    if (!infoToRecreate.contains(mBeanInfo))
+                        infoToRecreate.add(mBeanInfo);
+            }
+
+            List itemsToReregister = new ArrayList<>();
+
+            for (EntaxyRuntimeObjectMBeanInfo mBeanInfo : infoToRecreate)
+                collectCascadeChildren(itemsToReregister, mBeanInfo.mbeanHolder.mbean);
+
+            infoToReregister.addAll(itemsToReregister.stream()
+                    .map(item -> infoById.get(item.getId()))
+                    .filter(item -> item != null)
+                    .collect(Collectors.toList()));
+            infoToReregister.removeAll(infoToRecreate);
+
+            List runtimeObjects = infoToRecreate.stream()
+                    .map(inf -> inf.runtimeObject)
+                    .collect(Collectors.toList());
+
+            ObjectHelper helper = new ObjectHelper(runtimeObjects);
+
+            List recreatedInfos = helper.load();
+
+            List toRegister = new ArrayList<>();
+
+            for (EntaxyRuntimeObjectMBeanInfo newInfo : recreatedInfos) {
+
+                EntaxyRuntimeObjectMBeanInfo oldInfo = (EntaxyRuntimeObjectMBeanInfo) infoById.get(newInfo.getId());
+
+                if (oldInfo == null) {
+
+                    // just add
+
+                    infoById.put(newInfo.getId(), newInfo);
+                    newInfo.setBundleContext(bundleContext);
+                    newInfo.status(ItemStatus.REREGISTER);
+                    toRegister.add(newInfo);
+                } else {
+
+                    // mbean info already exists
+
+                    if (newInfo.isAutoLoaded()) {
+
+                        // object loaded only as someone's parent
+                        // so we just switch the children links
+                        switchChildren(newInfo.mbeanHolder.mbean, oldInfo.mbeanHolder.mbean);
+
+                        if (oldInfo.isInStatus(ItemStatus.REMOVE))
+                            oldInfo.status(ItemStatus.REREGISTER);
+
+                    } else if (newInfo.isLoaded()) {
+
+                        // unregister existing mbean
+                        oldInfo.unregister();
+
+                        updateObjectMBeanInfo(newInfo, oldInfo, toRegister);
+
+                        switchChildren(oldInfo.mbeanHolder.mbean, newInfo.mbeanHolder.mbean);
+
+                        // detach old secondaries from parent
+                        for (String key : oldInfo.secondaryBeans.keySet()) {
+                            List list = oldInfo.secondaryBeans.get(key);
+                            for (EntaxyRuntimeObjectMBeanInfo bi : list)
+                                bi.mbeanHolder.mbean.setParentMBean(null);
+                        }
+
+                        // remove all secondaries
+                        oldInfo.secondaryBeans.clear();
+
+                        // add new secondaries
+                        oldInfo.secondaryBeans.putAll(newInfo.secondaryBeans);
+
+                        // set new mbean
+                        oldInfo.mbeanHolder.mbean = newInfo.mbeanHolder.mbean;
+
+                        oldInfo.status(ItemStatus.REREGISTER);
+
+                        // schedule existing to re-register
+                        toRegister.add(oldInfo);
+
+                    }
+
+                }
+
+            }
+
+            /*
+             * for (EntaxyRuntimeObjectMBeanInfo mBeanInfo : infoToRecreate) { FactorySearchResult
+             * searchResult = findFactory(mBeanInfo.runtimeObject); EntaxyRuntimeObjectMBean
+             * newMBean = searchResult.factory.createMBean(mBeanInfo.runtimeObject);
+             * EntaxyRuntimeObjectMBeanInfo newInfo = (EntaxyRuntimeObjectMBeanInfo)
+             * MBeanUtils.createMBeanInfo(newMBean);
+             * 
+             * mBeanInfo.mbeanHolder.unregister();
+             * 
+             * if (newInfo.mbeanHolder.mbean.getParentMBean() == null) {
+             * newInfo.mbeanHolder.mbean.setParentMBean(mBeanInfo.mbeanHolder.mbean.getParentMBean()
+             * ); }
+             * 
+             * // unlink from parent and switch children
+             * mBeanInfo.mbeanHolder.mbean.setParentMBean(null);
+             * switchChildren(mBeanInfo.mbeanHolder.mbean, newInfo.mbeanHolder.mbean);
+             * 
+             * infoById.put(newInfo.getId(), newInfo); newInfo.mbeanHolder.bundleContext =
+             * bundleContext; newInfo.mbeanHolder.register(); }
+             */
+
+            for (EntaxyRuntimeItemMBeanInfo toReg : toRegister) {
+                toReg.unregister();
+                toReg.register();
+            }
+
+            infoToReregister.removeAll(toRegister);
+
+            for (EntaxyRuntimeItemMBeanInfo toReg : infoToReregister) {
+                toReg.unregister();
+                toReg.register();
+            }
+        }
+
+
+    }
+
+    public void refresh() {
+        synchronized (lock) {
+            toRemove.addAll(infoById.values().stream()
+                    .filter(v -> (v instanceof EntaxyRuntimeObjectMBeanInfo))
+                    .map(v -> EntaxyRuntimeObjectMBeanInfo.class.cast(v))
+                    .collect(Collectors.toList()));
+            tryToRemove();
+            loadCurrentObjects();
+        }
+    }
+
+    public void removeFactory(EntaxyRuntimeObjectMBeanFactory factory) {
+        for (String pattern : factory.getSupportedTypes()) {
+            factoriesMap.remove(pattern);
+        }
+    }
+
+    @Reference(cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC,
+            policyOption = ReferencePolicyOption.GREEDY,
+            collectionType = CollectionType.SERVICE, unbind = "removeCustomizer")
+    public void addCustomizer(EntaxyRuntimeObjectMBeanCustomizer customizer) {
+
+        synchronized (lock) {
+
+            EntaxyRuntimeObjectMBeanCustomizerHolder holder = customizersMap.get(customizer.getId());
+
+            if (holder != null) {
+                // just switch to new customizer
+                holder.customizer = customizer;
+            } else {
+                holder = new EntaxyRuntimeObjectMBeanCustomizerHolder(customizer);
+
+                customizersMap.put(customizer.getId(), holder);
+
+                for (EntaxyRuntimeItemMBeanInfo itemInfo : infoById.values()) {
+
+                    if ((itemInfo.mbeanHolder == null)
+                            || !(itemInfo.mbeanHolder.mbean instanceof EntaxyRuntimeObjectMBean))
+                        continue;
+
+                    if (!customizer.isAccepted((EntaxyRuntimeObjectMBean) itemInfo.mbeanHolder.mbean))
+                        continue;
+
+                    EntaxyRuntimeObjectMBeanInfo objectInfo = (EntaxyRuntimeObjectMBeanInfo) itemInfo;
+
+                    Customized customized = customizer.customize(objectInfo.mbeanHolder.mbean);
+
+                    if (customized.getAdditionalMBeans() == null || customized.getAdditionalMBeans().isEmpty())
+                        continue;
+
+                    List secondaries = customized.getAdditionalMBeans().stream()
+                            .map(b -> (EntaxyRuntimeObjectMBeanInfo) MBeanUtils.createMBeanInfo(b)).map(bi -> {
+                                bi.status(ItemStatus.NEW);
+                                bi.runtimeObject = objectInfo.runtimeObject;
+                                return bi;
+                            }).collect(Collectors.toList());
+
+                    for (EntaxyRuntimeObjectMBeanInfo bi : secondaries) {
+                        bi.register(bundleContext);
+                    }
+
+                    objectInfo.secondaryBeans.put(customizer.getId(), secondaries);
+
+                }
+
+            }
+
+        }
+
+    }
+
+    public void removeCustomizer(EntaxyRuntimeObjectMBeanCustomizer customizer) {
+        synchronized (lock) {
+
+            for (EntaxyRuntimeItemMBeanInfo itemInfo : infoById.values()) {
+
+                if ((itemInfo.mbeanHolder == null)
+                        || !(itemInfo.mbeanHolder.mbean instanceof EntaxyRuntimeObjectMBean))
+                    continue;
+
+                EntaxyRuntimeObjectMBeanInfo objectInfo = (EntaxyRuntimeObjectMBeanInfo) itemInfo;
+
+                if (objectInfo.secondaryBeans.containsKey(customizer.getId())) {
+                    for (EntaxyRuntimeObjectMBeanInfo sBean : objectInfo.secondaryBeans.get(customizer.getId()))
+                        sBean.unregister();
+                    objectInfo.secondaryBeans.remove(customizer.getId());
+                }
+
+            }
+
+            customizersMap.remove(customizer.getId());
+        }
+
+    }
+
+    protected void loadCurrentObjects() {
+
+        ObjectHelper helper = new ObjectHelper(entaxyRuntimeObjectService.getObjects());
+        List mBeanInfoList = helper.load();
+
+        for (EntaxyRuntimeObjectMBeanInfo mBeanInfo : mBeanInfoList) {
+            infoById.put(mBeanInfo.getId(), mBeanInfo);
+            mBeanInfo.register(bundleContext);
+            mBeanInfo.resetStatus();
+        }
+
+    }
+
+    protected FactorySearchResult findFactory(EntaxyRuntimeObject entaxyRuntimeObject) {
+        EntaxyRuntimeObjectMBeanFactory result = null;
+        String type = entaxyRuntimeObject.getType();
+        while (CommonUtils.isValid(type)) {
+            result = factoriesMap.get(type);
+            if (result != null)
+                return FactorySearchResult.create(result, type);
+            int index = type.lastIndexOf('.');
+            if (index < 0) {
+                if (type.equals(TYPE_WILDCARD))
+                    type = "";
+                else
+                    type = TYPE_WILDCARD;
+            } else {
+                if (type.endsWith(TYPE_WILDCARD))
+                    type = type.substring(0, index);
+                else {
+                    type = type.substring(0, index).concat(".").concat(TYPE_WILDCARD);
+                }
+            }
+        }
+
+        return FactorySearchResult.create(null, "");
+    }
+
+    protected void findFactory(EntaxyRuntimeObjectMBeanInfo mBeanInfo) {
+        FactorySearchResult searchResult = findFactory(mBeanInfo.runtimeObject);
+        if (searchResult != null) {
+            mBeanInfo.factory = searchResult.factory;
+            mBeanInfo.foundPattern = searchResult.pattern;
+        }
+    }
+
+
+    // EntaxyRuntimeObjectService.Listener
+
+    @Override
+    public void objectAdded(EntaxyRuntimeObject object) {
+        if (object == null)
+            return;
+        synchronized (lock) {
+            ObjectHelper helper = new ObjectHelper(Collections.singletonList(object));
+            List mBeanInfoList = helper.load();
+
+            List toRegister = new ArrayList<>();
+
+            for (EntaxyRuntimeObjectMBeanInfo mBeanInfo : mBeanInfoList) {
+
+                if (!infoById.containsKey(mBeanInfo.getId())) {
+
+                    // just add
+
+                    infoById.put(mBeanInfo.getId(), mBeanInfo);
+                    mBeanInfo.setBundleContext(bundleContext);;
+                    mBeanInfo.status(ItemStatus.REREGISTER);
+                    toRegister.add(mBeanInfo);
+                } else {
+
+                    // mbean info already exists
+
+                    EntaxyRuntimeObjectMBeanInfo existing =
+                            (EntaxyRuntimeObjectMBeanInfo) infoById.get(mBeanInfo.getId());
+
+                    if (mBeanInfo.isAutoLoaded()) {
+
+                        // object loaded only as someone's parent
+                        // so we just switch the children links
+                        // switchChildren(mBeanInfo.mbeanHolder.mbean, existing.mbeanHolder.mbean);
+
+                        switchChildren(mBeanInfo.mbeanHolder.mbean, existing.mbeanHolder.mbean,
+                                existing.secondaryBeans.values().stream().flatMap(list -> list.stream())
+                                        .map(bi -> bi.mbeanHolder.mbean).collect(Collectors.toList()));
+
+                        if (existing.isInStatus(ItemStatus.REMOVE))
+                            existing.status(ItemStatus.REREGISTER);
+
+                    } else if (mBeanInfo.isLoaded()) {
+
+                        // unregister existing mbean
+                        existing.unregister();
+
+                        updateObjectMBeanInfo(mBeanInfo, existing, toRegister);
+
+                        // switchChildren(existing.mbeanHolder.mbean, mBeanInfo.mbeanHolder.mbean);
+
+                        switchChildren(existing.mbeanHolder.mbean, mBeanInfo.mbeanHolder.mbean,
+                                existing.secondaryBeans.values().stream().flatMap(list -> list.stream())
+                                        .map(bi -> bi.mbeanHolder.mbean).collect(Collectors.toList()));
+
+                        // detach old secondaries from parent
+                        for (String key : existing.secondaryBeans.keySet()) {
+                            List list = existing.secondaryBeans.get(key);
+                            for (EntaxyRuntimeObjectMBeanInfo bi : list)
+                                bi.mbeanHolder.mbean.setParentMBean(null);
+                        }
+
+                        // remove all secondaries
+                        existing.secondaryBeans.clear();
+
+                        // add new secondaries
+                        existing.secondaryBeans.putAll(mBeanInfo.secondaryBeans);
+
+                        // set new mbean
+                        existing.mbeanHolder.mbean = mBeanInfo.mbeanHolder.mbean;
+
+                        existing.status(ItemStatus.REREGISTER);
+
+                        // schedule existing to re-register
+                        toRegister.add(existing);
+
+                    }
+
+                }
+
+            }
+
+            for (EntaxyRuntimeObjectMBeanInfo mbean : toRegister) {
+                if (mbean.isRegistered())
+                    mbean.unregister();
+                mbean.register();
+            }
+
+        }
+
+    }
+
+    protected void switchChildren(EntaxyRuntimeItemMBean fromMBean, EntaxyRuntimeItemMBean toMBean,
+            List ignore) {
+
+        // avoid cuncurrent modifications
+        List children = new ArrayList<>(fromMBean.getChildMBeans().values());
+
+        for (EntaxyRuntimeItemMBean child : children)
+            if (!ignore.contains(child))
+                child.setParentMBean(toMBean);
+
+    }
+
+    protected void switchChildren(EntaxyRuntimeItemMBean fromMBean, EntaxyRuntimeItemMBean toMBean) {
+
+        // avoid cuncurrent modifications
+        List children = new ArrayList<>(fromMBean.getChildMBeans().values());
+
+        for (EntaxyRuntimeItemMBean child : children)
+            child.setParentMBean(toMBean);
+    }
+
+    protected void updateObjectMBeanInfo(EntaxyRuntimeObjectMBeanInfo fromMBeanInfo,
+            EntaxyRuntimeObjectMBeanInfo toMBeanInfo, List affectedItems) {
+
+        // switch existing children to new mbean
+        // and schedule them to re-register
+        /*
+         * List children = new
+         * ArrayList<>(fromMBeanInfo.mbeanHolder.mbean.getChildMBeans().values()); for
+         * (EntaxyRuntimeItemMBean child : children) {
+         * child.setParentMBean(toMBeanInfo.mbeanHolder.mbean); if
+         * (!affectedItems.contains(infoById.get(child.getId())))
+         * affectedItems.add((EntaxyRuntimeObjectMBeanInfo) infoById.get(child.getId()));
+         * 
+         * List cascadeChildren = new ArrayList<>();
+         * collectCascadeChildren(cascadeChildren, child); affectedItems.addAll(
+         * cascadeChildren.stream() .map(c -> (EntaxyRuntimeObjectMBeanInfo)
+         * infoById.get(c.getId())) .collect(Collectors.toList())); }
+         */
+        // set parent to new mbean
+        // existing.mbeanHolder.mbean.setParentMBean(mBeanInfo.mbeanHolder.mbean.getParentMBean());
+        // toMBeanInfo.mbeanHolder.mbean.setParentMBean(null);
+
+        // update existing
+        toMBeanInfo.factory = fromMBeanInfo.factory;
+        toMBeanInfo.foundPattern = fromMBeanInfo.foundPattern;
+        toMBeanInfo.relationFromParent = fromMBeanInfo.relationFromParent;
+        toMBeanInfo.runtimeObject = fromMBeanInfo.runtimeObject;
+
+    }
+
+    protected void collectCascadeChildren(List result, EntaxyRuntimeItemMBean startMBean) {
+        for (EntaxyRuntimeItemMBean child : startMBean.getChildMBeans().values()) {
+            result.add(child);
+            collectCascadeChildren(result, child);
+        }
+    }
+
+    @Override
+    public void objectModified(EntaxyRuntimeObject object) {
+        // we'll do the same as when an object is added
+        objectAdded(object);
+    }
+
+    @Override
+    public void objectRemoved(EntaxyRuntimeObject object) {
+        synchronized (lock) {
+            if (!infoById.containsKey(object.getObjectFullId()))
+                return;
+            toRemove.add((EntaxyRuntimeObjectMBeanInfo) infoById.get(object.getObjectFullId()));
+            tryToRemove();
+        }
+    }
+
+    protected void tryToRemove() {
+        int currentSize = -1;
+        while (currentSize != toRemove.size()) {
+            currentSize = toRemove.size();
+            List removed = new ArrayList<>();
+            for (EntaxyRuntimeObjectMBeanInfo item : toRemove) {
+                if (item.isRegistered())
+                    item.unregister();
+                // if (item.mbeanHolder.mbean.getChildMBeans().isEmpty()) {
+                if (item.getPrimaryChildMBeans().isEmpty()) {
+                    // remove from parent
+                    item.mbeanHolder.mbean.setParentMBean(null);
+                    // remove
+                    infoById.remove(item.getId());
+
+                    removed.add(item);
+                }
+            }
+            toRemove.removeAll(removed);
+        }
+    }
+
+    // Util classes
+
+    protected class ObjectHelper {
+
+        List objects;
+
+        Map createdInfo = new HashMap<>();
+
+        public ObjectHelper(List objects) {
+            this.objects = objects;
+        }
+
+        public List load() {
+
+            // create Mbean info objects
+            for (EntaxyRuntimeObject object : this.objects) {
+                String objectId = object.getObjectFullId();
+
+                EntaxyRuntimeObjectMBeanInfo mBeanInfo = getOrCreateMBeanInfo(object);
+                if (mBeanInfo == null)
+                    continue;
+
+                mBeanInfo.makeLoaded();
+
+                EntaxyRuntimeObjectMBean mBean = mBeanInfo.mbeanHolder.mbean;
+
+                List relations = object.getIncomiingRelations(OBJECT_RELATION.COMPOSITION);
+                if (relations.isEmpty())
+                    relations = object.getIncomiingRelations(OBJECT_RELATION.AGGREGATION);
+                if (relations.isEmpty())
+                    continue;
+
+                EntaxyRuntimeRelation parentLink = relations.get(0);
+                EntaxyRuntimeObject parentObject = parentLink.getMain();
+                String parentObjectId = parentObject.getObjectFullId();
+                EntaxyRuntimeObjectMBeanInfo mBeanInfoParent = getOrCreateMBeanInfo(parentObject);
+
+                if (!mBeanInfoParent.isLoaded())
+                    mBeanInfoParent.makeAutoLoaded();
+
+                mBean.setParentMBean(mBeanInfoParent.mbeanHolder.mbean);
+                if (CommonUtils.isValid(parentLink.getName()))
+                    mBean.setJMXSubQualifierName(parentLink.getName());
+                mBean.setParentSubPath(parentLink.getGroup());
+            }
+
+            return new ArrayList<>(createdInfo.values());
+
+        }
+
+        protected EntaxyRuntimeObjectMBeanInfo getOrCreateMBeanInfo(EntaxyRuntimeObject object) {
+            String objectId = object.getObjectFullId();
+            if (!createdInfo.containsKey(objectId)) {
+                FactorySearchResult searchResult = findFactory(object);
+                if (searchResult.factory == null) {
+                    log.warn("No MBean factory found for object [{}]", objectId);
+                    return null;
+                }
+                EntaxyRuntimeObjectMBean mBean = searchResult.factory.createMBean(object);
+                EntaxyRuntimeObjectMBeanInfo mBeanInfo =
+                        (EntaxyRuntimeObjectMBeanInfo) MBeanUtils.createMBeanInfo(mBean);
+
+                for (EntaxyRuntimeObjectMBeanCustomizerHolder holder : customizersMap.values()) {
+                    EntaxyRuntimeObjectMBeanCustomizer customizer = holder.customizer;
+                    if (customizer.isAccepted(mBean)) {
+                        Customized customized = customizer.customize(mBean);
+                        if (customized.getAdditionalMBeans() != null && !customized.getAdditionalMBeans().isEmpty())
+                            mBeanInfo.secondaryBeans.put(customizer.getId(),
+                                    customized.getAdditionalMBeans().stream()
+                                            .map(b -> (EntaxyRuntimeObjectMBeanInfo) MBeanUtils.createMBeanInfo(b))
+                                            .map(bi -> {
+                                                bi.status(ItemStatus.NEW);
+                                                bi.runtimeObject = object;
+                                                return bi;
+                                            })
+                                            .collect(Collectors.toList()));
+                    }
+
+                }
+
+                mBeanInfo.status(ItemStatus.NEW);
+                mBeanInfo.runtimeObject = object;
+                createdInfo.put(objectId, mBeanInfo);
+                return mBeanInfo;
+            } else {
+                return createdInfo.get(objectId);
+            }
+
+        }
+    }
+
+    public Map getFactoriesMap() {
+        return Collections.unmodifiableMap(factoriesMap);
+    }
+
+
+    public Map> getInfoById() {
+        return Collections.unmodifiableMap(infoById);
+    }
+
+    public List findObjects(String osgiFilter) throws InvalidSyntaxException {
+        return entaxyRuntimeObjectService.findObjects(osgiFilter);
+    }
+
+}
diff --git a/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/impl/MBeanHolder.java b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/impl/MBeanHolder.java
new file mode 100644
index 00000000..7669b225
--- /dev/null
+++ b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/impl/MBeanHolder.java
@@ -0,0 +1,150 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.object.impl;
+
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Iterator;
+
+import javax.management.DynamicMBean;
+import javax.management.MBeanRegistration;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import ru.entaxy.esb.platform.base.management.core.ManagementCore;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeItemMBean;
+
+public class MBeanHolder {
+
+    private static final Logger log = LoggerFactory.getLogger(MBeanHolder.class);
+
+    public static  MBeanHolder create(S mbean) {
+        MBeanHolder result = new MBeanHolder();
+        result.mbean = mbean;
+        result.objectId = mbean.getId();
+        return result;
+    }
+
+    public static  MBeanHolder register(Class mbeanClass,
+            S mbean,
+            Dictionary properties,
+            BundleContext bundleContext) {
+
+        MBeanHolder result = create(mbean);
+
+        if (properties != null) {
+            result.clearProperties();
+            Enumeration keys = properties.keys();
+            while (keys.hasMoreElements()) {
+                String key = keys.nextElement();
+                result.registrationProperties.put(key, properties.get(key));
+            }
+        }
+
+        if (mbeanClass != null)
+            result.register(mbeanClass);
+        else
+            result.register();
+
+        return result;
+    }
+
+    ServiceRegistration registration;
+
+    public String objectId;
+
+    public T mbean;
+
+    Dictionary registrationPropertiesDefaults = new Hashtable<>();
+
+    Dictionary registrationProperties = new Hashtable<>();
+
+    BundleContext bundleContext;
+
+    public void clearProperties() {
+        this.registrationProperties = new Hashtable<>();
+    }
+
+    protected void loadDefaultProperties() {
+        Iterator iter = registrationPropertiesDefaults.keys().asIterator();
+        while (iter.hasNext()) {
+            String key = iter.next();
+            registrationProperties.put(key, registrationPropertiesDefaults.get(key));
+        }
+    }
+
+    public void register() {
+        if (this.mbean == null)
+            return;
+        register(this.mbean.getMBeanClass());
+    }
+
+    public void register(Class mbeanClass) {
+        if (this.mbean == null)
+            return;
+
+        unregister();
+
+        String[] classes = new String[] {
+            mbeanClass.getName(),
+            DynamicMBean.class.getName(),
+            MBeanRegistration.class.getName()
+        };
+
+        loadDefaultProperties();
+
+        if (registrationProperties.get(ManagementCore.JMX_OBJECTNAME) == null) {
+            registrationProperties.put(ManagementCore.JMX_OBJECTNAME,
+                    MBeanUtils.addNamespace(MBeanUtils.calculateJmxObjectName(mbean)));
+        }
+
+        try {
+            registration = bundleContext.registerService(classes, mbean, registrationProperties);
+        } catch (Exception e) {
+            log.error("Error registering MBean [" + mbean.getId() + "]", e);
+        }
+
+    }
+
+
+    public void unregister() {
+        if (registration != null) {
+            try {
+                registration.unregister();
+            } catch (Exception ignore) {
+                // NOOP
+            }
+
+            registration = null;
+
+        }
+        clearProperties();
+    }
+}
diff --git a/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/impl/MBeanUtils.java b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/impl/MBeanUtils.java
new file mode 100644
index 00000000..76a23beb
--- /dev/null
+++ b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/impl/MBeanUtils.java
@@ -0,0 +1,101 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.object.impl;
+
+import java.util.Arrays;
+import java.util.stream.Collectors;
+
+import ru.entaxy.esb.platform.base.management.core.ManagementCore;
+import ru.entaxy.platform.base.support.CommonUtils;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeItemMBean;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectContainerMBean;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBean;
+
+public class MBeanUtils {
+
+
+    public static EntaxyRuntimeItemMBeanInfo createMBeanInfo(EntaxyRuntimeItemMBean mBean) {
+        if (EntaxyRuntimeObjectMBean.class.isAssignableFrom(mBean.getMBeanClass())) {
+            EntaxyRuntimeObjectMBeanInfo mBeanInfo = new EntaxyRuntimeObjectMBeanInfo(
+                    ((EntaxyRuntimeObjectMBean) mBean).getRuntimeObject());
+            mBeanInfo.createHolder((EntaxyRuntimeObjectMBean) mBean);
+            return mBeanInfo;
+        } else {
+            EntaxyRuntimeObjectContainerMBeanInfo mBeanInfo = new EntaxyRuntimeObjectContainerMBeanInfo();
+            mBeanInfo.createHolder((EntaxyRuntimeObjectContainerMBean) mBean);
+            return mBeanInfo;
+        }
+    }
+
+    public static String calculateJmxObjectName(EntaxyRuntimeItemMBean mbean) {
+        return calculateJmxObjectName(mbean, EntaxyRuntimeItemMBean.JMX_SUBPATH_QUALIFIER);
+    }
+
+    public static String calculateJmxObjectName(EntaxyRuntimeItemMBean mbean, String subPathQualifier) {
+        String finalName = mbean.getJMXSubQualifier();
+        EntaxyRuntimeItemMBean currentMbean = mbean.getParentMBean();
+        String parentSubPath = mbean.getParentSubPath();
+
+        String levelPlaceholderConstant = "@LEVEL@";
+
+        finalName = finalName.replace(EntaxyRuntimeItemMBean.JMX_SUBQUALIFIER_AUTO,
+                subPathQualifier.concat("_").concat(levelPlaceholderConstant));
+
+        while (currentMbean != null) {
+            String newName = currentMbean.getJMXSubQualifier();
+            if (CommonUtils.isValid(parentSubPath)) {
+                // we must create unique, but idempotent set of keys
+                // as a key we'll use subPathQualifier with level index
+                String subpath = Arrays.asList(parentSubPath.split("/"))
+                        .stream()
+                        .map(s -> subPathQualifier.concat("_").concat(levelPlaceholderConstant).concat("=").concat(s))
+                        .collect(Collectors.joining(","));
+                if (CommonUtils.isValid(subpath))
+                    newName = newName.concat(",").concat(subpath);
+            }
+
+            finalName = newName.concat(",").concat(finalName);
+            parentSubPath = currentMbean.getParentSubPath();
+            currentMbean = currentMbean.getParentMBean();
+        }
+
+        // replace placeholder with overall level value
+        String[] splitted = finalName.split(",");
+        for (int i = 0; i < splitted.length; i++) {
+            splitted[i] = splitted[i].replace(levelPlaceholderConstant, "" + i);
+        }
+        finalName = Arrays.asList(splitted).stream().collect(Collectors.joining(","));
+
+        return finalName;
+    }
+
+    public static String addNamespace(String qualifier) {
+        if (qualifier.contains(":"))
+            return qualifier;
+        return ManagementCore.ENTAXY_JMX_DOMAIN.concat(":").concat(qualifier);
+    }
+
+}
diff --git a/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/shell/EntaxyRuntimeObjectMBeanManagerSupport.java b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/shell/EntaxyRuntimeObjectMBeanManagerSupport.java
new file mode 100644
index 00000000..eef6d9b5
--- /dev/null
+++ b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/shell/EntaxyRuntimeObjectMBeanManagerSupport.java
@@ -0,0 +1,39 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.object.shell;
+
+import org.apache.karaf.shell.api.action.lifecycle.Reference;
+
+import ru.entaxy.platform.core.management.object.impl.EntaxyRuntimeObjectMBeanManager;
+
+public class EntaxyRuntimeObjectMBeanManagerSupport {
+
+    public static final String COMMAND_SCOPE = "entaxy";
+
+    @Reference
+    public EntaxyRuntimeObjectMBeanManager mBeanManager;
+
+}
diff --git a/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/shell/ListMBeanFactories.java b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/shell/ListMBeanFactories.java
new file mode 100644
index 00000000..ef85d862
--- /dev/null
+++ b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/shell/ListMBeanFactories.java
@@ -0,0 +1,59 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.object.shell;
+
+import java.util.HashSet;
+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 ru.entaxy.platform.base.support.karaf.shell.ShellTableFixed;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBeanFactory;
+
+@Service
+@Command(scope = EntaxyRuntimeObjectMBeanManagerSupport.COMMAND_SCOPE, name = "object-mbean-factory-list")
+public class ListMBeanFactories extends EntaxyRuntimeObjectMBeanManagerSupport implements Action {
+
+    @Override
+    public Object execute() throws Exception {
+        ShellTableFixed shellTable = new ShellTableFixed();
+        shellTable.column("Id");
+        shellTable.column("Supported types");
+
+        for (EntaxyRuntimeObjectMBeanFactory factory : new HashSet<>(mBeanManager.getFactoriesMap().values())) {
+            shellTable.addRow().addContent(
+                    factory.getId(),
+                    factory.getSupportedTypes().stream().collect(Collectors.joining("\n")));
+        }
+
+        shellTable.print(System.out);
+
+        return null;
+    }
+
+}
diff --git a/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/shell/ListMBeans.java b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/shell/ListMBeans.java
new file mode 100644
index 00000000..6c6e09cd
--- /dev/null
+++ b/platform/runtime/core/management/object-management/src/main/java/ru/entaxy/platform/core/management/object/shell/ListMBeans.java
@@ -0,0 +1,77 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.object.shell;
+
+import java.util.Map;
+import java.util.Map.Entry;
+
+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 ru.entaxy.platform.base.support.karaf.shell.ShellTableFixed;
+import ru.entaxy.platform.core.management.object.impl.EntaxyRuntimeItemMBeanInfo;
+import ru.entaxy.platform.core.management.object.impl.EntaxyRuntimeObjectMBeanInfo;
+
+@Service
+@Command(scope = EntaxyRuntimeObjectMBeanManagerSupport.COMMAND_SCOPE, name = "object-mbean-list")
+public class ListMBeans extends EntaxyRuntimeObjectMBeanManagerSupport implements Action {
+
+    @Override
+    public Object execute() throws Exception {
+        ShellTableFixed shellTable = new ShellTableFixed();
+        shellTable.column("Object Id");
+        shellTable.column("Type");
+        shellTable.column("Class name");
+        shellTable.column("Registered");
+        shellTable.column("Parent Id");
+        shellTable.column("Ghost");
+
+        Map> map = mBeanManager.getInfoById();
+        for (Entry> entry : map.entrySet()) {
+
+            EntaxyRuntimeItemMBeanInfo info = entry.getValue();
+
+            shellTable.addRow().addContent(
+                    entry.getKey(),
+                    info instanceof EntaxyRuntimeObjectMBeanInfo ? "OBJECT" : "CONTAINER",
+                    info.mbeanHolder.mbean == null ? "" : info.mbeanHolder.mbean.getClass().getName(),
+                    info.isRegistered() ? "*" : "",
+                    info.mbeanHolder.mbean == null ? ""
+                            : info.mbeanHolder.mbean.getParentMBean() == null ? ""
+                                    : info.mbeanHolder.mbean.getParentMBean().getId(),
+                    info instanceof EntaxyRuntimeObjectMBeanInfo
+                            ? ((EntaxyRuntimeObjectMBeanInfo) info).isGhost() ? "*" : ""
+                            : "");
+
+        }
+
+        shellTable.print(System.out);
+
+        return null;
+    }
+
+}
diff --git a/platform/runtime/core/management/pom.xml b/platform/runtime/core/management/pom.xml
index 5f6d25ec..1c6a061f 100644
--- a/platform/runtime/core/management/pom.xml
+++ b/platform/runtime/core/management/pom.xml
@@ -5,7 +5,7 @@
     
         ru.entaxy.esb.platform.runtime
         core
-        1.10.0
+        1.11.0
     
 
     ru.entaxy.esb.platform.runtime.core
diff --git a/platform/runtime/core/management/profile-management/pom.xml b/platform/runtime/core/management/profile-management/pom.xml
index 1e04fc47..b60e0acf 100644
--- a/platform/runtime/core/management/profile-management/pom.xml
+++ b/platform/runtime/core/management/profile-management/pom.xml
@@ -5,7 +5,7 @@
     
         ru.entaxy.esb.platform.runtime.core
         management
-        1.10.0
+        1.11.0
     
 
     ru.entaxy.esb.platform.runtime.core.management
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/AccountHelper.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/AccountHelper.java
new file mode 100644
index 00000000..071bb22b
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/AccountHelper.java
@@ -0,0 +1,32 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.platform.core.management.profile.helper;
+
+import ru.entaxy.platform.core.management.profile.support.legacy.AccountManager;
+
+public interface AccountHelper extends AccountManager {
+
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/AccountHelperImpl.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/AccountHelperImpl.java
new file mode 100644
index 00000000..459c8717
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/AccountHelperImpl.java
@@ -0,0 +1,95 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.platform.core.management.profile.helper;
+
+import org.osgi.service.component.annotations.Activate;
+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.platform.core.management.profile.NotBackwardCompatibleException;
+import ru.entaxy.platform.core.management.profile.support.legacy.AccountManager;
+
+@Component(service = AccountHelper.class, immediate = true)
+public class AccountHelperImpl implements AccountHelper {
+
+    private static final Logger LOG = LoggerFactory.getLogger(AccountHelperImpl.class);
+
+    protected AccountManager accountManager = null;
+
+    protected AccountManager nullAccountManager = null;
+
+    @Activate
+    public void activate() {
+        this.nullAccountManager = new AccountManager() {
+
+            @Override
+            public String getAccountForSystem(String systemUuid) throws Exception {
+                throw new NotBackwardCompatibleException(Helpers.BACKWARD_COMPATIBILITY_DISABLED);
+            }
+
+            @Override
+            public void createAccountForSystem(String login, String password, String systemUUID, String createdBy,
+                    String editedBy) throws Exception {
+                throw new NotBackwardCompatibleException(Helpers.BACKWARD_COMPATIBILITY_DISABLED);
+            }
+
+        };
+    }
+
+    @Reference(collectionType = CollectionType.SERVICE, cardinality = ReferenceCardinality.OPTIONAL,
+            policy = ReferencePolicy.DYNAMIC, policyOption = ReferencePolicyOption.GREEDY,
+            service = AccountManager.class, unbind = "unsetAccountManager")
+    public void setAccountManager(AccountManager accountManager) {
+        this.accountManager = accountManager;
+    }
+
+    public void unsetAccountManager(AccountManager accountManager) {
+        this.accountManager = null;
+    }
+
+    protected AccountManager getEffectiveAccountManager() {
+        return accountManager != null ? accountManager : nullAccountManager;
+    }
+
+    @Override
+    public String getAccountForSystem(String systemUuid) throws Exception {
+        return getEffectiveAccountManager().getAccountForSystem(systemUuid);
+    }
+
+    @Override
+    public void createAccountForSystem(String login, String password, String systemUUID, String createdBy,
+            String editedBy) throws Exception {
+        getEffectiveAccountManager().createAccountForSystem(login, password, systemUUID, createdBy, editedBy);
+    }
+
+
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/ConnectorHelper.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/ConnectorHelper.java
new file mode 100644
index 00000000..87e2f1a6
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/ConnectorHelper.java
@@ -0,0 +1,32 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.platform.core.management.profile.helper;
+
+import ru.entaxy.platform.core.management.profile.support.legacy.ConnectorManager;
+
+public interface ConnectorHelper extends ConnectorManager {
+
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/ConnectorHelperImpl.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/ConnectorHelperImpl.java
new file mode 100644
index 00000000..588c1d37
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/ConnectorHelperImpl.java
@@ -0,0 +1,122 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.platform.core.management.profile.helper;
+
+import java.util.Map;
+
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.annotations.Activate;
+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.platform.core.management.profile.NotBackwardCompatibleException;
+import ru.entaxy.platform.core.management.profile.support.legacy.ConnectorManager;
+
+@Component(service = ConnectorHelper.class, immediate = true)
+public class ConnectorHelperImpl implements ConnectorHelper {
+
+    private static final Logger log = LoggerFactory.getLogger(ProfileHelperImpl.class);
+
+    protected static final String EXPLANATION = Helpers.BACKWARD_COMPATIBILITY_DISABLED;
+
+    protected ConnectorManager connectorManager = null;
+
+    protected ConnectorManager nullConnectorManager = null;
+
+    @Activate
+    public void activate(ComponentContext componentContext) {
+        this.nullConnectorManager = new ConnectorManager() {
+
+            @Override
+            public void stopConnector(String idOrName, String connectorName) throws Exception {
+                throw new NotBackwardCompatibleException(EXPLANATION);
+            }
+
+            @Override
+            public void startConnector(String idOrName, String connectorName) throws Exception {
+                throw new NotBackwardCompatibleException(EXPLANATION);
+            }
+
+            @Override
+            public void removeConnector(String idOrName, String connectorName) throws Exception {
+                throw new NotBackwardCompatibleException(EXPLANATION);
+            }
+
+            @Override
+            public void addConnector(String idOrName, String connectorFactoryId, Map parameters)
+                    throws Exception {
+                throw new NotBackwardCompatibleException(EXPLANATION);
+            }
+        };
+    }
+
+    public ConnectorManager getEffectiveConnectorManager() {
+        return connectorManager != null ? connectorManager : nullConnectorManager;
+    }
+
+    @Reference(collectionType = CollectionType.SERVICE, cardinality = ReferenceCardinality.OPTIONAL,
+            policyOption = ReferencePolicyOption.GREEDY, policy = ReferencePolicy.DYNAMIC,
+            service = ConnectorManager.class,
+            unbind = "unsetConnectorManager")
+    public void setConnectorManager(ConnectorManager connectorManager) {
+        this.connectorManager = connectorManager;
+        log.debug(">> ConnectorManager is bound");
+    }
+
+    public void unsetConnectorManager(ConnectorManager connectorManager) {
+        this.connectorManager = null;
+        log.debug(">> ConnectorManager is unbound");
+    }
+
+
+    @Override
+    public void addConnector(String idOrName, String connectorFactoryId, Map parameters)
+            throws Exception {
+        getEffectiveConnectorManager().addConnector(idOrName, connectorFactoryId, parameters);
+    }
+
+    @Override
+    public void removeConnector(String idOrName, String connectorName) throws Exception {
+        getEffectiveConnectorManager().removeConnector(idOrName, connectorName);
+    }
+
+    @Override
+    public void startConnector(String idOrName, String connectorName) throws Exception {
+        getEffectiveConnectorManager().startConnector(idOrName, connectorName);
+    }
+
+    @Override
+    public void stopConnector(String idOrName, String connectorName) throws Exception {
+        getEffectiveConnectorManager().stopConnector(idOrName, connectorName);
+    }
+
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/Helpers.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/Helpers.java
new file mode 100644
index 00000000..d38ea561
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/Helpers.java
@@ -0,0 +1,68 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.platform.core.management.profile.helper;
+
+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 ru.entaxy.platform.base.objects.EntaxyObjectService;
+
+@Component(service = Helpers.class, immediate = true)
+public class Helpers {
+
+    public static final String BACKWARD_COMPATIBILITY_DISABLED =
+            "You're calling deprecated API, to use it backward compatibility modules must be installed";
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC,
+            policyOption = ReferencePolicyOption.GREEDY)
+    volatile public ProfileHelper profileHelper;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC,
+            policyOption = ReferencePolicyOption.GREEDY)
+    volatile public ConnectorHelper connectorHelper;
+
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC,
+            policyOption = ReferencePolicyOption.GREEDY)
+    volatile public PermissionHelper permissionHelper;
+
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC,
+            policyOption = ReferencePolicyOption.GREEDY)
+    volatile public EntaxyObjectService entaxyObjectService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC,
+            policyOption = ReferencePolicyOption.GREEDY)
+    volatile public SystemHelper systemHelper;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC,
+            policyOption = ReferencePolicyOption.GREEDY)
+    volatile public AccountHelper accountHelper;
+
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/PermissionHelper.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/PermissionHelper.java
new file mode 100644
index 00000000..653736a5
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/PermissionHelper.java
@@ -0,0 +1,32 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.platform.core.management.profile.helper;
+
+import ru.entaxy.platform.core.management.profile.support.legacy.PermissionManager;
+
+public interface PermissionHelper extends PermissionManager {
+
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/PermissionHelperImpl.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/PermissionHelperImpl.java
new file mode 100644
index 00000000..78352b95
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/PermissionHelperImpl.java
@@ -0,0 +1,108 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.platform.core.management.profile.helper;
+
+import java.util.List;
+
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.annotations.Activate;
+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.ReferencePolicyOption;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import ru.entaxy.platform.core.management.profile.NotBackwardCompatibleException;
+import ru.entaxy.platform.core.management.profile.support.legacy.PermissionManager;
+
+@Component(service = PermissionHelper.class, immediate = true)
+public class PermissionHelperImpl implements PermissionHelper {
+
+    private static final Logger log = LoggerFactory.getLogger(PermissionHelperImpl.class);
+
+    protected static final String EXPLANATION = Helpers.BACKWARD_COMPATIBILITY_DISABLED;
+
+    protected PermissionManager permissionManager = null;
+
+    protected PermissionManager nullPermissionManager = null;
+
+    @Activate
+    public void activate(ComponentContext componentContext) {
+        this.nullPermissionManager = new PermissionManager() {
+
+            @Override
+            public List getSubjectPermissions(String subjectId) throws Exception {
+                throw new NotBackwardCompatibleException(EXPLANATION);
+            }
+
+            @Override
+            public List getObjectPermissions(String objectId) throws Exception {
+                throw new NotBackwardCompatibleException(EXPLANATION);
+            }
+
+            @Override
+            public void createPermission(String objectId, String subjectId) throws Exception {
+                throw new NotBackwardCompatibleException(EXPLANATION);
+            }
+        };
+    }
+
+    public PermissionManager getEffectivePermissionManager() {
+        return this.permissionManager != null ? this.permissionManager : this.nullPermissionManager;
+    }
+
+    @Reference(collectionType = CollectionType.SERVICE, cardinality = ReferenceCardinality.OPTIONAL,
+            policyOption = ReferencePolicyOption.GREEDY, service = PermissionManager.class,
+            unbind = "unsetPermissionManager")
+    public void setPermissionManager(PermissionManager permissionManager) {
+        this.permissionManager = permissionManager;
+        log.debug(">> PermissionManager is bound");
+    }
+
+    public void unsetPermissionManager(PermissionManager permissionManager) {
+        this.permissionManager = null;
+        log.debug(">> PermissionManager is unbound");
+    }
+
+
+
+    @Override
+    public List getObjectPermissions(String objectId) throws Exception {
+        return getEffectivePermissionManager().getObjectPermissions(objectId);
+    }
+
+    @Override
+    public List getSubjectPermissions(String subjectId) throws Exception {
+        return getEffectivePermissionManager().getSubjectPermissions(subjectId);
+    }
+
+    @Override
+    public void createPermission(String objectId, String subjectId) throws Exception {
+        getEffectivePermissionManager().createPermission(objectId, subjectId);
+    }
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/ProfileHelper.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/ProfileHelper.java
new file mode 100644
index 00000000..c5ef9c91
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/ProfileHelper.java
@@ -0,0 +1,32 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.platform.core.management.profile.helper;
+
+import ru.entaxy.platform.core.management.profile.support.legacy.ProfileManager;
+
+public interface ProfileHelper extends ProfileManager {
+
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/ProfileHelperImpl.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/ProfileHelperImpl.java
new file mode 100644
index 00000000..29034df8
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/ProfileHelperImpl.java
@@ -0,0 +1,133 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.platform.core.management.profile.helper;
+
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.annotations.Activate;
+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.platform.core.management.profile.NotBackwardCompatibleException;
+import ru.entaxy.platform.core.management.profile.support.legacy.ProfileManager;
+
+@Component(service = {ProfileHelper.class},
+        immediate = true)
+public class ProfileHelperImpl implements ProfileHelper {
+
+    private static final Logger log = LoggerFactory.getLogger(ProfileHelperImpl.class);
+
+    protected static final String EXPLANATION = Helpers.BACKWARD_COMPATIBILITY_DISABLED;
+
+    protected ProfileManager profileManager = null;
+
+    protected ProfileManager nullProfileManager = null;
+
+    @Activate
+    public void activate(ComponentContext componentContext) {
+
+        this.nullProfileManager = new ProfileManager() {
+
+            @Override
+            public void uninstallProfile(String idOrName) throws Exception {
+                throw new NotBackwardCompatibleException(EXPLANATION);
+            }
+
+            @Override
+            public void stopProfile(String idOrName) throws Exception {
+                throw new NotBackwardCompatibleException(EXPLANATION);
+            }
+
+            @Override
+            public void startProfile(String idOrName) throws Exception {
+                throw new NotBackwardCompatibleException(EXPLANATION);
+            }
+
+            @Override
+            public void createProfile(String id, String name, String description) throws Exception {
+                throw new NotBackwardCompatibleException(EXPLANATION);
+            }
+
+            @Override
+            public String getProfileConfig(String idOrName) throws Exception {
+                throw new NotBackwardCompatibleException(EXPLANATION);
+            }
+        };
+
+    }
+
+
+
+    public ProfileManager getEffectiveProfileManager() {
+        return profileManager != null ? profileManager : nullProfileManager;
+    }
+
+    @Reference(collectionType = CollectionType.SERVICE, cardinality = ReferenceCardinality.OPTIONAL,
+            policy = ReferencePolicy.DYNAMIC, policyOption = ReferencePolicyOption.GREEDY,
+            service = ProfileManager.class, unbind = "unsetProfileManager")
+    public void setProfileManager(ProfileManager profileManager) {
+        this.profileManager = profileManager;
+        log.debug(">> ProfileManager is bound");
+    }
+
+    public void unsetProfileManager(ProfileManager profileManager) {
+        this.profileManager = null;
+        log.debug(">> ProfileManager is unbound");
+    }
+
+
+
+    @Override
+    public void createProfile(String id, String name, String description) throws Exception {
+        getEffectiveProfileManager().createProfile(id, name, description);
+    }
+
+    @Override
+    public String getProfileConfig(String idOrName) throws Exception {
+        return getEffectiveProfileManager().getProfileConfig(idOrName);
+    }
+
+    @Override
+    public void startProfile(String idOrName) throws Exception {
+        getEffectiveProfileManager().startProfile(idOrName);
+    }
+
+    @Override
+    public void stopProfile(String idOrName) throws Exception {
+        getEffectiveProfileManager().stopProfile(idOrName);
+    }
+
+    @Override
+    public void uninstallProfile(String idOrName) throws Exception {
+        getEffectiveProfileManager().uninstallProfile(idOrName);
+    }
+
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/SystemHelper.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/SystemHelper.java
new file mode 100644
index 00000000..b977e8c8
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/SystemHelper.java
@@ -0,0 +1,32 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.platform.core.management.profile.helper;
+
+import ru.entaxy.platform.core.management.profile.support.legacy.SystemManager;
+
+public interface SystemHelper extends SystemManager {
+
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/SystemHelperImpl.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/SystemHelperImpl.java
new file mode 100644
index 00000000..20320f1f
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/esb/platform/core/management/profile/helper/SystemHelperImpl.java
@@ -0,0 +1,81 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.platform.core.management.profile.helper;
+
+import org.osgi.service.component.annotations.Activate;
+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.platform.core.management.profile.NotBackwardCompatibleException;
+import ru.entaxy.platform.core.management.profile.support.legacy.SystemManager;
+
+@Component(service = SystemHelper.class, immediate = true)
+public class SystemHelperImpl implements SystemHelper {
+
+    private static final Logger LOG = LoggerFactory.getLogger(SystemHelperImpl.class);
+
+    protected SystemManager systemManager = null;
+
+    protected SystemManager nullSystemManager = null;
+
+    @Activate
+    public void activate() {
+        this.nullSystemManager = new SystemManager() {
+
+            @Override
+            public String getUUIDbyName(String name) throws Exception {
+                throw new NotBackwardCompatibleException(Helpers.BACKWARD_COMPATIBILITY_DISABLED);
+            }
+        };
+    }
+
+    @Reference(collectionType = CollectionType.SERVICE, cardinality = ReferenceCardinality.OPTIONAL,
+            policy = ReferencePolicy.DYNAMIC, policyOption = ReferencePolicyOption.GREEDY,
+            service = SystemManager.class, unbind = "unsetSystemManager")
+    public void setSystemManager(SystemManager systemManager) {
+        this.systemManager = systemManager;
+    }
+
+    public void unsetSystemManager(SystemManager systemManager) {
+        this.systemManager = null;
+    }
+
+    protected SystemManager getEffectiveSystemManager() {
+        return systemManager != null ? systemManager : nullSystemManager;
+    }
+
+    @Override
+    public String getUUIDbyName(String name) throws Exception {
+        return getEffectiveSystemManager().getUUIDbyName(name);
+    }
+
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/ConnectorMBean.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/ConnectorMBean.java
new file mode 100644
index 00000000..e1c1aa7e
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/ConnectorMBean.java
@@ -0,0 +1,75 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.profile;
+
+import ru.entaxy.esb.platform.base.management.core.api.Attribute;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanAnnotated;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanExportPolicy;
+import ru.entaxy.esb.platform.base.management.core.api.Operation;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBean;
+
+@MBeanAnnotated(policy = MBeanExportPolicy.ANNOTATED_ONLY)
+public interface ConnectorMBean extends EntaxyRuntimeObjectMBean {
+
+    public static final String CAPABILITY_NAMESPACE = "entaxy.runtime.connector";
+
+    public static final String CONNECTOR_KEY = "connector";
+
+    public static final String CONNECTOR_KEY_VALUE_DEFAULT = "default";
+
+    // TODO implement if needed
+    // public boolean isDefault();
+
+    @Attribute(desc = "Connector name")
+    default String getName() {
+        return getObjectId();
+    };
+
+    @Attribute(desc = "Connector registered name used in registry")
+    public String getRegisteredName();
+
+    @Attribute(desc = "Connector system")
+    public String getSystem();
+
+    @Attribute(desc = "Connector classifier")
+    public String getClassifier();
+
+    @Attribute(desc = "Connector display name")
+    public String getDisplayName();
+
+    @Attribute(desc = "Connector direction")
+    public String getDirection();
+
+    @Attribute(desc = "Connector protocol")
+    public String getProtocol();
+
+    @Operation(desc = "Starts the connector")
+    public void start() throws Exception;
+
+    @Operation(desc = "Stops the connector")
+    public void stop() throws Exception;
+
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/DefaultRouteMBean.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/DefaultRouteMBean.java
new file mode 100644
index 00000000..dfd5598a
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/DefaultRouteMBean.java
@@ -0,0 +1,62 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.profile;
+
+import ru.entaxy.esb.platform.base.management.core.Qualifier;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanAnnotated;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanExportPolicy;
+import ru.entaxy.esb.platform.base.management.core.api.Operation;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBean;
+
+@MBeanAnnotated(policy = MBeanExportPolicy.ANNOTATED_ONLY)
+public interface DefaultRouteMBean extends EntaxyRuntimeObjectMBean {
+
+    public static interface Helper {
+
+        public static Qualifier getQualifier(String profileName) {
+            return RoutesMBean.Helper.getQualifier(profileName).qualifier(ROUTE_KEY, ROUTE_KEY_VALUE_DEFAULT);
+        }
+
+    }
+
+
+    public static final String CAPABILITY_NAMESPACE = "entaxy.runtime.default-route";
+
+    public static final String ROUTE_KEY = "route";
+
+    public static final String ROUTE_KEY_VALUE_DEFAULT = "default";
+
+    default boolean isDefault() {
+        return true;
+    };
+
+    @Deprecated(since = "1.10", forRemoval = true)
+    @Operation(desc = "Gets route's configuration")
+    default public String doGetRouteConfig() throws Exception {
+        return readConfiguration();
+    };
+
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/NotBackwardCompatibleException.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/NotBackwardCompatibleException.java
new file mode 100644
index 00000000..7f60fb5a
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/NotBackwardCompatibleException.java
@@ -0,0 +1,41 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.profile;
+
+import javax.naming.OperationNotSupportedException;
+
+public class NotBackwardCompatibleException extends OperationNotSupportedException {
+
+    private static final long serialVersionUID = 1L;
+
+    public NotBackwardCompatibleException() {
+        super();
+    }
+
+    public NotBackwardCompatibleException(String message) {
+        super(message);
+    }
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/ProfileMBean.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/ProfileMBean.java
new file mode 100644
index 00000000..27bf6b92
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/ProfileMBean.java
@@ -0,0 +1,135 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.profile;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import javax.management.MBeanOperationInfo;
+
+import ru.entaxy.esb.platform.base.management.core.Qualifier;
+import ru.entaxy.esb.platform.base.management.core.api.Attribute;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanAnnotated;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanExportPolicy;
+import ru.entaxy.esb.platform.base.management.core.api.Operation;
+import ru.entaxy.esb.platform.base.management.core.api.Parameter;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBean;
+
+@MBeanAnnotated(policy = MBeanExportPolicy.ANNOTATED_ONLY)
+public interface ProfileMBean extends EntaxyRuntimeObjectMBean {
+
+    public static interface Helper {
+
+        public static Qualifier getQualifier(String name) {
+            return ProfilesMBean.Q_PROFILES.qualifier(PROFILE_KEY, name);
+        }
+
+    }
+
+    public static final String CAPABILITY_NAMESPACE = "entaxy.runtime.profile";
+
+    public static final String PROFILE_KEY = "profile";
+
+    @Attribute
+    default public String getName() {
+        return getObjectId();
+    };
+
+    @Attribute
+    public String getDescription();
+
+    @Deprecated(since = "1.10", forRemoval = true)
+    @Attribute
+    default public String getBasicAuthAccount() {
+        return "";
+    };
+
+    @Deprecated(since = "1.10", forRemoval = true)
+    @Attribute
+    default public String getUuid() {
+        return getObjectId();
+    };
+
+    @Deprecated(since = "1.10", forRemoval = true)
+    @Attribute(desc = "Systems the current can send messages to")
+    default public List getAllowedTargets() {
+        return Collections.emptyList();
+    };
+
+    @Deprecated(since = "1.10", forRemoval = true)
+    @Attribute(desc = "Systems the current can receive messages from")
+    default public List getAllowedSources() {
+        return Collections.emptyList();
+    };
+
+    @Deprecated(since = "1.10", forRemoval = true)
+    @Operation(desc = "Adds connector to profile")
+    public void addConnector(
+            @Parameter(name = "factoryId", desc = "Connector factory ID") String connectorFactoryId,
+            @Parameter(name = "parameters", desc = "Connector parameters") Map parameters)
+            throws Exception;
+
+    @Deprecated(since = "1.10", forRemoval = true)
+    @Operation(desc = "Removes connector from profile")
+    public void removeConnector(
+            @Parameter(name = "connectorName", desc = "Connector name") String connectorName) throws Exception;
+
+    @Deprecated(since = "1.10", forRemoval = true)
+    @Operation(desc = "Starts connector in profile")
+    public void startConnector(
+            @Parameter(name = "connectorName", desc = "Connector name") String connectorName) throws Exception;
+
+    @Deprecated(since = "1.10", forRemoval = true)
+    @Operation(desc = "Stops connector in profile")
+    public void stopConnector(
+            @Parameter(name = "connectorName", desc = "Connector name") String connectorName) throws Exception;
+
+    @Deprecated(since = "1.10", forRemoval = true)
+    @Operation(desc = "Gets connector's configuration")
+    public String getConnectorConfig(
+            @Parameter(name = "connectorName", desc = "Connector name") String connectorName) throws Exception;
+
+    @Deprecated(since = "1.10", forRemoval = true)
+    @Operation(desc = "Creates account for this system", impact = MBeanOperationInfo.ACTION)
+    default public void createAccount(
+            @Parameter(name = "login", desc = "Login") String login,
+            @Parameter(name = "password", desc = "Password") String password) throws Exception {};
+
+    @Deprecated(since = "1.10", forRemoval = true)
+    @Operation(desc = "Allow this system to send messages to other system")
+    default public void allowTarget(
+            @Parameter(name = "targetIdOrName", desc = "Target system Id or Name") String idOrName) throws Exception {
+
+    };
+
+    @Deprecated(since = "1.10", forRemoval = true)
+    @Operation(desc = "Allow this system to receive messages from other system")
+    default public void allowSource(
+            @Parameter(name = "sourceIdOrName", desc = "Source system Id or Name") String idOrName) throws Exception {
+
+    };
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/ProfilesMBean.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/ProfilesMBean.java
new file mode 100644
index 00000000..35edf5cb
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/ProfilesMBean.java
@@ -0,0 +1,48 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.profile;
+
+import ru.entaxy.esb.platform.base.management.core.ManagementCore;
+import ru.entaxy.esb.platform.base.management.core.Qualifier;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanAnnotated;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanExportPolicy;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectContainerMBean;
+import ru.entaxy.platform.core.management.profile.support.legacy.ProfileManager;
+
+@MBeanAnnotated(policy = MBeanExportPolicy.ANNOTATED_ONLY)
+public interface ProfilesMBean extends EntaxyRuntimeObjectContainerMBean, ProfileManager {
+
+    public static final String CAPABILITY_NAMESPACE_DEFAULT_ROUTE = "entaxy.runtime.default-route";
+
+    public static final String PROFILES_KEY = "category";
+
+    public static final String PROFILES_KEY_VALUE = "profiles";
+
+    public static final Qualifier Q_PROFILES = ManagementCore.Q_RUNTIME
+            .qualifier(ProfilesMBean.PROFILES_KEY, ProfilesMBean.PROFILES_KEY_VALUE);
+
+
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/RoutesMBean.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/RoutesMBean.java
new file mode 100644
index 00000000..34b37990
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/RoutesMBean.java
@@ -0,0 +1,44 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.profile;
+
+import ru.entaxy.esb.platform.base.management.core.Qualifier;
+
+public interface RoutesMBean {
+
+	public static interface Helper {
+		public static Qualifier getQualifier(String profileName) {
+			return ProfileMBean.Helper
+					.getQualifier(profileName)
+					.qualifier(ROUTES_KEY, ROUTES_KEY_VALUE);
+		}
+		
+	}
+	
+	public static final String ROUTES_KEY = "section";
+	public static final String ROUTES_KEY_VALUE = "routes";
+	
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/impl/ConnectorMBeanFactory.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/impl/ConnectorMBeanFactory.java
new file mode 100644
index 00000000..7d56624f
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/impl/ConnectorMBeanFactory.java
@@ -0,0 +1,79 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.profile.impl;
+
+import java.util.Collections;
+import java.util.List;
+
+import javax.management.NotCompliantMBeanException;
+
+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.ReferencePolicyOption;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import ru.entaxy.esb.platform.core.management.profile.helper.Helpers;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeItemMBean;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBean;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBeanFactory;
+import ru.entaxy.platform.core.management.object.MBeanFactory;
+import ru.entaxy.platform.core.management.object.factory.AbstractMBeanFactory;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+
+
+@MBeanFactory(id = "connector-factory", supportedTypes = {"entaxy.runtime.connector"})
+@Component(service = EntaxyRuntimeObjectMBeanFactory.class, immediate = true)
+public class ConnectorMBeanFactory extends AbstractMBeanFactory {
+
+    private static final Logger log = LoggerFactory.getLogger(ConnectorMBeanFactory.class);
+
+//    @Reference(cardinality = ReferenceCardinality.MANDATORY, policyOption = ReferencePolicyOption.GREEDY)
+//    ProfilesMBean profilesMBean;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY, policyOption = ReferencePolicyOption.GREEDY)
+    Helpers helpers;
+
+    @Override
+    public  T createMBean(EntaxyRuntimeObject entaxyRuntimeObject) {
+        ConnectorMBeanImpl beanImpl;
+        try {
+            beanImpl = new ConnectorMBeanImpl(entaxyRuntimeObject, helpers);
+  //          beanImpl.setParentMBean(profilesMBean);
+        } catch (NotCompliantMBeanException e) {
+            log.error("Error creating ProfileMBeanImpl for [" + entaxyRuntimeObject.getObjectFullId() + "]", e);
+            return null;
+        }
+        return (T) beanImpl;
+    }
+
+    @Override
+    public List createMBeans() {
+        return Collections.emptyList();
+    }
+
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/impl/ConnectorMBeanImpl.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/impl/ConnectorMBeanImpl.java
new file mode 100644
index 00000000..8bc24627
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/impl/ConnectorMBeanImpl.java
@@ -0,0 +1,99 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.profile.impl;
+
+import javax.management.NotCompliantMBeanException;
+
+import ru.entaxy.esb.platform.base.management.core.api.EntaxyRuntimeTyped;
+import ru.entaxy.esb.platform.core.management.profile.helper.Helpers;
+import ru.entaxy.platform.core.management.object.ObjectMBean;
+import ru.entaxy.platform.core.management.object.factory.AbstractObjectMBean;
+import ru.entaxy.platform.core.management.profile.ConnectorMBean;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+
+// @TODO move string to constant
+@EntaxyRuntimeTyped(name = "entaxy.runtime.connector")
+@ObjectMBean(subQualifierName = "connector")
+public class ConnectorMBeanImpl extends AbstractObjectMBean implements ConnectorMBean {
+
+    protected Helpers helpers;
+
+    public ConnectorMBeanImpl(EntaxyRuntimeObject entaxyRuntimeObject, Helpers helpers)
+            throws NotCompliantMBeanException {
+        super(ConnectorMBean.class, entaxyRuntimeObject);
+        this.helpers = helpers;
+    }
+
+    @Override
+    public String getJMXSubQualifierValue() {
+        return getObjectId();
+    }
+
+    @Override
+    public String getFactoryId() {
+        return this.entaxyRuntimeObject.getAttributeOrDefault("templateId", super.getFactoryId()).toString();
+    }
+
+    @Override
+    public String getRegisteredName() {
+        return this.entaxyRuntimeObject.getAttributeOrDefault("bundleName", "").toString();
+    }
+
+    @Override
+    public String getSystem() {
+        return this.entaxyRuntimeObject.getAttributeOrDefault("system", "").toString();
+    }
+
+    @Override
+    public String getClassifier() {
+        return this.entaxyRuntimeObject.getAttributeOrDefault("classifier", "").toString();
+    }
+
+    @Override
+    public String getDisplayName() {
+        return this.entaxyRuntimeObject.getAttributeOrDefault("displayName", getObjectId()).toString();
+    }
+
+    @Override
+    public String getDirection() {
+        return this.entaxyRuntimeObject.getAttributeOrDefault("direction", getObjectId()).toString();
+    }
+
+    @Override
+    public String getProtocol() {
+        return this.entaxyRuntimeObject.getAttributeOrDefault("protocol", getObjectId()).toString();
+    }
+
+    @Override
+    public void start() throws Exception {
+        this.helpers.connectorHelper.startConnector(getSystem(), this.getRegisteredName());
+    }
+
+    @Override
+    public void stop() throws Exception {
+        this.helpers.connectorHelper.stopConnector(getSystem(), this.getRegisteredName());
+    }
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/impl/DefaultRouteMBeanFactory.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/impl/DefaultRouteMBeanFactory.java
new file mode 100644
index 00000000..c5c8e6eb
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/impl/DefaultRouteMBeanFactory.java
@@ -0,0 +1,76 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.profile.impl;
+
+import java.util.Collections;
+import java.util.List;
+
+import javax.management.NotCompliantMBeanException;
+
+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.ReferencePolicyOption;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import ru.entaxy.esb.platform.core.management.profile.helper.Helpers;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeItemMBean;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBean;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBeanFactory;
+import ru.entaxy.platform.core.management.object.MBeanFactory;
+import ru.entaxy.platform.core.management.object.factory.AbstractMBeanFactory;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+
+
+@MBeanFactory(id = "default-route-factory", supportedTypes = {"entaxy.runtime.default-route"})
+@Component(service = EntaxyRuntimeObjectMBeanFactory.class, immediate = true)
+public class DefaultRouteMBeanFactory extends AbstractMBeanFactory {
+
+    private static final Logger log = LoggerFactory.getLogger(DefaultRouteMBeanFactory.class);
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY, policyOption = ReferencePolicyOption.GREEDY)
+    Helpers helpers;
+
+    @Override
+    public  T createMBean(EntaxyRuntimeObject entaxyRuntimeObject) {
+        DefaultRouteMBeanImpl beanImpl;
+        try {
+            beanImpl = new DefaultRouteMBeanImpl(entaxyRuntimeObject, helpers);
+            // beanImpl.setParentMBean(profilesMBean);
+        } catch (NotCompliantMBeanException e) {
+            log.error("Error creating ProfileMBeanImpl for [" + entaxyRuntimeObject.getObjectFullId() + "]", e);
+            return null;
+        }
+        return (T) beanImpl;
+    }
+
+    @Override
+    public List createMBeans() {
+        return Collections.emptyList();
+    }
+
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/impl/DefaultRouteMBeanImpl.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/impl/DefaultRouteMBeanImpl.java
new file mode 100644
index 00000000..155334f6
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/impl/DefaultRouteMBeanImpl.java
@@ -0,0 +1,95 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.profile.impl;
+
+import javax.management.NotCompliantMBeanException;
+
+import ru.entaxy.esb.platform.base.management.core.api.EntaxyRuntimeTyped;
+import ru.entaxy.esb.platform.core.management.profile.helper.Helpers;
+import ru.entaxy.platform.core.management.object.ObjectMBean;
+import ru.entaxy.platform.core.management.object.factory.AbstractObjectMBean;
+import ru.entaxy.platform.core.management.profile.DefaultRouteMBean;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+
+// @TODO move string to constant
+@EntaxyRuntimeTyped(name = "entaxy.runtime.default-route")
+@ObjectMBean(subQualifierName = "route")
+public class DefaultRouteMBeanImpl extends AbstractObjectMBean implements DefaultRouteMBean {
+
+    Helpers helpers;
+
+    public DefaultRouteMBeanImpl(EntaxyRuntimeObject entaxyRuntimeObject, Helpers helpers)
+            throws NotCompliantMBeanException {
+        super(DefaultRouteMBean.class, entaxyRuntimeObject);
+        this.helpers = helpers;
+    }
+
+    /**
+     * methood is overridden for compatibility with current UI
+     * 
+     * TODO: remove after the above is not actual
+     */
+    @Override
+    public String getJMXSubQualifierName() {
+        return "route";
+    }
+
+    /**
+     * methood is overridden for compatibility with current UI
+     * 
+     * TODO: remove after the above is not actual
+     */
+    @Override
+    public String getJMXSubQualifierValue() {
+        return "default";
+    }
+
+    /**
+     * methood is overridden for compatibility with current UI
+     * 
+     * TODO: remove after the above is not actual
+     */
+    /*
+    @Override
+    public String getParentSubPath() {
+        // TODO remove after the above is not actual
+        return "";
+    }
+    */
+
+    /**
+     * methood is overridden for compatibility with current UI
+     * 
+     * TODO: remove after the above is not actual
+     */
+    /*
+    @Override
+    public String getJMXSubQualifier() {
+        return "section=routes," + super.getJMXSubQualifier();
+    }
+    */
+
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/impl/ProfileMBeanFactory.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/impl/ProfileMBeanFactory.java
new file mode 100644
index 00000000..b4482b61
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/impl/ProfileMBeanFactory.java
@@ -0,0 +1,81 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.profile.impl;
+
+import java.util.Collections;
+import java.util.List;
+
+import javax.management.NotCompliantMBeanException;
+
+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.esb.platform.core.management.profile.helper.Helpers;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeItemMBean;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBean;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBeanFactory;
+import ru.entaxy.platform.core.management.object.MBeanFactory;
+import ru.entaxy.platform.core.management.object.factory.AbstractMBeanFactory;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+
+
+@MBeanFactory(id = "profile-factory", supportedTypes = {"entaxy.runtime.profile"})
+@Component(service = EntaxyRuntimeObjectMBeanFactory.class, immediate = true)
+public class ProfileMBeanFactory extends AbstractMBeanFactory {
+
+    private static final Logger log = LoggerFactory.getLogger(ProfileMBeanFactory.class);
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    ProfilesMBeanImpl profilesMBean;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC,
+            policyOption = ReferencePolicyOption.GREEDY)
+    volatile Helpers helpers;
+
+    @Override
+    public  T createMBean(EntaxyRuntimeObject entaxyRuntimeObject) {
+        ProfileMBeanImpl beanImpl;
+        try {
+            beanImpl = new ProfileMBeanImpl(entaxyRuntimeObject, helpers);
+            beanImpl.setParentMBean(profilesMBean);
+        } catch (NotCompliantMBeanException e) {
+            log.error("Error creating ProfileMBeanImpl for [" + entaxyRuntimeObject.getObjectFullId() + "]", e);
+            return null;
+        }
+        return (T) beanImpl;
+    }
+
+    @Override
+    public List createMBeans() {
+        return Collections.singletonList(profilesMBean);
+    }
+
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/impl/ProfileMBeanImpl.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/impl/ProfileMBeanImpl.java
new file mode 100644
index 00000000..82db8ab6
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/impl/ProfileMBeanImpl.java
@@ -0,0 +1,188 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.profile.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.management.NotCompliantMBeanException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import ru.entaxy.esb.platform.base.management.core.api.EntaxyRuntimeTyped;
+import ru.entaxy.esb.platform.core.management.profile.helper.Helpers;
+import ru.entaxy.platform.base.support.CommonUtils;
+import ru.entaxy.platform.core.management.object.ObjectMBean;
+import ru.entaxy.platform.core.management.object.factory.AbstractObjectMBean;
+import ru.entaxy.platform.core.management.profile.NotBackwardCompatibleException;
+import ru.entaxy.platform.core.management.profile.ProfileMBean;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+
+// @TODO move string to constant
+@EntaxyRuntimeTyped(name = "entaxy.runtime.profile")
+@ObjectMBean(subQualifierName = "profile")
+public class ProfileMBeanImpl extends AbstractObjectMBean implements ProfileMBean {
+
+    private static final Logger log = LoggerFactory.getLogger(ProfileMBeanImpl.class);
+
+    Helpers helpers;
+
+    // BundleContext bundleContext;
+
+    public ProfileMBeanImpl(EntaxyRuntimeObject entaxyRuntimeObject, /*
+                                                                      * BundleContext bundleContext,
+                                                                      */
+            Helpers helpers)
+            throws NotCompliantMBeanException {
+        super(ProfileMBean.class, entaxyRuntimeObject);
+        // this.bundleContext = bundleContext;
+        this.helpers = helpers;
+        setJMXSubQualifierValue(entaxyRuntimeObject.getId());
+    }
+
+    @Override
+    public String getJMXSubQualifierName() {
+        // TODO Auto-generated method stub
+        return super.getJMXSubQualifierName();
+    }
+
+    @Override
+    public String getJMXSubQualifierValue() {
+        return getObjectId();
+    }
+
+    @Override
+    public String getName() {
+        return entaxyRuntimeObject.getAttributeOrDefault("name", "").toString();
+    }
+
+    @Override
+    public String getDescription() {
+        return entaxyRuntimeObject.getAttributeOrDefault("name", "").toString();
+    }
+
+    @Override
+    @Deprecated
+    public String getUuid() {
+        try {
+            return internalGetUuid();
+        } catch (Exception ignore) {
+        } ;
+        return getObjectId();
+    }
+
+    @Deprecated
+    protected String internalGetUuid() throws Exception {
+        return helpers.systemHelper.getUUIDbyName(getName());
+    }
+
+    @Override
+    public String getBasicAuthAccount() {
+        try {
+            return internalGetBasicAuthAccount();
+        } catch (Exception ignore) {
+
+        }
+        return "";
+    }
+
+    protected String internalGetBasicAuthAccount() throws Exception {
+        return helpers.accountHelper.getAccountForSystem(internalGetUuid());
+    }
+
+    @Override
+    public void createAccount(String login, String password) throws Exception {
+        if (CommonUtils.isValid(getBasicAuthAccount()))
+            throw new IllegalArgumentException("Account already exists");
+
+        // FIXME remove hardcoded
+        this.helpers.accountHelper.createAccountForSystem(login, password, getUuid(), "admin", "admin");
+
+    }
+
+    @Override
+    public void addConnector(String connectorFactoryId, Map parameters) throws Exception {
+        this.helpers.connectorHelper.addConnector(getName(), connectorFactoryId, parameters);
+    }
+
+    @Override
+    public void removeConnector(String connectorName) throws Exception {
+        this.helpers.connectorHelper.removeConnector(getName(), connectorName);
+    }
+
+    @Override
+    public void startConnector(String connectorName) throws Exception {
+        this.helpers.connectorHelper.startConnector(getName(), connectorName);
+    }
+
+    @Override
+    public void stopConnector(String connectorName) throws Exception {
+        this.helpers.connectorHelper.stopConnector(getName(), connectorName);
+    }
+
+    @Override
+    public String getConnectorConfig(String connectorName) throws Exception {
+        return helpers.entaxyObjectService.findObject(connectorName, "entaxy.runtime.connector").getConfiguration();
+    }
+
+    @Override
+    public List getAllowedTargets() {
+        try {
+            return helpers.permissionHelper.getObjectPermissions(internalGetUuid());
+        } catch (NotBackwardCompatibleException ignore) {
+            //
+        } catch (Exception e) {
+            log.warn("getAllowedTargets not succeded", e);
+        }
+        return new ArrayList<>();
+    }
+
+    @Override
+    public List getAllowedSources() {
+        try {
+            return helpers.permissionHelper.getSubjectPermissions(internalGetUuid());
+        } catch (NotBackwardCompatibleException ignore) {
+            //
+        } catch (Exception e) {
+            log.warn("getAllowedSources not succeded", e);
+        }
+        return new ArrayList<>();
+    }
+
+    @Override
+    public void allowSource(String idOrName) throws Exception {
+        helpers.permissionHelper.createPermission(idOrName, internalGetUuid());
+    }
+
+    @Override
+    public void allowTarget(String idOrName) throws Exception {
+        helpers.permissionHelper.createPermission(internalGetUuid(), idOrName);
+
+    }
+
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/impl/ProfilesMBeanImpl.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/impl/ProfilesMBeanImpl.java
new file mode 100644
index 00000000..3f7bcf03
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/impl/ProfilesMBeanImpl.java
@@ -0,0 +1,106 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.profile.impl;
+
+import javax.management.NotCompliantMBeanException;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.CollectionType;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+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.osgi.service.component.annotations.ServiceScope;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import ru.entaxy.esb.platform.core.management.profile.helper.Helpers;
+import ru.entaxy.platform.core.management.object.ContainerMBean;
+import ru.entaxy.platform.core.management.object.factory.AbstractObjectContainerMBean;
+import ru.entaxy.platform.core.management.profile.ProfilesMBean;
+
+@Component(service = {ProfilesMBeanImpl.class}, scope = ServiceScope.SINGLETON,
+        immediate = true)
+@ContainerMBean(id = "profiles", subQualifierValue = "profiles")
+public class ProfilesMBeanImpl extends AbstractObjectContainerMBean
+        implements ProfilesMBean {
+
+    private static final Logger log = LoggerFactory.getLogger(ProfilesMBeanImpl.class);
+
+    protected BundleContext bundleContext;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY, service = Helpers.class,
+            collectionType = CollectionType.SERVICE, policy = ReferencePolicy.DYNAMIC,
+            policyOption = ReferencePolicyOption.GREEDY)
+    volatile Helpers helpers;
+
+    public ProfilesMBeanImpl() throws NotCompliantMBeanException {
+        super(ProfilesMBean.class);
+    }
+
+    @Activate
+    public void activate(ComponentContext componentContext) {
+        this.bundleContext = componentContext.getBundleContext();
+
+    }
+
+    @Deactivate
+    public void deactivate() {}
+
+    /*
+     * ProfileManager implementation
+     */
+
+    @Override
+    public void createProfile(String id, String name, String description) throws Exception {
+        this.helpers.profileHelper.createProfile(id, name, description);
+    }
+
+    @Override
+    public String getProfileConfig(String idOrName) throws Exception {
+        return this.helpers.entaxyObjectService.findObject(idOrName, "entaxy.runtime.profile").getConfiguration();
+    }
+
+    @Override
+    public void startProfile(String idOrName) throws Exception {
+        this.helpers.profileHelper.startProfile(idOrName);
+    }
+
+    @Override
+    public void stopProfile(String idOrName) throws Exception {
+        this.helpers.profileHelper.stopProfile(idOrName);
+    }
+
+    @Override
+    public void uninstallProfile(String idOrName) throws Exception {
+        this.helpers.profileHelper.uninstallProfile(idOrName);
+    }
+
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/AccountManager.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/AccountManager.java
new file mode 100644
index 00000000..26c7ff17
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/AccountManager.java
@@ -0,0 +1,35 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.profile.support.legacy;
+
+public interface AccountManager {
+
+    public String getAccountForSystem(String systemUuid) throws Exception;
+
+    public void createAccountForSystem(String login, String password, String systemUUID, String createdBy,
+            String editedBy) throws Exception;
+
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/ConnectorMBean.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/ConnectorMBean.java
new file mode 100644
index 00000000..19259905
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/ConnectorMBean.java
@@ -0,0 +1,83 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.profile.support.legacy;
+
+import ru.entaxy.esb.platform.base.management.core.Qualifier;
+import ru.entaxy.esb.platform.base.management.core.api.Attribute;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanAnnotated;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanExportPolicy;
+import ru.entaxy.esb.platform.base.management.core.api.Operation;
+import ru.entaxy.esb.platform.base.management.core.api.RuntimeTypedMBean;
+import ru.entaxy.esb.platform.base.management.core.utils.BundleAwareMBean;
+
+@MBeanAnnotated(policy = MBeanExportPolicy.ANNOTATION_ENRICH)
+public interface ConnectorMBean extends BundleAwareMBean, RuntimeTypedMBean {
+
+	public static interface Helper {
+
+		public static Qualifier getQualifier(String profileName, String connectorName) {
+			return ConnectorsMBean.Helper.getQualifier(profileName).qualifier(CONNECTOR_KEY, connectorName);
+		}
+		
+	}
+
+	public static final String CAPABILITY_NAMESPACE = "entaxy.runtime.connector";
+	
+	public static final String CONNECTOR_KEY = "connector";
+	
+	public static final String CONNECTOR_KEY_VALUE_DEFAULT = "default";
+
+	// TODO implement if needed
+	// public boolean isDefault();
+
+	@Attribute(desc = "Factory ID used to create the connector")
+	public String getFactoryId();
+	
+	@Attribute(desc = "Connector name")
+	public String getName();
+	
+	@Attribute(desc = "Connector registered name used in registry")
+	public String getRegisteredName();
+
+	@Attribute(desc = "Connector system")
+	public String getSystem();
+
+	@Attribute(desc = "Connector classifier")
+	public String getClassifier();
+
+	@Attribute(desc = "Connector display name")
+	public String getDisplayName();
+
+	@Attribute(desc = "Connector direction")
+	public String getDirection();
+
+	@Operation(desc = "Starts the connector")
+	public void start() throws Exception;
+	
+	@Operation(desc = "Stops the connector")
+	public void stop() throws Exception;
+	
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/ConnectorManager.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/ConnectorManager.java
new file mode 100644
index 00000000..f0acda4b
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/ConnectorManager.java
@@ -0,0 +1,40 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.profile.support.legacy;
+
+import java.util.Map;
+
+public interface ConnectorManager {
+
+	public void addConnector(String idOrName, String connectorFactoryId, Map parameters) throws Exception;
+	
+	public void removeConnector(String idOrName, String connectorName) throws Exception;
+	
+	public void startConnector(String idOrName, String connectorName) throws Exception;
+	
+	public void stopConnector(String idOrName, String connectorName) throws Exception;
+	
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/ConnectorsMBean.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/ConnectorsMBean.java
new file mode 100644
index 00000000..56ed338c
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/ConnectorsMBean.java
@@ -0,0 +1,44 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.profile.support.legacy;
+
+import ru.entaxy.esb.platform.base.management.core.Qualifier;
+import ru.entaxy.platform.core.management.profile.ProfileMBean;
+
+public interface ConnectorsMBean {
+    public static interface Helper {
+        public static Qualifier getQualifier(String profileName) {
+            return ProfileMBean.Helper
+                    .getQualifier(profileName)
+                    .qualifier(CONNECTORS_KEY, CONNECTORS_KEY_VALUE);
+        }
+
+    }
+
+    public static final String CONNECTORS_KEY = "section";
+    public static final String CONNECTORS_KEY_VALUE = "connectors";
+
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/DeployedLegacyConnectorCustomizer.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/DeployedLegacyConnectorCustomizer.java
new file mode 100644
index 00000000..36cb2ae1
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/DeployedLegacyConnectorCustomizer.java
@@ -0,0 +1,113 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.profile.support.legacy;
+
+import java.io.UnsupportedEncodingException;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.wiring.BundleCapability;
+
+import ru.entaxy.esb.platform.base.management.core.utils.ExtendedBundleTrackerCustomizer;
+import ru.entaxy.platform.base.support.CommonUtils;
+import ru.entaxy.platform.base.support.osgi.tracker.filter.BundleCapabilityFilter;
+
+public class DeployedLegacyConnectorCustomizer extends ExtendedBundleTrackerCustomizer> {
+
+    @Override
+    protected List createManagedObject(Bundle bundle, BundleEvent event,
+            Map> filterResults) {
+        @SuppressWarnings("unchecked")
+        List capabilities =
+                (List) filterResults.get(BundleCapabilityFilter.DEFAULT_FILTER_ID);
+        if (capabilities == null)
+            capabilities = new ArrayList<>();
+        List result = new ArrayList<>();
+
+
+        for (BundleCapability capability : capabilities) {
+
+            // process only legacy connectors
+            if (capability.getAttributes().containsKey("objectId")
+                    && capability.getAttributes().containsKey("factory")) {
+                // it's factory-based connector
+                continue;
+            }
+
+
+            Object val = capability.getAttributes().get("name");
+            String name = val == null ? "" : val.toString();
+            if (!CommonUtils.isValid(name))
+                continue;
+            val = capability.getAttributes().get("system");
+            String system = val == null ? "" : val.toString();
+            if (!CommonUtils.isValid(system))
+                continue;
+
+            val = capability.getAttributes().get("templateId");
+            String factoryId = val == null ? "" : val.toString();
+
+            val = capability.getAttributes().get("factory");
+            factoryId = val == null ? factoryId : val.toString();
+
+            val = capability.getAttributes().get("bundleName");
+            String registeredName = val == null ? "" : val.toString();
+
+            val = capability.getAttributes().get("classifier");
+            String classifier = val == null ? "" : val.toString();
+
+            val = capability.getAttributes().get("displayName");
+            String displayName;
+            try {
+                displayName =
+                        val == null ? "" : new String(val.toString().getBytes(StandardCharsets.ISO_8859_1), "UTF-8");
+            } catch (UnsupportedEncodingException e) {
+                displayName = val == null ? "" : val.toString();
+            }
+
+            val = capability.getAttributes().get("direction");
+            String direction = val == null ? "" : val.toString();
+
+
+            ManagedLegacyConnector mc = (new ManagedLegacyConnector())
+                    .name(name)
+                    .system(system)
+                    .factoryId(factoryId)
+                    .registeredName(registeredName)
+                    .classifier(classifier)
+                    .displayName(displayName)
+                    .direction(direction);
+            enrich(bundle, event, filterResults, mc);
+            result.add(mc);
+        }
+        return result;
+    }
+
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/LegacyConnectorMBeanImpl.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/LegacyConnectorMBeanImpl.java
new file mode 100644
index 00000000..71aa61fd
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/LegacyConnectorMBeanImpl.java
@@ -0,0 +1,94 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.profile.support.legacy;
+
+import javax.management.NotCompliantMBeanException;
+
+import org.osgi.framework.BundleContext;
+
+import ru.entaxy.esb.platform.base.management.core.api.EntaxyRuntimeTyped;
+import ru.entaxy.esb.platform.base.management.core.utils.BundleAwareMBeanImpl;
+import ru.entaxy.esb.platform.core.management.profile.helper.Helpers;
+
+// @TODO move string to constant
+@EntaxyRuntimeTyped(name = "entaxy.runtime.connector")
+public class LegacyConnectorMBeanImpl extends BundleAwareMBeanImpl
+        implements ConnectorMBean {
+
+    protected Helpers helpers;
+
+    public LegacyConnectorMBeanImpl(BundleContext bundleContext, ManagedLegacyConnector managedObject, Helpers helpers)
+            throws NotCompliantMBeanException {
+        super(ConnectorMBean.class, managedObject);
+        this.bundleContext = bundleContext;
+        this.helpers = helpers;
+    }
+
+    @Override
+    public String getFactoryId() {
+        return this.managedObject.getFactoryId();
+    }
+
+    @Override
+    public String getName() {
+        return this.managedObject.getName();
+    }
+
+    @Override
+    public String getRegisteredName() {
+        return this.managedObject.getRegisteredName();
+    }
+
+    @Override
+    public String getSystem() {
+        return this.managedObject.getSystem();
+    }
+
+    @Override
+    public String getClassifier() {
+        return this.managedObject.getClassifier();
+    }
+
+    @Override
+    public String getDisplayName() {
+        return this.managedObject.getDisplayName();
+    }
+
+    @Override
+    public String getDirection() {
+        return this.managedObject.getDirection();
+    }
+
+    @Override
+    public void start() throws Exception {
+        this.helpers.connectorHelper.startConnector(this.managedObject.getSystem(), this.getRegisteredName());
+    }
+
+    @Override
+    public void stop() throws Exception {
+        this.helpers.connectorHelper.stopConnector(this.managedObject.getSystem(), this.getRegisteredName());
+    }
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/LegacyConnectorManager.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/LegacyConnectorManager.java
new file mode 100644
index 00000000..bbe6db8f
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/LegacyConnectorManager.java
@@ -0,0 +1,72 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.profile.support.legacy;
+
+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.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.util.tracker.BundleTracker;
+
+import ru.entaxy.esb.platform.core.management.profile.helper.Helpers;
+import ru.entaxy.platform.base.support.osgi.tracker.BundleTrackerUtils;
+import ru.entaxy.platform.base.support.osgi.tracker.filter.BundleCapabilityFilter;
+
+@Component(service = LegacyConnectorManager.class, immediate = true)
+public class LegacyConnectorManager {
+
+    public static final String CAPABILITY_NAMESPACE = "entaxy.runtime.connector";
+
+    protected BundleTracker> connectorTracker;
+
+    protected BundleContext bundleContext;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY, service = Helpers.class,
+            collectionType = CollectionType.SERVICE)
+    Helpers helpers;
+
+    @Activate
+    public void activate(ComponentContext componentContext) {
+        this.bundleContext = componentContext.getBundleContext();
+        connectorTracker = BundleTrackerUtils.>createBuilder()
+                .customizer(
+                        (new DeployedLegacyConnectorCustomizer())
+                                .listener(new ManagedLegacyConnectorsListener(bundleContext, this.helpers)))
+                .addFilter(
+                        (new BundleCapabilityFilter()).namespace(CAPABILITY_NAMESPACE))
+                .bundleContext(bundleContext)
+                .bundleState(Bundle.ACTIVE | Bundle.INSTALLED | Bundle.RESOLVED | Bundle.STARTING | Bundle.STOPPING)
+                .get();
+        connectorTracker.open();
+
+    }
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/ManagedLegacyConnector.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/ManagedLegacyConnector.java
new file mode 100644
index 00000000..8f5a2afb
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/ManagedLegacyConnector.java
@@ -0,0 +1,136 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.profile.support.legacy;
+
+import ru.entaxy.esb.platform.base.management.core.utils.BundleAwareManagedObjectImpl;
+
+public class ManagedLegacyConnector extends BundleAwareManagedObjectImpl {
+
+	protected String system;
+
+	protected String name;
+	
+	protected String registeredName;
+	
+	protected String factoryId;
+
+	protected String classifier;
+
+	protected String displayName;
+
+	protected String direction;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public ManagedLegacyConnector name(String name) {
+		setName(name);
+		return this;
+	}
+	
+	public String getSystem() {
+		return system;
+	}
+
+	public void setSystem(String system) {
+		this.system = system;
+	}
+
+	public ManagedLegacyConnector system(String system) {
+		setSystem(system);
+		return this;
+	}
+
+	public String getFactoryId() {
+		return factoryId;
+	}
+
+	public void setFactoryId(String factoryId) {
+		this.factoryId = factoryId;
+	}
+	
+	public ManagedLegacyConnector factoryId(String factoryIdValue) {
+		this.setFactoryId(factoryIdValue);
+		return this;
+	}
+
+	public String getRegisteredName() {
+		return registeredName;
+	}
+
+	public void setRegisteredName(String registeredName) {
+		this.registeredName = registeredName;
+	};
+	
+	public ManagedLegacyConnector registeredName(String registeredNameValue) {
+		this.setRegisteredName(registeredNameValue);
+		return this;
+	};
+
+	public String getClassifier() {
+		return classifier;
+	}
+
+	public void setClassifier(String classifier) {
+		this.classifier = classifier;
+	}
+
+	public ManagedLegacyConnector classifier(String classifierValue) {
+		this.setClassifier(classifierValue);
+		return this;
+	}
+
+	public String getDisplayName() {
+		return displayName;
+	}
+
+	public void setDisplayName(String displayName) {
+		this.displayName = displayName;
+	}
+
+	public ManagedLegacyConnector displayName(String displayNameValue) {
+		this.setDisplayName(displayNameValue);
+		return this;
+	}
+
+	public String getDirection() {
+		return direction;
+	}
+
+	public void setDirection(String direction) {
+		this.direction = direction;
+	}
+
+	public ManagedLegacyConnector direction(String directionValue) {
+		this.setDirection(directionValue);
+		return this;
+	}
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/ManagedLegacyConnectorsListener.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/ManagedLegacyConnectorsListener.java
new file mode 100644
index 00000000..ff28e477
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/ManagedLegacyConnectorsListener.java
@@ -0,0 +1,77 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.profile.support.legacy;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.osgi.framework.BundleContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import ru.entaxy.esb.platform.base.management.core.utils.ManagedObjectsListener;
+import ru.entaxy.esb.platform.core.management.profile.helper.Helpers;
+
+public class ManagedLegacyConnectorsListener extends
+        ManagedObjectsListener, ManagedLegacyConnector, ConnectorMBean, LegacyConnectorMBeanImpl> {
+
+    private static final Logger log = LoggerFactory.getLogger(ManagedLegacyConnectorsListener.class);
+
+    protected Helpers helpers;
+
+    public ManagedLegacyConnectorsListener(BundleContext bundleContext, Helpers helpers) {
+        super(bundleContext, ConnectorMBean.class);
+        this.helpers = helpers;
+    }
+
+    @Override
+    protected Iterator getIterator(List managedObject) {
+        return managedObject.iterator();
+    }
+
+    @Override
+    protected String getKeyValue(ManagedLegacyConnector object) {
+        return object.getName();
+    }
+
+    @Override
+    protected LegacyConnectorMBeanImpl createService(ManagedLegacyConnector managedObject) {
+        try {
+            return new LegacyConnectorMBeanImpl(bundleContext, managedObject, helpers);
+        } catch (Exception e) {
+            log.error("Error creating service", e);
+            return null;
+        }
+    }
+
+    @Override
+    protected String getJmxObjectName(ManagedLegacyConnector managedObject) {
+        return ConnectorMBean.Helper.getQualifier(
+                managedObject.getSystem(),
+                managedObject.getName()).getValue();
+    }
+
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/PermissionManager.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/PermissionManager.java
new file mode 100644
index 00000000..1e5bd66a
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/PermissionManager.java
@@ -0,0 +1,38 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.profile.support.legacy;
+
+import java.util.List;
+
+public interface PermissionManager {
+
+    public List getObjectPermissions(String objectId) throws Exception;
+
+    public List getSubjectPermissions(String subjectId) throws Exception;
+
+    public void createPermission(String objectId, String subjectId) throws Exception;
+
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/ProfileManager.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/ProfileManager.java
new file mode 100644
index 00000000..35efba72
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/ProfileManager.java
@@ -0,0 +1,57 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.profile.support.legacy;
+
+import ru.entaxy.esb.platform.base.management.core.api.Operation;
+import ru.entaxy.esb.platform.base.management.core.api.Parameter;
+
+@Deprecated(since = "1.10", forRemoval = true)
+public interface ProfileManager {
+
+    @Operation(desc = "Create and deploy new profile")
+    public void createProfile(
+            @Parameter(desc = "Profile ID", name = "id") String id,
+            @Parameter(desc = "System name", name = "name") String name,
+            @Parameter(desc = "Description", name = "description") String description) throws Exception;
+
+    @Deprecated(since = "1.10", forRemoval = true)
+    @Operation(desc = "Get profile configuration")
+    public String getProfileConfig(@Parameter(desc = "Profile ID or system name", name = "idOrName") String idOrName)
+            throws Exception;
+
+    @Operation(desc = "Start profile")
+    public void startProfile(@Parameter(desc = "Profile ID or system name", name = "idOrName") String idOrName)
+            throws Exception;
+
+    @Operation(desc = "Stop profile")
+    public void stopProfile(@Parameter(desc = "Profile ID or system name", name = "idOrName") String idOrName)
+            throws Exception;
+
+    @Operation(desc = "Uninstall profile")
+    public void uninstallProfile(@Parameter(desc = "Profile ID or system name", name = "idOrName") String idOrName)
+            throws Exception;
+
+}
diff --git a/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/SystemManager.java b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/SystemManager.java
new file mode 100644
index 00000000..45839569
--- /dev/null
+++ b/platform/runtime/core/management/profile-management/src/main/java/ru/entaxy/platform/core/management/profile/support/legacy/SystemManager.java
@@ -0,0 +1,32 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.profile.support.legacy;
+
+public interface SystemManager {
+
+    String getUUIDbyName(String name) throws Exception;
+
+}
diff --git a/platform/runtime/core/management/repository-management/LICENSE.txt b/platform/runtime/core/management/repository-management/LICENSE.txt
new file mode 100644
index 00000000..4ae94b75
--- /dev/null
+++ b/platform/runtime/core/management/repository-management/LICENSE.txt
@@ -0,0 +1,175 @@
+                                 ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ
+
+Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой)
+версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего
+Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН
+7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова,
+д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу
+https://www.emdev.ru/about (далее - Компания).
+
+Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями»
+(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения,
+Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в
+настоящем документе, в противном случае, он должен не использовать или не получать доступ
+к Программному обеспечению.
+
+                                    1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ
+
+a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии
+или редакции, исключительные права на которую принадлежат Правообладателю.
+b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные
+права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ
+для ЭВМ № 2021610848 от 19.01.2021 года.
+c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта
+https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО.
+d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также
+личные неимущественные права авторов произведений на результат интеллектуальной деятельности.
+e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование
+ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка
+включает предоставление Пользователю неисключительного права использования ПО, в том числе
+получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение
+патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается
+Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается
+для каждого Пользователя индивидуально в Сертификате.
+f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром),
+подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное
+обеспечение в ограниченном объёме и на определённый период времени.
+g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО,
+предоставленных Пользователю согласно условиям Подписки.
+h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного
+обеспечения.
+i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий
+из одного или нескольких файлов, который может быть прочтён человеком.
+j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля
+программы, полученный в результате обработки исходного кода, еще не связанный в полную программу.
+Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый
+продукт.
+k) Некоммерческое использование – индивидуальное личное использование Пользователем программного
+обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации
+возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая
+выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения.
+
+                    2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
+
+2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного
+обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом
+воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения
+в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ.
+2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит
+неисключительный характер.
+2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию,
+лицензия на ограниченное использование Программного обеспечения.
+2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования
+имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан
+обратиться в службу поддержки Правообладателя по адресу:  https://entaxy.ru/ для изменения
+вида лицензии с Базовой бесплатной версии на Подписки.
+2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для
+пробного использования программного обеспечения – не ограничен.
+2.6. Использование Пользователем настоящего программного обеспечения в целях разработки,
+модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю,
+без разрешения Правообладателя не допускается.
+
+                                3. АВТОРСКОЕ ПРАВО.
+
+3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение
+и любые его копии принадлежат Правообладателю.
+3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента,
+к которому можно получить доступ с помощью Программного обеспечения, является собственностью
+соответствующего владельца контента и защищается применимым законодательством об авторском
+праве или другими законами и договорами об интеллектуальной собственности.
+3.3. Условия использования Программного обеспечения.
+Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь
+придерживается следующих условий:
+3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять
+какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании
+Программного обеспечения или на нем.
+3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать,
+расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать
+Программное обеспечение.
+3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования
+ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне.
+3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено
+использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам.
+
+                    4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС»
+
+4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю
+на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с
+использованием Пользователем:
+4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в
+Программное обеспечение;
+4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями
+настоящего соглашения;
+4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием,
+или данными, не предоставленными Пользователю Правообладателем;
+4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем.
+
+
+5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ
+ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ
+И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ
+ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ
+И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ
+ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО.
+
+                        6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ.
+НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ
+ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ,
+ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ;
+ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ.
+ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ
+ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ;
+КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ
+ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ.
+
+                        7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ:
+Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия
+(включая, но не ограничиваясь) по:
+-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код)
+ Программного обеспечения;
+-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный
+код Программного обеспечения, за исключением тех изменений, которые вносятся средствами,
+включёнными в Программное обеспечение и описанными непосредственно в документации к нему;
+-созданию условий для использования Программного обеспечения лицами, не имеющими прав на
+использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство
+третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа
+к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку;
+-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию).
+
+                    8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА.
+
+8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из
+лицензионных продуктов, используемых на законных основаниях, а
+именно https://entaxy.ru/libs/licenses/root-aggregated.deps.
+8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть
+совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения.
+8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться
+Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения,
+содержащих все изменения и дополнения программного обеспечения.
+
+                        9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ.
+
+9.1.  Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым
+программным обеспечением.
+9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно
+с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм
+«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public.
+9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий
+пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя,
+прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер
+ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства
+Российской Федерации.
+
+                                10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ.
+
+10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет
+право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб,
+недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий
+пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере
+2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения
+исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy).
+10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое
+законодательство – Российской Федерации.
+10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным,
+остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать
+исполнять свои обязанности в соответствии с этими положениями.
diff --git a/platform/runtime/core/management/repository-management/pom.xml b/platform/runtime/core/management/repository-management/pom.xml
new file mode 100644
index 00000000..f08a0a85
--- /dev/null
+++ b/platform/runtime/core/management/repository-management/pom.xml
@@ -0,0 +1,46 @@
+
+  4.0.0
+  
+    ru.entaxy.esb.platform.runtime.core
+    management
+    1.11.0
+  
+  ru.entaxy.esb.platform.runtime.core.management
+  repository-management
+  bundle
+  ENTAXY :: PLATFORM :: RUNTIME :: CORE :: MANAGEMENT :: REPOSITORY MANAGEMENT
+  ENTAXY :: PLATFORM :: RUNTIME :: CORE :: MANAGEMENT :: REPOSITORY MANAGEMENT
+  
+  
+		
+			ru.entaxy.esb.platform.runtime.core.management
+			object-management
+			${project.version}
+		
+	  	
+	  		org.osgi
+	  		org.osgi.service.component.annotations
+	  		1.4.0
+	  		compile
+	  	        
+        
+        	org.apache.felix
+        	org.apache.felix.scr
+        	2.1.20
+        
+	  	
+	  		
+	  			ru.entaxy.esb.platform.runtime.base
+	  		
+	  		base-support
+	  		${project.version}
+	  	
+	  	
+	  		ru.entaxy.esb.platform.runtime.base
+	  		management-core
+	  		${project.version}
+	  	
+	  
+  
+  
+
diff --git a/platform/runtime/core/management/repository-management/src/main/java/ru/entaxy/platform/core/management/repository/RepositoriesMBean.java b/platform/runtime/core/management/repository-management/src/main/java/ru/entaxy/platform/core/management/repository/RepositoriesMBean.java
new file mode 100644
index 00000000..0db22989
--- /dev/null
+++ b/platform/runtime/core/management/repository-management/src/main/java/ru/entaxy/platform/core/management/repository/RepositoriesMBean.java
@@ -0,0 +1,48 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * repository-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.repository;
+
+import ru.entaxy.esb.platform.base.management.core.api.MBeanAnnotated;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanExportPolicy;
+import ru.entaxy.esb.platform.base.management.core.api.Operation;
+import ru.entaxy.esb.platform.base.management.core.api.Parameter;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectContainerMBean;
+
+@MBeanAnnotated(policy = MBeanExportPolicy.ANNOTATED_ONLY)
+public interface RepositoriesMBean extends EntaxyRuntimeObjectContainerMBean {
+
+    @Operation(desc = "Start repository")
+    void startRepository(
+            @Parameter(name = "idOrName", desc = "Id or name of the repository") String idOrName) throws Exception;
+
+    @Operation(desc = "Stop repository")
+    void stopRepository(
+            @Parameter(name = "idOrName", desc = "Id or name of the repository") String idOrName) throws Exception;
+
+    @Operation(desc = "Uninstall repository")
+    void uninstallRepository(
+            @Parameter(name = "idOrName", desc = "Id or name of the repository") String idOrName) throws Exception;
+}
diff --git a/platform/runtime/core/management/repository-management/src/main/java/ru/entaxy/platform/core/management/repository/RepositoryMBean.java b/platform/runtime/core/management/repository-management/src/main/java/ru/entaxy/platform/core/management/repository/RepositoryMBean.java
new file mode 100644
index 00000000..d5ae4c37
--- /dev/null
+++ b/platform/runtime/core/management/repository-management/src/main/java/ru/entaxy/platform/core/management/repository/RepositoryMBean.java
@@ -0,0 +1,41 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * repository-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.repository;
+
+import ru.entaxy.esb.platform.base.management.core.api.Attribute;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanAnnotated;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanExportPolicy;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBean;
+
+@MBeanAnnotated(policy = MBeanExportPolicy.ANNOTATED_ONLY)
+public interface RepositoryMBean extends EntaxyRuntimeObjectMBean {
+
+    @Attribute(desc = "Repository name")
+    default String getName() {
+        return getObjectId();
+    }
+
+}
diff --git a/platform/runtime/core/management/repository-management/src/main/java/ru/entaxy/platform/core/management/repository/impl/RepositoriesMBeanImpl.java b/platform/runtime/core/management/repository-management/src/main/java/ru/entaxy/platform/core/management/repository/impl/RepositoriesMBeanImpl.java
new file mode 100644
index 00000000..970fa6c7
--- /dev/null
+++ b/platform/runtime/core/management/repository-management/src/main/java/ru/entaxy/platform/core/management/repository/impl/RepositoriesMBeanImpl.java
@@ -0,0 +1,75 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * repository-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.repository.impl;
+
+import javax.management.NotCompliantMBeanException;
+
+import org.osgi.service.component.annotations.*;
+
+import ru.entaxy.platform.base.objects.EntaxyObjectService;
+import ru.entaxy.platform.core.management.object.ContainerMBean;
+import ru.entaxy.platform.core.management.object.factory.AbstractObjectContainerMBean;
+import ru.entaxy.platform.core.management.repository.RepositoriesMBean;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObjectManager;
+
+@Component(service = {RepositoriesMBeanImpl.class}, scope = ServiceScope.SINGLETON,
+        immediate = true)
+@ContainerMBean(id = "repositories", subQualifierValue = "repositories")
+public class RepositoriesMBeanImpl extends AbstractObjectContainerMBean
+        implements RepositoriesMBean {
+
+    private String REPOSITORY_RUNTIME_TYPE = "entaxy.runtime.repository";
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC,
+            policyOption = ReferencePolicyOption.GREEDY)
+    volatile public EntaxyObjectService entaxyObjectService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC,
+            policyOption = ReferencePolicyOption.GREEDY)
+    volatile private EntaxyRuntimeObjectManager entaxyRuntimeObjectManager;
+
+    public RepositoriesMBeanImpl() throws NotCompliantMBeanException {
+        super(RepositoriesMBean.class);
+    }
+
+    @Override
+    public void startRepository(String idOrName) throws Exception {
+        entaxyRuntimeObjectManager
+                .start(entaxyObjectService.findObject(idOrName, REPOSITORY_RUNTIME_TYPE).getObjectFullId());
+    }
+
+    @Override
+    public void stopRepository(String idOrName) throws Exception {
+        entaxyRuntimeObjectManager
+                .stopForced(entaxyObjectService.findObject(idOrName, REPOSITORY_RUNTIME_TYPE).getObjectFullId());
+    }
+
+    @Override
+    public void uninstallRepository(String idOrName) throws Exception {
+        entaxyRuntimeObjectManager
+                .uninstallForced(entaxyObjectService.findObject(idOrName, REPOSITORY_RUNTIME_TYPE).getObjectFullId());
+    }
+}
diff --git a/platform/runtime/core/management/repository-management/src/main/java/ru/entaxy/platform/core/management/repository/impl/RepositoryMBeanFactory.java b/platform/runtime/core/management/repository-management/src/main/java/ru/entaxy/platform/core/management/repository/impl/RepositoryMBeanFactory.java
new file mode 100644
index 00000000..c86fc646
--- /dev/null
+++ b/platform/runtime/core/management/repository-management/src/main/java/ru/entaxy/platform/core/management/repository/impl/RepositoryMBeanFactory.java
@@ -0,0 +1,73 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * repository-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.repository.impl;
+
+import java.util.Collections;
+import java.util.List;
+
+import javax.management.NotCompliantMBeanException;
+
+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;
+
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeItemMBean;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBean;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBeanFactory;
+import ru.entaxy.platform.core.management.object.MBeanFactory;
+import ru.entaxy.platform.core.management.object.factory.AbstractMBeanFactory;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+
+@MBeanFactory(id = "repository-factory", supportedTypes = {"entaxy.runtime.repository"})
+@Component(service = EntaxyRuntimeObjectMBeanFactory.class, immediate = true)
+public class RepositoryMBeanFactory extends AbstractMBeanFactory {
+
+    private static final Logger log = LoggerFactory.getLogger(RepositoryMBeanFactory.class);
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    RepositoriesMBeanImpl repositoriesMBean;
+
+    @Override
+    public  T createMBean(EntaxyRuntimeObject entaxyRuntimeObject) {
+        RepositoryMBeanImpl beanImpl;
+        try {
+            beanImpl = new RepositoryMBeanImpl(entaxyRuntimeObject);
+            beanImpl.setParentMBean(repositoriesMBean);
+        } catch (NotCompliantMBeanException e) {
+            log.error("Error creating ProfileMBeanImpl for [" + entaxyRuntimeObject.getObjectFullId() + "]", e);
+            return null;
+        }
+        return (T) beanImpl;
+    }
+
+    @Override
+    public List createMBeans() {
+        return Collections.singletonList(repositoriesMBean);
+    }
+
+}
diff --git a/platform/runtime/core/management/repository-management/src/main/java/ru/entaxy/platform/core/management/repository/impl/RepositoryMBeanImpl.java b/platform/runtime/core/management/repository-management/src/main/java/ru/entaxy/platform/core/management/repository/impl/RepositoryMBeanImpl.java
new file mode 100644
index 00000000..63e7bdfe
--- /dev/null
+++ b/platform/runtime/core/management/repository-management/src/main/java/ru/entaxy/platform/core/management/repository/impl/RepositoryMBeanImpl.java
@@ -0,0 +1,44 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * repository-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.repository.impl;
+
+import javax.management.NotCompliantMBeanException;
+
+import ru.entaxy.esb.platform.base.management.core.api.EntaxyRuntimeTyped;
+import ru.entaxy.platform.core.management.object.ObjectMBean;
+import ru.entaxy.platform.core.management.object.factory.AbstractObjectMBean;
+import ru.entaxy.platform.core.management.repository.RepositoryMBean;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+
+@EntaxyRuntimeTyped(name = "entaxy.runtime.repository")
+@ObjectMBean(subQualifierName = "repository")
+public class RepositoryMBeanImpl extends AbstractObjectMBean implements RepositoryMBean {
+
+    public RepositoryMBeanImpl(EntaxyRuntimeObject entaxyRuntimeObject)
+            throws NotCompliantMBeanException {
+        super(RepositoryMBean.class, entaxyRuntimeObject);
+    }
+}
diff --git a/platform/runtime/core/management/route-management/LICENSE.txt b/platform/runtime/core/management/route-management/LICENSE.txt
new file mode 100644
index 00000000..4ae94b75
--- /dev/null
+++ b/platform/runtime/core/management/route-management/LICENSE.txt
@@ -0,0 +1,175 @@
+                                 ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ
+
+Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой)
+версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего
+Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН
+7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова,
+д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу
+https://www.emdev.ru/about (далее - Компания).
+
+Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями»
+(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения,
+Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в
+настоящем документе, в противном случае, он должен не использовать или не получать доступ
+к Программному обеспечению.
+
+                                    1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ
+
+a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии
+или редакции, исключительные права на которую принадлежат Правообладателю.
+b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные
+права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ
+для ЭВМ № 2021610848 от 19.01.2021 года.
+c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта
+https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО.
+d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также
+личные неимущественные права авторов произведений на результат интеллектуальной деятельности.
+e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование
+ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка
+включает предоставление Пользователю неисключительного права использования ПО, в том числе
+получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение
+патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается
+Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается
+для каждого Пользователя индивидуально в Сертификате.
+f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром),
+подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное
+обеспечение в ограниченном объёме и на определённый период времени.
+g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО,
+предоставленных Пользователю согласно условиям Подписки.
+h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного
+обеспечения.
+i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий
+из одного или нескольких файлов, который может быть прочтён человеком.
+j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля
+программы, полученный в результате обработки исходного кода, еще не связанный в полную программу.
+Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый
+продукт.
+k) Некоммерческое использование – индивидуальное личное использование Пользователем программного
+обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации
+возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая
+выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения.
+
+                    2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
+
+2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного
+обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом
+воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения
+в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ.
+2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит
+неисключительный характер.
+2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию,
+лицензия на ограниченное использование Программного обеспечения.
+2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования
+имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан
+обратиться в службу поддержки Правообладателя по адресу:  https://entaxy.ru/ для изменения
+вида лицензии с Базовой бесплатной версии на Подписки.
+2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для
+пробного использования программного обеспечения – не ограничен.
+2.6. Использование Пользователем настоящего программного обеспечения в целях разработки,
+модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю,
+без разрешения Правообладателя не допускается.
+
+                                3. АВТОРСКОЕ ПРАВО.
+
+3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение
+и любые его копии принадлежат Правообладателю.
+3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента,
+к которому можно получить доступ с помощью Программного обеспечения, является собственностью
+соответствующего владельца контента и защищается применимым законодательством об авторском
+праве или другими законами и договорами об интеллектуальной собственности.
+3.3. Условия использования Программного обеспечения.
+Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь
+придерживается следующих условий:
+3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять
+какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании
+Программного обеспечения или на нем.
+3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать,
+расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать
+Программное обеспечение.
+3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования
+ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне.
+3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено
+использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам.
+
+                    4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС»
+
+4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю
+на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с
+использованием Пользователем:
+4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в
+Программное обеспечение;
+4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями
+настоящего соглашения;
+4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием,
+или данными, не предоставленными Пользователю Правообладателем;
+4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем.
+
+
+5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ
+ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ
+И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ
+ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ
+И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ
+ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО.
+
+                        6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ.
+НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ
+ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ,
+ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ;
+ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ.
+ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ
+ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ;
+КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ
+ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ.
+
+                        7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ:
+Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия
+(включая, но не ограничиваясь) по:
+-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код)
+ Программного обеспечения;
+-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный
+код Программного обеспечения, за исключением тех изменений, которые вносятся средствами,
+включёнными в Программное обеспечение и описанными непосредственно в документации к нему;
+-созданию условий для использования Программного обеспечения лицами, не имеющими прав на
+использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство
+третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа
+к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку;
+-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию).
+
+                    8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА.
+
+8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из
+лицензионных продуктов, используемых на законных основаниях, а
+именно https://entaxy.ru/libs/licenses/root-aggregated.deps.
+8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть
+совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения.
+8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться
+Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения,
+содержащих все изменения и дополнения программного обеспечения.
+
+                        9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ.
+
+9.1.  Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым
+программным обеспечением.
+9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно
+с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм
+«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public.
+9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий
+пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя,
+прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер
+ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства
+Российской Федерации.
+
+                                10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ.
+
+10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет
+право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб,
+недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий
+пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере
+2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения
+исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy).
+10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое
+законодательство – Российской Федерации.
+10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным,
+остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать
+исполнять свои обязанности в соответствии с этими положениями.
diff --git a/platform/runtime/core/management/route-management/pom.xml b/platform/runtime/core/management/route-management/pom.xml
new file mode 100644
index 00000000..53317a89
--- /dev/null
+++ b/platform/runtime/core/management/route-management/pom.xml
@@ -0,0 +1,32 @@
+
+  4.0.0
+  
+    ru.entaxy.esb.platform.runtime.core
+    management
+    1.11.0
+  
+  ru.entaxy.esb.platform.runtime.core.management
+  route-management
+  bundle
+  ENTAXY :: PLATFORM :: RUNTIME :: CORE :: MANAGEMENT :: ROUTE MANAGEMENT
+  ENTAXY :: PLATFORM :: RUNTIME :: CORE :: MANAGEMENT :: ROUTE MANAGEMENT
+  
+  
+	ru.entaxy.platform.core.management.route
+	ru.entaxy.platform.core.management.route.impl
+  
+  
+  
+		
+			ru.entaxy.esb.platform.runtime.core.management
+			object-management
+			${project.version}
+		
+      
+          ru.entaxy.esb.platform.runtime.core.objects-implementations.route-implementation
+          route-producing
+          ${project.version}
+      
+  
+  
+
diff --git a/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/RouteComponentLibrariesMBean.java b/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/RouteComponentLibrariesMBean.java
new file mode 100644
index 00000000..3ee45468
--- /dev/null
+++ b/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/RouteComponentLibrariesMBean.java
@@ -0,0 +1,45 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * route-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.route;
+
+import ru.entaxy.esb.platform.base.management.core.ManagementCore;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanAnnotated;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanExportPolicy;
+import ru.entaxy.esb.platform.base.management.core.api.Operation;
+
+@MBeanAnnotated(policy = MBeanExportPolicy.ANNOTATED_ONLY)
+public interface RouteComponentLibrariesMBean {
+
+    String ROUTE_COMPONENT_LIBRARIES_KEY = "util";
+    String ROUTE_COMPONENT_LIBRARIES_KEY_VALUE = "route-component-libraries";
+
+    String JMX_OBJECT_NAME = ManagementCore.Q_PLATFORM_S + ","
+            + RouteComponentLibrariesMBean.ROUTE_COMPONENT_LIBRARIES_KEY + "="
+            + RouteComponentLibrariesMBean.ROUTE_COMPONENT_LIBRARIES_KEY_VALUE;
+
+    @Operation(desc = "Gets all tag descriptors")
+    String readAllTagDescriptors() throws Exception;
+}
diff --git a/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/RouteLibrariesMBean.java b/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/RouteLibrariesMBean.java
new file mode 100644
index 00000000..8dcbb982
--- /dev/null
+++ b/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/RouteLibrariesMBean.java
@@ -0,0 +1,45 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * route-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.route;
+
+import ru.entaxy.esb.platform.base.management.core.ManagementCore;
+import ru.entaxy.esb.platform.base.management.core.Qualifier;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanAnnotated;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanExportPolicy;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectContainerMBean;
+
+@MBeanAnnotated(policy = MBeanExportPolicy.ANNOTATED_ONLY)
+public interface RouteLibrariesMBean extends EntaxyRuntimeObjectContainerMBean {
+
+    public static final String ROUTE_LIBRARIES_KEY = "category";
+
+    public static final String ROUTE_LIBRARIES_VALUE = "route-libraries";
+
+    public static final Qualifier Q_ROUTE_LIBRARIES = ManagementCore.Q_RUNTIME
+            .qualifier(RouteLibrariesMBean.ROUTE_LIBRARIES_KEY, RouteLibrariesMBean.ROUTE_LIBRARIES_VALUE);
+
+
+}
diff --git a/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/RouteLibraryMBean.java b/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/RouteLibraryMBean.java
new file mode 100644
index 00000000..879c3503
--- /dev/null
+++ b/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/RouteLibraryMBean.java
@@ -0,0 +1,48 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * route-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.route;
+
+import ru.entaxy.esb.platform.base.management.core.Qualifier;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanAnnotated;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanExportPolicy;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBean;
+
+@MBeanAnnotated(policy = MBeanExportPolicy.ANNOTATED_ONLY)
+public interface RouteLibraryMBean extends EntaxyRuntimeObjectMBean {
+
+    public static final String CAPABILITY_NAMESPACE = "entaxy.runtime.route-library";
+
+    public static final String ROUTE_LIBRARY_KEY = "route-library";
+
+    public static interface Helper {
+
+        public static Qualifier getQualifier(String name) {
+            return RouteLibrariesMBean.Q_ROUTE_LIBRARIES.qualifier(ROUTE_LIBRARY_KEY, name);
+        }
+
+    }
+
+}
diff --git a/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/RouteMBean.java b/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/RouteMBean.java
new file mode 100644
index 00000000..08606c6a
--- /dev/null
+++ b/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/RouteMBean.java
@@ -0,0 +1,79 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * route-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.route;
+
+import ru.entaxy.esb.platform.base.management.core.api.Attribute;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanAnnotated;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanExportPolicy;
+import ru.entaxy.platform.base.support.CommonUtils;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBean;
+
+@MBeanAnnotated(policy = MBeanExportPolicy.ANNOTATED_ONLY)
+public interface RouteMBean extends EntaxyRuntimeObjectMBean {
+
+    public static final String CAPABILITY_NAMESPACE = "entaxy.runtime.route";
+
+    public static final String ROUTE_KEY = "route";
+
+    String ROUTE_ATTR_ROUTE_ID = "routeId";
+    String ROUTE_ATTR_ROUTE_TYPE = "routeType";
+    String ROUTE_ATTR_IS_CALLABLE = "routeIsCallable";
+    String ROUTE_ATTR_GLOBAL_CALL_MODE = "routeGlobalCallMode";
+    String ROUTE_ATTR_LOCAL_CALL_MODE = "routeLocalCallMode";
+
+
+    @Override
+    @Attribute
+    default String getDisplayName() {
+        return CommonUtils.getValid(getRuntimeObject().getDisplayName(), getRouteId());
+    }
+
+    @Attribute
+    default String getRouteId() {
+        return getRuntimeObject().getAttributeOrDefault(ROUTE_ATTR_ROUTE_ID, getObjectId()).toString();
+    };
+
+    @Attribute
+    default String getRouteType() {
+        return getRuntimeObject().getAttributeOrDefault(ROUTE_ATTR_ROUTE_TYPE, "UNKNOWN").toString();
+    }
+
+    @Attribute
+    default boolean isCallable() {
+        return Boolean
+                .parseBoolean(getRuntimeObject().getAttributeOrDefault(ROUTE_ATTR_IS_CALLABLE, "false").toString());
+    };
+
+    @Attribute
+    default String getGlobalCallMode() {
+        return getRuntimeObject().getAttributeOrDefault(ROUTE_ATTR_GLOBAL_CALL_MODE, "NONE").toString();
+    }
+
+    @Attribute
+    default String getLocalCallMode() {
+        return getRuntimeObject().getAttributeOrDefault(ROUTE_ATTR_LOCAL_CALL_MODE, "NONE").toString();
+    }
+}
diff --git a/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/RoutesMBean.java b/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/RoutesMBean.java
new file mode 100644
index 00000000..4e35aad2
--- /dev/null
+++ b/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/RoutesMBean.java
@@ -0,0 +1,82 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * route-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.route;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import javax.management.MBeanOperationInfo;
+
+import ru.entaxy.esb.platform.base.management.core.api.Attribute;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanAnnotated;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanExportPolicy;
+import ru.entaxy.esb.platform.base.management.core.api.NotExported;
+import ru.entaxy.esb.platform.base.management.core.api.Operation;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBean;
+
+@MBeanAnnotated(policy = MBeanExportPolicy.ANNOTATED_ONLY)
+public interface RoutesMBean extends EntaxyRuntimeObjectMBean {
+
+    String ATTR_ROUTE_CONTAINER_TYPE = "routeContainerType";
+
+    String JMX_SUBQUALIFIER_VALUE = "routes";
+
+    String RUNTIME_TYPE = "entaxy.runtime.route-container";
+
+    @Attribute
+    default String getRouteContainerType() {
+        return getRuntimeObject().getAttributeOrDefault(ATTR_ROUTE_CONTAINER_TYPE, "NONE").toString();
+    }
+
+    @Operation(desc = "List all included routes", impact = MBeanOperationInfo.INFO)
+    default List> listRoutes() {
+        return Collections.emptyList();
+    };
+
+    @Override
+    default String getJMXSubQualifierValue() {
+        return JMX_SUBQUALIFIER_VALUE;
+    }
+
+    @Override
+    @Attribute
+    default String getRuntimeType() {
+        return EntaxyRuntimeObjectMBean.super.getRuntimeType();
+    }
+
+    @Override
+    @NotExported
+    String readConfiguration();
+
+    @Override
+    @NotExported
+    Map> readExtendedData();
+
+    @Override
+    @NotExported
+    void refreshBundleInfo();
+}
diff --git a/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/impl/RouteComponentLibrariesMBeanImpl.java b/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/impl/RouteComponentLibrariesMBeanImpl.java
new file mode 100644
index 00000000..714f4059
--- /dev/null
+++ b/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/impl/RouteComponentLibrariesMBeanImpl.java
@@ -0,0 +1,71 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * route-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.route.impl;
+
+import org.osgi.service.component.annotations.*;
+import ru.entaxy.esb.platform.base.management.core.ManagementCore;
+import ru.entaxy.esb.platform.base.management.core.api.AnnotatedMBean;
+import ru.entaxy.esb.resources.EntaxyResourceService;
+import ru.entaxy.platform.core.management.route.RouteComponentLibrariesMBean;
+import ru.entaxy.platform.routes.design.library.ComponentLibrary;
+import ru.entaxy.platform.routes.design.library.ComponentLibraryManager;
+
+import javax.management.DynamicMBean;
+import javax.management.MBeanRegistration;
+import javax.management.NotCompliantMBeanException;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Component(
+        service = {RouteComponentLibrariesMBean.class, DynamicMBean.class, MBeanRegistration.class},
+        property = {ManagementCore.JMX_OBJECTNAME + "=" + RouteComponentLibrariesMBean.JMX_OBJECT_NAME},
+        scope = ServiceScope.SINGLETON,
+        immediate = true)
+public class RouteComponentLibrariesMBeanImpl extends AnnotatedMBean
+        implements RouteComponentLibrariesMBean {
+
+    @Reference
+    ComponentLibraryManager componentLibraryManager;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY
+            , service = EntaxyResourceService.class
+            , collectionType = CollectionType.SERVICE)
+    EntaxyResourceService entaxyResourceService;
+
+    public RouteComponentLibrariesMBeanImpl() throws NotCompliantMBeanException {
+        super(RouteComponentLibrariesMBean.class);
+    }
+
+    @Override
+    public String readAllTagDescriptors() {
+        List schemas = componentLibraryManager.getAllSchemasWithUiDescriptor();
+        return schemas.stream().map(s -> {
+            return entaxyResourceService
+                    .getResource(s.getLibrary().getUrl() + "/" + s.getUiDescriptor())
+                    .getAsString();
+        }).collect(Collectors.toList()).toString();
+    }
+}
diff --git a/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/impl/RouteLibrariesMBeanImpl.java b/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/impl/RouteLibrariesMBeanImpl.java
new file mode 100644
index 00000000..b753b8dc
--- /dev/null
+++ b/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/impl/RouteLibrariesMBeanImpl.java
@@ -0,0 +1,48 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * route-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.route.impl;
+
+import javax.management.NotCompliantMBeanException;
+
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ServiceScope;
+
+import ru.entaxy.platform.core.management.object.ContainerMBean;
+import ru.entaxy.platform.core.management.object.factory.AbstractObjectContainerMBean;
+import ru.entaxy.platform.core.management.route.RouteLibrariesMBean;
+
+@Component(service = {RouteLibrariesMBeanImpl.class}, scope = ServiceScope.SINGLETON,
+        immediate = true)
+@ContainerMBean(id = "route-libraries", subQualifierValue = "route-libraries")
+public class RouteLibrariesMBeanImpl extends AbstractObjectContainerMBean
+        implements RouteLibrariesMBean {
+
+    public RouteLibrariesMBeanImpl() throws NotCompliantMBeanException {
+        super(RouteLibrariesMBean.class);
+    }
+
+
+}
diff --git a/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/impl/RouteLibraryMBeanImpl.java b/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/impl/RouteLibraryMBeanImpl.java
new file mode 100644
index 00000000..752d7c36
--- /dev/null
+++ b/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/impl/RouteLibraryMBeanImpl.java
@@ -0,0 +1,46 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * route-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.route.impl;
+
+import javax.management.NotCompliantMBeanException;
+
+import ru.entaxy.esb.platform.base.management.core.api.EntaxyRuntimeTyped;
+import ru.entaxy.platform.core.management.object.ObjectMBean;
+import ru.entaxy.platform.core.management.object.factory.AbstractObjectMBean;
+import ru.entaxy.platform.core.management.route.RouteLibraryMBean;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+
+@EntaxyRuntimeTyped(name = "entaxy.runtime.route-library")
+@ObjectMBean(subQualifierName = "route-library")
+public class RouteLibraryMBeanImpl extends AbstractObjectMBean implements RouteLibraryMBean {
+
+    protected RouteLibraryMBeanImpl(EntaxyRuntimeObject entaxyRuntimeObject)
+            throws NotCompliantMBeanException {
+        super(RouteLibraryMBean.class, entaxyRuntimeObject);
+        setJMXSubQualifierValue(entaxyRuntimeObject.getId());
+    }
+
+}
diff --git a/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/impl/RouteMBeanImpl.java b/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/impl/RouteMBeanImpl.java
new file mode 100644
index 00000000..08dcf55b
--- /dev/null
+++ b/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/impl/RouteMBeanImpl.java
@@ -0,0 +1,43 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * route-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.route.impl;
+
+import javax.management.NotCompliantMBeanException;
+
+import ru.entaxy.esb.platform.base.management.core.api.EntaxyRuntimeTyped;
+import ru.entaxy.platform.core.management.object.factory.AbstractObjectMBean;
+import ru.entaxy.platform.core.management.route.RouteMBean;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+
+@EntaxyRuntimeTyped(name = "entaxy.runtime.route")
+public class RouteMBeanImpl extends AbstractObjectMBean implements RouteMBean {
+
+    protected RouteMBeanImpl(EntaxyRuntimeObject entaxyRuntimeObject)
+            throws NotCompliantMBeanException {
+        super(RouteMBean.class, entaxyRuntimeObject);
+    }
+
+}
diff --git a/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/impl/RouteMbeanFactory.java b/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/impl/RouteMbeanFactory.java
new file mode 100644
index 00000000..be84a40f
--- /dev/null
+++ b/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/impl/RouteMbeanFactory.java
@@ -0,0 +1,142 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * route-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.route.impl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.management.NotCompliantMBeanException;
+
+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;
+
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeItemMBean;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBean;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBeanCustomizer;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBeanFactory;
+import ru.entaxy.platform.core.management.object.MBeanFactory;
+import ru.entaxy.platform.core.management.object.factory.AbstractMBeanFactory;
+import ru.entaxy.platform.core.management.route.RoutesMBean;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+
+@MBeanFactory(id = "route-factory", supportedTypes = {"entaxy.runtime.route-library", "entaxy.runtime.route"})
+@Component(service = {EntaxyRuntimeObjectMBeanFactory.class, EntaxyRuntimeObjectMBeanCustomizer.class},
+        immediate = true)
+public class RouteMbeanFactory extends AbstractMBeanFactory implements EntaxyRuntimeObjectMBeanCustomizer {
+
+    private static final Logger LOG = LoggerFactory.getLogger(RouteMbeanFactory.class);
+
+    protected static String ROUTE_TYPE = "entaxy.runtime.route";
+    protected static String ROUTE_LIBRARY_TYPE = "entaxy.runtime.route-library";
+
+    protected static String ROUTE_CONTAINER_MARKER = "isRouteContainer";
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    RouteLibrariesMBeanImpl routeLibrariesMBean;
+
+    @Override
+    public  T createMBean(EntaxyRuntimeObject entaxyRuntimeObject) {
+
+        EntaxyRuntimeObjectMBean bean = null;
+
+        if (entaxyRuntimeObject.getType().equals(ROUTE_TYPE)
+                || entaxyRuntimeObject.getType().startsWith(ROUTE_TYPE + ".")) {
+            try {
+                bean = new RouteMBeanImpl(entaxyRuntimeObject);
+            } catch (Exception e) {
+                LOG.error("Error creating RouteMBeanImpl", e);
+            }
+        } else if (entaxyRuntimeObject.getType().equals(ROUTE_LIBRARY_TYPE)
+                || entaxyRuntimeObject.getType().startsWith(ROUTE_LIBRARY_TYPE)) {
+            try {
+                bean = new RouteLibraryMBeanImpl(entaxyRuntimeObject);
+                bean.setParentMBean(routeLibrariesMBean);
+            } catch (Exception e) {
+                LOG.error("Error creating RouteLibraryMBeanImpl", e);
+            }
+        }
+        return (T) bean;
+    }
+
+    @Override
+    public List createMBeans() {
+        return Collections.singletonList(routeLibrariesMBean);
+    }
+
+    /* EntaxyRuntimeObjectMBeanCustomizer */
+
+    @Override
+    public boolean isAccepted(EntaxyRuntimeObjectMBean bean) {
+        boolean result = false;
+        try {
+            result = Boolean.parseBoolean(
+                    bean.getRuntimeObject().getAttributeOrDefault(ROUTE_CONTAINER_MARKER, "false").toString());
+        } catch (Exception ignore) {
+            // NOOP
+        }
+        return result;
+    }
+
+    @Override
+    public Customized customize(EntaxyRuntimeObjectMBean bean) {
+        CustomizedImpl result = new CustomizedImpl();
+        result.mBean = bean;
+
+        try {
+            RoutesMBeanImpl routesMBeanImpl = new RoutesMBeanImpl(bean.getRuntimeObject());
+            routesMBeanImpl.setParentMBean(bean);
+            result.additionalMBeans.add(routesMBeanImpl);
+        } catch (NotCompliantMBeanException e) {
+            LOG.error(String.format("Error creating customized bean [%s] for [%s]", RoutesMBean.class.getName(),
+                    bean.getRuntimeObject()), e);
+        }
+
+        return result;
+    }
+
+    protected static class CustomizedImpl implements Customized {
+
+        EntaxyRuntimeObjectMBean mBean;
+
+        List additionalMBeans = new ArrayList<>();
+
+        @Override
+        public EntaxyRuntimeObjectMBean getCustomizedMBean() {
+            return mBean;
+        }
+
+        @Override
+        public List getAdditionalMBeans() {
+            return additionalMBeans;
+        }
+
+    }
+
+}
diff --git a/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/impl/RoutesMBeanImpl.java b/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/impl/RoutesMBeanImpl.java
new file mode 100644
index 00000000..9c7a3f79
--- /dev/null
+++ b/platform/runtime/core/management/route-management/src/main/java/ru/entaxy/platform/core/management/route/impl/RoutesMBeanImpl.java
@@ -0,0 +1,65 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * route-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.route.impl;
+
+import javax.management.NotCompliantMBeanException;
+
+import ru.entaxy.esb.platform.base.management.core.api.EntaxyRuntimeTyped;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeItemMBean;
+import ru.entaxy.platform.core.management.object.ObjectMBean;
+import ru.entaxy.platform.core.management.object.factory.AbstractObjectMBean;
+import ru.entaxy.platform.core.management.route.RoutesMBean;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+
+@EntaxyRuntimeTyped(name = RoutesMBean.RUNTIME_TYPE)
+@ObjectMBean(subQualifierName = EntaxyRuntimeItemMBean.JMX_SUBQUALIFIER_AUTO)
+public class RoutesMBeanImpl extends AbstractObjectMBean implements RoutesMBean {
+
+    protected RoutesMBeanImpl(EntaxyRuntimeObject entaxyRuntimeObject)
+            throws NotCompliantMBeanException {
+        super(RoutesMBean.class, entaxyRuntimeObject);
+    }
+
+    @Override
+    public String getJMXSubQualifierValue() {
+        return RoutesMBean.JMX_SUBQUALIFIER_VALUE;
+    }
+
+    @Override
+    public String getId() {
+        return super.getId().concat("_routes");
+    }
+
+    @Override
+    public String getDisplayName() {
+        return "routes";
+    }
+
+    @Override
+    public String getRuntimeType() {
+        return RoutesMBean.super.getRuntimeType();
+    }
+}
diff --git a/platform/runtime/core/management/service-management/pom.xml b/platform/runtime/core/management/service-management/pom.xml
index 7faa8ee5..92e1585c 100644
--- a/platform/runtime/core/management/service-management/pom.xml
+++ b/platform/runtime/core/management/service-management/pom.xml
@@ -3,7 +3,7 @@
   
     ru.entaxy.esb.platform.runtime.core
     management
-    1.10.0
+    1.11.0
   
   ru.entaxy.esb.platform.runtime.core.management
   service-management
diff --git a/platform/runtime/core/management/service-management/src/main/java/ru/entaxy/platform/core/management/service/ServiceMBean.java b/platform/runtime/core/management/service-management/src/main/java/ru/entaxy/platform/core/management/service/ServiceMBean.java
new file mode 100644
index 00000000..c390bcc1
--- /dev/null
+++ b/platform/runtime/core/management/service-management/src/main/java/ru/entaxy/platform/core/management/service/ServiceMBean.java
@@ -0,0 +1,53 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * service-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.service;
+
+import ru.entaxy.esb.platform.base.management.core.Qualifier;
+import ru.entaxy.esb.platform.base.management.core.api.Attribute;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanAnnotated;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanExportPolicy;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBean;
+
+@MBeanAnnotated(policy = MBeanExportPolicy.ANNOTATED_ONLY)
+public interface ServiceMBean extends EntaxyRuntimeObjectMBean {
+
+    public static interface Helper {
+
+        public static Qualifier getQualifier(String name) {
+            return ServicesMBean.Q_SERVICES.qualifier(SERVICE_KEY, name);
+        }
+
+    }
+
+    public static final String CAPABILITY_NAMESPACE = "entaxy.runtime.service";
+
+    public static final String SERVICE_KEY = "service";
+
+    @Attribute
+    default String getName() {
+        return getObjectId();
+    };
+}
diff --git a/platform/runtime/core/management/service-management/src/main/java/ru/entaxy/platform/core/management/service/ServicesMBean.java b/platform/runtime/core/management/service-management/src/main/java/ru/entaxy/platform/core/management/service/ServicesMBean.java
new file mode 100644
index 00000000..2395024a
--- /dev/null
+++ b/platform/runtime/core/management/service-management/src/main/java/ru/entaxy/platform/core/management/service/ServicesMBean.java
@@ -0,0 +1,65 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * service-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.service;
+
+import ru.entaxy.esb.platform.base.management.core.ManagementCore;
+import ru.entaxy.esb.platform.base.management.core.Qualifier;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanAnnotated;
+import ru.entaxy.esb.platform.base.management.core.api.MBeanExportPolicy;
+import ru.entaxy.esb.platform.base.management.core.api.Operation;
+import ru.entaxy.esb.platform.base.management.core.api.Parameter;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectContainerMBean;
+
+@MBeanAnnotated(policy = MBeanExportPolicy.ANNOTATED_ONLY)
+public interface ServicesMBean extends EntaxyRuntimeObjectContainerMBean {
+
+    public static final String CAPABILITY_NAMESPACE = "entaxy.runtime.service";
+
+    public static final String SERVICES_KEY = "category";
+
+    public static final String SERVICES_KEY_VALUE = "services";
+
+    public static final Qualifier Q_SERVICES = ManagementCore.Q_RUNTIME
+            .qualifier(ServicesMBean.SERVICES_KEY, ServicesMBean.SERVICES_KEY_VALUE);
+
+    @Deprecated(since = "1.10", forRemoval = true)
+    @Operation(desc = "Gets service's configuration")
+    public String getServiceConfig(
+            @Parameter(name = "idOrName", desc = "Service id or name") String idOrName) throws Exception;
+
+    @Operation(desc = "Start service")
+    public void startService(
+            @Parameter(name = "idOrName", desc = "Service id or name") String idOrName) throws Exception;
+
+    @Operation(desc = "Stop service")
+    public void stopService(
+            @Parameter(name = "idOrName", desc = "Service id or name") String idOrName) throws Exception;
+
+    @Operation(desc = "Uninstall service")
+    public void uninstallService(
+            @Parameter(name = "idOrName", desc = "Service id or name") String idOrName) throws Exception;
+
+}
diff --git a/platform/runtime/core/management/service-management/src/main/java/ru/entaxy/platform/core/management/service/impl/ServiceMBeanFactory.java b/platform/runtime/core/management/service-management/src/main/java/ru/entaxy/platform/core/management/service/impl/ServiceMBeanFactory.java
new file mode 100644
index 00000000..94325e9d
--- /dev/null
+++ b/platform/runtime/core/management/service-management/src/main/java/ru/entaxy/platform/core/management/service/impl/ServiceMBeanFactory.java
@@ -0,0 +1,101 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * service-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.service.impl;
+
+import java.util.Collections;
+import java.util.List;
+
+import javax.management.NotCompliantMBeanException;
+
+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.platform.core.management.object.EntaxyRuntimeItemMBean;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBean;
+import ru.entaxy.platform.core.management.object.EntaxyRuntimeObjectMBeanFactory;
+import ru.entaxy.platform.core.management.object.MBeanFactory;
+import ru.entaxy.platform.core.management.object.factory.AbstractMBeanFactory;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+
+
+@MBeanFactory(id = "service-factory", supportedTypes = {"entaxy.runtime.service", "entaxy.runtime.service.*"})
+@Component(service = EntaxyRuntimeObjectMBeanFactory.class, immediate = true)
+public class ServiceMBeanFactory extends AbstractMBeanFactory {
+
+    private static final Logger log = LoggerFactory.getLogger(ServiceMBeanFactory.class);
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.STATIC,
+            policyOption = ReferencePolicyOption.RELUCTANT)
+    ServicesMBeanImpl servicesMBean;
+
+/*    
+@Activate
+public void activate(ComponentContext componentContext) {
+    log.info("Activating ServiceMBeanFactory");
+}
+
+@Deactivate
+public void deactivate() {
+    log.info("DeActivating ServiceMBeanFactory");
+}
+
+*/
+    @Override
+    public  T createMBean(EntaxyRuntimeObject entaxyRuntimeObject) {
+        ServiceMBeanImpl beanImpl;
+        try {
+            beanImpl = new ServiceMBeanImpl(entaxyRuntimeObject);
+            beanImpl.setParentMBean(servicesMBean);
+        } catch (NotCompliantMBeanException e) {
+            log.error("Error creating ProfileMBeanImpl for [" + entaxyRuntimeObject.getObjectFullId() + "]", e);
+            return null;
+        }
+        return (T) beanImpl;
+    }
+
+
+/*
+public void setServicesMBean(ServicesMBeanImpl servicesMBean) {
+    log.info("setServicesMBean");
+    this.servicesMBean = servicesMBean;
+}
+
+public void unsetServicesMBean(ServicesMBeanImpl servicesMBean) {
+    log.info("unsetServicesMBean");
+    this.servicesMBean = null;
+}
+*/
+    @Override
+    public List createMBeans() {
+        return Collections.singletonList(servicesMBean);
+    }
+
+}
diff --git a/platform/runtime/core/management/service-management/src/main/java/ru/entaxy/platform/core/management/service/impl/ServiceMBeanImpl.java b/platform/runtime/core/management/service-management/src/main/java/ru/entaxy/platform/core/management/service/impl/ServiceMBeanImpl.java
new file mode 100644
index 00000000..b864c03d
--- /dev/null
+++ b/platform/runtime/core/management/service-management/src/main/java/ru/entaxy/platform/core/management/service/impl/ServiceMBeanImpl.java
@@ -0,0 +1,61 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * service-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.service.impl;
+
+import javax.management.NotCompliantMBeanException;
+
+import ru.entaxy.esb.platform.base.management.core.api.EntaxyRuntimeTyped;
+import ru.entaxy.platform.core.management.object.ObjectMBean;
+import ru.entaxy.platform.core.management.object.factory.AbstractObjectMBean;
+import ru.entaxy.platform.core.management.service.ServiceMBean;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+
+@EntaxyRuntimeTyped(name = "entaxy.runtime.service")
+@ObjectMBean(subQualifierName = ServiceMBean.SERVICE_KEY)
+public class ServiceMBeanImpl extends AbstractObjectMBean implements ServiceMBean {
+
+    public ServiceMBeanImpl(EntaxyRuntimeObject entaxyRuntimeObject)
+            throws NotCompliantMBeanException {
+        super(ServiceMBean.class, entaxyRuntimeObject);
+    }
+
+
+    /**
+     * methood is overridden for compatibility with current UI
+     * 
+     * TODO: remove after the above is not actual
+     */
+    @Override
+    public String getJMXSubQualifierName() {
+        return SERVICE_KEY;
+    }
+
+    @Override
+    public String getJMXSubQualifierValue() {
+        return getObjectId();
+    }
+
+}
diff --git a/platform/runtime/core/management/service-management/src/main/java/ru/entaxy/platform/core/management/service/impl/ServicesMBeanImpl.java b/platform/runtime/core/management/service-management/src/main/java/ru/entaxy/platform/core/management/service/impl/ServicesMBeanImpl.java
new file mode 100644
index 00000000..04b8d42b
--- /dev/null
+++ b/platform/runtime/core/management/service-management/src/main/java/ru/entaxy/platform/core/management/service/impl/ServicesMBeanImpl.java
@@ -0,0 +1,141 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * service-management
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.management.service.impl;
+
+import javax.management.NotCompliantMBeanException;
+
+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.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.osgi.service.component.annotations.ServiceScope;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import ru.entaxy.platform.base.objects.EntaxyObjectService;
+import ru.entaxy.platform.core.management.object.ContainerMBean;
+import ru.entaxy.platform.core.management.object.factory.AbstractObjectContainerMBean;
+import ru.entaxy.platform.core.management.service.ServicesMBean;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObjectManager;
+
+@Component(service = {ServicesMBeanImpl.class}, scope = ServiceScope.SINGLETON, immediate = true)
+@ContainerMBean(id = "services", subQualifierName = "category", subQualifierValue = "services")
+public class ServicesMBeanImpl extends AbstractObjectContainerMBean implements ServicesMBean {
+
+    private static final Logger log = LoggerFactory.getLogger(ServicesMBeanImpl.class);
+
+    protected BundleContext bundleContext;
+
+    private String SERVICE_RUNTIME_TYPE = "entaxy.runtime.service";
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC,
+            policyOption = ReferencePolicyOption.GREEDY)
+    volatile public EntaxyObjectService entaxyObjectService;
+/*
+@Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC,
+policyOption = ReferencePolicyOption.GREEDY)
+volatile private BundleManager bundleManager;
+*/
+    @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC,
+            policyOption = ReferencePolicyOption.GREEDY)
+    volatile private EntaxyRuntimeObjectManager entaxyRuntimeObjectManager;
+
+    public ServicesMBeanImpl() throws NotCompliantMBeanException {
+        super(ServicesMBean.class);
+    }
+
+    @Activate
+    public void activate(ComponentContext componentContext) {
+        this.bundleContext = componentContext.getBundleContext();
+        // log.info("Activating ServicesMBeanImpl");
+    }
+
+/*
+public void setEntaxyObjectService(EntaxyObjectService entaxyObjectService) {
+log.info("setEntaxyObjectService");
+this.entaxyObjectService = entaxyObjectService;
+}
+
+public void unsetEntaxyObjectService(EntaxyObjectService entaxyObjectService) {
+log.info("unsetEntaxyObjectService");
+this.entaxyObjectService = null;
+}
+
+public void setBundleManager(BundleManager bundleManager) {
+log.info("setBundleManager");
+this.bundleManager = bundleManager;
+}
+
+public void unsetBundleManager(BundleManager bundleManager) {
+log.info("unsetBundleManager");
+this.bundleManager = null;
+}
+*/
+    @Deactivate
+    public void deactivate() {
+        log.info("Deactivating ServicesMBeanImpl");
+    }
+
+    @Override
+    public String getServiceConfig(String idOrName) {
+        return entaxyObjectService.findObject(idOrName, SERVICE_RUNTIME_TYPE).getConfiguration();
+    }
+
+    @Override
+    public void startService(String idOrName) throws Exception {
+        // long bundleId = entaxyObjectService.findObject(idOrName,
+        // SERVICE_RUNTIME_TYPE).getBundleInfo().getBundleId();
+        // bundleManager.startBundle(bundleContext.getBundle(bundleId).getSymbolicName());
+        entaxyRuntimeObjectManager
+                .start(entaxyObjectService.findObject(idOrName, SERVICE_RUNTIME_TYPE).getObjectFullId());
+    }
+
+    @Override
+    public void stopService(String idOrName) throws Exception {
+        // long bundleId = entaxyObjectService.findObject(idOrName,
+        // SERVICE_RUNTIME_TYPE).getBundleInfo().getBundleId();
+        // bundleManager.stopBundle(bundleContext.getBundle(bundleId).getSymbolicName());
+        entaxyRuntimeObjectManager
+                .stopForced(entaxyObjectService.findObject(idOrName, SERVICE_RUNTIME_TYPE).getObjectFullId());
+    }
+
+    @Override
+    public void uninstallService(String idOrName) throws Exception {
+        // long bundleId = entaxyObjectService.findObject(idOrName,
+        // SERVICE_RUNTIME_TYPE).getBundleInfo().getBundleId();
+        // Bundle bundle = bundleContext.getBundle(bundleId);
+        // bundleManager.uninstallBundleByName(bundle.getSymbolicName(), "service",
+        // bundle.getVersion().toString());
+        // todo remove all connected resources
+        entaxyRuntimeObjectManager
+                .uninstallForced(entaxyObjectService.findObject(idOrName, SERVICE_RUNTIME_TYPE).getObjectFullId());
+    }
+}
diff --git a/platform/runtime/core/object-producing/object-producer-api/pom.xml b/platform/runtime/core/object-producing/object-producer-api/pom.xml
index 0a52951b..9d5a267c 100644
--- a/platform/runtime/core/object-producing/object-producer-api/pom.xml
+++ b/platform/runtime/core/object-producing/object-producer-api/pom.xml
@@ -3,7 +3,7 @@
   
     ru.entaxy.esb.platform.runtime.core
     object-producing
-    1.10.0
+    1.11.0
   
   ru.entaxy.esb.platform.runtime.core.object-producing
   object-producer-api
diff --git a/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/EntaxyFactoryDataProcessor.java b/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/EntaxyFactoryDataProcessor.java
index d3607077..79131335 100644
--- a/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/EntaxyFactoryDataProcessor.java
+++ b/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/EntaxyFactoryDataProcessor.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-api
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/EntaxyProducer.java b/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/EntaxyProducer.java
index 10c3d671..6de01d77 100644
--- a/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/EntaxyProducer.java
+++ b/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/EntaxyProducer.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/EntaxyProducerService.java b/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/EntaxyProducerService.java
index cbbabcc2..8ffdf986 100644
--- a/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/EntaxyProducerService.java
+++ b/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/EntaxyProducerService.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/EntaxyProducerUtils.java b/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/EntaxyProducerUtils.java
index c19ef65d..b79a58d9 100644
--- a/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/EntaxyProducerUtils.java
+++ b/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/EntaxyProducerUtils.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-api
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/EntaxyWrappedFactory.java b/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/EntaxyWrappedFactory.java
index 3e38f059..3de0250c 100644
--- a/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/EntaxyWrappedFactory.java
+++ b/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/EntaxyWrappedFactory.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/ExecutionPlan.java b/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/ExecutionPlan.java
index 572abf39..f3431fd4 100644
--- a/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/ExecutionPlan.java
+++ b/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/ExecutionPlan.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/ExecutionTask.java b/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/ExecutionTask.java
index 5eb8ea08..db9de95b 100644
--- a/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/ExecutionTask.java
+++ b/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/ExecutionTask.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/ProducerResult.java b/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/ProducerResult.java
index 74e342d1..04244caa 100644
--- a/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/ProducerResult.java
+++ b/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/ProducerResult.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/ProducingCommandExecutor.java b/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/ProducingCommandExecutor.java
index 1ade01de..8d3e9ff4 100644
--- a/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/ProducingCommandExecutor.java
+++ b/platform/runtime/core/object-producing/object-producer-api/src/main/java/ru/entaxy/platform/core/producer/api/ProducingCommandExecutor.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/pom.xml b/platform/runtime/core/object-producing/object-producer-core/pom.xml
index eecdce0c..78adf161 100644
--- a/platform/runtime/core/object-producing/object-producer-core/pom.xml
+++ b/platform/runtime/core/object-producing/object-producer-core/pom.xml
@@ -3,7 +3,7 @@
   
     ru.entaxy.esb.platform.runtime.core
     object-producing
-    1.10.0
+    1.11.0
   
   ru.entaxy.esb.platform.runtime.core.object-producing
   object-producer-core
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/audit/ObjectProducerEventConverter.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/audit/ObjectProducerEventConverter.java
new file mode 100644
index 00000000..e4cbe7d4
--- /dev/null
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/audit/ObjectProducerEventConverter.java
@@ -0,0 +1,84 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-producer-core
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.producer.audit;
+
+import org.osgi.framework.Filter;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.service.component.annotations.Component;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import ru.entaxy.audit.data.AuditEvent;
+import ru.entaxy.audit.data.Outcome;
+import ru.entaxy.audit.data.Severity;
+import ru.entaxy.audit.service.EventConverter;
+import ru.entaxy.audit.service.EventConverterInfo;
+import ru.entaxy.audit.service.InterpretedEvent;
+import ru.entaxy.audit.service.jmx.JMXInvokeEvent;
+
+@Component(service = EventConverter.class, immediate = true)
+@EventConverterInfo(classes = {JMXInvokeEvent.class})
+public class ObjectProducerEventConverter implements EventConverter {
+
+    private static final Logger LOG = LoggerFactory.getLogger(ObjectProducerEventConverter.class);
+
+    @Override
+    public  AuditEvent convert(T event) {
+        if (!JMXInvokeEvent.class.equals(event.getClass()))
+            return null;
+        JMXInvokeEvent invokeEvent = (JMXInvokeEvent) event;
+        Filter filter;
+        try {
+            filter = FrameworkUtil
+                    .createFilter(
+                            "(&(jmx.domain=ru.entaxy.esb)(jmx.methodName=createObjectByInstructions)(jmx.property.factoryId=*))");
+        } catch (InvalidSyntaxException e) {
+            LOG.error("Error creating filter", e);
+            return null;
+        }
+
+        if (!filter.matches(event.getEventEssense())) {
+            if (LOG.isDebugEnabled())
+                LOG.debug("Event not matches: {}", event.toString());
+            return null;
+        }
+
+        String objectId = invokeEvent.getMethodParams()[0].toString();
+        String factoryId = event.getEventEssense().getOrDefault("jmx.property.factoryId", "unknown").toString();
+
+        AuditEvent result = AuditEvent.AuditLoggingEventBuilder.getInstance()
+                .target("ENTAXY OBJECTS")
+                .outcome(Outcome.SUCCESS)
+                .message(String.format("Object %s of factory %s was changed", objectId, factoryId))
+                .severity(Severity.INFO)
+                .category(String.format("%s:%s", objectId, factoryId))
+                .build();
+
+        return result;
+    }
+
+}
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/AbstractCommandExecutor.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/AbstractCommandExecutor.java
index 8830db01..10f49a7f 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/AbstractCommandExecutor.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/AbstractCommandExecutor.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/CommandExecutor.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/CommandExecutor.java
index 76f8e426..15ae00f8 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/CommandExecutor.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/CommandExecutor.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/CommandInstructions.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/CommandInstructions.java
index bef79f5d..261f3f86 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/CommandInstructions.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/CommandInstructions.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/ProducingExecutor.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/ProducingExecutor.java
index 1e1ad0e7..331b032d 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/ProducingExecutor.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/ProducingExecutor.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
@@ -284,7 +284,7 @@ public class ProducingExecutor {
 		producerResult.commandResult("#plan").result(true).resultObject(executionPlan);
 		producerResult.commandResult("#init").result(true).resultObject(configuration);
 		
-		// add all awailable extensions to task executors
+		// add all available extensions to task executors
 		if (producerService instanceof EntaxyExtendable) {
 			producerResult.commandResult("#extensions").result(true).resultObject(
 				(EntaxyExtensionsProvider)new EntaxyExtensionsProviderImpl(((EntaxyExtendable)producerService).getExtensions())	
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/builder/BuiltObject.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/builder/BuiltObject.java
index 95b093f7..c13de0e1 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/builder/BuiltObject.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/builder/BuiltObject.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/builder/BuiltObjectList.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/builder/BuiltObjectList.java
index 804a0fa7..d2fe9cd3 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/builder/BuiltObjectList.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/builder/BuiltObjectList.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/builder/DefaultBuiltObject.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/builder/DefaultBuiltObject.java
index 31910afe..11a602c9 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/builder/DefaultBuiltObject.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/builder/DefaultBuiltObject.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/builder/ObjectBuilder.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/builder/ObjectBuilder.java
index 4c820163..60f25050 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/builder/ObjectBuilder.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/builder/ObjectBuilder.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Analyze.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Analyze.java
index 019da329..06796a2f 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Analyze.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Analyze.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Build.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Build.java
index 582755d4..5d04a8ca 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Build.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Build.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Deploy.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Deploy.java
index 8672660c..b5f1ab9b 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Deploy.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Deploy.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Enrich.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Enrich.java
index b1ce2ba3..7693eb42 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Enrich.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Enrich.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Generate.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Generate.java
index 1e504628..ab905ada 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Generate.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Generate.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Install.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Install.java
index 25b8a468..483cb587 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Install.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Install.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Layout.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Layout.java
index 7588b2e0..57ac1152 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Layout.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Layout.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/PrepareGenerate.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/PrepareGenerate.java
index fa571779..fdae550f 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/PrepareGenerate.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/PrepareGenerate.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Store.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Store.java
index 2aedb4fe..72028582 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Store.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Store.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Validate.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Validate.java
index 03afc3d3..c2502b47 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Validate.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/commands/Validate.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/deployer/DefaultDeployedObject.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/deployer/DefaultDeployedObject.java
index 9b723404..f73e55e9 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/deployer/DefaultDeployedObject.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/deployer/DefaultDeployedObject.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/deployer/DeployedObject.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/deployer/DeployedObject.java
index 2c5efd32..be681162 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/deployer/DeployedObject.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/deployer/DeployedObject.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/deployer/DeployedObjectList.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/deployer/DeployedObjectList.java
index 1bf1c2e8..cd861d84 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/deployer/DeployedObjectList.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/deployer/DeployedObjectList.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/deployer/ObjectDeployer.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/deployer/ObjectDeployer.java
index baa16b94..16db3bdc 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/deployer/ObjectDeployer.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/deployer/ObjectDeployer.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/AbstractObjectTask.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/AbstractObjectTask.java
index f765d7e2..355cc5a4 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/AbstractObjectTask.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/AbstractObjectTask.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/AbstractRefTask.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/AbstractRefTask.java
index f12741cd..6d667aa0 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/AbstractRefTask.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/AbstractRefTask.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/AbstractTask.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/AbstractTask.java
index 680737d7..1aab125a 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/AbstractTask.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/AbstractTask.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/CalculateTask.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/CalculateTask.java
index bbf744ef..be73b592 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/CalculateTask.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/CalculateTask.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/DefaultObjectDataResolver.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/DefaultObjectDataResolver.java
index 9316becf..8ed38dd3 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/DefaultObjectDataResolver.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/DefaultObjectDataResolver.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/GenerateRefTask.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/GenerateRefTask.java
index 7b99b0db..bf2d78f1 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/GenerateRefTask.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/GenerateRefTask.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/GenerateTask.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/GenerateTask.java
index 6a7eda63..2178f6bc 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/GenerateTask.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/GenerateTask.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/GeneratedHeaders.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/GeneratedHeaders.java
index 18a10bb9..73c6edce 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/GeneratedHeaders.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/GeneratedHeaders.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/GeneratedList.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/GeneratedList.java
index 07e648ad..b7166283 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/GeneratedList.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/GeneratedList.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/GeneratedObjectsPublishDataStorage.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/GeneratedObjectsPublishDataStorage.java
new file mode 100644
index 00000000..ebc62e2e
--- /dev/null
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/GeneratedObjectsPublishDataStorage.java
@@ -0,0 +1,174 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-producer-core
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.producer.executor.generationmodel;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.stream.Collectors;
+
+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;
+import ru.entaxy.platform.core.producer.executor.objectmodel.FactoredObject;
+import ru.entaxy.platform.core.producer.executor.objectmodel.FactoredObjectRef;
+
+public class GeneratedObjectsPublishDataStorage {
+
+    Map publishData = new HashMap<>();
+
+    public JsonObject getPublishData(String objectUuid) {
+        return publishData.getOrDefault(objectUuid, new JsonObject());
+    }
+
+    public JsonObject generatePublishData(FactoredObject factoredObject, EntaxyFactory factory, String outputType) {
+
+        JsonObject result = new JsonObject();
+        JsonObject originObject = factoredObject.origin;
+
+        result = getFilteredObject(originObject, originObject, factory, outputType);
+
+        publishData.put(factoredObject.getUuid(), result);
+
+        return getPublishData(factoredObject.getUuid());
+    }
+
+    protected JsonObject getFilteredObject(JsonObject originObject, JsonObject rootObject, EntaxyFactory factory,
+            String outputType) {
+
+        JsonObject result = new JsonObject();
+
+        Map factoryFields = factory.getOutputByType(outputType).getFields().stream()
+                .collect(Collectors.toMap(fi -> fi.getName(), fi -> fi.getJsonOrigin()));
+
+        for (Entry entry : originObject.entrySet()) {
+            String name = entry.getKey();
+
+            if (FactoredObject.EMBEDDED_FIELD.equals(name) || FactoredObject.IGNORE_SECTION.equals(name)
+                    || (name.startsWith("##") && !name.startsWith("##config")))
+                continue;
+
+            boolean skip = false;
+
+            // check @INTERNAL directive via factory data
+            JsonObject joField = factoryFields.getOrDefault(name, new JsonObject());
+            if (joField.has(EntaxyFactory.CONFIGURATION.DIRECTIVES.INTERNAL)) {
+                try {
+                    skip = joField.get(EntaxyFactory.CONFIGURATION.DIRECTIVES.INTERNAL).getAsBoolean();
+                } catch (Exception ignore) {
+                    // NOOP
+                }
+            }
+            if (skip)
+                continue;
+
+            // check @INTERNAL directive via object data
+            JsonElement je = entry.getValue();
+            if (je.isJsonObject()) {
+                JsonObject jo = je.getAsJsonObject();
+
+                if (jo.has(EntaxyFactory.CONFIGURATION.DIRECTIVES.INTERNAL)) {
+                    try {
+                        skip = jo.get(EntaxyFactory.CONFIGURATION.DIRECTIVES.INTERNAL).getAsBoolean();
+                    } catch (Exception e) {
+                        // NOOP
+                    }
+                    if (skip)
+                        continue;
+                }
+            }
+
+            // check for @PUBLISH_UNRESOLVED directive
+            if (joField.has(GenerationModel.DIRECTIVE_PUBLISH_URESOLVED)) {
+
+                JsonElement publishUnresolved = joField.get(GenerationModel.DIRECTIVE_PUBLISH_URESOLVED);
+                String publishUnresolvedValue = publishUnresolved.getAsString();
+
+                boolean publishRef = publishUnresolvedValue.equalsIgnoreCase(GenerationModel.PUBLISH_UNRESOLVED_REF);
+                boolean publishObject =
+                        publishUnresolvedValue.equalsIgnoreCase(GenerationModel.PUBLISH_UNRESOLVED_OBJECT);
+
+                if (publishRef || publishObject) {
+
+                    JsonObject unresolvedRef = null;
+
+                    // first we must get unresolved ref
+                    if (je.isJsonObject()) {
+                        if (FactoredObjectRef.isRef(je.getAsJsonObject())) {
+                            // ref is found
+                            unresolvedRef = je.getAsJsonObject();
+                        }
+                    }
+                    if (unresolvedRef == null) {
+                        JsonElement unresolved = JSONUtils.findElementExt(rootObject,
+                                String.format("%s.properties.%s", GenerationModel.UNRESOLVED_CONTAINER_NAME, name));
+                        if (unresolved != null && unresolved.isJsonObject())
+                            unresolvedRef = unresolved.getAsJsonObject();
+                    }
+
+                    if (unresolvedRef != null) {
+                        if (publishRef) {
+                            result.add(name, unresolvedRef);
+                            continue;
+                        } else {
+
+                            // get target object
+                            JsonElement uuid = unresolvedRef.get(FactoredObjectRef.TARGET_UUID_FIELD);
+                            if (uuid.isJsonPrimitive()) {
+                                String objectUuid = uuid.getAsString();
+                                if (publishData.containsKey(objectUuid)) {
+                                    JsonObject toPublish = publishData.get(objectUuid);
+                                    // we nust remove 'isEmbedded'
+                                    toPublish.remove(FactoredObject.IS_EMBEDDED_FIELD);
+                                    result.add(name, toPublish);
+                                    continue;
+                                }
+                            }
+
+                        }
+                    }
+
+                }
+
+            }
+
+            if (je.isJsonObject()) {
+                JsonObject filtered = getFilteredObject(je.getAsJsonObject(), rootObject, factory, outputType);
+                if (filtered != null)
+                    result.add(name, filtered);
+            } else {
+                result.add(name, je);
+            }
+
+
+        }
+        return result;
+
+    }
+
+}
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/GenerationModel.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/GenerationModel.java
index ec7d887b..50017816 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/GenerationModel.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/GenerationModel.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/MergeTask.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/MergeTask.java
index 5040b6c9..bfe0476a 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/MergeTask.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/MergeTask.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/ObjectDataResolver.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/ObjectDataResolver.java
index 28ba7e6a..ca35c55c 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/ObjectDataResolver.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/ObjectDataResolver.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/ObjectResolveHelper.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/ObjectResolveHelper.java
index 22cd9a26..082ae494 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/ObjectResolveHelper.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/ObjectResolveHelper.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/ResolveObjectTask.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/ResolveObjectTask.java
index 9b8d5a11..bc27106e 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/ResolveObjectTask.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/ResolveObjectTask.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/ResolveRefTask.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/ResolveRefTask.java
index 132d1bf6..69496a7d 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/ResolveRefTask.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/ResolveRefTask.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/merge/AbstractMergeProcessor.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/merge/AbstractMergeProcessor.java
index 19106db1..4e35473a 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/merge/AbstractMergeProcessor.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/merge/AbstractMergeProcessor.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/merge/BlueprintMergeProcessor.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/merge/BlueprintMergeProcessor.java
index 7b3e3941..6d4c8a80 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/merge/BlueprintMergeProcessor.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/merge/BlueprintMergeProcessor.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
@@ -341,8 +341,9 @@ public class BlueprintMergeProcessor extends AbstractMergeProcessor {
                 Node item = testNodes.item(i);
                 if (!nodeName.equalsIgnoreCase(item.getLocalName()))
                     continue;
-                if ((nodeNamspace != null) && !nodeNamspace.equalsIgnoreCase(item.getNamespaceURI()))
-                    continue;
+                if (!mergeConfig.isIgnoreNamespace())
+                    if ((nodeNamspace != null) && !nodeNamspace.equalsIgnoreCase(item.getNamespaceURI()))
+                        continue;
                 boolean found = false;
                 for (Entry attributeEntry : attributes.entrySet()) {
                     String attrValue = attributeEntry.getValue();
@@ -882,6 +883,8 @@ public class BlueprintMergeProcessor extends AbstractMergeProcessor {
 
         String position = MERGE_POSITION.INSIDE_FIRST.label;
 
+        boolean ignoreNamespace = false;
+
         boolean ignore = false;
 
         Boolean recoursive = null;
@@ -950,6 +953,10 @@ public class BlueprintMergeProcessor extends AbstractMergeProcessor {
             this.position = position;
         }
 
+        public boolean isIgnoreNamespace() {
+            return ignoreNamespace;
+        }
+
         public boolean isIgnore() {
             return ignore;
         }
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/merge/MergeHelper.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/merge/MergeHelper.java
index 49629dbe..57778b73 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/merge/MergeHelper.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/merge/MergeHelper.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/merge/MergeProcessor.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/merge/MergeProcessor.java
index a05f9e0a..810c74a4 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/merge/MergeProcessor.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/merge/MergeProcessor.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/merge/MergingMap.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/merge/MergingMap.java
index 4badbf42..0b1378bc 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/merge/MergingMap.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/generationmodel/merge/MergingMap.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/installer/DefaultInstalledObject.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/installer/DefaultInstalledObject.java
index 29488e94..3fe58e19 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/installer/DefaultInstalledObject.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/installer/DefaultInstalledObject.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/installer/InstalledObject.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/installer/InstalledObject.java
index 538ac29a..b8d99999 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/installer/InstalledObject.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/installer/InstalledObject.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/installer/InstalledObjectList.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/installer/InstalledObjectList.java
index fdf7b8ff..236caf1d 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/installer/InstalledObjectList.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/installer/InstalledObjectList.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/installer/ObjectInstaller.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/installer/ObjectInstaller.java
index dcc93e96..8aee3a20 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/installer/ObjectInstaller.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/installer/ObjectInstaller.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/AbstractFactored.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/AbstractFactored.java
index 4e17dc42..70dbde1b 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/AbstractFactored.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/AbstractFactored.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/AbstractItem.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/AbstractItem.java
index cfd218e2..2958b164 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/AbstractItem.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/AbstractItem.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/Calculation.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/Calculation.java
index cdedef63..ec154476 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/Calculation.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/Calculation.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/FactoredObject.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/FactoredObject.java
index 6b61508e..086bb4a6 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/FactoredObject.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/FactoredObject.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/FactoredObjectProxy.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/FactoredObjectProxy.java
index 7172f71a..db70a5b6 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/FactoredObjectProxy.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/FactoredObjectProxy.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/FactoredObjectRef.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/FactoredObjectRef.java
index 29acdd27..c219aa3d 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/FactoredObjectRef.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/FactoredObjectRef.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/FactoryChecker.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/FactoryChecker.java
index 3bcbc59b..6ab47fc7 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/FactoryChecker.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/FactoryChecker.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/ObjectModel.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/ObjectModel.java
index a388eb4a..28e71900 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/ObjectModel.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/objectmodel/ObjectModel.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/support/AbstractPrintOutputSupport.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/support/AbstractPrintOutputSupport.java
index de378c6c..50150b05 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/support/AbstractPrintOutputSupport.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/support/AbstractPrintOutputSupport.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/support/ArtifactSupport.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/support/ArtifactSupport.java
index db68f87b..87b3fc9f 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/support/ArtifactSupport.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/support/ArtifactSupport.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/support/EntaxyObjectPropertiesHelper.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/support/EntaxyObjectPropertiesHelper.java
index 965cf263..d3c94138 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/support/EntaxyObjectPropertiesHelper.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/support/EntaxyObjectPropertiesHelper.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/support/LocalPrintOutput.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/support/LocalPrintOutput.java
index fca74d3a..266ad68c 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/support/LocalPrintOutput.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/support/LocalPrintOutput.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/support/ObjectSupportRegistry.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/support/ObjectSupportRegistry.java
index 42ec47d3..9c7db1ab 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/support/ObjectSupportRegistry.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/support/ObjectSupportRegistry.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/support/PrintOutputSupport.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/support/PrintOutputSupport.java
index bc7fa3c4..6580a95f 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/support/PrintOutputSupport.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/executor/support/PrintOutputSupport.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/CommonObjectProducer.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/CommonObjectProducer.java
index a7820f4c..3ca7028c 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/CommonObjectProducer.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/CommonObjectProducer.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
@@ -29,6 +29,9 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import ru.entaxy.esb.platform.runtime.base.connecting.generator.Generated;
 import ru.entaxy.platform.base.objects.EntaxyObject.FIELDS;
 import ru.entaxy.platform.base.objects.factory.EntaxyFactoryException;
@@ -37,7 +40,9 @@ import ru.entaxy.platform.core.producer.wrapper.AbstractFactoryWrapper;
 import ru.entaxy.platform.core.producer.wrapper.AbstractFactoryWrapper.GenerationProcessor;
 
 public class CommonObjectProducer extends DefaultProducer implements GenerationProcessor {
-
+    
+    private static final Logger log = LoggerFactory.getLogger(CommonObjectProducer.class);
+    
     @Deprecated(since = "1.10", forRemoval = true)
     protected final Map defaultFieldsPublished = new HashMap<>() {
         private static final long serialVersionUID = 1L;
@@ -86,7 +91,11 @@ public class CommonObjectProducer extends DefaultProducer implements GenerationP
                 dataToPublish.putAll(ownData);
             }
         }
-
+        
+        if (generated == null) {
+            log.error("generated template outputType = " + outputType + " is NULL for objectType[" + objectType + "]!");
+        }
+        
         for (Entry entry : publishedFields.entrySet())
             dataToPublish.putIfAbsent(entry.getKey(), generated.getProperties().get(entry.getValue()));
 
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/DefaultProducer.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/DefaultProducer.java
index ebd0a6f5..a507721d 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/DefaultProducer.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/DefaultProducer.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/EntaxyFactoryDataProcessorService.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/EntaxyFactoryDataProcessorService.java
index d054f1cd..350cebfc 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/EntaxyFactoryDataProcessorService.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/EntaxyFactoryDataProcessorService.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/EntaxyProducerInfo.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/EntaxyProducerInfo.java
index dd200b36..f325987b 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/EntaxyProducerInfo.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/EntaxyProducerInfo.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/EntaxyProducerServiceImpl.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/EntaxyProducerServiceImpl.java
index bc89917d..3848a89e 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/EntaxyProducerServiceImpl.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/EntaxyProducerServiceImpl.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/FieldInfoImpl.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/FieldInfoImpl.java
index 713fb4a9..e62021ea 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/FieldInfoImpl.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/FieldInfoImpl.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/InstructionsHelper.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/InstructionsHelper.java
index 1f4772dd..9748dfcf 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/InstructionsHelper.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/InstructionsHelper.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/RefFieldInfoImpl.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/RefFieldInfoImpl.java
index 325a0694..3db98e31 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/RefFieldInfoImpl.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/RefFieldInfoImpl.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/UniformExtendableProducer.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/UniformExtendableProducer.java
new file mode 100644
index 00000000..9955a34f
--- /dev/null
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/impl/UniformExtendableProducer.java
@@ -0,0 +1,186 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-producer-core
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.producer.impl;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.annotations.Activate;
+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 com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+
+import ru.entaxy.esb.platform.runtime.base.extensions.api.EntaxyExtension;
+import ru.entaxy.esb.platform.runtime.base.extensions.api.EntaxyExtensionsAware;
+import ru.entaxy.platform.base.objects.factory.EntaxyFactory;
+import ru.entaxy.platform.base.support.JSONUtils;
+import ru.entaxy.platform.core.producer.api.EntaxyProducer;
+import ru.entaxy.platform.core.producer.wrapper.AbstractFactoryWrapper;
+import ru.entaxy.platform.core.producer.wrapper.DefaultFactoryWrapper;
+
+@Component(service = {EntaxyProducer.class}, immediate = true, name = "UniformExtendableProducer")
+public class UniformExtendableProducer extends CommonObjectProducer implements EntaxyExtensionsAware {
+
+    private static final Logger log = LoggerFactory.getLogger(UniformExtendableProducer.class);
+
+    public static final String PRODUCER_EXTENSION_ATTR_SUPPORTED_TYPES = "supportedTypes";
+
+    public static final String PRODUCER_EXTENSION_PATH = "producer";
+    public static final String PRODUCER_EXTENSION_NAME = "config.json";
+
+    public static final String PRODUCER_EXTENSION_KEY = PRODUCER_EXTENSION_PATH + "/" + PRODUCER_EXTENSION_NAME;
+
+    protected Map> extensionsToSupportedTypesMap = new HashMap<>();
+
+    protected Object extensionsLock = new Object();
+
+    protected ComponentContext componentContext;
+
+    protected List availableFactories = new ArrayList<>();
+
+    protected Object factoriesLock = new Object();
+
+    @Activate
+    public void activate(ComponentContext componentContext) {
+        this.componentContext = componentContext;
+    }
+
+    @Override
+    public void addExtension(EntaxyExtension entaxyExtension) {
+        if (!entaxyExtension.getResources().containsKey(PRODUCER_EXTENSION_KEY))
+            return;
+
+        synchronized (extensionsLock) {
+            try {
+                JsonObject config =
+                        JSONUtils.getJsonRootObject(entaxyExtension.getResources().get(PRODUCER_EXTENSION_KEY));
+                if (!config.has(PRODUCER_EXTENSION_ATTR_SUPPORTED_TYPES))
+                    return;
+                JsonArray ja = config.get(PRODUCER_EXTENSION_ATTR_SUPPORTED_TYPES).getAsJsonArray();
+                if (ja.size() == 0)
+                    return;
+                final List list = new ArrayList<>();
+                for (int i = 0; i < ja.size(); i++) {
+                    JsonElement je = ja.get(i);
+                    if (!je.isJsonPrimitive())
+                        continue;
+                    if (!je.getAsJsonPrimitive().isString())
+                        continue;
+                    list.add(je.getAsJsonPrimitive().getAsString());
+                }
+                if (!list.isEmpty())
+                    this.extensionsToSupportedTypesMap.put(entaxyExtension, list);
+                calculateSupportedTypes();
+                rescanAvailables();
+            } catch (IOException e) {
+                log.error(
+                        "Error reading resource: [" + entaxyExtension.getResources().get(PRODUCER_EXTENSION_KEY) + "]",
+                        e);
+            }
+        }
+    }
+
+    @Override
+    public void removeExtension(EntaxyExtension entaxyExtension) {
+        if (extensionsToSupportedTypesMap.containsKey(entaxyExtension)) {
+            synchronized (extensionsLock) {
+                extensionsToSupportedTypesMap.remove(entaxyExtension);
+                calculateSupportedTypes();
+                rescanExisting();
+            }
+        }
+
+    }
+
+    protected void rescanAvailables() {
+        synchronized (factoriesLock) {
+            for (EntaxyFactory factory : availableFactories)
+                if (!factories.containsKey(factory))
+                    addFactory(factory);
+        }
+    }
+
+    protected void rescanExisting() {
+        synchronized (factoriesLock) {
+            List existing = new ArrayList<>(factories.values());
+            for (EntaxyFactory factory : existing)
+                if (!isTypeSupported(factory.getType()))
+                    super.removeFactory(factory);
+        }
+    }
+
+    protected void calculateSupportedTypes() {
+        final List typesList = new ArrayList<>();
+        supportedTypes.clear();
+        supportedTypesPatterns.clear();
+        extensionsToSupportedTypesMap.values().stream()
+                .forEach(list -> typesList.addAll(list));
+        setSupportedTypes(typesList);
+    }
+
+    @Reference(bind = "addFactory", unbind = "removeFactory", cardinality = ReferenceCardinality.MULTIPLE,
+            collectionType = CollectionType.SERVICE, policy = ReferencePolicy.DYNAMIC,
+            policyOption = ReferencePolicyOption.GREEDY)
+    public void addFactory(EntaxyFactory factory) {
+        synchronized (factoriesLock) {
+            if (!availableFactories.contains(factory))
+                availableFactories.add(factory);
+        }
+        doAddFactory(factory);
+    }
+
+    // WE MUST DECLARE IT for @Reference annotation processor
+    @Override
+    public void removeFactory(EntaxyFactory factory) {
+        synchronized (factoriesLock) {
+            availableFactories.remove(factory);
+        }
+        super.removeFactory(factory);
+
+    }
+
+    @Override
+    protected AbstractFactoryWrapper doAddFactory(EntaxyFactory factory) {
+        AbstractFactoryWrapper wrapper = super.doAddFactory(factory, DefaultFactoryWrapper.class);
+        if (wrapper != null)
+            wrapper.setGenerationProcessor(this);
+        return wrapper;
+    }
+
+}
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/AbstractConsumerAwareMetadataStorage.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/AbstractConsumerAwareMetadataStorage.java
index 001eb6e9..d603d6b7 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/AbstractConsumerAwareMetadataStorage.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/AbstractConsumerAwareMetadataStorage.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/ExchangeEnricher.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/ExchangeEnricher.java
index 0975aba8..d032730e 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/ExchangeEnricher.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/ExchangeEnricher.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/MetadataStorage.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/MetadataStorage.java
index fa958ab2..bf8017cf 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/MetadataStorage.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/MetadataStorage.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/MetadataStorageConsumer.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/MetadataStorageConsumer.java
index 022c86ab..9886a8ef 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/MetadataStorageConsumer.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/MetadataStorageConsumer.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/MetadataStorageEmpty.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/MetadataStorageEmpty.java
index 1d29e1ca..54024c26 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/MetadataStorageEmpty.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/MetadataStorageEmpty.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/MetadataStorageImpl.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/MetadataStorageImpl.java
index c0cf8a3c..dd96f958 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/MetadataStorageImpl.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/MetadataStorageImpl.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/MetadataStorageWrapper.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/MetadataStorageWrapper.java
index 4bb4e236..9b616e15 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/MetadataStorageWrapper.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/MetadataStorageWrapper.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/package-info.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/package-info.java
index 072b2c44..5b146092 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/package-info.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/support/package-info.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/wrapper/AbstractFactoryWrapper.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/wrapper/AbstractFactoryWrapper.java
index 62023ae1..4a17bb04 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/wrapper/AbstractFactoryWrapper.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/wrapper/AbstractFactoryWrapper.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/wrapper/DefaultFactoryWrapper.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/wrapper/DefaultFactoryWrapper.java
index feb4514d..67d6694b 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/wrapper/DefaultFactoryWrapper.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/wrapper/DefaultFactoryWrapper.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/wrapper/FieldWrapper.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/wrapper/FieldWrapper.java
index d4efbd97..30302ef1 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/wrapper/FieldWrapper.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/wrapper/FieldWrapper.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/wrapper/GenerationProcessorService.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/wrapper/GenerationProcessorService.java
index 69760994..a3e078da 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/wrapper/GenerationProcessorService.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/wrapper/GenerationProcessorService.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producer-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/wrapper/RefFieldWrapper.java b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/wrapper/RefFieldWrapper.java
index 8a0e75f8..c7698049 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/wrapper/RefFieldWrapper.java
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/java/ru/entaxy/platform/core/producer/wrapper/RefFieldWrapper.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producer-core/src/main/resources/config/BlueprintMergeProcessor.json b/platform/runtime/core/object-producing/object-producer-core/src/main/resources/config/BlueprintMergeProcessor.json
index 62eb5e46..0a0e9682 100644
--- a/platform/runtime/core/object-producing/object-producer-core/src/main/resources/config/BlueprintMergeProcessor.json
+++ b/platform/runtime/core/object-producing/object-producer-core/src/main/resources/config/BlueprintMergeProcessor.json
@@ -14,6 +14,7 @@
 	"reference": {
 		"targetNodeName": "##root",
 		"position": "inside_first",
+		"ignoreNamespace": true,
 		"unique": ["id"],
 		"conflict": "ignore" /*[ignore, replace]*/
 	},
diff --git a/platform/runtime/core/object-producing/object-producing-config-support/pom.xml b/platform/runtime/core/object-producing/object-producing-config-support/pom.xml
index 7636466d..847b4bb1 100644
--- a/platform/runtime/core/object-producing/object-producing-config-support/pom.xml
+++ b/platform/runtime/core/object-producing/object-producing-config-support/pom.xml
@@ -3,7 +3,7 @@
   
     ru.entaxy.esb.platform.runtime.core
     object-producing
-    1.10.0
+    1.11.0
   
   ru.entaxy.esb.platform.runtime.core.object-producing
   object-producing-config-support
diff --git a/platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/AddConfigCommand.java b/platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/AddConfigCommand.java
index 5dd8d0ca..3ccbab86 100644
--- a/platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/AddConfigCommand.java
+++ b/platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/AddConfigCommand.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-config-support
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/AddConfigCommand2.java b/platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/AddConfigCommand2.java
new file mode 100644
index 00000000..78c7d192
--- /dev/null
+++ b/platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/AddConfigCommand2.java
@@ -0,0 +1,290 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-producing-config-support
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.producer.config;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+import ru.entaxy.esb.platform.runtime.base.connecting.generator.Generated;
+import ru.entaxy.platform.base.objects.EntaxyObject;
+import ru.entaxy.platform.base.objects.EntaxyObject.FIELDS;
+import ru.entaxy.platform.base.objects.factory.EntaxyFactory;
+import ru.entaxy.platform.base.objects.factory.EntaxyFactory.OutputInfo;
+import ru.entaxy.platform.base.objects.factory.exceptions.FactoryNotFoundException;
+import ru.entaxy.platform.base.support.CommonUtils;
+import ru.entaxy.platform.base.support.JSONUtils;
+import ru.entaxy.platform.config.runtime.ObjectConfig;
+import ru.entaxy.platform.config.runtime.ObjectConfigHelper;
+import ru.entaxy.platform.config.runtime.ObjectConfig.FactoryOutputConfiguration;
+import ru.entaxy.platform.core.producer.api.EntaxyProducerService;
+import ru.entaxy.platform.core.producer.api.ExecutionPlan.ExecutionPlanUpdate;
+import ru.entaxy.platform.core.producer.api.ProducerResult;
+import ru.entaxy.platform.core.producer.api.ProducerResult.CommandResult;
+import ru.entaxy.platform.core.producer.api.ProducingCommandExecutor;
+import ru.entaxy.platform.core.producer.executor.AbstractCommandExecutor;
+import ru.entaxy.platform.core.producer.executor.objectmodel.FactoredObject;
+import ru.entaxy.platform.core.producer.executor.objectmodel.FactoredObjectProxy;
+import ru.entaxy.platform.core.producer.executor.objectmodel.FactoredObjectRef;
+import ru.entaxy.platform.core.producer.executor.objectmodel.ObjectModel;
+
+// @Component(service = ProducingCommandExecutor.class, immediate = true)
+// @CommandExecutor(id = "add-config", predecessors = {"enrich"}, descendants = {"validate"})
+public class AddConfigCommand2 extends AbstractCommandExecutor implements ProducingCommandExecutor {
+
+    private static final Logger log = LoggerFactory.getLogger(AddConfigCommand2.class);
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    EntaxyProducerService entaxyProducerServiceLocal;
+
+    public AddConfigCommand2() {
+        super(null);
+    }
+
+    protected AddConfigCommand2(EntaxyProducerService entaxyProducerService) {
+        super(entaxyProducerService);
+    }
+
+    @Activate
+    public void activate(ComponentContext componentContext) {
+        this.entaxyProducerService = this.entaxyProducerServiceLocal;
+        this.entaxyProducerService.registerCommand(this);
+    }
+
+    @Override
+    protected boolean doExecute(ProducerResult currentResult, CommandResult commandResult,
+            Map instructions) throws Exception {
+
+        printOutput("\n\n\t== ADD-CONFIG == \n\n");
+
+        ObjectModel objectModel = currentResult.findResultObject(ObjectModel.class);
+        objectModel.startTracking();
+
+        JsonObject incomingJson = objectModel.getJsonCurrent().deepCopy();
+
+        for (FactoredObject fo : objectModel.objects) {
+
+            // skip proxies
+            if (fo instanceof FactoredObjectProxy)
+                continue;
+
+            log.debug("OBJECT :: {}/{}", fo.getObjectId(), fo.getObjectType());
+
+            String factoryId = fo.factoryId;
+
+            EntaxyFactory factory = entaxyProducerService.findFactoryById(factoryId);
+            if (factory == null)
+                throw new FactoryNotFoundException(factoryId);
+
+            String output = fo.getOutputType();
+            log.debug("OUTPUT :: {}", output);
+
+            OutputInfo oi = CommonUtils.isValid(output) ? factory.getOutputByType(output) : factory.getDefaultOutput();
+            Map config = oi.getConfig();
+            if ((config == null) || (config.isEmpty()))
+                continue;
+
+            String val = config.getOrDefault(ObjectConfig.CONFIGURABLE_ATTRIBUTE_NAME, "false").toString();
+            Boolean configurable = Boolean.valueOf(val);
+            if (!configurable)
+                continue;
+
+            JsonObject objectOrigin = fo.origin;
+            JsonObject objectProperties = objectOrigin.get(FIELDS.PROPERTIES).getAsJsonObject();
+
+            if (objectProperties.has(ObjectConfig.CONFIG_FIELD_NAME))
+                continue;
+
+            @SuppressWarnings("serial")
+            Generated g = this.entaxyProducerService.findFactoryById("common-config")
+                    .generate("config-field", "private", new HashMap() {
+                        {
+                            put(FIELDS.FACTORY_ID, "common-config");
+                            put(ObjectConfig.TARGET_FACTORY_FIELD_NAME, fo.factoryId);
+                            put(ObjectConfig.TARGET_TYPE_FIELD_NAME, fo.getObjectType());
+                            put(ObjectConfig.TARGET_ID_FIELD_NAME, fo.getObjectId());
+                            put(ObjectConfig.TARGET_OUTPUT_FIELD_NAME, fo.getOutputType());
+                        }
+                    });
+
+            objectProperties.add(ObjectConfig.CONFIG_FIELD_NAME, JSONUtils.getJsonRootObject(g.getObject().toString()));
+            objectModel.setDirty();
+
+        }
+
+        for (FactoredObjectRef ref : objectModel.refs) {
+            // process external refs and replace ref to object with ref to config if
+            // - ref is not marked 'directValueOnly'
+            // - the referenced object has config
+            // - the referenced field is configurable
+
+            // if (!ref.isExternal())
+            // continue;
+
+            log.debug("REF :: " + ref.relativePath);
+
+            if (ObjectConfigHelper.getInstance().isDirectValueOnly(ref))
+                continue;
+
+            String objectId = ref.getTargetId();
+            String objectType = ref.getTargetType();
+
+            log.debug("TO :: " + objectId + ":" + objectType);
+            log.debug("DEFINED IN :: " + ref.definedIn.getObjectId());
+
+            String refField = ref.getOrDefault(FIELDS.REF_FIELD, FIELDS.OBJECT_ID).toString();
+            if (FIELDS.OBJECT_ID.equals(refField))
+                // objectId can't be configured
+                continue;
+
+            // skip if it's already config
+            if (ObjectConfig.CONFIG_OBJECT_TYPE.equals(objectType))
+                continue;
+
+            String configurationPid = ObjectConfig.getConfigurationPid(objectId, objectType);
+
+            String factoryId = null;
+
+            JsonElement newTargetId = null;
+
+            if (ref.isExternal()) {
+
+                EntaxyObject theObject = ObjectConfigHelper.getInstance().findObject(objectId, objectType);
+                if (theObject == null)
+                    // referenced object not found
+                    continue;
+
+                factoryId = theObject.getFactoryId();
+
+                EntaxyObject configObject = ObjectConfigHelper.getInstance()
+                        .findObject(configurationPid, ObjectConfig.CONFIG_OBJECT_TYPE);
+                if (configObject == null)
+                    // config for referenced object not found
+                    continue;
+
+                newTargetId = new JsonPrimitive(configurationPid);
+
+            } else {
+
+                log.debug("EXTERNAL :: false");
+
+                Optional theObjectOpt = objectModel.objects.stream()
+                        .filter(obj -> objectId.equals(obj.getObjectId())).findFirst();
+                if (!theObjectOpt.isPresent())
+                    continue;
+
+                FactoredObject theObject = theObjectOpt.get();
+
+                log.debug("TARGET OBJECT :: found");
+
+                factoryId = theObject.factoryId;
+
+                Optional configRefOpt = objectModel.refs.stream()
+                        .filter(r -> r.definedIn.equals(theObject))
+                        .filter(r -> r.relativePath.endsWith(ObjectConfig.CONFIG_FIELD_NAME))
+                        .findFirst();
+
+                if (!configRefOpt.isPresent())
+                    continue;
+
+                log.debug("REF TO CONFIG :: found; TARGET :: " + configRefOpt.get().getTargetId());
+
+                Optional configObjectOpt = objectModel.objects.stream()
+                        .filter(obj -> obj.getObjectId().equals(configRefOpt.get().getTargetId()))
+                        .findFirst();
+                if (!configObjectOpt.isPresent())
+                    continue;
+
+                log.debug("CONFIG OBJECT :: found");
+
+                newTargetId = new JsonPrimitive(configObjectOpt.get().getObjectId());
+            }
+
+
+            EntaxyFactory entaxyFactory = entaxyProducerService.findFactoryById(factoryId);
+            if (entaxyFactory == null)
+                // factory for referenced object not found
+                continue;
+
+            FactoryOutputConfiguration conf = FactoryOutputConfiguration.read(entaxyFactory,
+                    EntaxyFactory.CONFIGURATION.OUTPUTS.OUTPUT_TYPE_INIT);
+            if (!conf.isConfigurable)
+                continue;
+
+
+            if (!ObjectConfig.isConfigurable(entaxyFactory, EntaxyFactory.CONFIGURATION.OUTPUTS.OUTPUT_TYPE_INIT,
+                    refField, conf.defaultFieldsConfigurable, conf.configurations))
+                // field is not configurable
+                continue;
+
+            JSONUtils.replaceValue(ref.origin, FIELDS.OBJECT_TYPE, new JsonPrimitive(ObjectConfig.CONFIG_OBJECT_TYPE));
+            JSONUtils.replaceValue(ref.origin, FactoredObjectRef.TARGET_TYPE_FIELD,
+                    new JsonPrimitive(ObjectConfig.CONFIG_OBJECT_TYPE));
+            JSONUtils.replaceValue(ref.origin, FactoredObjectRef.TARGET_ID_FIELD, newTargetId);
+
+            // and we must generate ref to config to merge to main object
+            JSONUtils.replaceValue(ref.origin, FIELDS.IS_REF_BY_VALUE_ONLY, new JsonPrimitive(false));
+
+            objectModel.setDirty();
+
+        }
+
+        if (objectModel.stopTracking()) {
+
+            // remove ##embedded
+            for (FactoredObject fo : objectModel.objects)
+                fo.origin.remove(FactoredObject.EMBEDDED_FIELD);
+
+
+            commandResult.planUpdate = ExecutionPlanUpdate.create()
+                    // .updateInstructions().target("enrich").value("skip", true).complete()
+                    .reset().target("analyze").complete();
+        }
+
+        JsonObject outgoingJson = objectModel.getJsonCurrent();
+
+        printOutput("\n== INCOMING JSON ==\n");
+        printOutput(incomingJson.toString());
+        printOutput("\n== OUTGOING JSON ==\n");
+        printOutput(outgoingJson.toString());
+
+        commandResult.resultObject(outgoingJson);
+
+        return true;
+    }
+
+}
diff --git a/platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/ConfigObjectDataResolver.java b/platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/ConfigObjectDataResolver.java
index 15ee3b09..6018f8fc 100644
--- a/platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/ConfigObjectDataResolver.java
+++ b/platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/ConfigObjectDataResolver.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-config-support
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/ConfigProcessor.java b/platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/ConfigProcessor.java
index 4ee5320e..dc426d85 100644
--- a/platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/ConfigProcessor.java
+++ b/platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/ConfigProcessor.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-config-support
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
@@ -25,6 +25,7 @@
  */
 package ru.entaxy.platform.core.producer.config;
 
+import java.util.HashMap;
 import java.util.Map;
 
 import org.osgi.service.component.annotations.Component;
@@ -119,6 +120,8 @@ public class ConfigProcessor implements GenerationProcessor {
 
         String objectId = parameters.get(EntaxyObject.FIELDS.OBJECT_ID).toString();
 
+        Map rawValues = new HashMap<>();
+
         for (Map.Entry entry : properties.entrySet()) {
 
             if (entry.getKey().startsWith("#"))
@@ -128,11 +131,15 @@ public class ConfigProcessor implements GenerationProcessor {
                     conf.configurations))
                 continue;
 
+            rawValues.put(entry.getKey(), entry.getValue());
+
             properties.put(entry.getKey(),
                     ObjectConfig.getConfigurationPrefix(objectId, objectType) + entry.getKey() + "}");
 
         }
 
+        properties.put("rawValues", rawValues);
+
         ObjectConfig.removeConfigData(parameters);
 
         log.debug("preGenerate for {}:{}", wrappedFactory.getId(), wrappedFactory.getType());
diff --git a/platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/ConfigProducer.java b/platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/ConfigProducer.java
index 1cf08daa..030629f7 100644
--- a/platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/ConfigProducer.java
+++ b/platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/ConfigProducer.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-config-support
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
@@ -67,6 +67,8 @@ public class ConfigProducer extends CommonObjectProducer implements EntaxyProduc
     protected static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();
 
     protected static final String DIRECTIVE_FILL_CONFIGURABLES = "@FILL_CONFIGURABLES";
+    public static final String EXPRESSION_PREFIX = "${";
+    public static final String EXPRESSION_PREFIX_WITH_UNDERLINES = "$__{";
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
     EntaxyProducerService entaxyProducerService;
@@ -107,7 +109,7 @@ public class ConfigProducer extends CommonObjectProducer implements EntaxyProduc
             ObjectConfig.backupProperties(parameters, ObjectConfig.CONFIG_PROPERTIES_FIELD_NAME);
             ObjectConfig.removeConfigData(parameters, ObjectConfig.CONFIG_PROPERTIES_FIELD_NAME);
 
-            Map resultMap = properties;
+            Map resultMap = properties;
 
             if (parameters.containsKey(DIRECTIVE_FILL_CONFIGURABLES)) {
 
@@ -143,6 +145,13 @@ public class ConfigProducer extends CommonObjectProducer implements EntaxyProduc
 
                 }
 
+                for (Entry entry : resultMap.entrySet()) {
+                    if (entry.getValue() instanceof String && ((String) entry.getValue()).contains(EXPRESSION_PREFIX)) {
+                        String value = ((String) entry.getValue()).replace(EXPRESSION_PREFIX, EXPRESSION_PREFIX_WITH_UNDERLINES);
+                        resultMap.put(entry.getKey(), value);
+                    }
+                }
+
                 parameters.put(ObjectConfig.IMMUTABLES_FIELD_NAME, immutables);
 
             }
diff --git a/platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/ConfigProducer2.java b/platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/ConfigProducer2.java
new file mode 100644
index 00000000..6cbd431d
--- /dev/null
+++ b/platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/ConfigProducer2.java
@@ -0,0 +1,194 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-producing-config-support
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.producer.config;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.stream.Collectors;
+
+import org.osgi.service.component.annotations.CollectionType;
+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.esb.platform.runtime.base.connecting.generator.Generated;
+import ru.entaxy.platform.base.objects.EntaxyObject;
+import ru.entaxy.platform.base.objects.factory.EntaxyFactory;
+import ru.entaxy.platform.base.objects.factory.EntaxyFactoryException;
+import ru.entaxy.platform.base.support.CommonUtils;
+import ru.entaxy.platform.config.runtime.ObjectConfig;
+import ru.entaxy.platform.core.producer.api.EntaxyProducer;
+import ru.entaxy.platform.core.producer.api.EntaxyProducerService;
+import ru.entaxy.platform.core.producer.api.EntaxyWrappedFactory;
+import ru.entaxy.platform.core.producer.executor.generationmodel.GeneratedHeaders;
+import ru.entaxy.platform.core.producer.impl.CommonObjectProducer;
+import ru.entaxy.platform.core.producer.wrapper.AbstractFactoryWrapper;
+
+// @Component(service = EntaxyProducer.class, immediate = true)
+// @EntaxyProducerInfo (supportedTypes = {ObjectConfig.CONFIG_OBJECT_TYPE})
+public class ConfigProducer2 extends CommonObjectProducer implements EntaxyProducer {
+
+    private static final Logger log = LoggerFactory.getLogger(ConfigProducer2.class);
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    EntaxyProducerService entaxyProducerService;
+
+    @Reference(bind = "addFactory", unbind = "removeFactory", cardinality = ReferenceCardinality.MULTIPLE,
+            collectionType = CollectionType.SERVICE, policy = ReferencePolicy.DYNAMIC,
+            policyOption = ReferencePolicyOption.GREEDY)
+    public void addFactory(EntaxyFactory factory) {
+        AbstractFactoryWrapper wrapper = super.doAddFactory(factory);
+        if (wrapper != null)
+            wrapper.setGenerationProcessor(this);
+    }
+
+    // WE MUST DECLARE IT for @Reference annotation processor
+    @Override
+    public void removeFactory(EntaxyFactory factory) {
+        super.removeFactory(factory);
+    }
+
+    @Override
+    public void preGenerate(EntaxyWrappedFactory wrappedFactory, String outputType, String scope, String objectType,
+            Map parameters) throws EntaxyFactoryException {
+        super.preGenerate(wrappedFactory, outputType, scope, objectType, parameters);
+        @SuppressWarnings("unchecked")
+        Map properties = (Map) parameters.get(EntaxyObject.FIELDS.PROPERTIES);
+
+        // System.out.println("\n\n\tCONFIG PRODUCER :: preGenerate");
+        // System.out.println("\t" + parameters.toString());
+
+        // properties can be null for 'config-field' output
+        if (properties != null) {
+
+            /* System.out.println("\n\n\tGENERATE CONFIG: "
+            		+ "\noutput: " + outputType
+            		+ "\nscope: " + scope
+            		+ "\nproperties: " + properties.toString()); */
+
+            ObjectConfig.backupProperties(parameters, ObjectConfig.CONFIG_PROPERTIES_FIELD_NAME);
+            ObjectConfig.removeConfigData(parameters, ObjectConfig.CONFIG_PROPERTIES_FIELD_NAME);
+
+            Map configurables = new HashMap<>();
+            Map immutables = new HashMap<>();
+
+            String targetFactoryId = properties.get(ObjectConfig.CONFIG_FACTORY_FIELD_NAME).toString();
+            String targetOutput = properties.get(ObjectConfig.CONFIG_OUTPUT_FIELD_NAME).toString();
+
+            EntaxyFactory f = entaxyProducerService.findFactoryById(targetFactoryId);
+            if (!CommonUtils.isValid(targetOutput))
+                targetOutput = f.getDefaultOutput().getType();
+
+            fillConfigMaps(f, targetOutput, scope, objectType, parameters, configurables, immutables);
+
+            parameters.put(ObjectConfig.CONFIGURABLES_FIELD_NAME, configurables);
+            parameters.put(ObjectConfig.IMMUTABLES_FIELD_NAME, immutables);
+
+            String configuredId = parameters.get(ObjectConfig.CONFIG_ID_FIELD_NAME).toString();
+            String configuredType = parameters.get(ObjectConfig.CONFIG_TYPE_FIELD_NAME).toString();
+
+            String configurationPid = ObjectConfig.getConfigurationPid(configuredId, configuredType);
+            String placeholderPrefix = ObjectConfig.getConfigurationPrefix(configuredId, configuredType);
+
+            // set objectId to configurationPid
+
+            parameters.put(EntaxyObject.FIELDS.OBJECT_ID, configurationPid);
+
+            parameters.put(ObjectConfig.CONFIG_PID_FIELD_NAME, configurationPid);
+            parameters.put(ObjectConfig.CONFIG_PLACEHOLDER_PREFIX_FIELD_NAME, placeholderPrefix);
+
+        }
+    }
+
+    @Override
+    public void postGenerate(EntaxyWrappedFactory wrappedFactory, String outputType, String scope, String objectType,
+            Map parameters, Generated generated) throws EntaxyFactoryException {
+        super.postGenerate(wrappedFactory, outputType, scope, objectType, parameters, generated);
+        ObjectConfig.restoreBackupProperties(parameters, ObjectConfig.CONFIG_PROPERTIES_FIELD_NAME);
+
+        @SuppressWarnings("unchecked")
+        Map properties = (Map) parameters.get(EntaxyObject.FIELDS.PROPERTIES);
+
+        // properties can be null for 'config-field' output
+        if (properties != null) {
+
+            // enrich paramaters with configured fields placeholders
+            String placeholderPrefix = parameters.get(ObjectConfig.CONFIG_PLACEHOLDER_PREFIX_FIELD_NAME).toString();
+
+            @SuppressWarnings("unchecked")
+            Map configuredFields =
+                    (Map) parameters.getOrDefault(ObjectConfig.CONFIGURABLES_FIELD_NAME,
+                            Collections.emptyMap());
+            configuredFields.putAll(
+                    (Map) parameters.getOrDefault(ObjectConfig.IMMUTABLES_FIELD_NAME,
+                            Collections.emptyMap()));
+
+            log.debug("CONFIGURED: \n" + configuredFields);
+
+            Map placeholdersMap = configuredFields.entrySet().stream()
+                    // .map(entry -> entry.setValue(placeholderPrefix + entry.getKey() + "}"))
+                    .collect(Collectors.toMap(Map.Entry::getKey, entry -> placeholderPrefix + entry.getKey() + "}"));
+
+            log.debug("\n\n\tPLACEHOLDERS: \n" + placeholdersMap);
+
+            parameters.putAll(placeholdersMap);
+
+            // add headers
+            String configuredId = parameters.get(ObjectConfig.CONFIG_ID_FIELD_NAME).toString();
+            String configuredType = parameters.get(ObjectConfig.CONFIG_TYPE_FIELD_NAME).toString();
+
+            String configurationPid = ObjectConfig.getConfigurationPid(configuredId, configuredType);
+
+            GeneratedHeaders headers = GeneratedHeaders.getHeaders(generated.getProperties());
+            headers.set(ObjectConfig.HEADER_OBJECT_CONFIG_PID,
+                    configuredId + ":" + configuredType + ":" + configurationPid);
+        }
+    }
+
+    protected void fillConfigMaps(EntaxyFactory factory, String outputType, String scope, String objectType,
+            Map parameters, Map configurables, Map immutables) {
+
+        @SuppressWarnings("unchecked")
+        Map properties =
+                (Map) parameters.get(ObjectConfig.CONFIG_PROPERTIES_FIELD_NAME);
+        for (Entry entry : properties.entrySet()) {
+            Map targetMap =
+                    ObjectConfig.getTargetConfigMap(factory, outputType, entry.getKey(), configurables, immutables);
+            if (targetMap == null) {
+                continue;
+            }
+            targetMap.put(entry.getKey(), entry.getValue());
+
+        }
+
+    }
+
+}
diff --git a/platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/support/ConfigObjectSupport.java b/platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/support/ConfigObjectSupport.java
new file mode 100644
index 00000000..5d129317
--- /dev/null
+++ b/platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/support/ConfigObjectSupport.java
@@ -0,0 +1,114 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-producing-config-support
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.producer.config.support;
+
+import java.util.Map;
+
+import org.apache.felix.utils.properties.TypedProperties;
+import org.apache.karaf.config.core.ConfigRepository;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.component.annotations.Component;
+
+import ru.entaxy.esb.platform.runtime.base.connecting.generator.Generated;
+import ru.entaxy.platform.config.runtime.ObjectConfigHelper;
+import ru.entaxy.platform.core.producer.executor.builder.BuiltObject;
+import ru.entaxy.platform.core.producer.executor.builder.DefaultBuiltObject;
+import ru.entaxy.platform.core.producer.executor.builder.ObjectBuilder;
+import ru.entaxy.platform.core.producer.executor.deployer.DefaultDeployedObject;
+import ru.entaxy.platform.core.producer.executor.deployer.DeployedObject;
+import ru.entaxy.platform.core.producer.executor.deployer.ObjectDeployer;
+import ru.entaxy.platform.core.producer.executor.installer.DefaultInstalledObject;
+import ru.entaxy.platform.core.producer.executor.installer.InstalledObject;
+import ru.entaxy.platform.core.producer.executor.installer.ObjectInstaller;
+
+@Component(service = {ObjectBuilder.class, ObjectDeployer.class, ObjectInstaller.class})
+public class ConfigObjectSupport implements ObjectBuilder, ObjectDeployer, ObjectInstaller {
+
+    private static final String CONFIG_TYPE_PREFIX = "config:";
+
+    @Override
+    public boolean isBuildable(Generated generated) {
+        return generated.getType().startsWith(CONFIG_TYPE_PREFIX);
+    }
+
+    @Override
+    public BuiltObject build(Generated generated, Map instructions) throws Exception {
+        return new DefaultBuiltObject(new DeployableConfig(
+                generated.getProperties().getOrDefault("configurationPid",
+                        generated.getProperties().getOrDefault("objectId", "unknown")).toString(),
+
+                generated.getObject().toString()));
+    }
+
+    @Override
+    public boolean isDeployable(BuiltObject object) {
+        return object.getObject() instanceof DeployableConfig;
+    }
+
+    @Override
+    public DeployedObject deploy(BuiltObject object, Map instructions) throws Exception {
+        return new DefaultDeployedObject(object.getObject());
+    }
+
+    @Override
+    public boolean isInstallable(DeployedObject object) {
+        return object.getObject() instanceof DeployableConfig;
+    }
+
+    @Override
+    public InstalledObject install(DeployedObject object, Map instructions) throws Exception {
+        DeployableConfig deployableConfig = (DeployableConfig) object.getObject();
+        Map map = deployableConfig.properties;
+
+        ServiceReference ref = ObjectConfigHelper.getInstance().getReference(ConfigRepository.class);
+        ServiceReference ref2 =
+                ObjectConfigHelper.getInstance().getReference(ConfigurationAdmin.class);
+        if (ref != null) {
+
+            ConfigurationAdmin configurationAdmin = ObjectConfigHelper.getInstance().getService(ref2);
+
+            // we need this to not bind config to felix bundle
+            configurationAdmin.getConfiguration(deployableConfig.configurationPid, "?");
+
+            ConfigRepository configRepository = ObjectConfigHelper.getInstance().getService(ref);
+            TypedProperties typedProperties = configRepository.getConfig(deployableConfig.configurationPid);
+
+            typedProperties.clear();
+
+            for (Map.Entry entry : map.entrySet())
+                typedProperties.put(entry.getKey(), entry.getValue());
+
+            configRepository.update(deployableConfig.configurationPid, typedProperties);
+
+            ObjectConfigHelper.getInstance().ungetService(ref);
+            ObjectConfigHelper.getInstance().ungetService(ref2);
+        }
+
+        return new DefaultInstalledObject(map);
+    }
+
+}
diff --git a/platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/support/DeployableConfig.java b/platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/support/DeployableConfig.java
new file mode 100644
index 00000000..267d2809
--- /dev/null
+++ b/platform/runtime/core/object-producing/object-producing-config-support/src/main/java/ru/entaxy/platform/core/producer/config/support/DeployableConfig.java
@@ -0,0 +1,95 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-producing-config-support
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.producer.config.support;
+
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.jline.utils.Log;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import ru.entaxy.platform.base.support.CommonUtils;
+import ru.entaxy.platform.base.support.JSONUtils;
+import ru.entaxy.platform.config.runtime.ObjectConfig;
+import ru.entaxy.platform.config.runtime.ObjectConfig.ConfigHint;
+
+public class DeployableConfig {
+
+    private static final Logger LOG = LoggerFactory.getLogger(DeployableConfig.class);
+
+    public String jsonData;
+    public Map properties;
+
+    public String configurationPid;
+
+    public DeployableConfig(String configurationPid, String jsonData) {
+
+        this.configurationPid = configurationPid;
+
+        this.jsonData = jsonData;
+
+        Map origin = JSONUtils.element2map(JSONUtils.getJsonRootObject(jsonData));
+        properties = new HashMap<>();
+        if (origin == null) {
+            return;
+        }
+
+        for (Map.Entry entry : origin.entrySet())
+            if (!entry.getKey().startsWith("#"))
+                properties.put(entry.getKey(), entry.getValue());
+
+        try {
+            generateHint();
+        } catch (Exception e) {
+            Log.error("Error generating condig hint", e);
+        }
+
+    }
+
+    protected void generateHint() throws Exception {
+
+        properties.remove(ObjectConfig.CONFIG_HINT_FIELD_NAME);
+
+        String factoryId = properties.getOrDefault(ObjectConfig.CONFIG_FACTORY_FIELD_NAME, "").toString();
+        String outputType = properties.getOrDefault(ObjectConfig.CONFIG_OUTPUT_FIELD_NAME, "").toString();
+
+        ConfigHint configHint = new ConfigHint();
+        configHint.generate(properties, factoryId, outputType);
+
+        String jsonHint = configHint.getAsJsonString();
+        if (CommonUtils.isValid(jsonHint)) {
+            properties.put(ObjectConfig.CONFIG_HINT_FIELD_NAME,
+                    Base64.getEncoder().encodeToString(jsonHint.getBytes()));
+
+        }
+
+
+
+    }
+
+}
diff --git a/platform/runtime/core/object-producing/object-producing-config-support/src/main/resources/ru/entaxy/extensions/objectproducer/merge/config/BlueprintMergeProcessor.json b/platform/runtime/core/object-producing/object-producing-config-support/src/main/resources/ru/entaxy/extensions/objectproducer/merge/config/BlueprintMergeProcessor.json
new file mode 100644
index 00000000..888c30d9
--- /dev/null
+++ b/platform/runtime/core/object-producing/object-producing-config-support/src/main/resources/ru/entaxy/extensions/objectproducer/merge/config/BlueprintMergeProcessor.json
@@ -0,0 +1,8 @@
+{
+	"property-placeholder": {
+		"targetNodeName": "##root",
+		"position": "inside_first",
+		"unique": ["persistent-id"],
+		"conflict": "ignore" /*[ignore, replace]*/
+	}
+}
\ No newline at end of file
diff --git a/platform/runtime/core/object-producing/object-producing-config-support/src/main/resources/ru/entaxy/factory/object-config.json b/platform/runtime/core/object-producing/object-producing-config-support/src/main/resources/ru/entaxy/factory/object-config.json
new file mode 100644
index 00000000..f7434642
--- /dev/null
+++ b/platform/runtime/core/object-producing/object-producing-config-support/src/main/resources/ru/entaxy/factory/object-config.json
@@ -0,0 +1,103 @@
+{
+  "factory": {
+    "id": "object-config",
+    "type": "entaxy.runtime.config",
+    "description": "Entaxy object configuration factory",
+    "isAbstract": false
+  },
+  "entaxy.runtime.config": {},
+  "fields": {
+    "configurables": {
+      "type": "Map",
+      "group": "config",
+      "required": true,
+      "defaultValue": {}
+    },
+    "immutables": {
+      "type": "Map",
+      "group": "config",
+      "required": true,
+      "defaultValue": {}
+    }
+  },
+  "outputs": {
+    "init": {
+      "isDefault": true,
+      "scopes": ["private", "public"],
+      "fields": {
+      	"__entaxy_configuredId": {
+      		"type": "String",
+      		"isHidden": true
+      	},
+      	"__entaxy_configuredType": {
+      		"type": "String",
+      		"isHidden": true
+      	},
+      	"__entaxy_configuredFactoryId": {
+      		"type": "String",
+      		"isHidden": true
+      	},
+      	"__entaxy_configuredOutput": {
+      		"type": "String",
+      		"isHidden": true
+      	}
+      }
+    },
+    "config-defaults": {
+      "isDefault": false,
+      "scopes": ["private", "public"],
+      "fields": {
+      	"##publish": {
+      		"defaultValue": {
+      			"name": {
+					"@CALCULATED": {
+						"expression": "${properties.configurationPid}",
+						"lazy": true
+					}      				
+      			},
+      			"objectId": {
+					"@CALCULATED": {
+						"expression": "${properties.configurationPid}",
+						"lazy": true
+					}      				
+      			},
+				"relation": [
+					{
+						"@CALCULATED": {
+							"expression": "${properties.__entaxy_configuredId}:${properties.__entaxy_configuredType}:config:-composition:config",
+							"lazy": false
+						}
+					}
+				],
+				"target": {
+						"@CALCULATED": {
+							"expression": "${properties.__entaxy_configuredId}:${properties.__entaxy_configuredType}",
+							"lazy": false
+						}
+				}
+      		}
+      	}
+      },
+      "config": {
+	      "@PUBLISH_AS": {
+	      	"*": "configurationPid"
+	      }
+      }
+    },
+    "config-link-field": {
+      "isDefault": false,
+      "generator": "",
+      "config": {},
+      "scopes": ["private", "public"]
+    },
+    "config-defaults-field": {
+      "isDefault": false,
+      "generator": "",
+      "config": {},
+      "scopes": ["private"]
+    },
+    "ref":{
+      "scopes": ["private", "public"]
+    }
+  }
+}
\ No newline at end of file
diff --git a/platform/runtime/core/object-producing/object-producing-config-support/src/main/resources/ru/entaxy/templates/object-config/config-defaults-field.ftl b/platform/runtime/core/object-producing/object-producing-config-support/src/main/resources/ru/entaxy/templates/object-config/config-defaults-field.ftl
new file mode 100644
index 00000000..1c56f7d6
--- /dev/null
+++ b/platform/runtime/core/object-producing/object-producing-config-support/src/main/resources/ru/entaxy/templates/object-config/config-defaults-field.ftl
@@ -0,0 +1,29 @@
+[#ftl attributes={"generated.type":"json"}]
+{
+	"factoryId": "object-config",
+	"objectId": "[=objectId]",
+	"scope": "private",
+	"outputType": "config-defaults",
+	"@FILL_CONFIGURABLES": "",
+	"properties": {
+		"configured": {
+			"@CALCULATED": {
+				"resultType": "String",
+				"expression": "${#OWNER#.objectId}",
+				"lazy": true
+			}
+		},
+		"__entaxy_configuredId":"[=targetObjectId]",
+		"__entaxy_configuredType":"[=targetObjectType]",
+		"__entaxy_configuredFactoryId":"[=targetObjectFactoryId]",
+		"__entaxy_configuredOutput":"[=targetObjectOutput]",
+		"configurationPid": [=configurationPid],
+		"configuredProperties": {
+			"@CALCULATED": {
+				"resultType": "Map",
+				"expression": "${#OWNER#.properties}",
+				"lazy": true
+			}
+		}
+	}
+}
diff --git a/platform/runtime/core/object-producing/object-producing-config-support/src/main/resources/ru/entaxy/templates/object-config/config-defaults.ftl b/platform/runtime/core/object-producing/object-producing-config-support/src/main/resources/ru/entaxy/templates/object-config/config-defaults.ftl
new file mode 100644
index 00000000..7a18f237
--- /dev/null
+++ b/platform/runtime/core/object-producing/object-producing-config-support/src/main/resources/ru/entaxy/templates/object-config/config-defaults.ftl
@@ -0,0 +1,44 @@
+[#ftl attributes={"generated.type":"blueprint.fragment"}]
+
+    
+		
+			[#if configurables??]
+			[#list configurables as key, value]
+	   			
+			[/#list]
+			[/#if]
+		    		
+    
+
+
+	
+	
+	
+	
+    	
+    	
+    	
+    	
+    
+    
+	
+		
+		    
+	
+	
diff --git a/platform/runtime/core/object-producing/object-producing-config-support/src/main/resources/ru/entaxy/templates/object-config/config-link-field.ftl b/platform/runtime/core/object-producing/object-producing-config-support/src/main/resources/ru/entaxy/templates/object-config/config-link-field.ftl
new file mode 100644
index 00000000..5af27d75
--- /dev/null
+++ b/platform/runtime/core/object-producing/object-producing-config-support/src/main/resources/ru/entaxy/templates/object-config/config-link-field.ftl
@@ -0,0 +1,23 @@
+[#ftl attributes={"generated.type":"json"}]
+{
+	"factoryId": "object-config",
+	"objectId": "[=objectId]",
+	"scope": "public",
+	"@FILL_CONFIGURABLES": "properties",
+	"properties": {
+		"__entaxy_configuredId":"[=targetObjectId]",
+		"__entaxy_configuredType":"[=targetObjectType]",
+		"__entaxy_configuredFactoryId":"[=targetObjectFactoryId]",
+		"__entaxy_configuredOutput":"[=targetObjectOutput]"
+	},
+	"configuredProperties": {
+		"@CALCULATED": {
+			"resultType": "Map",
+			"expression": "${#OWNER#.properties}",
+			"lazy": true
+		}
+	},
+	"refConfig": {
+		"isRefByValueOnly": true
+	}
+}
diff --git a/platform/runtime/core/object-producing/object-producing-config-support/src/main/resources/ru/entaxy/templates/object-config/init.ftl b/platform/runtime/core/object-producing/object-producing-config-support/src/main/resources/ru/entaxy/templates/object-config/init.ftl
new file mode 100644
index 00000000..3c5b5f51
--- /dev/null
+++ b/platform/runtime/core/object-producing/object-producing-config-support/src/main/resources/ru/entaxy/templates/object-config/init.ftl
@@ -0,0 +1,2 @@
+[#ftl attributes={"generated.type":"config:json"}]
+[=configurables_json!]
diff --git a/platform/runtime/core/object-producing/object-producing-config-support/src/main/resources/ru/entaxy/templates/object-config/ref.ftl b/platform/runtime/core/object-producing/object-producing-config-support/src/main/resources/ru/entaxy/templates/object-config/ref.ftl
new file mode 100644
index 00000000..ea9f75e9
--- /dev/null
+++ b/platform/runtime/core/object-producing/object-producing-config-support/src/main/resources/ru/entaxy/templates/object-config/ref.ftl
@@ -0,0 +1,22 @@
+[#ftl attributes={"generated.type":"blueprint.fragment"}]
+
+    
+    
+    
+	
+	
+	
+	
+    	
+    	
+    	
+    	
+    
+    
+	
+		
+		    
+	
+	    
diff --git a/platform/runtime/core/object-producing/object-producing-management/pom.xml b/platform/runtime/core/object-producing/object-producing-management/pom.xml
index c01b65e1..f7d0f465 100644
--- a/platform/runtime/core/object-producing/object-producing-management/pom.xml
+++ b/platform/runtime/core/object-producing/object-producing-management/pom.xml
@@ -3,7 +3,7 @@
   
     ru.entaxy.esb.platform.runtime.core
     object-producing
-    1.10.0
+    1.11.0
   
   ru.entaxy.esb.platform.runtime.core.object-producing
   object-producing-management
diff --git a/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/FactoriesMBean.java b/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/FactoriesMBean.java
index 780e73dc..2e5ce605 100644
--- a/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/FactoriesMBean.java
+++ b/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/FactoriesMBean.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-management
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/FactoryMBean.java b/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/FactoryMBean.java
index 6f6cfe7e..18ffa18b 100644
--- a/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/FactoryMBean.java
+++ b/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/FactoryMBean.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-management
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/ProducerMBean.java b/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/ProducerMBean.java
index 204ab837..1cd94294 100644
--- a/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/ProducerMBean.java
+++ b/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/ProducerMBean.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-management
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/FactoriesMBeanImpl.java b/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/FactoriesMBeanImpl.java
index 280eccab..6d654927 100644
--- a/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/FactoriesMBeanImpl.java
+++ b/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/FactoriesMBeanImpl.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-management
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/FactoryMBeanImpl.java b/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/FactoryMBeanImpl.java
index af83a64d..a815ffe8 100644
--- a/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/FactoryMBeanImpl.java
+++ b/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/FactoryMBeanImpl.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-management
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/FactoryMBeanPublisher.java b/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/FactoryMBeanPublisher.java
index 479a7576..03be4272 100644
--- a/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/FactoryMBeanPublisher.java
+++ b/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/FactoryMBeanPublisher.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-management
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/ManagedProducer.java b/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/ManagedProducer.java
index ea68840d..a367480a 100644
--- a/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/ManagedProducer.java
+++ b/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/ManagedProducer.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-management
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/ManagedTypedProducer.java b/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/ManagedTypedProducer.java
index 98f81063..481a5652 100644
--- a/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/ManagedTypedProducer.java
+++ b/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/ManagedTypedProducer.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-management
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/ManagedTypedProducers.java b/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/ManagedTypedProducers.java
index 89fa0aa2..6fdbee3d 100644
--- a/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/ManagedTypedProducers.java
+++ b/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/ManagedTypedProducers.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-management
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/ProducerMBeanImpl.java b/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/ProducerMBeanImpl.java
index b83d8b6b..0ad11bba 100644
--- a/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/ProducerMBeanImpl.java
+++ b/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/ProducerMBeanImpl.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-management
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/ProducerServiceHelper.java b/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/ProducerServiceHelper.java
index 400b43d0..2593d99f 100644
--- a/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/ProducerServiceHelper.java
+++ b/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/ProducerServiceHelper.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-management
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/TypedProducerListener.java b/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/TypedProducerListener.java
index a821e25f..2c8bbbf4 100644
--- a/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/TypedProducerListener.java
+++ b/platform/runtime/core/object-producing/object-producing-management/src/main/java/ru/entaxy/platform/core/producer/management/impl/TypedProducerListener.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-management
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-resources-support/pom.xml b/platform/runtime/core/object-producing/object-producing-resources-support/pom.xml
index fe7cb79d..e277bd13 100644
--- a/platform/runtime/core/object-producing/object-producing-resources-support/pom.xml
+++ b/platform/runtime/core/object-producing/object-producing-resources-support/pom.xml
@@ -3,7 +3,7 @@
   
     ru.entaxy.esb.platform.runtime.core
     object-producing
-    1.10.0
+    1.11.0
   
   ru.entaxy.esb.platform.runtime.core.object-producing
   object-producing-resources-support
diff --git a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/DeployableResource.java b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/DeployableResource.java
index 39cefd49..45759926 100644
--- a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/DeployableResource.java
+++ b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/DeployableResource.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-resources-support
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/EntaxyResourceProducingProcessor.java b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/EntaxyResourceProducingProcessor.java
new file mode 100644
index 00000000..72285b7a
--- /dev/null
+++ b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/EntaxyResourceProducingProcessor.java
@@ -0,0 +1,37 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-producing-resources-support
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.producer.resources;
+
+import java.util.Map;
+
+public interface EntaxyResourceProducingProcessor {
+
+	String PROP_PROCESSOR = "processor";
+	
+	String getName();
+	Object process(Object value, Map properties) throws Exception;
+	
+}
diff --git a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/EntaxyResourceProducingProcessorService.java b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/EntaxyResourceProducingProcessorService.java
new file mode 100644
index 00000000..eb993e26
--- /dev/null
+++ b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/EntaxyResourceProducingProcessorService.java
@@ -0,0 +1,34 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-producing-resources-support
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.producer.resources;
+
+import java.util.Map;
+
+public interface EntaxyResourceProducingProcessorService {
+
+	Object process(Object value, Map properties) throws Exception;
+	
+}
diff --git a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/EntaxyResourceStringFormatter.java b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/EntaxyResourceStringFormatter.java
index e956c762..2f5d30e8 100644
--- a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/EntaxyResourceStringFormatter.java
+++ b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/EntaxyResourceStringFormatter.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-resources-support
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/ProcessResourcesCommand.java b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/ProcessResourcesCommand.java
index 9eeab5fd..81909f0d 100644
--- a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/ProcessResourcesCommand.java
+++ b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/ProcessResourcesCommand.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-resources-support
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/ResourceDataProcessor.java b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/ResourceDataProcessor.java
index c5e6490c..cb87d358 100644
--- a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/ResourceDataProcessor.java
+++ b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/ResourceDataProcessor.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-resources-support
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/ResourceDescriptor.java b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/ResourceDescriptor.java
index ddfe2447..3d457dbf 100644
--- a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/ResourceDescriptor.java
+++ b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/ResourceDescriptor.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-resources-support
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/ResourceObjectSupport.java b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/ResourceObjectSupport.java
index c71caf6d..3d003c0d 100644
--- a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/ResourceObjectSupport.java
+++ b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/ResourceObjectSupport.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-resources-support
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/ResourceProducer.java b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/ResourceProducer.java
index 158d3a36..e923c770 100644
--- a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/ResourceProducer.java
+++ b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/ResourceProducer.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-resources-support
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/StringFormatterService.java b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/StringFormatterService.java
index 38170b49..b8bfa4d4 100644
--- a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/StringFormatterService.java
+++ b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/StringFormatterService.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-resources-support
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/formatters/Base64Formatter.java b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/formatters/Base64Formatter.java
index cfad99e3..f8d49e0f 100644
--- a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/formatters/Base64Formatter.java
+++ b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/formatters/Base64Formatter.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-resources-support
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/generator/GeneratedResourceWrapper.java b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/generator/GeneratedResourceWrapper.java
index 96e1d435..a35b1dc1 100644
--- a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/generator/GeneratedResourceWrapper.java
+++ b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/generator/GeneratedResourceWrapper.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-resources-support
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/generator/ResourceWrapGenerator.java b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/generator/ResourceWrapGenerator.java
index f57935a3..17babeda 100644
--- a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/generator/ResourceWrapGenerator.java
+++ b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/generator/ResourceWrapGenerator.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-resources-support
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/impl/EntaxyResourceProducingProcessorServiceImpl.java b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/impl/EntaxyResourceProducingProcessorServiceImpl.java
new file mode 100644
index 00000000..4b8d208c
--- /dev/null
+++ b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/impl/EntaxyResourceProducingProcessorServiceImpl.java
@@ -0,0 +1,90 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-producing-resources-support
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.producer.resources.impl;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.osgi.service.component.annotations.Activate;
+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.platform.core.producer.resources.EntaxyResourceProducingProcessor;
+import ru.entaxy.platform.core.producer.resources.EntaxyResourceProducingProcessorService;
+
+@Component (service = EntaxyResourceProducingProcessorService.class, immediate = true)
+public class EntaxyResourceProducingProcessorServiceImpl implements EntaxyResourceProducingProcessorService {
+
+	private static final Logger log = LoggerFactory.getLogger(EntaxyResourceProducingProcessorServiceImpl.class);
+	
+	protected static EntaxyResourceProducingProcessorService _INSTANCE;
+	
+	public static EntaxyResourceProducingProcessorService getInstance() {
+		return _INSTANCE;
+	}
+	
+	protected Map processorsMap = new HashMap<>(); 
+	
+	@Activate
+	public void activate() {
+		_INSTANCE = this;
+	}
+	
+	@Reference (cardinality = ReferenceCardinality.MULTIPLE, collectionType = CollectionType.SERVICE, policy = ReferencePolicy.DYNAMIC
+			, policyOption = ReferencePolicyOption.GREEDY, unbind = "removeProcessor")
+	public void addProcessor(EntaxyResourceProducingProcessor processor) {
+		synchronized (processorsMap) {
+			this.processorsMap.put(processor.getName(), processor);
+		}
+	}
+
+	public void removeProcessor(EntaxyResourceProducingProcessor processor) {
+		synchronized (processorsMap) {
+			this.processorsMap.remove(processor.getName());
+		}
+	}
+	
+	
+	@Override
+	public Object process(Object value, Map properties) throws Exception{
+		Object val = properties.get(EntaxyResourceProducingProcessor.PROP_PROCESSOR);
+		if (val == null)
+			return value;
+		String processorName = val.toString();
+		if (!processorsMap.containsKey(processorName)) {
+			log.warn("Unknown processor [{}] in [{}]", processorName, properties);
+			return value;
+		}
+		return processorsMap.get(processorName).process(value, properties);
+	}
+
+}
diff --git a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/impl/ResourceDataProcessorImpl.java b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/impl/ResourceDataProcessorImpl.java
index 2ffbf3d6..ff4eb4b2 100644
--- a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/impl/ResourceDataProcessorImpl.java
+++ b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/impl/ResourceDataProcessorImpl.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-resources-support
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/impl/StringFormatterServiceImpl.java b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/impl/StringFormatterServiceImpl.java
index e8c24f56..13a38f6d 100644
--- a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/impl/StringFormatterServiceImpl.java
+++ b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/impl/StringFormatterServiceImpl.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-resources-support
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/processors/MergeResourceProcessor.java b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/processors/MergeResourceProcessor.java
index a6b18fd9..6b898a50 100644
--- a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/processors/MergeResourceProcessor.java
+++ b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/processors/MergeResourceProcessor.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-resources-support
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/processors/XSLTResourceProcessor.java b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/processors/XSLTResourceProcessor.java
index 563d4b67..ea2fc5d0 100644
--- a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/processors/XSLTResourceProcessor.java
+++ b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/processors/XSLTResourceProcessor.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-resources-support
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/processors/XSLTSaxonResourceProcessor.java b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/processors/XSLTSaxonResourceProcessor.java
index 0d4f9806..dffff5bf 100644
--- a/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/processors/XSLTSaxonResourceProcessor.java
+++ b/platform/runtime/core/object-producing/object-producing-resources-support/src/main/java/ru/entaxy/platform/core/producer/resources/processors/XSLTSaxonResourceProcessor.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-resources-support
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-shell/pom.xml b/platform/runtime/core/object-producing/object-producing-shell/pom.xml
index cdc9fc3e..af47f66b 100644
--- a/platform/runtime/core/object-producing/object-producing-shell/pom.xml
+++ b/platform/runtime/core/object-producing/object-producing-shell/pom.xml
@@ -3,7 +3,7 @@
   
     ru.entaxy.esb.platform.runtime.core
     object-producing
-    1.10.0
+    1.11.0
   
   ru.entaxy.esb.platform.runtime.core.object-producing
   object-producing-shell
diff --git a/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/EntaxyProducerServiceSupport.java b/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/EntaxyProducerServiceSupport.java
index 437b2346..4d595cdd 100644
--- a/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/EntaxyProducerServiceSupport.java
+++ b/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/EntaxyProducerServiceSupport.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryAwareCommand.java b/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryAwareCommand.java
index afa7c3df..4fddcb1a 100644
--- a/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryAwareCommand.java
+++ b/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryAwareCommand.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryConfiguration.java b/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryConfiguration.java
index bd50af8b..0d0ac808 100644
--- a/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryConfiguration.java
+++ b/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryConfiguration.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-shell
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryEssence.java b/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryEssence.java
new file mode 100644
index 00000000..c447820d
--- /dev/null
+++ b/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryEssence.java
@@ -0,0 +1,62 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-producing-shell
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.producer.shell;
+
+import java.util.Map;
+
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+
+import ru.entaxy.platform.base.support.karaf.shell.ShellTableExt;
+import ru.entaxy.platform.core.producer.api.EntaxyProducerUtils;
+
+@Service
+@Command(scope = EntaxyProducerServiceSupport.SCOPE, name = "factory-essence")
+public class FactoryEssence extends FactoryAwareCommand {
+
+    @Option(name = "-p", aliases = {"--prefix"})
+    String prefix = "";
+
+    @Override
+    protected Object doExecute() throws Exception {
+
+        Map essence = EntaxyProducerUtils.getFactoryEssence(entaxyFactory, prefix);
+
+        ShellTableExt table = new ShellTableExt();
+        table.column("Key");
+        table.column("Value");
+
+        for (Map.Entry entry : essence.entrySet())
+            table.addRow().addContent(entry.getKey(), entry.getValue() == null ? "" : entry.getValue().toString());
+
+        // print output
+        table.print(System.out);
+
+        return null;
+    }
+
+}
diff --git a/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryFields.java b/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryFields.java
index 18ffc713..014b573b 100644
--- a/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryFields.java
+++ b/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryFields.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryGenerate.java b/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryGenerate.java
index 3f969c7c..7a6b0c42 100644
--- a/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryGenerate.java
+++ b/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryGenerate.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryManagerStatus.java b/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryManagerStatus.java
index c9f00207..f49e6e9f 100644
--- a/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryManagerStatus.java
+++ b/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryManagerStatus.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-shell
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryOutputs.java b/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryOutputs.java
index e882134f..99fc5ad2 100644
--- a/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryOutputs.java
+++ b/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryOutputs.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryTypeInfo.java b/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryTypeInfo.java
index b6aa40a8..e0258889 100644
--- a/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryTypeInfo.java
+++ b/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FactoryTypeInfo.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-producing-shell
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FindFactories.java b/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FindFactories.java
new file mode 100644
index 00000000..fbcaf0e7
--- /dev/null
+++ b/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/FindFactories.java
@@ -0,0 +1,91 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-producing-shell
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.core.producer.shell;
+
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+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 org.osgi.framework.Filter;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.InvalidSyntaxException;
+
+import ru.entaxy.platform.base.objects.factory.EntaxyFactory;
+import ru.entaxy.platform.base.support.karaf.shell.ShellTableExt;
+
+@Service
+@Command(scope = "producer", name = "factory-find")
+public class FindFactories extends EntaxyProducerServiceSupport implements Action {
+
+    @Argument(index = 0, required = true)
+    String filter;
+
+    @Override
+    public Object execute() throws Exception {
+
+        Filter osgiFilter = null;
+
+        try {
+            osgiFilter = FrameworkUtil.createFilter(filter);
+        } catch (InvalidSyntaxException e) {
+
+            // print error
+            System.err.println("Invalid filter:");
+            e.printStackTrace(System.err);
+
+            return null;
+
+        }
+
+        List factories =
+                producerService.findFactories(osgiFilter).stream().sorted(new Comparator() {
+
+                    @Override
+                    public int compare(EntaxyFactory o1, EntaxyFactory o2) {
+                        return o1.getId().compareToIgnoreCase(o2.getId());
+                    }
+                })
+                        .collect(Collectors.toList());
+
+        ShellTableExt table = new ShellTableExt();
+
+        table.column("Id");
+        table.column("Type");
+
+        for (EntaxyFactory f : factories)
+            table.addRow().addContent(f.getId(), f.getType());
+
+        // print output
+        table.print(System.out);
+
+        return null;
+    }
+
+}
diff --git a/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/ListFactories.java b/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/ListFactories.java
index 7bceac19..0b5f038c 100644
--- a/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/ListFactories.java
+++ b/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/ListFactories.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/ListProducers.java b/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/ListProducers.java
index 10a40083..b8ba46ba 100644
--- a/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/ListProducers.java
+++ b/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/ListProducers.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/Produce.java b/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/Produce.java
index 7407f991..31d8febb 100644
--- a/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/Produce.java
+++ b/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/Produce.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/completers/FactoryIdCompleter.java b/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/completers/FactoryIdCompleter.java
index ba040b05..c9985ee7 100644
--- a/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/completers/FactoryIdCompleter.java
+++ b/platform/runtime/core/object-producing/object-producing-shell/src/main/java/ru/entaxy/platform/core/producer/shell/completers/FactoryIdCompleter.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-producing/pom.xml b/platform/runtime/core/object-producing/pom.xml
index d207bee3..9359df18 100644
--- a/platform/runtime/core/object-producing/pom.xml
+++ b/platform/runtime/core/object-producing/pom.xml
@@ -3,7 +3,7 @@
   
     ru.entaxy.esb.platform.runtime
     core
-    1.10.0
+    1.11.0
   
   ru.entaxy.esb.platform.runtime.core
   object-producing
@@ -25,7 +25,7 @@
 	    		ru.entaxy.esb.platform.runtime.base.objects-base
 	    	
 	    	objects-core
-	    	1.10.0
+	    	1.11.0
 	    	bundle
 	    
 	    
@@ -33,7 +33,7 @@
 	    		ru.entaxy.esb.platform.runtime.base.objects-base
 	    	
 	    	object-factory
-	    	1.10.0
+	    	1.11.0
 	    	bundle
 	    
     
diff --git a/platform/runtime/core/object-runtime/object-runtime-core/pom.xml b/platform/runtime/core/object-runtime/object-runtime-core/pom.xml
index 18ccb31b..634f171a 100644
--- a/platform/runtime/core/object-runtime/object-runtime-core/pom.xml
+++ b/platform/runtime/core/object-runtime/object-runtime-core/pom.xml
@@ -3,7 +3,7 @@
   
     ru.entaxy.esb.platform.runtime.core
     object-runtime
-    1.10.0
+    1.11.0
   
   object-runtime-core
   bundle
diff --git a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyObjectCustomizer.java b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyObjectCustomizer.java
new file mode 100644
index 00000000..026eb283
--- /dev/null
+++ b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyObjectCustomizer.java
@@ -0,0 +1,38 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-runtime-core
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.objects.runtime;
+
+import ru.entaxy.platform.base.objects.EntaxyObject;
+
+public interface EntaxyObjectCustomizer {
+
+    boolean isAccepted(EntaxyObject entaxyObject);
+
+    EntaxyObject applyCustomization(EntaxyObject entaxyObject);
+
+    EntaxyObject unapplyCustomization(EntaxyObject entaxyObject);
+
+}
diff --git a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyRuntimeObject.java b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyRuntimeObject.java
index 08a1da72..40be9ea6 100644
--- a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyRuntimeObject.java
+++ b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyRuntimeObject.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyRuntimeObjectContainer.java b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyRuntimeObjectContainer.java
index 826cd159..2ebc3185 100644
--- a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyRuntimeObjectContainer.java
+++ b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyRuntimeObjectContainer.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyRuntimeObjectExtendedDataProvider.java b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyRuntimeObjectExtendedDataProvider.java
new file mode 100644
index 00000000..b516258d
--- /dev/null
+++ b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyRuntimeObjectExtendedDataProvider.java
@@ -0,0 +1,36 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-runtime-core
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.objects.runtime;
+
+import java.util.Map;
+
+public interface EntaxyRuntimeObjectExtendedDataProvider {
+
+    String getProviderId();
+
+    Map getExtendedData(EntaxyRuntimeObject runtimeObject);
+
+}
diff --git a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyRuntimeObjectManager.java b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyRuntimeObjectManager.java
index 054fef66..efb4a866 100644
--- a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyRuntimeObjectManager.java
+++ b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyRuntimeObjectManager.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
@@ -46,6 +46,7 @@ public interface EntaxyRuntimeObjectManager {
 		String getObjectFullId();
 		boolean isForced();
 		boolean isSoft();
+		boolean isAffected();
 		Map getAffected();
 	}
 	
@@ -59,6 +60,8 @@ public interface EntaxyRuntimeObjectManager {
 	
 	OperationResult start(String objectFullId);
 	OperationResult startForced(String objectFullId);
+	OperationResult startForced(String objectFullId, boolean isAffectedBundle);
+	
 	OperationResult startSoft(String objectFullId);
 	
 	OperationResult start(OperationConfig config);
diff --git a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyRuntimeObjectResource.java b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyRuntimeObjectResource.java
index 9a221a3f..5a974acd 100644
--- a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyRuntimeObjectResource.java
+++ b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyRuntimeObjectResource.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyRuntimeObjectService.java b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyRuntimeObjectService.java
index 6f6df66e..2a01ffbe 100644
--- a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyRuntimeObjectService.java
+++ b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyRuntimeObjectService.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyRuntimeRelation.java b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyRuntimeRelation.java
index d3cbc194..015d05c1 100644
--- a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyRuntimeRelation.java
+++ b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/EntaxyRuntimeRelation.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/healthcheck/GhostObjectsHealthCheck.java b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/healthcheck/GhostObjectsHealthCheck.java
index 722e2ece..0f973aac 100644
--- a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/healthcheck/GhostObjectsHealthCheck.java
+++ b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/healthcheck/GhostObjectsHealthCheck.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/ClusterExtendedDataProvider.java b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/ClusterExtendedDataProvider.java
new file mode 100644
index 00000000..af3d2afc
--- /dev/null
+++ b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/ClusterExtendedDataProvider.java
@@ -0,0 +1,99 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-runtime-core
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.objects.runtime.impl;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+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.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.platform.base.objects.EntaxyObject.BundleInfo;
+import ru.entaxy.platform.core.support.runtime.cluster.ClusterBundleDataProvider;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObjectExtendedDataProvider;
+
+@Component(service = EntaxyRuntimeObjectExtendedDataProvider.class, immediate = true)
+public class ClusterExtendedDataProvider implements EntaxyRuntimeObjectExtendedDataProvider {
+
+    private static final Logger LOG = LoggerFactory.getLogger(ClusterExtendedDataProvider.class);
+
+    private static final String CLUSTER_PROVIDER_ID = "cluster";
+
+    @Reference(cardinality = ReferenceCardinality.OPTIONAL, policy = ReferencePolicy.DYNAMIC,
+            policyOption = ReferencePolicyOption.GREEDY)
+    volatile protected ClusterBundleDataProvider clusterBundleDataProvider = null;
+
+    protected BundleContext bundleContext;
+
+    @Activate
+    public void activate(ComponentContext componentContext) {
+        this.bundleContext = componentContext.getBundleContext();
+    }
+
+    @Override
+    public String getProviderId() {
+        return CLUSTER_PROVIDER_ID;
+    }
+
+    @Override
+    public Map getExtendedData(EntaxyRuntimeObject runtimeObject) {
+        if (clusterBundleDataProvider == null)
+            return null;
+        Map result = new HashMap<>();
+
+        List groups = getClusterGroups(runtimeObject);
+        if (groups != null) {
+            result.put("groups", groups);
+            result.put("objectClusterState", !groups.isEmpty() ?
+                    groups.stream().allMatch(group -> group.startsWith("?")) ? "non-clustered" : "clustered" : "local");
+        }
+
+        return result;
+    }
+
+    protected List getClusterGroups(EntaxyRuntimeObject runtimeObject) {
+        try {
+            BundleInfo bi = runtimeObject.getBundleInfo();
+            Bundle bundle = bundleContext.getBundle(bi.getBundleId());
+            return clusterBundleDataProvider.getGroups(bundle);
+        } catch (Exception e) {
+            LOG.error(String.format("Error getting cluster groups for [%s]", runtimeObject.getObjectFullId()), e);
+            return null;
+        }
+    }
+
+}
diff --git a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/EntaxyRuntimeObjectContainerBundle.java b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/EntaxyRuntimeObjectContainerBundle.java
index 870a9ed2..75d79180 100644
--- a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/EntaxyRuntimeObjectContainerBundle.java
+++ b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/EntaxyRuntimeObjectContainerBundle.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/EntaxyRuntimeObjectContainerImpl.java b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/EntaxyRuntimeObjectContainerImpl.java
index dd579812..32f03a96 100644
--- a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/EntaxyRuntimeObjectContainerImpl.java
+++ b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/EntaxyRuntimeObjectContainerImpl.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/EntaxyRuntimeObjectImpl.java b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/EntaxyRuntimeObjectImpl.java
index f67837da..3616ad86 100644
--- a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/EntaxyRuntimeObjectImpl.java
+++ b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/EntaxyRuntimeObjectImpl.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/EntaxyRuntimeObjectResourceImpl.java b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/EntaxyRuntimeObjectResourceImpl.java
index 176fdf4d..f27b4a0a 100644
--- a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/EntaxyRuntimeObjectResourceImpl.java
+++ b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/EntaxyRuntimeObjectResourceImpl.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/EntaxyRuntimeObjectServiceImpl.java b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/EntaxyRuntimeObjectServiceImpl.java
index f9f7db04..522d56e4 100644
--- a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/EntaxyRuntimeObjectServiceImpl.java
+++ b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/EntaxyRuntimeObjectServiceImpl.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/EntaxyRuntimeRelationImpl.java b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/EntaxyRuntimeRelationImpl.java
index 908f3727..80f19293 100644
--- a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/EntaxyRuntimeRelationImpl.java
+++ b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/EntaxyRuntimeRelationImpl.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/ObjectRuntimeStorage.java b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/ObjectRuntimeStorage.java
index 114dbb78..5b0f49f2 100644
--- a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/ObjectRuntimeStorage.java
+++ b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/ObjectRuntimeStorage.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/RuntimeObjectSearchProvider.java b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/RuntimeObjectSearchProvider.java
new file mode 100644
index 00000000..bd0605fd
--- /dev/null
+++ b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/RuntimeObjectSearchProvider.java
@@ -0,0 +1,171 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-runtime-core
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.objects.runtime.impl;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.osgi.framework.Filter;
+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 ru.entaxy.platform.base.support.CommonUtils;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObjectContainer;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObjectService;
+import ru.entaxy.platform.search.AbstractSearchProvider;
+import ru.entaxy.platform.search.SearchProvider;
+import ru.entaxy.platform.search.SearchProviderInfo;
+import ru.entaxy.platform.search.SearchService;
+
+@Component(service = SearchProvider.class, immediate = true)
+@SearchProviderInfo(id = "runtime",
+        targetTypes = {RuntimeObjectSearchProvider.TYPE_OBJECT, RuntimeObjectSearchProvider.TYPE_CONTAINER})
+public class RuntimeObjectSearchProvider extends AbstractSearchProvider {
+
+    public static final String TYPE_OBJECT = "object";
+    public static final String TYPE_CONTAINER = "container";
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC,
+            policyOption = ReferencePolicyOption.GREEDY)
+    volatile SearchService searchService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.DYNAMIC,
+            policyOption = ReferencePolicyOption.GREEDY)
+    volatile EntaxyRuntimeObjectService objectService;
+
+    @Override
+    public Map getStandardAttributes(String targetType) throws IllegalArgumentException {
+
+        if (TYPE_CONTAINER.equalsIgnoreCase(targetType))
+            return EntaxyRuntimeObjectContainer.SEARCH.STANDARD_ATTRIBUTES;
+
+        if (TYPE_OBJECT.equalsIgnoreCase(targetType)) {
+            Map result = new LinkedHashMap<>();
+            result.putAll(EntaxyRuntimeObject.SEARCH.STANDARD_ATTRIBUTES);
+
+            result.putAll(CommonUtils.prefixMap(EntaxyRuntimeObjectContainer.SEARCH.STANDARD_ATTRIBUTES, "container."));
+
+            // factory fields we'll get via search service
+            // for 'runtime-only' nodes the information can be unavailable
+
+            try {
+                result.putAll(CommonUtils.prefixMap(searchService.getStandardAttributes("factory"), "factory."));
+            } catch (Exception ignore) {
+                // NOOP
+            }
+
+            return result;
+        }
+
+        throw new IllegalArgumentException(
+                String.format("Provider [%s]: type [%s] nor supported", getProviderId(), targetType));
+    }
+
+    @Override
+    public List> search(String targetType, Filter filter) throws IllegalArgumentException {
+        if (TYPE_CONTAINER.equalsIgnoreCase(targetType))
+            return searchContainers(filter);
+
+        if (TYPE_OBJECT.equalsIgnoreCase(targetType))
+            return searchObjects(filter);
+
+        throw new IllegalArgumentException(
+                String.format("Provider [%s]: type [%s] nor supported", getProviderId(), targetType));
+    }
+
+    protected List> searchObjects(Filter filter) {
+        return objectService.getObjects().stream()
+                .map(obj -> getObjectEssence(obj))
+                .filter(ess -> filter.matches(ess))
+                .collect(Collectors.toList());
+    }
+
+    protected Map getObjectEssence(EntaxyRuntimeObject object) {
+
+        Map result = new LinkedHashMap<>();
+
+        // object attributes
+        result.put(EntaxyRuntimeObject.SEARCH.ATTR_ID, object.getId());
+        result.put(EntaxyRuntimeObject.SEARCH.ATTR_TYPE, object.getType());
+        result.put(EntaxyRuntimeObject.SEARCH.ATTR_LABEL, object.getAllAttributes().getOrDefault("label", ""));
+        result.put(EntaxyRuntimeObject.SEARCH.ATTR_DISPLAY_NAME, object.getDisplayName());
+        result.put(EntaxyRuntimeObject.SEARCH.ATTR_FACTORY, object.getFactoryId());
+        result.put(EntaxyRuntimeObject.SEARCH.ATTR_SCOPE, object.getScope());
+        result.put(EntaxyRuntimeObject.SEARCH.ATTR_RESOURCES, object.getResources().stream()
+                .map(res -> String.format("%s;%s", res.getResourceUrl(), res.getScope().name()))
+                .collect(Collectors.toList()));
+        result.put(EntaxyRuntimeObject.SEARCH.ATTR_RELATIONS_IN,
+                object.getIncomingRelations().stream().map(rel -> String.format("%s;%S;%s:%s",
+                        rel.getSource().getObjectFullId(), rel.getType().name(), rel.getName(), rel.getGroup()))
+                        .collect(Collectors.toList()));
+        result.put(EntaxyRuntimeObject.SEARCH.ATTR_RELATIONS_OUT,
+                object.getRelations().stream().map(rel -> String.format("%s;%S;%s:%s",
+                        rel.getTarget().getObjectFullId(), rel.getType().name(), rel.getName(), rel.getGroup()))
+                        .collect(Collectors.toList()));
+
+        // container attributes
+        result.putAll(CommonUtils.prefixMap(getContainerEssence(object.getContainer()), "container."));
+
+        // factory attributes we'll get via search service
+        // for 'runtime-only' nodes the information can be unavailable
+
+        try {
+            List> factories = searchService.search("factory",
+                    String.format("(&(id=%s)(type=%s))", object.getFactoryId(), object.getType()));
+            if (factories != null && !factories.isEmpty())
+                result.putAll(CommonUtils.prefixMap(factories.get(0), "factory."));
+        } catch (Exception ignore) {
+            // NOOP
+        }
+
+        return result;
+    }
+
+    protected List> searchContainers(Filter filter) {
+        return objectService.getContainers().stream()
+                .map(obj -> getContainerEssence(obj))
+                .filter(ess -> filter.matches(ess))
+                .collect(Collectors.toList());
+    }
+
+    protected Map getContainerEssence(EntaxyRuntimeObjectContainer container) {
+        Map result = new LinkedHashMap<>();
+
+        result.put(EntaxyRuntimeObjectContainer.SEARCH.ATTR_ID, container.getId());
+        result.put(EntaxyRuntimeObjectContainer.SEARCH.ATTR_TYPE, container.getType());
+        result.put(EntaxyRuntimeObjectContainer.SEARCH.ATTR_NAME, container.getName());
+        result.put(EntaxyRuntimeObjectContainer.SEARCH.ATTR_STATE, container.getState());
+
+        return result;
+    }
+
+}
diff --git a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/manager/EntaxyRuntimeObjectManagerImpl.java b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/manager/EntaxyRuntimeObjectManagerImpl.java
index e04f6b95..c713047b 100644
--- a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/manager/EntaxyRuntimeObjectManagerImpl.java
+++ b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/manager/EntaxyRuntimeObjectManagerImpl.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
@@ -53,8 +53,13 @@ public class EntaxyRuntimeObjectManagerImpl implements EntaxyRuntimeObjectManage
 
 	@Override
 	public OperationResult startForced(String objectFullId) {
-		return start((new OperationConfigImpl(objectFullId)).forced(true));
+		return startForced(objectFullId, false);
 	}
+	
+    @Override
+    public OperationResult startForced(String objectFullId, boolean isAffectedBundle) {
+        return start((new OperationConfigImpl(objectFullId)).forced(true).affectedOperation(isAffectedBundle));
+    }
 
 	@Override
 	public OperationResult startSoft(String objectFullId) {
diff --git a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/manager/OperationConfigImpl.java b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/manager/OperationConfigImpl.java
index 921b2eb2..35f8df57 100644
--- a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/manager/OperationConfigImpl.java
+++ b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/manager/OperationConfigImpl.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
@@ -37,6 +37,7 @@ public class OperationConfigImpl implements OperationConfig {
 	
 	boolean isForced = false;
 	boolean isSoft = false;
+	boolean isAffected = false;
 	
 	final Map affected = new HashMap<>();
 	
@@ -79,6 +80,11 @@ public class OperationConfigImpl implements OperationConfig {
 		return this;
 	};
 	
+	public OperationConfigImpl affectedOperation(boolean affectedValue) {
+        this.setIsAffected(affectedValue);
+        return this;
+    };
+	
 	public OperationConfigImpl objectFullId(String objectFullIdValue) {
 		this.setObjectFullId(objectFullIdValue);
 		return this;
@@ -95,5 +101,14 @@ public class OperationConfigImpl implements OperationConfig {
 	public void setSoft(boolean isSoft) {
 		this.isSoft = isSoft;
 	}
+	
+	public void setIsAffected(boolean isAffected) {
+        this.isAffected = isAffected;
+    }
+
+    @Override
+    public boolean isAffected() {
+        return isAffected;
+    }
 
 }
diff --git a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/manager/OperationExecutor.java b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/manager/OperationExecutor.java
index 51599557..c3ec553f 100644
--- a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/manager/OperationExecutor.java
+++ b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/manager/OperationExecutor.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
@@ -31,6 +31,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import ru.entaxy.platform.core.artifact.legacy.BundleController;
 import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
 import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject.ENTAXY_RUNTIME_OBJECT_STATE;
@@ -39,6 +42,8 @@ import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObjectManager.OperationCo
 import ru.entaxy.platform.objects.runtime.impl.EntaxyRuntimeObjectServiceImpl;
 
 public abstract class OperationExecutor> {
+    
+    private static final Logger log = LoggerFactory.getLogger(OperationExecutor.class);
 
 	EntaxyRuntimeObjectManagerImpl objectManager;
 	
@@ -53,6 +58,7 @@ public abstract class OperationExecutor> {
 			return OperationResultImpl.createFailed().message("Object not found: " + operationConfig.getObjectFullId());
 		Map prerequisites = getPrerequisites(operationConfig, runtimeObject);
 		if (!prerequisites.isEmpty()) {
+		    log.warn("Operation aborted due to failure to meet " + operationConfig.getObjectFullId() + " prerequisites");
 			return OperationResultImpl.createBlocked().affected(prerequisites);
 		}
 		if (operationConfig.isForced()) {
@@ -93,6 +99,23 @@ public abstract class OperationExecutor> {
 		return EntaxyRuntimeObjectServiceImpl.getInstance().getObjectState(object);
 	}
 	
+	protected ENTAXY_RUNTIME_OBJECT_STATE getObjectState(EntaxyRuntimeObject object, ENTAXY_RUNTIME_OBJECT_STATE expectedState) {
+        if (expectedState != null) {
+            synchronized (this) {
+                int limit = 0;
+                EntaxyRuntimeObjectServiceImpl objService = EntaxyRuntimeObjectServiceImpl.getInstance();
+                while (!(expectedState.equals(objService.getObjectState(object)))  && limit++ < 30) {
+                    try {
+                        this.wait(1000);
+                    } catch (InterruptedException e) {
+                        log.trace(e.getMessage(), e);
+                    }
+                }
+            }
+        }
+        return EntaxyRuntimeObjectServiceImpl.getInstance().getObjectState(object);
+    }
+	
 	protected EntaxyRuntimeObject getObjectFromConfig(OperationConfig operationConfig) {
 		try {
 			return EntaxyRuntimeObjectServiceImpl.getInstance().getRuntimeObject(operationConfig.getObjectFullId());
diff --git a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/manager/OperationExecutorStart.java b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/manager/OperationExecutorStart.java
index 0a403710..3e015adb 100644
--- a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/manager/OperationExecutorStart.java
+++ b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/manager/OperationExecutorStart.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
@@ -52,7 +52,8 @@ public class OperationExecutorStart extends OperationExecutor objects = runtimeObject.getDependsOn().stream()
 				.map(rel -> rel.getMain())
 				.filter(obj -> !runtimeObject.isColocatedWith(obj))
-				.filter(obj -> !ENTAXY_RUNTIME_OBJECT_STATE.ACTIVE.equals(getObjectState(obj)))
+				.filter(obj -> !ENTAXY_RUNTIME_OBJECT_STATE.ACTIVE.equals(
+				                    getObjectState(obj, (operationConfig.isAffected() ? ENTAXY_RUNTIME_OBJECT_STATE.ACTIVE : null))))
 				.collect(Collectors.toList());
 		
 		return createMapForObjects(objects, ENTAXY_RUNTIME_OBJECT_OPERATION.START);
@@ -82,8 +83,8 @@ public class OperationExecutorStart extends OperationExecutor {
 
@@ -83,7 +83,6 @@ public class OperationExecutorUninstall extends OperationExecutor parts = runtimeObject.getRelations(OBJECT_RELATION.COMPOSITION).stream()
 				.map(rel -> rel.getDependent())
@@ -112,8 +111,14 @@ public class OperationExecutorUninstall extends OperationExecutor resources = runtimeObject.getResources();
+		
 		try {
 			getBundleController(runtimeObject).uninstallBundle(runtimeObject.getContainer().getName());
+//			TODO: awaiting solution of task ENTAXY-1092
+//			if (resources != null)
+//			    for (EntaxyRuntimeObjectResource resource : resources)
+//			        resource.getResource().delete();
 			return OperationResultImpl.createDone();
 		} catch (Exception e) {
 			log.error("ERROR stoping [" + runtimeObject.getObjectFullId() + "]", e);
diff --git a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/manager/OperationResultImpl.java b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/manager/OperationResultImpl.java
index 47dfd5bc..eb0fa907 100644
--- a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/manager/OperationResultImpl.java
+++ b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/impl/manager/OperationResultImpl.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-core
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/internal/ObjectResourcesProvider.java b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/internal/ObjectResourcesProvider.java
new file mode 100644
index 00000000..cb9b1697
--- /dev/null
+++ b/platform/runtime/core/object-runtime/object-runtime-core/src/main/java/ru/entaxy/platform/objects/runtime/internal/ObjectResourcesProvider.java
@@ -0,0 +1,48 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-runtime-core
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.objects.runtime.internal;
+
+import org.osgi.service.component.annotations.Activate;
+
+import ru.entaxy.esb.resources.impl.AbstractResourceProviderProxy;
+
+// @Component(service = EntaxyResourceProviderProxy.class, immediate = true)
+/**
+ * @Deprecated already defined in core-support-runtime
+ */
+@Deprecated(forRemoval = true)
+public class ObjectResourcesProvider extends AbstractResourceProviderProxy {
+
+    @Activate
+    public void activate() {
+
+        setProtocol("object-resources");
+        setTargetProtocol("entaxy-file-internal");
+        setTargetPath(".object-resources");
+
+    }
+
+}
diff --git a/platform/runtime/core/object-runtime/object-runtime-shell/pom.xml b/platform/runtime/core/object-runtime/object-runtime-shell/pom.xml
index 249286d1..06a0d278 100644
--- a/platform/runtime/core/object-runtime/object-runtime-shell/pom.xml
+++ b/platform/runtime/core/object-runtime/object-runtime-shell/pom.xml
@@ -3,7 +3,7 @@
   
     ru.entaxy.esb.platform.runtime.core
     object-runtime
-    1.10.0
+    1.11.0
   
   object-runtime-shell
   bundle
diff --git a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ContainerAwareCommand.java b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ContainerAwareCommand.java
index 6ad1c219..3153b7f3 100644
--- a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ContainerAwareCommand.java
+++ b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ContainerAwareCommand.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-shell
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ContainerInfo.java b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ContainerInfo.java
index 640856a7..8915b801 100644
--- a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ContainerInfo.java
+++ b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ContainerInfo.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-shell
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ContainerList.java b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ContainerList.java
index d043cabc..5ea4caaf 100644
--- a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ContainerList.java
+++ b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ContainerList.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-shell
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/EntaxyRuntimeObjectServiceSupport.java b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/EntaxyRuntimeObjectServiceSupport.java
index bbf27b0b..e5a0d2a6 100644
--- a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/EntaxyRuntimeObjectServiceSupport.java
+++ b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/EntaxyRuntimeObjectServiceSupport.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-shell
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectFind.java b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectFind.java
new file mode 100644
index 00000000..d1082787
--- /dev/null
+++ b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectFind.java
@@ -0,0 +1,63 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-runtime-shell
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.objects.runtime.shell;
+
+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 org.osgi.framework.Filter;
+import org.osgi.framework.FrameworkUtil;
+
+import ru.entaxy.platform.base.support.karaf.shell.ShellTableExt;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+
+@Service
+@Command(name = "find-objects", scope = EntaxyRuntimeObjectServiceSupport.OBJECTS_SCOPE)
+public class ObjectFind extends EntaxyRuntimeObjectServiceSupport implements Action {
+
+    @Argument(index = 0)
+    String filter;
+
+    @Override
+    public Object execute() throws Exception {
+
+        Filter odgiFilter = FrameworkUtil.createFilter(filter);
+
+        ShellTableExt shellTable = new ShellTableExt();
+        shellTable.column("Id");
+        shellTable.column("Type");
+
+        for (EntaxyRuntimeObject obj : objectService.findObjects(odgiFilter))
+            shellTable.addRow().addContent(
+                    obj.getId(), obj.getType());
+
+        shellTable.print(System.out);
+
+        return null;
+    }
+
+}
diff --git a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectInfo.java b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectInfo.java
index 9d399958..320f2a59 100644
--- a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectInfo.java
+++ b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectInfo.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-shell
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectOperationCommand.java b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectOperationCommand.java
index 7f0a5fbf..c112aae4 100644
--- a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectOperationCommand.java
+++ b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectOperationCommand.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-shell
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectResources.java b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectResources.java
index 6902ff29..96a0040f 100644
--- a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectResources.java
+++ b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectResources.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-shell
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectStart.java b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectStart.java
index 0a8617ab..ced4b979 100644
--- a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectStart.java
+++ b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectStart.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-shell
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectStop.java b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectStop.java
index e777699d..40fa82f6 100644
--- a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectStop.java
+++ b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectStop.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-shell
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectUninstall.java b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectUninstall.java
index 0fe98ed7..6ff3e24e 100644
--- a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectUninstall.java
+++ b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectUninstall.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-shell
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectVersions.java b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectVersions.java
new file mode 100644
index 00000000..5741d5a2
--- /dev/null
+++ b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/ObjectVersions.java
@@ -0,0 +1,76 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-runtime-shell
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.objects.runtime.shell;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Reference;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+
+import ru.entaxy.platform.core.artifact.Artifact;
+import ru.entaxy.platform.core.artifact.Artifacts;
+import ru.entaxy.platform.core.artifact.repository.ArtifactRepository;
+import ru.entaxy.platform.core.artifact.service.ArtifactService;
+import ru.entaxy.platform.objects.runtime.EntaxyRuntimeObject;
+
+@Service
+@Command(name = "object-versions", scope = EntaxyRuntimeObjectServiceSupport.OBJECTS_SCOPE,
+        description = "List available object versions")
+public class ObjectVersions extends RuntimeObjectAwareCommand {
+
+    @Reference
+    ArtifactService artifactService;
+
+    @Override
+    public Object doExecute(EntaxyRuntimeObject entaxyObject) throws Exception {
+        Set availaleVersions = new HashSet<>();
+
+        Artifact artifact = Artifacts.create(Artifact.ARTIFACT_CATEGORY_BUNDLE);
+        artifact.getCoordinates().groupId(entaxyObject.getType()).artifactId(entaxyObject.getId());
+
+        String[] repos = new String[] {ArtifactRepository.REPO_NAME_LOCAL, ArtifactRepository.REPO_NAME_SHARED};
+        for (String repoName : repos) {
+            List versions = artifactService.getRepository(repoName).getAvailableVersions(artifact);
+            if (versions != null)
+                availaleVersions.addAll(versions);
+        }
+
+        List list = new ArrayList<>(availaleVersions);
+        Collections.sort(list);
+
+        System.out.println("Available versions:\n");
+        System.out.println(list.stream().collect(Collectors.joining("\n")));
+
+        return null;
+    }
+
+}
diff --git a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/RuntimeObjectAwareCommand.java b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/RuntimeObjectAwareCommand.java
index 43b54968..3fec4b0e 100644
--- a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/RuntimeObjectAwareCommand.java
+++ b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/RuntimeObjectAwareCommand.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/RuntimeObjectShellUtils.java b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/RuntimeObjectShellUtils.java
index aecc8ccf..241a369e 100644
--- a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/RuntimeObjectShellUtils.java
+++ b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/RuntimeObjectShellUtils.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-shell
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/completers/ContainerCompleter.java b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/completers/ContainerCompleter.java
index 9fa3014c..073c5e96 100644
--- a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/completers/ContainerCompleter.java
+++ b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/completers/ContainerCompleter.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-shell
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/completers/RuntimeObjectCompleter.java b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/completers/RuntimeObjectCompleter.java
index 474072e3..9e1f0fae 100644
--- a/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/completers/RuntimeObjectCompleter.java
+++ b/platform/runtime/core/object-runtime/object-runtime-shell/src/main/java/ru/entaxy/platform/objects/runtime/shell/completers/RuntimeObjectCompleter.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * object-runtime-shell
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/object-runtime/pom.xml b/platform/runtime/core/object-runtime/pom.xml
index 0aac1f97..e2d05608 100644
--- a/platform/runtime/core/object-runtime/pom.xml
+++ b/platform/runtime/core/object-runtime/pom.xml
@@ -3,7 +3,7 @@
   
     ru.entaxy.esb.platform.runtime
     core
-    1.10.0
+    1.11.0
   
   ru.entaxy.esb.platform.runtime.core
   object-runtime
diff --git a/platform/runtime/core/objects-implementations/config-implementation/LICENSE.txt b/platform/runtime/core/objects-implementations/config-implementation/LICENSE.txt
new file mode 100644
index 00000000..4ae94b75
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/config-implementation/LICENSE.txt
@@ -0,0 +1,175 @@
+                                 ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ
+
+Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой)
+версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего
+Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН
+7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова,
+д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу
+https://www.emdev.ru/about (далее - Компания).
+
+Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями»
+(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения,
+Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в
+настоящем документе, в противном случае, он должен не использовать или не получать доступ
+к Программному обеспечению.
+
+                                    1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ
+
+a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии
+или редакции, исключительные права на которую принадлежат Правообладателю.
+b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные
+права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ
+для ЭВМ № 2021610848 от 19.01.2021 года.
+c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта
+https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО.
+d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также
+личные неимущественные права авторов произведений на результат интеллектуальной деятельности.
+e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование
+ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка
+включает предоставление Пользователю неисключительного права использования ПО, в том числе
+получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение
+патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается
+Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается
+для каждого Пользователя индивидуально в Сертификате.
+f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром),
+подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное
+обеспечение в ограниченном объёме и на определённый период времени.
+g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО,
+предоставленных Пользователю согласно условиям Подписки.
+h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного
+обеспечения.
+i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий
+из одного или нескольких файлов, который может быть прочтён человеком.
+j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля
+программы, полученный в результате обработки исходного кода, еще не связанный в полную программу.
+Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый
+продукт.
+k) Некоммерческое использование – индивидуальное личное использование Пользователем программного
+обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации
+возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая
+выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения.
+
+                    2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
+
+2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного
+обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом
+воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения
+в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ.
+2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит
+неисключительный характер.
+2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию,
+лицензия на ограниченное использование Программного обеспечения.
+2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования
+имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан
+обратиться в службу поддержки Правообладателя по адресу:  https://entaxy.ru/ для изменения
+вида лицензии с Базовой бесплатной версии на Подписки.
+2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для
+пробного использования программного обеспечения – не ограничен.
+2.6. Использование Пользователем настоящего программного обеспечения в целях разработки,
+модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю,
+без разрешения Правообладателя не допускается.
+
+                                3. АВТОРСКОЕ ПРАВО.
+
+3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение
+и любые его копии принадлежат Правообладателю.
+3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента,
+к которому можно получить доступ с помощью Программного обеспечения, является собственностью
+соответствующего владельца контента и защищается применимым законодательством об авторском
+праве или другими законами и договорами об интеллектуальной собственности.
+3.3. Условия использования Программного обеспечения.
+Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь
+придерживается следующих условий:
+3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять
+какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании
+Программного обеспечения или на нем.
+3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать,
+расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать
+Программное обеспечение.
+3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования
+ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне.
+3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено
+использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам.
+
+                    4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС»
+
+4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю
+на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с
+использованием Пользователем:
+4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в
+Программное обеспечение;
+4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями
+настоящего соглашения;
+4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием,
+или данными, не предоставленными Пользователю Правообладателем;
+4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем.
+
+
+5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ
+ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ
+И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ
+ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ
+И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ
+ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО.
+
+                        6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ.
+НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ
+ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ,
+ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ;
+ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ.
+ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ
+ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ;
+КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ
+ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ.
+
+                        7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ:
+Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия
+(включая, но не ограничиваясь) по:
+-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код)
+ Программного обеспечения;
+-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный
+код Программного обеспечения, за исключением тех изменений, которые вносятся средствами,
+включёнными в Программное обеспечение и описанными непосредственно в документации к нему;
+-созданию условий для использования Программного обеспечения лицами, не имеющими прав на
+использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство
+третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа
+к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку;
+-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию).
+
+                    8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА.
+
+8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из
+лицензионных продуктов, используемых на законных основаниях, а
+именно https://entaxy.ru/libs/licenses/root-aggregated.deps.
+8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть
+совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения.
+8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться
+Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения,
+содержащих все изменения и дополнения программного обеспечения.
+
+                        9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ.
+
+9.1.  Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым
+программным обеспечением.
+9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно
+с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм
+«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public.
+9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий
+пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя,
+прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер
+ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства
+Российской Федерации.
+
+                                10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ.
+
+10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет
+право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб,
+недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий
+пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере
+2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения
+исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy).
+10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое
+законодательство – Российской Федерации.
+10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным,
+остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать
+исполнять свои обязанности в соответствии с этими положениями.
diff --git a/platform/runtime/core/objects-implementations/config-implementation/config-runtime/LICENSE.txt b/platform/runtime/core/objects-implementations/config-implementation/config-runtime/LICENSE.txt
new file mode 100644
index 00000000..4ae94b75
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/config-implementation/config-runtime/LICENSE.txt
@@ -0,0 +1,175 @@
+                                 ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ
+
+Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой)
+версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего
+Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН
+7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова,
+д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу
+https://www.emdev.ru/about (далее - Компания).
+
+Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями»
+(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения,
+Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в
+настоящем документе, в противном случае, он должен не использовать или не получать доступ
+к Программному обеспечению.
+
+                                    1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ
+
+a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии
+или редакции, исключительные права на которую принадлежат Правообладателю.
+b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные
+права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ
+для ЭВМ № 2021610848 от 19.01.2021 года.
+c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта
+https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО.
+d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также
+личные неимущественные права авторов произведений на результат интеллектуальной деятельности.
+e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование
+ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка
+включает предоставление Пользователю неисключительного права использования ПО, в том числе
+получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение
+патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается
+Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается
+для каждого Пользователя индивидуально в Сертификате.
+f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром),
+подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное
+обеспечение в ограниченном объёме и на определённый период времени.
+g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО,
+предоставленных Пользователю согласно условиям Подписки.
+h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного
+обеспечения.
+i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий
+из одного или нескольких файлов, который может быть прочтён человеком.
+j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля
+программы, полученный в результате обработки исходного кода, еще не связанный в полную программу.
+Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый
+продукт.
+k) Некоммерческое использование – индивидуальное личное использование Пользователем программного
+обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации
+возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая
+выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения.
+
+                    2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
+
+2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного
+обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом
+воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения
+в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ.
+2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит
+неисключительный характер.
+2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию,
+лицензия на ограниченное использование Программного обеспечения.
+2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования
+имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан
+обратиться в службу поддержки Правообладателя по адресу:  https://entaxy.ru/ для изменения
+вида лицензии с Базовой бесплатной версии на Подписки.
+2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для
+пробного использования программного обеспечения – не ограничен.
+2.6. Использование Пользователем настоящего программного обеспечения в целях разработки,
+модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю,
+без разрешения Правообладателя не допускается.
+
+                                3. АВТОРСКОЕ ПРАВО.
+
+3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение
+и любые его копии принадлежат Правообладателю.
+3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента,
+к которому можно получить доступ с помощью Программного обеспечения, является собственностью
+соответствующего владельца контента и защищается применимым законодательством об авторском
+праве или другими законами и договорами об интеллектуальной собственности.
+3.3. Условия использования Программного обеспечения.
+Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь
+придерживается следующих условий:
+3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять
+какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании
+Программного обеспечения или на нем.
+3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать,
+расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать
+Программное обеспечение.
+3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования
+ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне.
+3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено
+использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам.
+
+                    4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС»
+
+4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю
+на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с
+использованием Пользователем:
+4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в
+Программное обеспечение;
+4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями
+настоящего соглашения;
+4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием,
+или данными, не предоставленными Пользователю Правообладателем;
+4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем.
+
+
+5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ
+ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ
+И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ
+ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ
+И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ
+ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО.
+
+                        6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ.
+НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ
+ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ,
+ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ;
+ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ.
+ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ
+ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ;
+КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ
+ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ.
+
+                        7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ:
+Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия
+(включая, но не ограничиваясь) по:
+-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код)
+ Программного обеспечения;
+-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный
+код Программного обеспечения, за исключением тех изменений, которые вносятся средствами,
+включёнными в Программное обеспечение и описанными непосредственно в документации к нему;
+-созданию условий для использования Программного обеспечения лицами, не имеющими прав на
+использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство
+третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа
+к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку;
+-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию).
+
+                    8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА.
+
+8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из
+лицензионных продуктов, используемых на законных основаниях, а
+именно https://entaxy.ru/libs/licenses/root-aggregated.deps.
+8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть
+совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения.
+8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться
+Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения,
+содержащих все изменения и дополнения программного обеспечения.
+
+                        9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ.
+
+9.1.  Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым
+программным обеспечением.
+9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно
+с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм
+«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public.
+9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий
+пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя,
+прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер
+ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства
+Российской Федерации.
+
+                                10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ.
+
+10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет
+право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб,
+недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий
+пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере
+2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения
+исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy).
+10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое
+законодательство – Российской Федерации.
+10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным,
+остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать
+исполнять свои обязанности в соответствии с этими положениями.
diff --git a/platform/runtime/core/objects-implementations/config-implementation/config-runtime/pom.xml b/platform/runtime/core/objects-implementations/config-implementation/config-runtime/pom.xml
new file mode 100644
index 00000000..14807440
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/config-implementation/config-runtime/pom.xml
@@ -0,0 +1,49 @@
+
+  4.0.0
+  
+    ru.entaxy.esb.platform.runtime.core.objects-implementations
+    config-implementation
+    1.11.0
+  
+  ru.entaxy.esb.platform.runtime.core.objects-implementations.config-implementation
+  config-runtime
+  bundle
+  ENTAXY  :: PLATFORM :: CORE :: OBJECTS IMPLEMENTATIONS :: CONFIG :: RUNTIME
+  ENTAXY  :: PLATFORM :: CORE :: OBJECTS IMPLEMENTATIONS :: CONFIG :: RUNTIME  
+  
+  
+	  
+	  ru.entaxy.platform.config.runtime
+  
+  
+  
+  	
+  		org.apache.karaf.config
+  		org.apache.karaf.config.core
+  		${karaf.version}
+  	
+  	
+  		org.apache.felix
+  		org.apache.felix.configadmin
+  		${felix.configadmin.version}
+  	
+  	
+  		
+  			ru.entaxy.esb.platform.runtime.core.object-producing
+  		
+  		object-producer-core
+  		${project.version}
+  	
+  	
+		  ru.entaxy.esb.platform.runtime.core
+		  object-runtime-core
+		  ${project.version}
+	  
+	  
+		  commons-io
+		  commons-io
+		  ${commons-io.version}
+	  
+  
+  
+
diff --git a/platform/runtime/core/objects-implementations/config-implementation/config-runtime/src/main/java/ru/entaxy/platform/config/runtime/ConfigEntaxyObject.java b/platform/runtime/core/objects-implementations/config-implementation/config-runtime/src/main/java/ru/entaxy/platform/config/runtime/ConfigEntaxyObject.java
new file mode 100644
index 00000000..057a881d
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/config-implementation/config-runtime/src/main/java/ru/entaxy/platform/config/runtime/ConfigEntaxyObject.java
@@ -0,0 +1,163 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * config-runtime
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.config.runtime;
+
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import ru.entaxy.platform.base.objects.EntaxyObject;
+import ru.entaxy.platform.base.support.JSONUtils;
+
+public class ConfigEntaxyObject implements EntaxyObject, ConfigEntaxyObjectWrapped {
+
+    private static final Logger LOG = LoggerFactory.getLogger(ConfigEntaxyObject.class);
+
+    protected EntaxyObject origin;
+
+    protected Map configurationMap = new HashMap<>();
+
+    public ConfigEntaxyObject(EntaxyObject entaxyObject) {
+        super();
+        this.origin = entaxyObject;
+        configurationMap.put(EntaxyObject.FIELDS.OBJECT_ID, origin.getId());
+        configurationMap.put(EntaxyObject.FIELDS.OBJECT_TYPE, origin.getType());
+        configurationMap.put(EntaxyObject.FIELDS.FACTORY_ID, origin.getFactoryId());
+    }
+
+    @Override
+    public EntaxyObject getOrigin() {
+        return this.origin;
+    }
+
+    @Override
+    public String getId() {
+        return origin.getId();
+    }
+
+    @Override
+    public String getType() {
+        return origin.getType();
+    }
+
+    @Override
+    public String getDisplayName() {
+        return origin.getDisplayName();
+    }
+
+    @Override
+    public String getScope() {
+        return origin.getScope();
+    }
+
+    @Override
+    public String getOwner() {
+        return origin.getOwner();
+    }
+
+    @Override
+    public String getFactoryId() {
+        return origin.getFactoryId();
+    }
+
+    @Override
+    public BundleInfo getBundleInfo() {
+        return origin.getBundleInfo();
+    }
+
+    @Override
+    public String getConfiguration() {
+        ServiceReference ref =
+                ObjectConfigHelper.getInstance().getReference(ConfigurationAdmin.class);
+        if (ref != null) {
+            ConfigurationAdmin configurationAdmin = ObjectConfigHelper.getInstance().getService(ref);
+
+            Map properties = new HashMap<>();
+
+            try {
+                Configuration config = configurationAdmin.getConfiguration(getId(), "?");
+
+                Enumeration keys = config.getProperties().keys();
+
+                while (keys.hasMoreElements()) {
+                    String key = keys.nextElement();
+                    properties.put(key, config.getProperties().get(key));
+                }
+
+                properties.remove("felix.fileinstall.filename");
+                properties.remove(Constants.SERVICE_PID);
+                properties.remove(ConfigurationAdmin.SERVICE_FACTORYPID);
+
+                configurationMap.put(EntaxyObject.FIELDS.PROPERTIES, properties);
+
+
+                return JSONUtils.GSON.toJsonTree(configurationMap).toString();
+
+            } catch (IOException e) {
+                LOG.error("Error reading configuration [" + getId() + "]", e);
+            } finally {
+                ObjectConfigHelper.getInstance().ungetService(ref);
+            }
+
+        }
+        return origin.getConfiguration();
+    }
+
+    @Override
+    public boolean isProvided() {
+        return origin.isProvided();
+    }
+
+    @Override
+    public boolean isComplete() {
+        return origin.isComplete();
+    }
+
+    @Override
+    public boolean isGhost() {
+        return origin.isGhost();
+    }
+
+    @Override
+    public List getRelations() {
+        return origin.getRelations();
+    }
+
+    @Override
+    public List getIncomingRelations() {
+        return origin.getIncomingRelations();
+    }
+
+}
diff --git a/platform/runtime/core/objects-implementations/config-implementation/config-runtime/src/main/java/ru/entaxy/platform/config/runtime/ConfigEntaxyObjectWrapped.java b/platform/runtime/core/objects-implementations/config-implementation/config-runtime/src/main/java/ru/entaxy/platform/config/runtime/ConfigEntaxyObjectWrapped.java
new file mode 100644
index 00000000..4ce146da
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/config-implementation/config-runtime/src/main/java/ru/entaxy/platform/config/runtime/ConfigEntaxyObjectWrapped.java
@@ -0,0 +1,32 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * config-runtime
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.config.runtime;
+
+import ru.entaxy.platform.base.objects.EntaxyObject;
+
+public interface ConfigEntaxyObjectWrapped {
+    EntaxyObject getOrigin();
+}
diff --git a/platform/runtime/core/objects-implementations/config-implementation/config-runtime/src/main/java/ru/entaxy/platform/config/runtime/ObjectConfig.java b/platform/runtime/core/objects-implementations/config-implementation/config-runtime/src/main/java/ru/entaxy/platform/config/runtime/ObjectConfig.java
new file mode 100644
index 00000000..44f0a1e3
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/config-implementation/config-runtime/src/main/java/ru/entaxy/platform/config/runtime/ObjectConfig.java
@@ -0,0 +1,588 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-producing-config-support
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.config.runtime;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.regex.Pattern;
+
+import org.apache.felix.utils.properties.TypedProperties;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonElement;
+
+import ru.entaxy.platform.base.objects.EntaxyObject;
+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.OutputInfo;
+import ru.entaxy.platform.base.support.CommonUtils;
+import ru.entaxy.platform.base.support.JSONUtils;
+import ru.entaxy.platform.core.producer.api.EntaxyProducerService;
+import ru.entaxy.platform.core.producer.api.EntaxyProducerUtils;
+
+public class ObjectConfig {
+
+    private static final Logger log = LoggerFactory.getLogger(ObjectConfig.class);
+
+    public static final String CONFIG_OBJECT_TYPE = "entaxy.runtime.config";
+
+    public static final String TARGET_FACTORY_FIELD_NAME = "targetObjectFactoryId";
+    public static final String TARGET_TYPE_FIELD_NAME = "targetObjectType";
+    public static final String TARGET_ID_FIELD_NAME = "targetObjectId";
+    public static final String TARGET_OUTPUT_FIELD_NAME = "targetObjectOutput";
+
+    public static final String CONFIG_PROPERTIES_FIELD_NAME = "configuredProperties";
+    public static final String CONFIG_FACTORY_FIELD_NAME = "__entaxy_configuredFactoryId";
+    public static final String CONFIG_TYPE_FIELD_NAME = "__entaxy_configuredType";
+    public static final String CONFIG_ID_FIELD_NAME = "__entaxy_configuredId";
+    public static final String CONFIG_OUTPUT_FIELD_NAME = "__entaxy_configuredOutput";
+    public static final String CONFIG_HINT_FIELD_NAME = "__entaxy_config_hint";
+
+    public static final List CONFIG_INTERNAL_FIELDS = Arrays.asList(new String[] {CONFIG_FACTORY_FIELD_NAME,
+        CONFIG_TYPE_FIELD_NAME, CONFIG_ID_FIELD_NAME, CONFIG_OUTPUT_FIELD_NAME, CONFIG_HINT_FIELD_NAME});
+
+    public static final String CONFIG_PID_FIELD_NAME = "configurationPid";
+    public static final String CONFIG_PLACEHOLDER_PREFIX_FIELD_NAME = "placeholderPrefix";
+
+    @Deprecated
+    public static final String CONFIG_FIELD_NAME = "##config";
+    public static final String CONFIG_DEFAULTS_FIELD_NAME = "##config";
+    public static final String CONFIG_LINK_FIELD_NAME = "##config-link";
+    public static final String CONFIGURABLE_ATTRIBUTE_NAME = "configurable";
+    public static final String DEFAULT_FIELDS_CONFIGURABLE_ATTRIBUTE_NAME = "fieldsConfigurableByDefault";
+    public static final String CONFIGURABLE_FIELDS_ATTRIBUTE_NAME = "configurableFields";
+    public static final String PROPERTIES_BACKUP_FIELD = EntaxyObject.FIELDS.PROPERTIES + "_backup";
+
+    public static final String DIRECT_VALUE_ONLY_ATTR_NAME = "directValueOnly";
+
+    public static final String CONFIGURABLES_FIELD_NAME = "configurables";
+    public static final String IMMUTABLES_FIELD_NAME = "immutables";
+
+    public static final String HEADER_OBJECT_CONFIG_PID = "Entaxy-Generated-Object-Config-Pid";
+
+    protected static Gson GSON = new GsonBuilder().create();
+
+    public static String getConfigurationPid(String objectId, String type) {
+        return reduceType(type) + "." + objectId.replace("-", "_");
+    }
+
+    public static String reduceType(String type) {
+        return type
+                // .replace(EntaxyObject.OBJECT_TYPES.ENTAXY_RUNTIME_TYPE_PREFIX, "e_r_")
+                .replace("-", "_");
+    }
+
+    public static String getConfigurationPrefix(String objectId, String type) {
+        return "$" + getConfigurationPid(objectId, type) + "{";
+    }
+
+    public static boolean isConfigurable(EntaxyFactory factory, String outputType, String fieldName,
+            boolean defaultFieldsConfigurable, List configurations) {
+        Optional fi = factory.getOutputByType(outputType).getFields().stream()
+                .filter(f -> f.getName().equals(fieldName)).findFirst();
+        if (!fi.isPresent())
+            return false;
+
+        boolean fieldIsConfigurable = defaultFieldsConfigurable;
+
+        try {
+            fieldIsConfigurable = fi.get().getJsonOrigin().get(CONFIGURABLE_ATTRIBUTE_NAME).getAsBoolean();
+        } catch (Exception e) {
+            // usinf default value
+        }
+
+        if (!fieldIsConfigurable)
+            return false;
+
+        for (ConfigurableFieldsConfiguration cfc : configurations)
+            if (cfc.isConfigurable(factory, outputType, fieldName))
+                return true;
+
+        return false;
+    }
+
+    public static void backupProperties(Map parameters) {
+        backupProperties(parameters, EntaxyObject.FIELDS.PROPERTIES);
+    }
+
+    @SuppressWarnings("unchecked")
+    public static void backupProperties(Map parameters, String fieldName) {
+        if (!parameters.containsKey(fieldName))
+            return;
+        Map backup = new HashMap<>();
+        backup.putAll((Map) parameters.get(fieldName));
+        parameters.put(ObjectConfig.PROPERTIES_BACKUP_FIELD, backup);
+    }
+
+    public static void restoreBackupProperties(Map parameters) {
+        restoreBackupProperties(parameters, EntaxyObject.FIELDS.PROPERTIES);
+    }
+
+    public static void restoreBackupProperties(Map parameters, String fieldName) {
+        if (!parameters.containsKey(ObjectConfig.PROPERTIES_BACKUP_FIELD))
+            return;
+        parameters.put(fieldName, parameters.get(ObjectConfig.PROPERTIES_BACKUP_FIELD));
+    }
+
+    public static void removeConfigData(Map parameters) {
+        removeConfigData(parameters, EntaxyObject.FIELDS.PROPERTIES);
+    }
+
+    @SuppressWarnings("unchecked")
+    public static void removeConfigData(Map parameters, String fieldName) {
+        if (!parameters.containsKey(fieldName))
+            return;
+        ((Map) parameters.get(fieldName)).remove(CONFIG_FIELD_NAME);
+    }
+
+    public static Map getTargetConfigMap(EntaxyFactory factory, String outputType, String fieldName,
+            Map configurables, Map immutables) {
+/*
+ 		Optional fi = factory.getOutputByType(outputType).getFields().stream().filter(f -> f.getName().equals(fieldName)).findFirst();
+ 
+		if (!fi.isPresent()) {
+			log.debug("FIELD NOT FOUND: " + fieldName);
+			return null;
+		}
+		FieldInfo field = fi.get();
+		boolean isConfigurable = true;
+		log.debug("\n FIELDNAME:: " + fieldName + " -> " + field.getJsonOrigin());
+		if (field.getJsonOrigin().has(CONFIGURABLE_ATTRIBUTE_NAME))
+			try {
+				isConfigurable =  field.getJsonOrigin().get(CONFIGURABLE_ATTRIBUTE_NAME).getAsBoolean();
+			} catch (Exception e) {
+				isConfigurable = true; 
+			}
+		if (!isConfigurable) {
+			log.debug("FIELD NOT CONFIGURABLE: " + fieldName);
+			return null;
+		}
+*/
+        Optional fi = factory.getOutputByType(outputType).getFields().stream()
+                .filter(f -> f.getName().equals(fieldName)).findFirst();
+
+        if (!fi.isPresent()) {
+            log.debug("FIELD NOT FOUND: " + fieldName);
+            return null;
+        }
+
+        FactoryOutputConfiguration conf = FactoryOutputConfiguration.read(factory, outputType);
+
+        if (!isConfigurable(factory, outputType, fieldName, conf.defaultFieldsConfigurable, conf.configurations))
+            return null;
+
+        FieldInfo field = fi.get();
+
+        if (field.isImmutable())
+            return immutables;
+        return configurables;
+    }
+
+    public static String getConfiguredObjectId(String pid) {
+        ServiceReference ref = null;
+        try {
+            ref =
+                    ObjectConfigHelper.getInstance().getReference(ConfigurationAdmin.class);
+            ConfigurationAdmin configurationAdmin = ObjectConfigHelper.getInstance().getService(ref);
+
+            Configuration configuration = configurationAdmin.getConfiguration(pid, "?");
+            if (configuration == null)
+                return null;
+
+            String configuredId = configuration.getProperties().get(CONFIG_ID_FIELD_NAME).toString();
+            String configuredType = configuration.getProperties().get(CONFIG_TYPE_FIELD_NAME).toString();
+
+            if (!CommonUtils.isValid(configuredId) || !CommonUtils.isValid(configuredType))
+                return null;
+
+            return configuredId + ":" + configuredType;
+
+        } catch (Exception e) {
+            return null;
+        } finally {
+            ObjectConfigHelper.getInstance().ungetService(ref);
+        }
+    }
+
+    public static class FactoryOutputConfiguration {
+
+        public static FactoryOutputConfiguration read(EntaxyFactory factory, String outputType) {
+
+            FactoryOutputConfiguration result = new FactoryOutputConfiguration();
+
+            OutputInfo oi = factory.getOutputByType(outputType);
+            if (oi == null)
+                oi = factory.getDefaultOutput();
+
+            Map outputConfig = oi.getConfig();
+
+            result.isConfigurable = false;
+            try {
+                result.isConfigurable = (Boolean) outputConfig.get(ObjectConfig.CONFIGURABLE_ATTRIBUTE_NAME);
+            } catch (Exception e) {
+                log.trace("Parameter [{}] not found in [{}]:[{}]", ObjectConfig.CONFIGURABLE_ATTRIBUTE_NAME,
+                        factory.getId(), outputType);
+            }
+            if (!result.isConfigurable)
+                return result;
+
+            result.defaultFieldsConfigurable = false;
+            try {
+                result.defaultFieldsConfigurable =
+                        (Boolean) outputConfig.get(ObjectConfig.DEFAULT_FIELDS_CONFIGURABLE_ATTRIBUTE_NAME);
+            } catch (Exception e) {
+                log.trace("Parameter [{}] not found in [{}]:[{}]",
+                        ObjectConfig.DEFAULT_FIELDS_CONFIGURABLE_ATTRIBUTE_NAME, factory.getId(), outputType);
+            }
+
+            result.configurations = new ArrayList<>();
+
+            Object configuration = outputConfig.get(ObjectConfig.CONFIGURABLE_FIELDS_ATTRIBUTE_NAME);
+            if (configuration != null) {
+                if (configuration instanceof List) {
+                    List configList = (List) configuration;
+                    for (Object configItem : configList) {
+                        if (configItem instanceof Map) {
+                            ObjectConfig.ConfigurableFieldsConfiguration cnf =
+                                    ObjectConfig.ConfigurableFieldsConfiguration.read((Map) configItem);
+                            result.configurations.add(cnf);
+                        }
+                    }
+                } else if (configuration instanceof Map) {
+                    ObjectConfig.ConfigurableFieldsConfiguration cnf =
+                            ObjectConfig.ConfigurableFieldsConfiguration.read((Map) configuration);
+                    result.configurations.add(cnf);
+                }
+            } else {
+                result.configurations.add(new ObjectConfig.ConfigurableFieldsConfiguration());
+            }
+
+            return result;
+        }
+
+        public boolean isConfigurable;
+        public boolean defaultFieldsConfigurable;
+        public List configurations;
+
+    }
+
+    public static class ConfigurableFieldsConfiguration {
+
+        public static ConfigurableFieldsConfiguration read(Map parameters) {
+            JsonElement obj = GSON.toJsonTree(parameters);
+            if (obj.isJsonObject()) {
+                ConfigurableFieldsConfiguration result = GSON.fromJson(obj, ConfigurableFieldsConfiguration.class);
+                return result;
+            }
+            return null;
+        }
+
+
+        List includeNames = new ArrayList<>();
+        List includePatterns = new ArrayList<>();
+        List excludeNames = new ArrayList<>();
+        List excludePatterns = new ArrayList<>();
+
+        List includeTypes = new ArrayList<>();
+        List excludeTypes = new ArrayList<>();
+
+        public ConfigurableFieldsConfiguration() {
+            includeTypes.add("string");
+            includeTypes.add("boolean");
+            includeTypes.add("number");
+            includePatterns.add("*");
+        }
+
+
+        public boolean isConfigurable(EntaxyFactory factory, String outputType, String fieldName) {
+            Optional fi = factory.getOutputByType(outputType).getFields().stream()
+                    .filter(f -> f.getName().equals(fieldName)).findFirst();
+            if (!fi.isPresent())
+                return false;
+
+            String fieldType = fi.get().getType().toLowerCase();
+
+
+            boolean fieldIsExcluded = false;
+            for (String name : excludeNames)
+                if (fieldName.equals(name)) {
+                    fieldIsExcluded = true;
+                    break;
+                }
+
+            if (!fieldIsExcluded) {
+                for (String pattern : excludePatterns) {
+                    if (Pattern.matches(EntaxyProducerUtils.toRegexPattern(pattern), fieldName)) {
+                        fieldIsExcluded = true;
+                        break;
+                    }
+                }
+            }
+
+
+            if (!fieldIsExcluded) {
+                for (String type : excludeTypes)
+                    if (type.equals(fieldType)) {
+                        fieldIsExcluded = true;
+                        break;
+                    }
+            }
+
+            if (fieldIsExcluded)
+                return false;
+
+            boolean fieldIsIncluded = false;
+
+            // first we check types
+            if (!fieldIsIncluded) {
+                for (String type : includeTypes)
+                    if (type.equals(fieldType)) {
+                        fieldIsIncluded = true;
+                        break;
+                    }
+            }
+            if (!fieldIsIncluded)
+                return false;
+
+            if (!includeNames.isEmpty() || !includePatterns.isEmpty())
+                fieldIsIncluded = false;
+
+            for (String name : includeNames)
+                if (fieldName.equals(name)) {
+                    fieldIsIncluded = true;
+                    break;
+                }
+
+            if (!fieldIsIncluded) {
+                for (String pattern : includePatterns) {
+                    if (Pattern.matches(EntaxyProducerUtils.toRegexPattern(pattern), fieldName)) {
+                        fieldIsIncluded = true;
+                        break;
+                    }
+                }
+            }
+
+            return fieldIsIncluded;
+        }
+    }
+
+    public static class ConfigHint {
+
+        public static final String CONFIG_HINT_SECTION_FIELDS = "fields";
+
+        protected Map configHint = new HashMap<>();
+
+        public Map getAsMap() {
+            return configHint;
+        }
+
+        public JsonElement getAsJson() {
+            return JSONUtils.GSON.toJsonTree(configHint);
+        }
+
+        public String getAsJsonString() {
+            return getAsJson().toString();
+        }
+
+        public void generate(Map configProperties, String factoryId, String outputType) {
+
+            Map fieldsHint = generateFieldsHint(configProperties, factoryId, outputType);
+            if (fieldsHint != null)
+                configHint.put(CONFIG_HINT_SECTION_FIELDS, fieldsHint);
+
+        }
+
+        public void readFrom(TypedProperties typedProperties) {
+            if (typedProperties.containsKey(CONFIG_HINT_FIELD_NAME)) {
+                String encoded = typedProperties.get(CONFIG_HINT_FIELD_NAME).toString();
+                String hintString = new String(Base64.getDecoder().decode(encoded));
+                read(hintString);
+            }
+        }
+
+        public void read(String hintString) {
+            this.configHint = JSONUtils.element2map(JSONUtils.getJsonRootObject(hintString));
+        }
+
+        protected Map generateFieldsHint(Map configProperties, String factoryId,
+                String outputType) {
+
+            Map result = new HashMap<>();
+
+            try {
+
+                ServiceReference ref =
+                        ObjectConfigHelper.getInstance().getReference(EntaxyProducerService.class);
+                if (ref != null) {
+                    EntaxyProducerService entaxyProducerService = ObjectConfigHelper.getInstance().getService(ref);
+
+                    EntaxyFactory factory = entaxyProducerService.findFactoryById(factoryId);
+                    if (factory == null) {
+                        log.error("Factory not found: [{}]", factoryId);
+                        return null;
+                    }
+
+                    OutputInfo outputInfo = null;
+
+                    if (CommonUtils.isValid(outputType)) {
+                        outputInfo = factory.getOutputByType(outputType);
+                    } else {
+                        outputInfo = factory.getDefaultOutput();
+                    }
+                    if (outputInfo == null) {
+                        log.error("Output [{}] not found in factory [{}]", outputType, factoryId);
+                        return null;
+                    }
+
+                    for (FieldInfo fi : outputInfo.getFields()) {
+                        if (configProperties.containsKey(fi.getName())) {
+                            ConfigFieldHint fieldHint = ConfigFieldHint.create(fi);
+                            result.put(fieldHint.getName(), (Map) fieldHint);
+                        }
+                    }
+
+                    ObjectConfigHelper.getInstance().ungetService(ref);
+
+                    for (String name : ObjectConfig.CONFIG_INTERNAL_FIELDS) {
+                        ConfigFieldHint fieldHint = new ConfigFieldHint(name);
+                        fieldHint.setInternal(true);
+                        result.put(name, (Map) fieldHint);
+                    }
+
+                }
+
+                return result;
+
+            } catch (Exception e) {
+                return null;
+            }
+        }
+
+        public Map getFieldsHint() {
+            if (configHint.containsKey(CONFIG_HINT_SECTION_FIELDS)) {
+                Object obj = configHint.get(CONFIG_HINT_SECTION_FIELDS);
+                if (obj instanceof Map) {
+                    Map fieldHints = (Map) obj;
+                    Map result = new HashMap<>();
+
+                    for (String name : fieldHints.keySet()) {
+                        ConfigFieldHint fieldHint = new ConfigFieldHint(name);
+                        fieldHint.load((Map) fieldHints.get(name));
+                        result.put(name, fieldHint);
+                    }
+
+                    return result;
+                }
+            }
+            return new HashMap<>();
+        }
+
+    }
+
+    public static class ConfigFieldHint extends HashMap {
+
+        private static final long serialVersionUID = 1L;
+
+        public static final String CONFIG_FIELD_IS_INTERNAL = "isInternal";
+
+        public static ConfigFieldHint create(FieldInfo fieldInfo) {
+            ConfigFieldHint result = new ConfigFieldHint(fieldInfo.getName());
+
+            result.setType(fieldInfo.getType());
+            result.setDisplayName(fieldInfo.getDisplayName());
+            result.setDescription(fieldInfo.getDescription());
+            result.setInternal(false);
+
+            return result;
+
+        }
+
+        public ConfigFieldHint(String name) {
+            super();
+            setName(name);
+        }
+
+        String name;
+
+        public void load(Map data) {
+            this.putAll(data);
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String name) {
+            this.name = name;
+        }
+
+        public String getDisplayName() {
+            Object displayName = getOrDefault(EntaxyFactory.CONFIGURATION.FIELDS.ATTRIBUTES.FIELD_DISPLAY_NAME, "");
+            return displayName != null ? displayName.toString() : "";
+        }
+
+        public void setDisplayName(String displayName) {
+            put(EntaxyFactory.CONFIGURATION.FIELDS.ATTRIBUTES.FIELD_DISPLAY_NAME, displayName);
+        }
+
+        public String getType() {
+            return getOrDefault(EntaxyFactory.CONFIGURATION.FIELDS.ATTRIBUTES.FIELD_TYPE, "String").toString();
+        }
+
+        public void setType(String type) {
+            put(EntaxyFactory.CONFIGURATION.FIELDS.ATTRIBUTES.FIELD_TYPE, type);
+        }
+
+        public String getDescription() {
+            return getOrDefault(EntaxyFactory.CONFIGURATION.FIELDS.ATTRIBUTES.FIELD_DESCRIPTION, "").toString();
+        }
+
+        public void setDescription(String description) {
+            put(EntaxyFactory.CONFIGURATION.FIELDS.ATTRIBUTES.FIELD_DESCRIPTION, description);
+        }
+
+        public boolean isInternal() {
+            return (Boolean) getOrDefault(CONFIG_FIELD_IS_INTERNAL, false);
+        }
+
+        public void setInternal(boolean isInternal) {
+            put(CONFIG_FIELD_IS_INTERNAL, isInternal);
+        }
+
+    }
+
+}
diff --git a/platform/runtime/core/objects-implementations/config-implementation/config-runtime/src/main/java/ru/entaxy/platform/config/runtime/ObjectConfigCustomizer.java b/platform/runtime/core/objects-implementations/config-implementation/config-runtime/src/main/java/ru/entaxy/platform/config/runtime/ObjectConfigCustomizer.java
new file mode 100644
index 00000000..fece7c29
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/config-implementation/config-runtime/src/main/java/ru/entaxy/platform/config/runtime/ObjectConfigCustomizer.java
@@ -0,0 +1,55 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * config-runtime
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.config.runtime;
+
+import org.osgi.service.component.annotations.Component;
+
+import ru.entaxy.platform.base.objects.EntaxyObject;
+import ru.entaxy.platform.objects.runtime.EntaxyObjectCustomizer;
+
+@Component(service = EntaxyObjectCustomizer.class, immediate = true)
+public class ObjectConfigCustomizer implements EntaxyObjectCustomizer {
+
+    @Override
+    public boolean isAccepted(EntaxyObject entaxyObject) {
+        return entaxyObject.getType().equals(ObjectConfig.CONFIG_OBJECT_TYPE);
+    }
+
+    @Override
+    public EntaxyObject applyCustomization(EntaxyObject entaxyObject) {
+        if (entaxyObject instanceof ConfigEntaxyObjectWrapped)
+            return entaxyObject;
+        return new ConfigEntaxyObject(entaxyObject);
+    }
+
+    @Override
+    public EntaxyObject unapplyCustomization(EntaxyObject entaxyObject) {
+        if (entaxyObject instanceof ConfigEntaxyObjectWrapped)
+            return ((ConfigEntaxyObjectWrapped) entaxyObject).getOrigin();
+        return entaxyObject;
+    }
+
+}
diff --git a/platform/runtime/core/objects-implementations/config-implementation/config-runtime/src/main/java/ru/entaxy/platform/config/runtime/ObjectConfigEditor.java b/platform/runtime/core/objects-implementations/config-implementation/config-runtime/src/main/java/ru/entaxy/platform/config/runtime/ObjectConfigEditor.java
new file mode 100644
index 00000000..1047da09
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/config-implementation/config-runtime/src/main/java/ru/entaxy/platform/config/runtime/ObjectConfigEditor.java
@@ -0,0 +1,209 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * config-runtime
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.config.runtime;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.math.NumberUtils;
+import org.apache.felix.utils.properties.TypedProperties;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+import ru.entaxy.platform.base.support.CommonUtils;
+import ru.entaxy.platform.config.runtime.ObjectConfig.ConfigFieldHint;
+
+public class ObjectConfigEditor {
+
+    public static ObjectConfigEditor create(File configFile) throws IOException {
+        return new ObjectConfigEditor(configFile);
+    }
+
+    protected String pid;
+
+    protected File configFile;
+
+    protected TypedProperties loadedProperties;
+
+    protected ObjectConfig.ConfigHint configHint = new ObjectConfig.ConfigHint();
+
+    protected TypedProperties modifiedProperties = new TypedProperties();
+
+    protected Map currentProperties = new HashMap<>();
+
+    protected Map fieldHints = new HashMap<>();
+
+    protected ObjectConfigEditor(File configFile) throws IOException {
+        super();
+        this.configFile = configFile;
+        loadedProperties = new TypedProperties();
+        loadedProperties.load(configFile);
+        configHint.readFrom(loadedProperties);
+        fieldHints = configHint.getFieldsHint();
+    }
+
+    public void loadCurrent(String pid) throws Exception {
+        ServiceReference ref = null;
+        try {
+            ref = ObjectConfigHelper.getInstance().getReference(ConfigurationAdmin.class);
+            ConfigurationAdmin configurationAdmin = ObjectConfigHelper.getInstance().getService(ref);
+
+            int pos = pid.indexOf('~');
+            if (pos >= 0) {
+                pid = pid.substring(0, pos);
+            }
+            Configuration configuration = configurationAdmin.getConfiguration(pid, "?");
+
+            currentProperties.clear();
+            if (configuration.getProperties() == null) {
+                return;
+            }
+            Enumeration keys = configuration.getProperties().keys();
+            while (keys.hasMoreElements()) {
+                String key = keys.nextElement();
+                currentProperties.put(key, configuration.getProperties().get(key));
+            }
+
+        } finally {
+            if (ref != null)
+                ObjectConfigHelper.getInstance().ungetService(ref);
+        }
+
+    }
+
+    public boolean isDirty() {
+        return !modifiedProperties.isEmpty();
+    }
+
+    public Set getPropertiesNames() {
+        Set result = new HashSet<>();
+        result.addAll(loadedProperties.keySet());
+        result.addAll(currentProperties.keySet());
+
+        // remove hint field itself
+        result.remove(ObjectConfig.CONFIG_HINT_FIELD_NAME);
+        // remove felix property
+        result.remove("felix.fileinstall.filename");
+        // remove osgi properties
+        result.remove(Constants.SERVICE_PID);
+
+
+        return result;
+    }
+
+    public ConfigProperty getAsConfigProperty(String name) {
+        if (!getPropertiesNames().contains(name))
+            return null;
+        ConfigProperty result = new ConfigProperty(name);
+        if (loadedProperties.containsKey(name))
+            result.configValue = loadedProperties.get(name);
+        if (currentProperties.containsKey(name))
+            result.currentValue = currentProperties.get(name);
+        if (modifiedProperties.containsKey(name))
+            result.modifiedValue = modifiedProperties.get(name);
+        if (fieldHints.containsKey(name))
+            result.hint = fieldHints.get(name);
+        return result;
+    }
+
+    public void setValue(String propertyName, String propertyValue) throws Exception {
+        if (!loadedProperties.containsKey(propertyName) && !currentProperties.containsKey(propertyName))
+            throw new IllegalArgumentException("Unknown property: [" + propertyName + "]");
+        ConfigProperty property = getAsConfigProperty(propertyName);
+        String dataType = CommonUtils.getValid(property.hint.getType(), "string").toLowerCase();
+
+        Object valueToSet = propertyValue;
+
+        if ("boolean".equals(dataType)) {
+            try {
+                valueToSet = Boolean.parseBoolean(propertyValue);
+            } catch (Exception e) {
+                valueToSet = Boolean.FALSE;
+            }
+        } else if ("number".equals(valueToSet)) {
+            try {
+                valueToSet = NumberUtils.createNumber(propertyValue);
+            } catch (Exception e) {
+                valueToSet = 0;
+            }
+
+        }
+
+        modifiedProperties.put(propertyName, valueToSet);
+
+    }
+
+    public File getConfigFile() {
+        return configFile;
+    }
+
+    public void save() throws IOException {
+        if (!isDirty())
+            return;
+        loadedProperties.putAll(modifiedProperties);
+        loadedProperties.save(configFile);
+    }
+
+    public void clear() {
+        FileUtils.deleteQuietly(configFile);
+    }
+
+    public String getPid() {
+        return pid;
+    }
+
+    public void setPid(String pid) {
+        this.pid = pid;
+    }
+
+    public static class ConfigProperty {
+        public ConfigFieldHint hint;
+        public Object configValue = null;
+        public Object currentValue = null;
+        public Object modifiedValue = null;
+
+        public String name;
+
+        public ConfigProperty(String name) {
+            this.name = name;
+            this.hint = new ConfigFieldHint(name);
+        }
+
+        public boolean isDirty() {
+            return modifiedValue != null;
+        }
+
+    }
+
+}
diff --git a/platform/runtime/core/objects-implementations/config-implementation/config-runtime/src/main/java/ru/entaxy/platform/config/runtime/ObjectConfigHelper.java b/platform/runtime/core/objects-implementations/config-implementation/config-runtime/src/main/java/ru/entaxy/platform/config/runtime/ObjectConfigHelper.java
new file mode 100644
index 00000000..411aa4e7
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/config-implementation/config-runtime/src/main/java/ru/entaxy/platform/config/runtime/ObjectConfigHelper.java
@@ -0,0 +1,100 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * object-producing-config-support
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.config.runtime;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+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.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+
+import ru.entaxy.platform.base.objects.EntaxyObject;
+import ru.entaxy.platform.base.objects.EntaxyObjectService;
+import ru.entaxy.platform.core.producer.executor.objectmodel.FactoredObjectRef;
+
+@Component(service = ObjectConfigHelper.class, immediate = true)
+public class ObjectConfigHelper {
+
+    private static ObjectConfigHelper _INSTANCE = null;
+
+    public static ObjectConfigHelper getInstance() {
+        return _INSTANCE;
+    }
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    EntaxyObjectService entaxyObjectService;
+
+    public BundleContext bundleContext;
+
+    public ObjectConfigHelper() {
+        super();
+        _INSTANCE = this;
+    }
+
+    @Activate
+    public void activate(ComponentContext componentContext) {
+        this.bundleContext = componentContext.getBundleContext();
+    }
+
+    @Deactivate
+    public void deactivate() {
+
+    }
+
+    public EntaxyObject findObject(String objectId, String objectType) {
+        return entaxyObjectService.findObject(objectId, objectType);
+    }
+
+    public boolean isDirectValueOnly(FactoredObjectRef ref) {
+        if (!ref.origin.has(ObjectConfig.DIRECT_VALUE_ONLY_ATTR_NAME))
+            return false;
+        try {
+            return ref.origin.get(ObjectConfig.DIRECT_VALUE_ONLY_ATTR_NAME).getAsBoolean();
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+    public  ServiceReference getReference(Class clazz) {
+        if (bundleContext == null)
+            return null;
+        return bundleContext.getServiceReference(clazz);
+    }
+
+    public  T getService(ServiceReference ref) {
+        return (T) bundleContext.getService(ref);
+    }
+
+    public void ungetService(ServiceReference ref) {
+        if (bundleContext == null)
+            return;
+        bundleContext.ungetService(ref);
+    }
+
+}
diff --git a/platform/runtime/core/objects-implementations/config-implementation/pom.xml b/platform/runtime/core/objects-implementations/config-implementation/pom.xml
new file mode 100644
index 00000000..7bcf31f1
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/config-implementation/pom.xml
@@ -0,0 +1,16 @@
+
+  4.0.0
+  
+    ru.entaxy.esb.platform.runtime.core
+    objects-implementations
+    1.11.0
+  
+  ru.entaxy.esb.platform.runtime.core.objects-implementations
+  config-implementation
+  pom
+  ENTAXY  :: PLATFORM :: CORE :: OBJECTS IMPLEMENTATIONS :: CONFIG
+  ENTAXY  :: PLATFORM :: CORE :: OBJECTS IMPLEMENTATIONS :: CONFIG  
+  
+  	config-runtime
+  
+
diff --git a/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/pom.xml b/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/pom.xml
index 8fa017c8..4b8c1402 100644
--- a/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/pom.xml
+++ b/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/pom.xml
@@ -3,7 +3,7 @@
   
     ru.entaxy.esb.platform.runtime.core.objects-implementations
     connection-implementation
-    1.10.0
+    1.11.0
   
   ru.entaxy.esb.platform.runtime.core.objects-implementations.connection-implementation
   connection-producing
diff --git a/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/ConnectionProducer.java b/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/ConnectionProducer.java
index 73814ec0..89521635 100644
--- a/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/ConnectionProducer.java
+++ b/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/ConnectionProducer.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * connection-producing
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/AdapterWrapManager.java b/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/AdapterWrapManager.java
index 22bf3ded..c8fa1058 100644
--- a/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/AdapterWrapManager.java
+++ b/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/AdapterWrapManager.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * connection-producing
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/AdapterWrapperDefaultFactory.java b/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/AdapterWrapperDefaultFactory.java
index 169f5f00..546c1216 100644
--- a/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/AdapterWrapperDefaultFactory.java
+++ b/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/AdapterWrapperDefaultFactory.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * connection-producing
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/AdapterWrapperEntaxyFactory.java b/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/AdapterWrapperEntaxyFactory.java
index 5412e766..cb4db50e 100644
--- a/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/AdapterWrapperEntaxyFactory.java
+++ b/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/AdapterWrapperEntaxyFactory.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * connection-producing
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/AdapterWrapperGenerationProcessor.java b/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/AdapterWrapperGenerationProcessor.java
index 1a35eb5f..d43841a3 100644
--- a/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/AdapterWrapperGenerationProcessor.java
+++ b/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/AdapterWrapperGenerationProcessor.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * connection-producing
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/ConfigConverter.java b/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/ConfigConverter.java
index 89677078..af99a11b 100644
--- a/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/ConfigConverter.java
+++ b/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/ConfigConverter.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * connection-producing
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/TrackedAdapter.java b/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/TrackedAdapter.java
index 1ebef02e..a9afb33c 100644
--- a/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/TrackedAdapter.java
+++ b/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/TrackedAdapter.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * connection-producing
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/TrackedAdapterCustomizer.java b/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/TrackedAdapterCustomizer.java
index 19dd9941..28050358 100644
--- a/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/TrackedAdapterCustomizer.java
+++ b/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/TrackedAdapterCustomizer.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * connection-producing
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/TrackedAdapterCustomizerListener.java b/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/TrackedAdapterCustomizerListener.java
index 5c7bab8d..fc4db492 100644
--- a/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/TrackedAdapterCustomizerListener.java
+++ b/platform/runtime/core/objects-implementations/connection-implementation/connection-producing/src/main/java/ru/entaxy/platform/base/objects/connection/producing/adapters/TrackedAdapterCustomizerListener.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * connection-producing
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/objects-implementations/connection-implementation/pom.xml b/platform/runtime/core/objects-implementations/connection-implementation/pom.xml
index 0e8a2b73..86b80812 100644
--- a/platform/runtime/core/objects-implementations/connection-implementation/pom.xml
+++ b/platform/runtime/core/objects-implementations/connection-implementation/pom.xml
@@ -3,7 +3,7 @@
   
     ru.entaxy.esb.platform.runtime.core
     objects-implementations
-    1.10.0
+    1.11.0
   
   ru.entaxy.esb.platform.runtime.core.objects-implementations
   connection-implementation
diff --git a/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/pom.xml b/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/pom.xml
index c554b98c..c3a2977a 100644
--- a/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/pom.xml
+++ b/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/pom.xml
@@ -4,7 +4,7 @@
   
     ru.entaxy.esb.platform.runtime.core.objects-implementations
     connection-implementation
-    1.10.0
+    1.11.0
   
   ru.entaxy.esb.platform.runtime.core.objects-implementations.connection-implementation
   standard-connections-pack
diff --git a/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/java/ru/entaxy/platform/runtime/connections/file/FileConnectionComponent.java b/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/java/ru/entaxy/platform/runtime/connections/file/FileConnectionComponent.java
index 7c58038b..268aa803 100644
--- a/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/java/ru/entaxy/platform/runtime/connections/file/FileConnectionComponent.java
+++ b/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/java/ru/entaxy/platform/runtime/connections/file/FileConnectionComponent.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * file-adapter
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/java/ru/entaxy/platform/runtime/connections/ftp/FtpConnectionComponent.java b/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/java/ru/entaxy/platform/runtime/connections/ftp/FtpConnectionComponent.java
index 3b8ba963..2ca154b4 100644
--- a/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/java/ru/entaxy/platform/runtime/connections/ftp/FtpConnectionComponent.java
+++ b/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/java/ru/entaxy/platform/runtime/connections/ftp/FtpConnectionComponent.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * file-adapter
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/java/ru/entaxy/platform/runtime/connections/ftps/FtpsConnectionComponent.java b/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/java/ru/entaxy/platform/runtime/connections/ftps/FtpsConnectionComponent.java
new file mode 100644
index 00000000..6b712f94
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/java/ru/entaxy/platform/runtime/connections/ftps/FtpsConnectionComponent.java
@@ -0,0 +1,130 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * file-adapter
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.runtime.connections.ftps;
+
+import org.apache.camel.ExtendedCamelContext;
+import org.apache.camel.component.file.GenericFileEndpoint;
+import org.apache.camel.component.file.remote.FtpsComponent;
+import org.apache.camel.spi.PropertyConfigurer;
+import org.apache.commons.net.ftp.FTPFile;
+import ru.entaxy.platform.base.support.CommonUtils;
+
+import java.util.Map;
+
+public class FtpsConnectionComponent extends FtpsComponent {
+
+    private static final String COMPONENT_CONFIGURER = "ftps-component-configurer";
+    private static final String ENDPOINT_CONFIGURER = "ftps-endpoint-configurer";
+    private static final String PATH_PLACEHOLDER = "PATH_PLACEHOLDER";
+
+    protected String username = "";
+    protected String password = "";
+    protected String host = "";
+    protected String port = "";
+    protected String directoryName = "";
+
+    private volatile PropertyConfigurer componentPropertyConfigurerLocal;
+    private volatile PropertyConfigurer endpointPropertyConfigurerLocal;
+
+    @Override
+    protected void doBuild() {
+
+        componentPropertyConfigurerLocal = getCamelContext().adapt(ExtendedCamelContext.class).getConfigurerResolver()
+                .resolvePropertyConfigurer(COMPONENT_CONFIGURER, getCamelContext());
+        log.debug("componentPropertyConfigurerLocal: {}", componentPropertyConfigurerLocal);
+
+        endpointPropertyConfigurerLocal = getCamelContext().adapt(ExtendedCamelContext.class).getConfigurerResolver()
+                .resolvePropertyConfigurer(ENDPOINT_CONFIGURER, getCamelContext());
+        log.debug("endpointPropertyConfigurerLocal: {}", endpointPropertyConfigurerLocal);
+    }
+
+    protected GenericFileEndpoint createEndpoint(String uri, String remaining, Map parameters)
+            throws Exception {
+
+        // doBuild method called to force configurer initialization (doBuild not invoked in some scenario)
+        doBuild();
+        uri = uri.replace(PATH_PLACEHOLDER, buildPath());
+        log.debug("CREATING ENDPOINT FOR [{}]", uri);
+        if (CommonUtils.isValid(username)) {
+            parameters.put("username", username);
+        }
+        if (CommonUtils.isValid(password)) {
+            parameters.put("password", password);
+        }
+
+        return super.createEndpoint(uri, remaining, parameters);
+    }
+
+    private String buildPath() {
+
+        StringBuilder path = new StringBuilder();
+
+        if (CommonUtils.isValid(host)) {
+            path.append(host.trim());
+        }
+        if (CommonUtils.isValid(port)) {
+            path.append(":");
+            path.append(port.trim());
+        }
+        if (CommonUtils.isValid(directoryName)) {
+            if (!directoryName.startsWith("/")) {
+                path.append("/");
+            }
+            path.append(directoryName.trim());
+        }
+        return path.toString();
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public void setHost(String host) {
+        this.host = host;
+    }
+
+    public void setPort(String port) {
+        this.port = port;
+    }
+
+    public void setDirectoryName(String directoryName) {
+        this.directoryName = directoryName;
+    }
+
+    @Override
+    public PropertyConfigurer getComponentPropertyConfigurer() {
+        return componentPropertyConfigurerLocal;
+    }
+
+    @Override
+    public PropertyConfigurer getEndpointPropertyConfigurer() {
+        return endpointPropertyConfigurerLocal;
+    }
+}
diff --git a/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/java/ru/entaxy/platform/runtime/connections/sftp/SftpConnectionComponent.java b/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/java/ru/entaxy/platform/runtime/connections/sftp/SftpConnectionComponent.java
index 9d2726ad..aff50657 100644
--- a/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/java/ru/entaxy/platform/runtime/connections/sftp/SftpConnectionComponent.java
+++ b/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/java/ru/entaxy/platform/runtime/connections/sftp/SftpConnectionComponent.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * file-adapter
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/resources/ru/entaxy/factory/ftps-connection.json b/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/resources/ru/entaxy/factory/ftps-connection.json
new file mode 100644
index 00000000..9cdb97a7
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/resources/ru/entaxy/factory/ftps-connection.json
@@ -0,0 +1,2442 @@
+{
+  "factory": {
+    "id": "ftps-connection",
+    "type": "entaxy.runtime.connection",
+    "parent": "remote-file-abstract-connection",
+    "isAbstract": false,
+    "camelOriginComponent": "ftps",
+    "label": "ftps",
+    "description": "This component provides access to remote file systems over the FTP and SFTP protocols. For more details see Camel docs",
+    "displayName": "FTPS",
+    "camelOrigin": "camel-ftp",
+    "camelOriginJavaType": "org.apache.camel.component.file.remote.FtpsComponent"
+  },
+  "entaxy.runtime.connection": {},
+  "fields": {
+    "useGlobalSslContextParameters": {
+      "displayName": "Use Global Ssl Context Parameters",
+      "description": "Enable usage of global SSL context parameters. For more details see Camel docs",
+      "label": "security",
+      "type": "boolean",
+      "kind": "property",
+      "required": false,
+      "hidden": false,
+      "defaultValue": false,
+      "group": "security",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "boolean",
+        "deprecated": false
+      }
+    },
+    "transferLoggingIntervalSeconds": {
+      "displayName": "Transfer Logging Interval Seconds",
+      "description": "Configures the interval in seconds to use when logging the progress of upload and download operations that are in-flight. This is used for logging progress when operations takes longer time. For more details see Camel docs",
+      "label": "common",
+      "type": "number",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "defaultValue": 5,
+      "group": "common",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "int",
+        "deprecated": false
+      }
+    },
+    "transferLoggingLevel": {
+      "displayName": "Transfer Logging Level",
+      "description": "Configure the logging level to use when logging the progress of upload and download operations. For more details see Camel docs",
+      "label": "common",
+      "type": "object",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "defaultValue": "DEBUG",
+      "group": "common",
+      "@TYPEINFO": {
+        "type": "enum",
+        "values": [
+          "TRACE",
+          "DEBUG",
+          "INFO",
+          "WARN",
+          "ERROR",
+          "OFF"
+        ]
+      },
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "org.apache.camel.LoggingLevel",
+        "deprecated": false
+      }
+    },
+    "transferLoggingVerbose": {
+      "displayName": "Transfer Logging Verbose",
+      "description": "Configures whether the perform verbose (fine grained) logging of the progress of upload and download operations. For more details see Camel docs",
+      "label": "common",
+      "type": "boolean",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "defaultValue": false,
+      "group": "common",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "boolean",
+        "deprecated": false
+      }
+    },
+    "resumeDownload": {
+      "displayName": "Resume Download",
+      "description": "Configures whether resume download is enabled. This must be supported by the FTP server (almost all FTP servers support it). In addition the options localWorkDirectory must be configured so downloaded files are stored in a local directory, and the option binary must be enabled, which is required to support resuming of downloads. For more details see Camel docs",
+      "label": "consumer",
+      "type": "boolean",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "defaultValue": false,
+      "group": "consumer",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "boolean",
+        "deprecated": false
+      }
+    },
+    "handleDirectoryParserAbsoluteResult": {
+      "displayName": "Handle Directory Parser Absolute Result",
+      "description": "Allows you to set how the consumer will handle subfolders and files in the path if the directory parser results in with absolute paths The reason for this is that some FTP servers may return file names with absolute paths, and if so then the FTP component needs to handle this by converting the returned path into a relative path. For more details see Camel docs",
+      "label": "consumer,advanced",
+      "type": "boolean",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "defaultValue": false,
+      "group": "consumer (advanced)",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "boolean",
+        "deprecated": false,
+        "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+        "configurationField": "configuration"
+      }
+    },
+    "activePortRange": {
+      "displayName": "Active Port Range",
+      "description": "Set the client side port range in active mode. The syntax is: minPort-maxPort Both port numbers are inclusive, eg 10000-19999 to include all 1xxxx ports. For more details see Camel docs",
+      "label": "advanced",
+      "type": "string",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "advanced",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "java.lang.String",
+        "deprecated": false,
+        "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+        "configurationField": "configuration"
+      }
+    },
+    "bufferSize": {
+      "displayName": "Buffer Size",
+      "description": "Buffer size in bytes used for writing files (or in case of FTP for downloading and uploading files). For more details see Camel docs",
+      "label": "advanced",
+      "type": "number",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "defaultValue": 131072,
+      "group": "advanced",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "int",
+        "deprecated": false
+      }
+    },
+    "ftpClient": {
+      "displayName": "Ftp Client",
+      "description": "To use a custom instance of FTPClient. For more details see Camel docs",
+      "label": "advanced",
+      "type": "object",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "advanced",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "org.apache.commons.net.ftp.FTPClient",
+        "deprecated": false
+      }
+    },
+    "ftpClientConfig": {
+      "displayName": "Ftp Client Config",
+      "description": "To use a custom instance of FTPClientConfig to configure the FTP client the endpoint should use. For more details see Camel docs",
+      "label": "advanced",
+      "type": "object",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "advanced",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "org.apache.commons.net.ftp.FTPClientConfig",
+        "deprecated": false
+      }
+    },
+    "ftpClientConfigParameters": {
+      "displayName": "Ftp Client Config Parameters",
+      "description": "Used by FtpComponent to provide additional parameters for the FTPClientConfig. For more details see Camel docs",
+      "label": "advanced",
+      "type": "object",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "advanced",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "java.util.Map\u003cjava.lang.String, java.lang.Object\u003e",
+        "prefix": "ftpClientConfig.",
+        "multiValue": true,
+        "deprecated": false
+      }
+    },
+    "ftpClientParameters": {
+      "displayName": "Ftp Client Parameters",
+      "description": "Used by FtpComponent to provide additional parameters for the FTPClient. For more details see Camel docs",
+      "label": "advanced",
+      "type": "object",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "advanced",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "java.util.Map\u003cjava.lang.String, java.lang.Object\u003e",
+        "prefix": "ftpClient.",
+        "multiValue": true,
+        "deprecated": false
+      }
+    },
+    "siteCommand": {
+      "displayName": "Site Command",
+      "description": "Sets optional site command(s) to be executed after successful login. Multiple site commands can be separated using a new line character. For more details see Camel docs",
+      "label": "advanced",
+      "type": "string",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "advanced",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "java.lang.String",
+        "deprecated": false,
+        "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+        "configurationField": "configuration"
+      }
+    },
+    "account": {
+      "displayName": "Account",
+      "description": "Account to use for login. For more details see Camel docs",
+      "label": "security",
+      "type": "string",
+      "kind": "parameter",
+      "required": false,
+      "hidden": true,
+      "group": "security",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "java.lang.String",
+        "deprecated": false,
+        "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+        "configurationField": "configuration"
+      }
+    },
+    "disableSecureDataChannelDefaults": {
+      "displayName": "Disable Secure Data Channel Defaults",
+      "description": "Use this option to disable default options when using secure data channel. This allows you to be in full control what the execPbsz and execProt setting should be used. Default is false. For more details see Camel docs",
+      "label": "security",
+      "type": "boolean",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "defaultValue": false,
+      "group": "security",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "boolean",
+        "deprecated": false,
+        "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+        "configurationField": "configuration"
+      }
+    },
+    "execPbsz": {
+      "displayName": "Exec Pbsz",
+      "description": "When using secure data channel you can set the exec protection buffer size. For more details see Camel docs",
+      "label": "security",
+      "type": "number",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "security",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "java.lang.Long",
+        "deprecated": false,
+        "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+        "configurationField": "configuration"
+      }
+    },
+    "execProt": {
+      "displayName": "Exec Prot",
+      "description": "The exec protection level PROT command. C - Clear S - Safe(SSL protocol only) E - Confidential(SSL protocol only) P - Private. For more details see Camel docs",
+      "label": "security",
+      "type": "string",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "security",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "java.lang.String",
+        "deprecated": false,
+        "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+        "configurationField": "configuration"
+      }
+    },
+    "ftpClientKeyStoreParameters": {
+      "displayName": "Ftp Client Key Store Parameters",
+      "description": "Set the key store parameters. For more details see Camel docs",
+      "label": "security",
+      "type": "object",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "security",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "java.util.Map\u003cjava.lang.String, java.lang.Object\u003e",
+        "prefix": "ftpClient.keyStore.",
+        "multiValue": true,
+        "deprecated": false
+      }
+    },
+    "ftpClientTrustStoreParameters": {
+      "displayName": "Ftp Client Trust Store Parameters",
+      "description": "Set the trust store parameters. For more details see Camel docs",
+      "label": "security",
+      "type": "object",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "security",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "java.util.Map\u003cjava.lang.String, java.lang.Object\u003e",
+        "prefix": "ftpClient.trustStore.",
+        "multiValue": true,
+        "deprecated": false
+      }
+    },
+    "implicit": {
+      "displayName": "Implicit",
+      "description": "Set the security mode (Implicit/Explicit). true - Implicit Mode / False - Explicit Mode. For more details see Camel docs",
+      "label": "security",
+      "type": "boolean",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "defaultValue": false,
+      "group": "security",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "boolean",
+        "deprecated": false,
+        "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+        "configurationField": "configuration"
+      }
+    },
+    "securityProtocol": {
+      "displayName": "Security Protocol",
+      "description": "Set the underlying security protocol. For more details see Camel docs",
+      "label": "security",
+      "type": "string",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "defaultValue": "TLSv1.2",
+      "group": "security",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "java.lang.String",
+        "deprecated": false,
+        "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+        "configurationField": "configuration"
+      }
+    },
+    "sslContextParameters": {
+      "displayName": "Ssl Context Parameters",
+      "description": "Gets the JSSE configuration that overrides any settings in FtpsEndpoint#ftpClientKeyStoreParameters, ftpClientTrustStoreParameters, and FtpsConfiguration#getSecurityProtocol(). For more details see Camel docs",
+      "label": "security",
+      "type": "object",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "security",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "org.apache.camel.support.jsse.SSLContextParameters",
+        "deprecated": false
+      }
+    }
+  },
+  "##camel": {
+    "settings": {
+      "import": {
+        "factory": {
+          "attributes": {
+            "name": [
+              "id",
+              "camelOriginComponent"
+            ],
+            "label": {
+              "target": "label",
+              "replaceIfEmpty": true
+            },
+            "description": {
+              "target": "description",
+              "policy": "firstOnly",
+              "replaceIfEmpty": true
+            },
+            "artifactId": "camelOrigin",
+            "javaType": "camelOriginJavaType"
+          }
+        },
+        "fileds": {
+          "attributes": {
+            "displayName": "displayName",
+            "description": {
+              "target": "description",
+              "policy": "firstOnly"
+            },
+            "label": "label",
+            "type": {
+              "target": "type",
+              "map": {
+                "integer": "number"
+              }
+            },
+            "kind": {
+              "target": "kind",
+              "policy": "both"
+            },
+            "required": "required",
+            "secret": "hidden",
+            "defaultValue": {
+              "target": "defaultValue",
+              "convertTo": "@type"
+            },
+            "group": "group",
+            "enum": {
+              "target": "@TYPEINFO/values",
+              "targetObject": {
+                "@TYPEINFO": {
+                  "type": "enum"
+                }
+              }
+            }
+          }
+        },
+        "outputs": {
+          "init": {
+            "fields": {
+              "@IMPORT": [
+                {
+                  "sourceFactoryId": "#",
+                  "location": "fields",
+                  "prefix": "camel_",
+                  "filter": {
+                    "contains": [
+                      {
+                        "attribute": "kind",
+                        "values": [
+                          "property"
+                        ]
+                      }
+                    ]
+                  }
+                }
+              ]
+            }
+          },
+          "path": {
+            "fields": {
+              "@IMPORT": [
+                {
+                  "sourceFactoryId": "#",
+                  "location": "fields",
+                  "prefix": "camel_",
+                  "filter": {
+                    "contains": [
+                      {
+                        "attribute": "kind",
+                        "values": [
+                          "path"
+                        ]
+                      }
+                    ]
+                  }
+                }
+              ]
+            }
+          },
+          "consumer": {
+            "fields": {
+              "@IMPORT": [
+                {
+                  "sourceFactoryId": "#",
+                  "location": "fields",
+                  "prefix": "camel_",
+                  "filter": {
+                    "contains": [
+                      {
+                        "attribute": "kind",
+                        "values": [
+                          "parameter"
+                        ]
+                      },
+                      {
+                        "attribute": "label",
+                        "inverse": true,
+                        "values": [
+                          "producer"
+                        ]
+                      }
+                    ]
+                  }
+                }
+              ]
+            }
+          },
+          "producer": {
+            "fields": {
+              "@IMPORT": [
+                {
+                  "sourceFactoryId": "#",
+                  "location": "fields",
+                  "prefix": "camel_",
+                  "filter": {
+                    "contains": [
+                      {
+                        "attribute": "kind",
+                        "values": [
+                          "parameter"
+                        ]
+                      },
+                      {
+                        "attribute": "label",
+                        "inverse": true,
+                        "values": [
+                          "consumer"
+                        ]
+                      }
+                    ]
+                  }
+                }
+              ]
+            }
+          },
+          "__objects": {
+            "fields": {
+              "@IMPORT": [
+                {
+                  "sourceFactoryId": "#",
+                  "location": "fields",
+                  "prefix": "",
+                  "filter": {
+                    "contains": [
+                      {
+                        "attribute": "type",
+                        "values": [
+                          "Object",
+                          "object"
+                        ]
+                      }
+                    ]
+                  }
+                }
+              ]
+            }
+          }
+        }
+      }
+    },
+    "origin": {
+      "component": {
+        "kind": "component",
+        "name": "ftps",
+        "title": "FTPS",
+        "description": "Upload and download files to/from FTP servers supporting the FTPS protocol.",
+        "deprecated": false,
+        "deprecationNote": "",
+        "firstVersion": "2.2.0",
+        "label": "file",
+        "javaType": "org.apache.camel.component.file.remote.FtpsComponent",
+        "supportLevel": "Stable",
+        "groupId": "org.apache.camel",
+        "artifactId": "camel-ftp",
+        "version": "3.4.5",
+        "scheme": "ftps",
+        "extendsScheme": "file",
+        "syntax": "ftps:host:port/directoryName",
+        "alternativeSyntax": "ftps:username:password@host:port/directoryName",
+        "async": false,
+        "consumerOnly": false,
+        "producerOnly": false,
+        "lenientProperties": false
+      },
+      "componentProperties": {
+        "bridgeErrorHandler": {
+          "kind": "property",
+          "displayName": "Bridge Error Handler",
+          "group": "consumer",
+          "label": "consumer",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored."
+        },
+        "lazyStartProducer": {
+          "kind": "property",
+          "displayName": "Lazy Start Producer",
+          "group": "producer",
+          "label": "producer",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel\u0027s routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing."
+        },
+        "basicPropertyBinding": {
+          "kind": "property",
+          "displayName": "Basic Property Binding",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities"
+        },
+        "useGlobalSslContextParameters": {
+          "kind": "property",
+          "displayName": "Use Global Ssl Context Parameters",
+          "group": "security",
+          "label": "security",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "false",
+          "description": "Enable usage of global SSL context parameters."
+        }
+      },
+      "properties": {
+        "host": {
+          "kind": "path",
+          "displayName": "Host",
+          "group": "common",
+          "label": "",
+          "required": true,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "deprecationNote": "",
+          "secret": false,
+          "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+          "configurationField": "configuration",
+          "description": "Hostname of the FTP server"
+        },
+        "port": {
+          "kind": "path",
+          "displayName": "Port",
+          "group": "common",
+          "label": "",
+          "required": false,
+          "type": "integer",
+          "javaType": "int",
+          "deprecated": false,
+          "secret": false,
+          "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+          "configurationField": "configuration",
+          "description": "Port of the FTP server"
+        },
+        "directoryName": {
+          "kind": "path",
+          "displayName": "Directory Name",
+          "group": "common",
+          "label": "",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+          "configurationField": "configuration",
+          "description": "The starting directory"
+        },
+        "binary": {
+          "kind": "parameter",
+          "displayName": "Binary",
+          "group": "common",
+          "label": "",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+          "configurationField": "configuration",
+          "description": "Specifies the file transfer mode, BINARY or ASCII. Default is ASCII (false)."
+        },
+        "charset": {
+          "kind": "parameter",
+          "displayName": "Charset",
+          "group": "common",
+          "label": "",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "description": "This option is used to specify the encoding of the file. You can use this on the consumer, to specify the encodings of the files, which allow Camel to know the charset it should load the file content in case the file content is being accessed. Likewise when writing a file, you can use this option to specify which charset to write the file as well. Do mind that when writing the file Camel may have to read the message content into memory to be able to convert the data into the configured charset, so do not use this if you have big messages."
+        },
+        "disconnect": {
+          "kind": "parameter",
+          "displayName": "Disconnect",
+          "group": "common",
+          "label": "common",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "Whether or not to disconnect from remote FTP server right after use. Disconnect will only disconnect the current connection to the FTP server. If you have a consumer which you want to stop, then you need to stop the consumer/route instead."
+        },
+        "doneFileName": {
+          "kind": "parameter",
+          "displayName": "Done File Name",
+          "group": "common",
+          "label": "",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "description": "Producer: If provided, then Camel will write a 2nd done file when the original file has been written. The done file will be empty. This option configures what file name to use. Either you can specify a fixed name. Or you can use dynamic placeholders. The done file will always be written in the same folder as the original file. Consumer: If provided, Camel will only consume files if a done file exists. This option configures what file name to use. Either you can specify a fixed name. Or you can use dynamic placeholders.The done file is always expected in the same folder as the original file. Only ${file.name} and ${file.name.next} is supported as dynamic placeholders."
+        },
+        "fileName": {
+          "kind": "parameter",
+          "displayName": "File Name",
+          "group": "common",
+          "label": "",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "description": "Use Expression such as File Language to dynamically set the filename. For consumers, it\u0027s used as a filename filter. For producers, it\u0027s used to evaluate the filename to write. If an expression is set, it take precedence over the CamelFileName header. (Note: The header itself can also be an Expression). The expression options support both String and Expression types. If the expression is a String type, it is always evaluated using the File Language. If the expression is an Expression type, the specified Expression type is used - this allows you, for instance, to use OGNL expressions. For the consumer, you can use it to filter filenames, so you can for instance consume today\u0027s file using the File Language syntax: mydata-${date:now:yyyyMMdd}.txt. The producers support the CamelOverruleFileName header which takes precedence over any existing CamelFileName header; the CamelOverruleFileName is a header that is used only once, and makes it easier as this avoids to temporary store CamelFileName and have to restore it afterwards."
+        },
+        "passiveMode": {
+          "kind": "parameter",
+          "displayName": "Passive Mode",
+          "group": "common",
+          "label": "",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+          "configurationField": "configuration",
+          "description": "Sets passive mode connections. Default is active mode connections."
+        },
+        "separator": {
+          "kind": "parameter",
+          "displayName": "Separator",
+          "group": "common",
+          "label": "",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.camel.component.file.remote.RemoteFileConfiguration.PathSeparator",
+          "enum": [
+            "UNIX",
+            "Windows",
+            "Auto"
+          ],
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "UNIX",
+          "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+          "configurationField": "configuration",
+          "description": "Sets the path separator to be used. UNIX \u003d Uses unix style path separator Windows \u003d Uses windows style path separator Auto \u003d (is default) Use existing path separator in file name"
+        },
+        "transferLoggingIntervalSeconds": {
+          "kind": "parameter",
+          "displayName": "Transfer Logging Interval Seconds",
+          "group": "common",
+          "label": "common",
+          "required": false,
+          "type": "integer",
+          "javaType": "int",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "5",
+          "description": "Configures the interval in seconds to use when logging the progress of upload and download operations that are in-flight. This is used for logging progress when operations takes longer time."
+        },
+        "transferLoggingLevel": {
+          "kind": "parameter",
+          "displayName": "Transfer Logging Level",
+          "group": "common",
+          "label": "common",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.camel.LoggingLevel",
+          "enum": [
+            "TRACE",
+            "DEBUG",
+            "INFO",
+            "WARN",
+            "ERROR",
+            "OFF"
+          ],
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "DEBUG",
+          "description": "Configure the logging level to use when logging the progress of upload and download operations."
+        },
+        "transferLoggingVerbose": {
+          "kind": "parameter",
+          "displayName": "Transfer Logging Verbose",
+          "group": "common",
+          "label": "common",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "Configures whether the perform verbose (fine grained) logging of the progress of upload and download operations."
+        },
+        "fastExistsCheck": {
+          "kind": "parameter",
+          "displayName": "Fast Exists Check",
+          "group": "common (advanced)",
+          "label": "common,advanced",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "If set this option to be true, camel-ftp will use the list file directly to check if the file exists. Since some FTP server may not support to list the file directly, if the option is false, camel-ftp will use the old way to list the directory and check if the file exists. This option also influences readLock\u003dchanged to control whether it performs a fast check to update file information or not. This can be used to speed up the process if the FTP server has a lot of files."
+        },
+        "bridgeErrorHandler": {
+          "kind": "parameter",
+          "displayName": "Bridge Error Handler",
+          "group": "consumer",
+          "label": "consumer",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored."
+        },
+        "delete": {
+          "kind": "parameter",
+          "displayName": "Delete",
+          "group": "consumer",
+          "label": "consumer",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "If true, the file will be deleted after it is processed successfully."
+        },
+        "moveFailed": {
+          "kind": "parameter",
+          "displayName": "Move Failed",
+          "group": "consumer",
+          "label": "consumer",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "description": "Sets the move failure expression based on Simple language. For example, to move files into a .error subdirectory use: .error. Note: When moving the files to the fail location Camel will handle the error and will not pick up the file again."
+        },
+        "noop": {
+          "kind": "parameter",
+          "displayName": "Noop",
+          "group": "consumer",
+          "label": "consumer",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "If true, the file is not moved or deleted in any way. This option is good for readonly data, or for ETL type requirements. If noop\u003dtrue, Camel will set idempotent\u003dtrue as well, to avoid consuming the same files over and over again."
+        },
+        "preMove": {
+          "kind": "parameter",
+          "displayName": "Pre Move",
+          "group": "consumer",
+          "label": "consumer",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "description": "Expression (such as File Language) used to dynamically set the filename when moving it before processing. For example to move in-progress files into the order directory set this value to order."
+        },
+        "preSort": {
+          "kind": "parameter",
+          "displayName": "Pre Sort",
+          "group": "consumer",
+          "label": "consumer",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "When pre-sort is enabled then the consumer will sort the file and directory names during polling, that was retrieved from the file system. You may want to do this in case you need to operate on the files in a sorted order. The pre-sort is executed before the consumer starts to filter, and accept files to process by Camel. This option is default\u003dfalse meaning disabled."
+        },
+        "recursive": {
+          "kind": "parameter",
+          "displayName": "Recursive",
+          "group": "consumer",
+          "label": "consumer",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "If a directory, will look for files in all the sub-directories as well."
+        },
+        "resumeDownload": {
+          "kind": "parameter",
+          "displayName": "Resume Download",
+          "group": "consumer",
+          "label": "consumer",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "Configures whether resume download is enabled. This must be supported by the FTP server (almost all FTP servers support it). In addition the options localWorkDirectory must be configured so downloaded files are stored in a local directory, and the option binary must be enabled, which is required to support resuming of downloads."
+        },
+        "sendEmptyMessageWhenIdle": {
+          "kind": "parameter",
+          "displayName": "Send Empty Message When Idle",
+          "group": "consumer",
+          "label": "consumer",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "If the polling consumer did not poll any files, you can enable this option to send an empty message (no body) instead."
+        },
+        "streamDownload": {
+          "kind": "parameter",
+          "displayName": "Stream Download",
+          "group": "consumer",
+          "label": "consumer",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+          "configurationField": "configuration",
+          "description": "Sets the download method to use when not using a local working directory. If set to true, the remote files are streamed to the route as they are read. When set to false, the remote files are loaded into memory before being sent into the route. If enabling this option then you must set stepwise\u003dfalse as both cannot be enabled at the same time."
+        },
+        "download": {
+          "kind": "parameter",
+          "displayName": "Download",
+          "group": "consumer (advanced)",
+          "label": "consumer,advanced",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "Whether the FTP consumer should download the file. If this option is set to false, then the message body will be null, but the consumer will still trigger a Camel Exchange that has details about the file such as file name, file size, etc. It\u0027s just that the file will not be downloaded."
+        },
+        "exceptionHandler": {
+          "kind": "parameter",
+          "displayName": "Exception Handler",
+          "group": "consumer (advanced)",
+          "label": "consumer,advanced",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.camel.spi.ExceptionHandler",
+          "optionalPrefix": "consumer.",
+          "deprecated": false,
+          "secret": false,
+          "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored."
+        },
+        "exchangePattern": {
+          "kind": "parameter",
+          "displayName": "Exchange Pattern",
+          "group": "consumer (advanced)",
+          "label": "consumer,advanced",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.camel.ExchangePattern",
+          "enum": [
+            "InOnly",
+            "InOut",
+            "InOptionalOut"
+          ],
+          "deprecated": false,
+          "secret": false,
+          "description": "Sets the exchange pattern when the consumer creates an exchange."
+        },
+        "handleDirectoryParserAbsoluteResult": {
+          "kind": "parameter",
+          "displayName": "Handle Directory Parser Absolute Result",
+          "group": "consumer (advanced)",
+          "label": "consumer,advanced",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+          "configurationField": "configuration",
+          "description": "Allows you to set how the consumer will handle subfolders and files in the path if the directory parser results in with absolute paths The reason for this is that some FTP servers may return file names with absolute paths, and if so then the FTP component needs to handle this by converting the returned path into a relative path."
+        },
+        "ignoreFileNotFoundOrPermissionError": {
+          "kind": "parameter",
+          "displayName": "Ignore File Not Found Or Permission Error",
+          "group": "consumer (advanced)",
+          "label": "consumer,advanced",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+          "configurationField": "configuration",
+          "description": "Whether to ignore when (trying to list files in directories or when downloading a file), which does not exist or due to permission error. By default when a directory or file does not exists or insufficient permission, then an exception is thrown. Setting this option to true allows to ignore that instead."
+        },
+        "inProgressRepository": {
+          "kind": "parameter",
+          "displayName": "In Progress Repository",
+          "group": "consumer (advanced)",
+          "label": "consumer,advanced",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.camel.spi.IdempotentRepository",
+          "deprecated": false,
+          "secret": false,
+          "description": "A pluggable in-progress repository org.apache.camel.spi.IdempotentRepository. The in-progress repository is used to account the current in progress files being consumed. By default a memory based repository is used."
+        },
+        "localWorkDirectory": {
+          "kind": "parameter",
+          "displayName": "Local Work Directory",
+          "group": "consumer (advanced)",
+          "label": "consumer,advanced",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "description": "When consuming, a local work directory can be used to store the remote file content directly in local files, to avoid loading the content into memory. This is beneficial, if you consume a very big remote file and thus can conserve memory."
+        },
+        "onCompletionExceptionHandler": {
+          "kind": "parameter",
+          "displayName": "On Completion Exception Handler",
+          "group": "consumer (advanced)",
+          "label": "consumer,advanced",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.camel.spi.ExceptionHandler",
+          "deprecated": false,
+          "secret": false,
+          "description": "To use a custom org.apache.camel.spi.ExceptionHandler to handle any thrown exceptions that happens during the file on completion process where the consumer does either a commit or rollback. The default implementation will log any exception at WARN level and ignore."
+        },
+        "pollStrategy": {
+          "kind": "parameter",
+          "displayName": "Poll Strategy",
+          "group": "consumer (advanced)",
+          "label": "consumer,advanced",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.camel.spi.PollingConsumerPollStrategy",
+          "deprecated": false,
+          "secret": false,
+          "description": "A pluggable org.apache.camel.PollingConsumerPollingStrategy allowing you to provide your custom implementation to control error handling usually occurred during the poll operation before an Exchange have been created and being routed in Camel."
+        },
+        "processStrategy": {
+          "kind": "parameter",
+          "displayName": "Process Strategy",
+          "group": "consumer (advanced)",
+          "label": "consumer,advanced",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.camel.component.file.GenericFileProcessStrategy\u003corg.apache.commons.net.ftp.FTPFile\u003e",
+          "deprecated": false,
+          "secret": false,
+          "description": "A pluggable org.apache.camel.component.file.GenericFileProcessStrategy allowing you to implement your own readLock option or similar. Can also be used when special conditions must be met before a file can be consumed, such as a special ready file exists. If this option is set then the readLock option does not apply."
+        },
+        "useList": {
+          "kind": "parameter",
+          "displayName": "Use List",
+          "group": "consumer (advanced)",
+          "label": "consumer,advanced",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "true",
+          "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+          "configurationField": "configuration",
+          "description": "Whether to allow using LIST command when downloading a file. Default is true. In some use cases you may want to download a specific file and are not allowed to use the LIST command, and therefore you can set this option to false. Notice when using this option, then the specific file to download does not include meta-data information such as file size, timestamp, permissions etc, because those information is only possible to retrieve when LIST command is in use."
+        },
+        "fileExist": {
+          "kind": "parameter",
+          "displayName": "File Exist",
+          "group": "producer",
+          "label": "producer",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.camel.component.file.GenericFileExist",
+          "enum": [
+            "Override",
+            "Append",
+            "Fail",
+            "Ignore",
+            "Move",
+            "TryRename"
+          ],
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "Override",
+          "description": "What to do if a file already exists with the same name. Override, which is the default, replaces the existing file. - Append - adds content to the existing file. - Fail - throws a GenericFileOperationException, indicating that there is already an existing file. - Ignore - silently ignores the problem and does not override the existing file, but assumes everything is okay. - Move - option requires to use the moveExisting option to be configured as well. The option eagerDeleteTargetFile can be used to control what to do if an moving the file, and there exists already an existing file, otherwise causing the move operation to fail. The Move option will move any existing files, before writing the target file. - TryRename is only applicable if tempFileName option is in use. This allows to try renaming the file from the temporary name to the actual name, without doing any exists check. This check may be faster on some file systems and especially FTP servers."
+        },
+        "flatten": {
+          "kind": "parameter",
+          "displayName": "Flatten",
+          "group": "producer",
+          "label": "producer",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "Flatten is used to flatten the file name path to strip any leading paths, so it\u0027s just the file name. This allows you to consume recursively into sub-directories, but when you eg write the files to another directory they will be written in a single directory. Setting this to true on the producer enforces that any file name in CamelFileName header will be stripped for any leading paths."
+        },
+        "jailStartingDirectory": {
+          "kind": "parameter",
+          "displayName": "Jail Starting Directory",
+          "group": "producer",
+          "label": "producer",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "true",
+          "description": "Used for jailing (restricting) writing files to the starting directory (and sub) only. This is enabled by default to not allow Camel to write files to outside directories (to be more secured out of the box). You can turn this off to allow writing files to directories outside the starting directory, such as parent or root folders."
+        },
+        "lazyStartProducer": {
+          "kind": "parameter",
+          "displayName": "Lazy Start Producer",
+          "group": "producer",
+          "label": "producer",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel\u0027s routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing."
+        },
+        "moveExisting": {
+          "kind": "parameter",
+          "displayName": "Move Existing",
+          "group": "producer",
+          "label": "producer",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "description": "Expression (such as File Language) used to compute file name to use when fileExist\u003dMove is configured. To move files into a backup subdirectory just enter backup. This option only supports the following File Language tokens: file:name, file:name.ext, file:name.noext, file:onlyname, file:onlyname.noext, file:ext, and file:parent. Notice the file:parent is not supported by the FTP component, as the FTP component can only move any existing files to a relative directory based on current dir as base."
+        },
+        "tempFileName": {
+          "kind": "parameter",
+          "displayName": "Temp File Name",
+          "group": "producer",
+          "label": "producer",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "description": "The same as tempPrefix option but offering a more fine grained control on the naming of the temporary filename as it uses the File Language. The location for tempFilename is relative to the final file location in the option \u0027fileName\u0027, not the target directory in the base uri. For example if option fileName includes a directory prefix: dir/finalFilename then tempFileName is relative to that subdirectory dir."
+        },
+        "tempPrefix": {
+          "kind": "parameter",
+          "displayName": "Temp Prefix",
+          "group": "producer",
+          "label": "producer",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "description": "This option is used to write the file using a temporary name and then, after the write is complete, rename it to the real name. Can be used to identify files being written and also avoid consumers (not using exclusive read locks) reading in progress files. Is often used by FTP when uploading big files."
+        },
+        "allowNullBody": {
+          "kind": "parameter",
+          "displayName": "Allow Null Body",
+          "group": "producer (advanced)",
+          "label": "producer,advanced",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "Used to specify if a null body is allowed during file writing. If set to true then an empty file will be created, when set to false, and attempting to send a null body to the file component, a GenericFileWriteException of \u0027Cannot write null body to file.\u0027 will be thrown. If the fileExist option is set to \u0027Override\u0027, then the file will be truncated, and if set to append the file will remain unchanged."
+        },
+        "chmod": {
+          "kind": "parameter",
+          "displayName": "Chmod",
+          "group": "producer (advanced)",
+          "label": "producer,advanced",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+          "configurationField": "configuration",
+          "description": "Allows you to set chmod on the stored file. For example chmod\u003d640."
+        },
+        "disconnectOnBatchComplete": {
+          "kind": "parameter",
+          "displayName": "Disconnect On Batch Complete",
+          "group": "producer (advanced)",
+          "label": "producer,advanced",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "Whether or not to disconnect from remote FTP server right after a Batch upload is complete. disconnectOnBatchComplete will only disconnect the current connection to the FTP server."
+        },
+        "eagerDeleteTargetFile": {
+          "kind": "parameter",
+          "displayName": "Eager Delete Target File",
+          "group": "producer (advanced)",
+          "label": "producer,advanced",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "true",
+          "description": "Whether or not to eagerly delete any existing target file. This option only applies when you use fileExists\u003dOverride and the tempFileName option as well. You can use this to disable (set it to false) deleting the target file before the temp file is written. For example you may write big files and want the target file to exists during the temp file is being written. This ensure the target file is only deleted until the very last moment, just before the temp file is being renamed to the target filename. This option is also used to control whether to delete any existing files when fileExist\u003dMove is enabled, and an existing file exists. If this option copyAndDeleteOnRenameFails false, then an exception will be thrown if an existing file existed, if its true, then the existing file is deleted before the move operation."
+        },
+        "keepLastModified": {
+          "kind": "parameter",
+          "displayName": "Keep Last Modified",
+          "group": "producer (advanced)",
+          "label": "producer,advanced",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "Will keep the last modified timestamp from the source file (if any). Will use the Exchange.FILE_LAST_MODIFIED header to located the timestamp. This header can contain either a java.util.Date or long with the timestamp. If the timestamp exists and the option is enabled it will set this timestamp on the written file. Note: This option only applies to the file producer. You cannot use this option with any of the ftp producers."
+        },
+        "moveExistingFileStrategy": {
+          "kind": "parameter",
+          "displayName": "Move Existing File Strategy",
+          "group": "producer (advanced)",
+          "label": "producer,advanced",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.camel.component.file.strategy.FileMoveExistingStrategy",
+          "deprecated": false,
+          "secret": false,
+          "description": "Strategy (Custom Strategy) used to move file with special naming token to use when fileExist\u003dMove is configured. By default, there is an implementation used if no custom strategy is provided"
+        },
+        "sendNoop": {
+          "kind": "parameter",
+          "displayName": "Send Noop",
+          "group": "producer (advanced)",
+          "label": "producer,advanced",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "true",
+          "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+          "configurationField": "configuration",
+          "description": "Whether to send a noop command as a pre-write check before uploading files to the FTP server. This is enabled by default as a validation of the connection is still valid, which allows to silently re-connect to be able to upload the file. However if this causes problems, you can turn this option off."
+        },
+        "activePortRange": {
+          "kind": "parameter",
+          "displayName": "Active Port Range",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+          "configurationField": "configuration",
+          "description": "Set the client side port range in active mode. The syntax is: minPort-maxPort Both port numbers are inclusive, eg 10000-19999 to include all 1xxxx ports."
+        },
+        "autoCreate": {
+          "kind": "parameter",
+          "displayName": "Auto Create",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "true",
+          "description": "Automatically create missing directories in the file\u0027s pathname. For the file consumer, that means creating the starting directory. For the file producer, it means the directory the files should be written to."
+        },
+        "basicPropertyBinding": {
+          "kind": "parameter",
+          "displayName": "Basic Property Binding",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities"
+        },
+        "bufferSize": {
+          "kind": "parameter",
+          "displayName": "Buffer Size",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "integer",
+          "javaType": "int",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "131072",
+          "description": "Buffer size in bytes used for writing files (or in case of FTP for downloading and uploading files)."
+        },
+        "connectTimeout": {
+          "kind": "parameter",
+          "displayName": "Connect Timeout",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "duration",
+          "javaType": "int",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "10000",
+          "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+          "configurationField": "configuration",
+          "description": "Sets the connect timeout for waiting for a connection to be established Used by both FTPClient and JSCH"
+        },
+        "ftpClient": {
+          "kind": "parameter",
+          "displayName": "Ftp Client",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.commons.net.ftp.FTPClient",
+          "deprecated": false,
+          "secret": false,
+          "description": "To use a custom instance of FTPClient"
+        },
+        "ftpClientConfig": {
+          "kind": "parameter",
+          "displayName": "Ftp Client Config",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.commons.net.ftp.FTPClientConfig",
+          "deprecated": false,
+          "secret": false,
+          "description": "To use a custom instance of FTPClientConfig to configure the FTP client the endpoint should use."
+        },
+        "ftpClientConfigParameters": {
+          "kind": "parameter",
+          "displayName": "Ftp Client Config Parameters",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "object",
+          "javaType": "java.util.Map\u003cjava.lang.String, java.lang.Object\u003e",
+          "prefix": "ftpClientConfig.",
+          "multiValue": true,
+          "deprecated": false,
+          "secret": false,
+          "description": "Used by FtpComponent to provide additional parameters for the FTPClientConfig"
+        },
+        "ftpClientParameters": {
+          "kind": "parameter",
+          "displayName": "Ftp Client Parameters",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "object",
+          "javaType": "java.util.Map\u003cjava.lang.String, java.lang.Object\u003e",
+          "prefix": "ftpClient.",
+          "multiValue": true,
+          "deprecated": false,
+          "secret": false,
+          "description": "Used by FtpComponent to provide additional parameters for the FTPClient"
+        },
+        "maximumReconnectAttempts": {
+          "kind": "parameter",
+          "displayName": "Maximum Reconnect Attempts",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "integer",
+          "javaType": "int",
+          "deprecated": false,
+          "secret": false,
+          "description": "Specifies the maximum reconnect attempts Camel performs when it tries to connect to the remote FTP server. Use 0 to disable this behavior."
+        },
+        "reconnectDelay": {
+          "kind": "parameter",
+          "displayName": "Reconnect Delay",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "duration",
+          "javaType": "long",
+          "deprecated": false,
+          "secret": false,
+          "description": "Delay in millis Camel will wait before performing a reconnect attempt."
+        },
+        "siteCommand": {
+          "kind": "parameter",
+          "displayName": "Site Command",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+          "configurationField": "configuration",
+          "description": "Sets optional site command(s) to be executed after successful login. Multiple site commands can be separated using a new line character."
+        },
+        "soTimeout": {
+          "kind": "parameter",
+          "displayName": "So Timeout",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "duration",
+          "javaType": "int",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "5m",
+          "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+          "configurationField": "configuration",
+          "description": "Sets the so timeout FTP and FTPS Only for Camel 2.4. SFTP for Camel 2.14.3/2.15.3/2.16 onwards. Is the SocketOptions.SO_TIMEOUT value in millis. Recommended option is to set this to 300000 so as not have a hanged connection. On SFTP this option is set as timeout on the JSCH Session instance."
+        },
+        "stepwise": {
+          "kind": "parameter",
+          "displayName": "Stepwise",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "true",
+          "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+          "configurationField": "configuration",
+          "description": "Sets whether we should stepwise change directories while traversing file structures when downloading files, or as well when uploading a file to a directory. You can disable this if you for example are in a situation where you cannot change directory on the FTP server due security reasons. Stepwise cannot be used together with streamDownload."
+        },
+        "synchronous": {
+          "kind": "parameter",
+          "displayName": "Synchronous",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "false",
+          "description": "Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported)."
+        },
+        "throwExceptionOnConnectFailed": {
+          "kind": "parameter",
+          "displayName": "Throw Exception On Connect Failed",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+          "configurationField": "configuration",
+          "description": "Should an exception be thrown if connection failed (exhausted) By default exception is not thrown and a WARN is logged. You can use this to enable exception being thrown and handle the thrown exception from the org.apache.camel.spi.PollingConsumerPollStrategy rollback method."
+        },
+        "timeout": {
+          "kind": "parameter",
+          "displayName": "Timeout",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "duration",
+          "javaType": "int",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "30s",
+          "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+          "configurationField": "configuration",
+          "description": "Sets the data timeout for waiting for reply Used only by FTPClient"
+        },
+        "antExclude": {
+          "kind": "parameter",
+          "displayName": "Ant Exclude",
+          "group": "filter",
+          "label": "consumer,filter",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "description": "Ant style filter exclusion. If both antInclude and antExclude are used, antExclude takes precedence over antInclude. Multiple exclusions may be specified in comma-delimited format."
+        },
+        "antFilterCaseSensitive": {
+          "kind": "parameter",
+          "displayName": "Ant Filter Case Sensitive",
+          "group": "filter",
+          "label": "consumer,filter",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "true",
+          "description": "Sets case sensitive flag on ant filter."
+        },
+        "antInclude": {
+          "kind": "parameter",
+          "displayName": "Ant Include",
+          "group": "filter",
+          "label": "consumer,filter",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "description": "Ant style filter inclusion. Multiple inclusions may be specified in comma-delimited format."
+        },
+        "eagerMaxMessagesPerPoll": {
+          "kind": "parameter",
+          "displayName": "Eager Max Messages Per Poll",
+          "group": "filter",
+          "label": "consumer,filter",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "true",
+          "description": "Allows for controlling whether the limit from maxMessagesPerPoll is eager or not. If eager then the limit is during the scanning of files. Where as false would scan all files, and then perform sorting. Setting this option to false allows for sorting all files first, and then limit the poll. Mind that this requires a higher memory usage as all file details are in memory to perform the sorting."
+        },
+        "exclude": {
+          "kind": "parameter",
+          "displayName": "Exclude",
+          "group": "filter",
+          "label": "consumer,filter",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "description": "Is used to exclude files, if filename matches the regex pattern (matching is case in-senstive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpoint uri. See more details at configuring endpoint uris"
+        },
+        "filter": {
+          "kind": "parameter",
+          "displayName": "Filter",
+          "group": "filter",
+          "label": "consumer,filter",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.camel.component.file.GenericFileFilter\u003corg.apache.commons.net.ftp.FTPFile\u003e",
+          "deprecated": false,
+          "secret": false,
+          "description": "Pluggable filter as a org.apache.camel.component.file.GenericFileFilter class. Will skip files if filter returns false in its accept() method."
+        },
+        "filterDirectory": {
+          "kind": "parameter",
+          "displayName": "Filter Directory",
+          "group": "filter",
+          "label": "consumer,filter",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "description": "Filters the directory based on Simple language. For example to filter on current date, you can use a simple date pattern such as ${date:now:yyyMMdd}"
+        },
+        "filterFile": {
+          "kind": "parameter",
+          "displayName": "Filter File",
+          "group": "filter",
+          "label": "consumer,filter",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "description": "Filters the file based on Simple language. For example to filter on file size, you can use ${file:size} 5000"
+        },
+        "idempotent": {
+          "kind": "parameter",
+          "displayName": "Idempotent",
+          "group": "filter",
+          "label": "consumer,filter",
+          "required": false,
+          "type": "boolean",
+          "javaType": "java.lang.Boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "false",
+          "description": "Option to use the Idempotent Consumer EIP pattern to let Camel skip already processed files. Will by default use a memory based LRUCache that holds 1000 entries. If noop\u003dtrue then idempotent will be enabled as well to avoid consuming the same files over and over again."
+        },
+        "idempotentKey": {
+          "kind": "parameter",
+          "displayName": "Idempotent Key",
+          "group": "filter",
+          "label": "consumer,filter",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "description": "To use a custom idempotent key. By default the absolute path of the file is used. You can use the File Language, for example to use the file name and file size, you can do: idempotentKey\u003d${file:name}-${file:size}"
+        },
+        "idempotentRepository": {
+          "kind": "parameter",
+          "displayName": "Idempotent Repository",
+          "group": "filter",
+          "label": "consumer,filter",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.camel.spi.IdempotentRepository",
+          "deprecated": false,
+          "secret": false,
+          "description": "A pluggable repository org.apache.camel.spi.IdempotentRepository which by default use MemoryMessageIdRepository if none is specified and idempotent is true."
+        },
+        "include": {
+          "kind": "parameter",
+          "displayName": "Include",
+          "group": "filter",
+          "label": "consumer,filter",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "description": "Is used to include files, if filename matches the regex pattern (matching is case in-sensitive). Notice if you use symbols such as plus sign and others you would need to configure this using the RAW() syntax if configuring this as an endpoint uri. See more details at configuring endpoint uris"
+        },
+        "maxDepth": {
+          "kind": "parameter",
+          "displayName": "Max Depth",
+          "group": "filter",
+          "label": "consumer,filter",
+          "required": false,
+          "type": "integer",
+          "javaType": "int",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "2147483647",
+          "description": "The maximum depth to traverse when recursively processing a directory."
+        },
+        "maxMessagesPerPoll": {
+          "kind": "parameter",
+          "displayName": "Max Messages Per Poll",
+          "group": "filter",
+          "label": "consumer,filter",
+          "required": false,
+          "type": "integer",
+          "javaType": "int",
+          "deprecated": false,
+          "secret": false,
+          "description": "To define a maximum messages to gather per poll. By default no maximum is set. Can be used to set a limit of e.g. 1000 to avoid when starting up the server that there are thousands of files. Set a value of 0 or negative to disabled it. Notice: If this option is in use then the File and FTP components will limit before any sorting. For example if you have 100000 files and use maxMessagesPerPoll\u003d500, then only the first 500 files will be picked up, and then sorted. You can use the eagerMaxMessagesPerPoll option and set this to false to allow to scan all files first and then sort afterwards."
+        },
+        "minDepth": {
+          "kind": "parameter",
+          "displayName": "Min Depth",
+          "group": "filter",
+          "label": "consumer,filter",
+          "required": false,
+          "type": "integer",
+          "javaType": "int",
+          "deprecated": false,
+          "secret": false,
+          "description": "The minimum depth to start processing when recursively processing a directory. Using minDepth\u003d1 means the base directory. Using minDepth\u003d2 means the first sub directory."
+        },
+        "move": {
+          "kind": "parameter",
+          "displayName": "Move",
+          "group": "filter",
+          "label": "consumer,filter",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "description": "Expression (such as Simple Language) used to dynamically set the filename when moving it after processing. To move files into a .done subdirectory just enter .done."
+        },
+        "exclusiveReadLockStrategy": {
+          "kind": "parameter",
+          "displayName": "Exclusive Read Lock Strategy",
+          "group": "lock",
+          "label": "consumer,lock",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.camel.component.file.GenericFileExclusiveReadLockStrategy\u003corg.apache.commons.net.ftp.FTPFile\u003e",
+          "deprecated": false,
+          "secret": false,
+          "description": "Pluggable read-lock as a org.apache.camel.component.file.GenericFileExclusiveReadLockStrategy implementation."
+        },
+        "readLock": {
+          "kind": "parameter",
+          "displayName": "Read Lock",
+          "group": "lock",
+          "label": "consumer,lock",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "enum": [
+            "none",
+            "markerFile",
+            "fileLock",
+            "rename",
+            "changed",
+            "idempotent",
+            "idempotent-changed",
+            "idempotent-rename"
+          ],
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "none",
+          "description": "Used by consumer, to only poll the files if it has exclusive read-lock on the file (i.e. the file is not in-progress or being written). Camel will wait until the file lock is granted. This option provides the build in strategies: - none - No read lock is in use - markerFile - Camel creates a marker file (fileName.camelLock) and then holds a lock on it. This option is not available for the FTP component - changed - Changed is using file length/modification timestamp to detect whether the file is currently being copied or not. Will at least use 1 sec to determine this, so this option cannot consume files as fast as the others, but can be more reliable as the JDK IO API cannot always determine whether a file is currently being used by another process. The option readLockCheckInterval can be used to set the check frequency. - fileLock - is for using java.nio.channels.FileLock. This option is not avail for Windows OS and the FTP component. This approach should be avoided when accessing a remote file system via a mount/share unless that file system supports distributed file locks. - rename - rename is for using a try to rename the file as a test if we can get exclusive read-lock. - idempotent - (only for file component) idempotent is for using a idempotentRepository as the read-lock. This allows to use read locks that supports clustering if the idempotent repository implementation supports that. - idempotent-changed - (only for file component) idempotent-changed is for using a idempotentRepository and changed as the combined read-lock. This allows to use read locks that supports clustering if the idempotent repository implementation supports that. - idempotent-rename - (only for file component) idempotent-rename is for using a idempotentRepository and rename as the combined read-lock. This allows to use read locks that supports clustering if the idempotent repository implementation supports that.Notice: The various read locks is not all suited to work in clustered mode, where concurrent consumers on different nodes is competing for the same files on a shared file system. The markerFile using a close to atomic operation to create the empty marker file, but its not guaranteed to work in a cluster. The fileLock may work better but then the file system need to support distributed file locks, and so on. Using the idempotent read lock can support clustering if the idempotent repository supports clustering, such as Hazelcast Component or Infinispan."
+        },
+        "readLockCheckInterval": {
+          "kind": "parameter",
+          "displayName": "Read Lock Check Interval",
+          "group": "lock",
+          "label": "consumer,lock",
+          "required": false,
+          "type": "integer",
+          "javaType": "long",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "1000",
+          "description": "Interval in millis for the read-lock, if supported by the read lock. This interval is used for sleeping between attempts to acquire the read lock. For example when using the changed read lock, you can set a higher interval period to cater for slow writes. The default of 1 sec. may be too fast if the producer is very slow writing the file. Notice: For FTP the default readLockCheckInterval is 5000. The readLockTimeout value must be higher than readLockCheckInterval, but a rule of thumb is to have a timeout that is at least 2 or more times higher than the readLockCheckInterval. This is needed to ensure that amble time is allowed for the read lock process to try to grab the lock before the timeout was hit."
+        },
+        "readLockDeleteOrphanLockFiles": {
+          "kind": "parameter",
+          "displayName": "Read Lock Delete Orphan Lock Files",
+          "group": "lock",
+          "label": "consumer,lock",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "true",
+          "description": "Whether or not read lock with marker files should upon startup delete any orphan read lock files, which may have been left on the file system, if Camel was not properly shutdown (such as a JVM crash). If turning this option to false then any orphaned lock file will cause Camel to not attempt to pickup that file, this could also be due another node is concurrently reading files from the same shared directory."
+        },
+        "readLockLoggingLevel": {
+          "kind": "parameter",
+          "displayName": "Read Lock Logging Level",
+          "group": "lock",
+          "label": "consumer,lock",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.camel.LoggingLevel",
+          "enum": [
+            "TRACE",
+            "DEBUG",
+            "INFO",
+            "WARN",
+            "ERROR",
+            "OFF"
+          ],
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "DEBUG",
+          "description": "Logging level used when a read lock could not be acquired. By default a DEBUG is logged. You can change this level, for example to OFF to not have any logging. This option is only applicable for readLock of types: changed, fileLock, idempotent, idempotent-changed, idempotent-rename, rename."
+        },
+        "readLockMarkerFile": {
+          "kind": "parameter",
+          "displayName": "Read Lock Marker File",
+          "group": "lock",
+          "label": "consumer,lock",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "true",
+          "description": "Whether to use marker file with the changed, rename, or exclusive read lock types. By default a marker file is used as well to guard against other processes picking up the same files. This behavior can be turned off by setting this option to false. For example if you do not want to write marker files to the file systems by the Camel application."
+        },
+        "readLockMinAge": {
+          "kind": "parameter",
+          "displayName": "Read Lock Min Age",
+          "group": "lock",
+          "label": "consumer,lock",
+          "required": false,
+          "type": "integer",
+          "javaType": "long",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "0",
+          "description": "This option is applied only for readLock\u003dchanged. It allows to specify a minimum age the file must be before attempting to acquire the read lock. For example use readLockMinAge\u003d300s to require the file is at last 5 minutes old. This can speedup the changed read lock as it will only attempt to acquire files which are at least that given age."
+        },
+        "readLockMinLength": {
+          "kind": "parameter",
+          "displayName": "Read Lock Min Length",
+          "group": "lock",
+          "label": "consumer,lock",
+          "required": false,
+          "type": "integer",
+          "javaType": "long",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "1",
+          "description": "This option is applied only for readLock\u003dchanged. It allows you to configure a minimum file length. By default Camel expects the file to contain data, and thus the default value is 1. You can set this option to zero, to allow consuming zero-length files."
+        },
+        "readLockRemoveOnCommit": {
+          "kind": "parameter",
+          "displayName": "Read Lock Remove On Commit",
+          "group": "lock",
+          "label": "consumer,lock",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "This option is applied only for readLock\u003didempotent. It allows to specify whether to remove the file name entry from the idempotent repository when processing the file is succeeded and a commit happens. By default the file is not removed which ensures that any race-condition do not occur so another active node may attempt to grab the file. Instead the idempotent repository may support eviction strategies that you can configure to evict the file name entry after X minutes - this ensures no problems with race conditions. See more details at the readLockIdempotentReleaseDelay option."
+        },
+        "readLockRemoveOnRollback": {
+          "kind": "parameter",
+          "displayName": "Read Lock Remove On Rollback",
+          "group": "lock",
+          "label": "consumer,lock",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "true",
+          "description": "This option is applied only for readLock\u003didempotent. It allows to specify whether to remove the file name entry from the idempotent repository when processing the file failed and a rollback happens. If this option is false, then the file name entry is confirmed (as if the file did a commit)."
+        },
+        "readLockTimeout": {
+          "kind": "parameter",
+          "displayName": "Read Lock Timeout",
+          "group": "lock",
+          "label": "consumer,lock",
+          "required": false,
+          "type": "integer",
+          "javaType": "long",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "10000",
+          "description": "Optional timeout in millis for the read-lock, if supported by the read-lock. If the read-lock could not be granted and the timeout triggered, then Camel will skip the file. At next poll Camel, will try the file again, and this time maybe the read-lock could be granted. Use a value of 0 or lower to indicate forever. Currently fileLock, changed and rename support the timeout. Notice: For FTP the default readLockTimeout value is 20000 instead of 10000. The readLockTimeout value must be higher than readLockCheckInterval, but a rule of thumb is to have a timeout that is at least 2 or more times higher than the readLockCheckInterval. This is needed to ensure that amble time is allowed for the read lock process to try to grab the lock before the timeout was hit."
+        },
+        "backoffErrorThreshold": {
+          "kind": "parameter",
+          "displayName": "Backoff Error Threshold",
+          "group": "scheduler",
+          "label": "consumer,scheduler",
+          "required": false,
+          "type": "integer",
+          "javaType": "int",
+          "deprecated": false,
+          "secret": false,
+          "description": "The number of subsequent error polls (failed due some error) that should happen before the backoffMultipler should kick-in."
+        },
+        "backoffIdleThreshold": {
+          "kind": "parameter",
+          "displayName": "Backoff Idle Threshold",
+          "group": "scheduler",
+          "label": "consumer,scheduler",
+          "required": false,
+          "type": "integer",
+          "javaType": "int",
+          "deprecated": false,
+          "secret": false,
+          "description": "The number of subsequent idle polls that should happen before the backoffMultipler should kick-in."
+        },
+        "backoffMultiplier": {
+          "kind": "parameter",
+          "displayName": "Backoff Multiplier",
+          "group": "scheduler",
+          "label": "consumer,scheduler",
+          "required": false,
+          "type": "integer",
+          "javaType": "int",
+          "deprecated": false,
+          "secret": false,
+          "description": "To let the scheduled polling consumer backoff if there has been a number of subsequent idles/errors in a row. The multiplier is then the number of polls that will be skipped before the next actual attempt is happening again. When this option is in use then backoffIdleThreshold and/or backoffErrorThreshold must also be configured."
+        },
+        "delay": {
+          "kind": "parameter",
+          "displayName": "Delay",
+          "group": "scheduler",
+          "label": "consumer,scheduler",
+          "required": false,
+          "type": "integer",
+          "javaType": "long",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "500",
+          "description": "Milliseconds before the next poll."
+        },
+        "greedy": {
+          "kind": "parameter",
+          "displayName": "Greedy",
+          "group": "scheduler",
+          "label": "consumer,scheduler",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "If greedy is enabled, then the ScheduledPollConsumer will run immediately again, if the previous run polled 1 or more messages."
+        },
+        "initialDelay": {
+          "kind": "parameter",
+          "displayName": "Initial Delay",
+          "group": "scheduler",
+          "label": "consumer,scheduler",
+          "required": false,
+          "type": "integer",
+          "javaType": "long",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "1000",
+          "description": "Milliseconds before the first poll starts."
+        },
+        "repeatCount": {
+          "kind": "parameter",
+          "displayName": "Repeat Count",
+          "group": "scheduler",
+          "label": "consumer,scheduler",
+          "required": false,
+          "type": "integer",
+          "javaType": "long",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "0",
+          "description": "Specifies a maximum limit of number of fires. So if you set it to 1, the scheduler will only fire once. If you set it to 5, it will only fire five times. A value of zero or negative means fire forever."
+        },
+        "runLoggingLevel": {
+          "kind": "parameter",
+          "displayName": "Run Logging Level",
+          "group": "scheduler",
+          "label": "consumer,scheduler",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.camel.LoggingLevel",
+          "enum": [
+            "TRACE",
+            "DEBUG",
+            "INFO",
+            "WARN",
+            "ERROR",
+            "OFF"
+          ],
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "TRACE",
+          "description": "The consumer logs a start/complete log line when it polls. This option allows you to configure the logging level for that."
+        },
+        "scheduledExecutorService": {
+          "kind": "parameter",
+          "displayName": "Scheduled Executor Service",
+          "group": "scheduler",
+          "label": "consumer,scheduler",
+          "required": false,
+          "type": "object",
+          "javaType": "java.util.concurrent.ScheduledExecutorService",
+          "deprecated": false,
+          "secret": false,
+          "description": "Allows for configuring a custom/shared thread pool to use for the consumer. By default each consumer has its own single threaded thread pool."
+        },
+        "scheduler": {
+          "kind": "parameter",
+          "displayName": "Scheduler",
+          "group": "scheduler",
+          "label": "consumer,scheduler",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "enum": [
+            "none",
+            "spring",
+            "quartz"
+          ],
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "none",
+          "description": "To use a cron scheduler from either camel-spring or camel-quartz component"
+        },
+        "schedulerProperties": {
+          "kind": "parameter",
+          "displayName": "Scheduler Properties",
+          "group": "scheduler",
+          "label": "consumer,scheduler",
+          "required": false,
+          "type": "object",
+          "javaType": "java.util.Map\u003cjava.lang.String, java.lang.Object\u003e",
+          "prefix": "scheduler.",
+          "multiValue": true,
+          "deprecated": false,
+          "secret": false,
+          "description": "To configure additional properties when using a custom scheduler or any of the Quartz, Spring based scheduler."
+        },
+        "startScheduler": {
+          "kind": "parameter",
+          "displayName": "Start Scheduler",
+          "group": "scheduler",
+          "label": "consumer,scheduler",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "true",
+          "description": "Whether the scheduler should be auto started."
+        },
+        "timeUnit": {
+          "kind": "parameter",
+          "displayName": "Time Unit",
+          "group": "scheduler",
+          "label": "consumer,scheduler",
+          "required": false,
+          "type": "object",
+          "javaType": "java.util.concurrent.TimeUnit",
+          "enum": [
+            "NANOSECONDS",
+            "MICROSECONDS",
+            "MILLISECONDS",
+            "SECONDS",
+            "MINUTES",
+            "HOURS",
+            "DAYS"
+          ],
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "MILLISECONDS",
+          "description": "Time unit for initialDelay and delay options."
+        },
+        "useFixedDelay": {
+          "kind": "parameter",
+          "displayName": "Use Fixed Delay",
+          "group": "scheduler",
+          "label": "consumer,scheduler",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "true",
+          "description": "Controls if fixed delay or fixed rate is used. See ScheduledExecutorService in JDK for details."
+        },
+        "account": {
+          "kind": "parameter",
+          "displayName": "Account",
+          "group": "security",
+          "label": "security",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": true,
+          "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+          "configurationField": "configuration",
+          "description": "Account to use for login"
+        },
+        "disableSecureDataChannelDefaults": {
+          "kind": "parameter",
+          "displayName": "Disable Secure Data Channel Defaults",
+          "group": "security",
+          "label": "security",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+          "configurationField": "configuration",
+          "description": "Use this option to disable default options when using secure data channel. This allows you to be in full control what the execPbsz and execProt setting should be used. Default is false"
+        },
+        "execPbsz": {
+          "kind": "parameter",
+          "displayName": "Exec Pbsz",
+          "group": "security",
+          "label": "security",
+          "required": false,
+          "type": "integer",
+          "javaType": "java.lang.Long",
+          "deprecated": false,
+          "secret": false,
+          "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+          "configurationField": "configuration",
+          "description": "When using secure data channel you can set the exec protection buffer size"
+        },
+        "execProt": {
+          "kind": "parameter",
+          "displayName": "Exec Prot",
+          "group": "security",
+          "label": "security",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+          "configurationField": "configuration",
+          "description": "The exec protection level PROT command. C - Clear S - Safe(SSL protocol only) E - Confidential(SSL protocol only) P - Private"
+        },
+        "ftpClientKeyStoreParameters": {
+          "kind": "parameter",
+          "displayName": "Ftp Client Key Store Parameters",
+          "group": "security",
+          "label": "security",
+          "required": false,
+          "type": "object",
+          "javaType": "java.util.Map\u003cjava.lang.String, java.lang.Object\u003e",
+          "prefix": "ftpClient.keyStore.",
+          "multiValue": true,
+          "deprecated": false,
+          "secret": false,
+          "description": "Set the key store parameters"
+        },
+        "ftpClientTrustStoreParameters": {
+          "kind": "parameter",
+          "displayName": "Ftp Client Trust Store Parameters",
+          "group": "security",
+          "label": "security",
+          "required": false,
+          "type": "object",
+          "javaType": "java.util.Map\u003cjava.lang.String, java.lang.Object\u003e",
+          "prefix": "ftpClient.trustStore.",
+          "multiValue": true,
+          "deprecated": false,
+          "secret": false,
+          "description": "Set the trust store parameters"
+        },
+        "implicit": {
+          "kind": "parameter",
+          "displayName": "Implicit",
+          "group": "security",
+          "label": "security",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+          "configurationField": "configuration",
+          "description": "Set the security mode (Implicit/Explicit). true - Implicit Mode / False - Explicit Mode"
+        },
+        "password": {
+          "kind": "parameter",
+          "displayName": "Password",
+          "group": "security",
+          "label": "security",
+          "required": false,
+          "type": "password",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": true,
+          "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+          "configurationField": "configuration",
+          "description": "Password to use for login"
+        },
+        "securityProtocol": {
+          "kind": "parameter",
+          "displayName": "Security Protocol",
+          "group": "security",
+          "label": "security",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "TLSv1.2",
+          "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+          "configurationField": "configuration",
+          "description": "Set the underlying security protocol."
+        },
+        "sslContextParameters": {
+          "kind": "parameter",
+          "displayName": "Ssl Context Parameters",
+          "group": "security",
+          "label": "security",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.camel.support.jsse.SSLContextParameters",
+          "deprecated": false,
+          "secret": false,
+          "description": "Gets the JSSE configuration that overrides any settings in FtpsEndpoint#ftpClientKeyStoreParameters, ftpClientTrustStoreParameters, and FtpsConfiguration#getSecurityProtocol()."
+        },
+        "username": {
+          "kind": "parameter",
+          "displayName": "Username",
+          "group": "security",
+          "label": "security",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": true,
+          "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration",
+          "configurationField": "configuration",
+          "description": "Username to use for login"
+        },
+        "shuffle": {
+          "kind": "parameter",
+          "displayName": "Shuffle",
+          "group": "sort",
+          "label": "consumer,sort",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "To shuffle the list of files (sort in random order)"
+        },
+        "sortBy": {
+          "kind": "parameter",
+          "displayName": "Sort By",
+          "group": "sort",
+          "label": "consumer,sort",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "description": "Built-in sort by using the File Language. Supports nested sorts, so you can have a sort by file name and as a 2nd group sort by modified date."
+        },
+        "sorter": {
+          "kind": "parameter",
+          "displayName": "Sorter",
+          "group": "sort",
+          "label": "consumer,sort",
+          "required": false,
+          "type": "object",
+          "javaType": "java.util.Comparator\u003corg.apache.camel.component.file.GenericFile\u003corg.apache.commons.net.ftp.FTPFile\u003e\u003e",
+          "deprecated": false,
+          "secret": false,
+          "description": "Pluggable sorter as a java.util.Comparator class."
+        }
+      }
+    }
+  },
+  "outputs": {
+    "init": {
+      "fields": {
+        "username": {},
+        "password": {},
+        "host": {},
+        "port": {},
+        "directoryName": {},
+        "@IMPORT": [
+          {
+            "sourceFactoryId": "#",
+            "location": "fields",
+            "prefix": "camel_",
+            "filter": {
+              "contains": [
+                {
+                  "attribute": "kind",
+                  "values": [
+                    "property"
+                  ]
+                }
+              ]
+            }
+          }
+        ]
+      },
+      "config": {
+        "configurable": true,
+        "fieldsConfigurableByDefault": true,
+        "configurableFields": {
+          "includeTypes":["string","password","number"],
+          "includeNames":["username","password","host","port","directoryName"],
+          "includePatterns":[]
+        }
+      }
+    },
+    "path": {
+      "fields": {
+        "@IMPORT": [
+          {
+            "sourceFactoryId": "#",
+            "location": "fields",
+            "prefix": "camel_",
+            "filter": {
+              "contains": [
+                {
+                  "attribute": "kind",
+                  "values": [
+                    "path"
+                  ]
+                }
+              ]
+            }
+          }
+        ]
+      }
+    },
+    "consumer": {
+      "fields": {
+        "@IMPORT": [
+          {
+            "sourceFactoryId": "#",
+            "location": "fields",
+            "prefix": "camel_",
+            "filter": {
+              "contains": [
+                {
+                  "attribute": "kind",
+                  "values": [
+                    "parameter"
+                  ]
+                },
+                {
+                  "attribute": "label",
+                  "inverse": true,
+                  "values": [
+                    "producer"
+                  ]
+                }
+              ]
+            }
+          }
+        ]
+      }
+    },
+    "producer": {
+      "fields": {
+        "@IMPORT": [
+          {
+            "sourceFactoryId": "#",
+            "location": "fields",
+            "prefix": "camel_",
+            "filter": {
+              "contains": [
+                {
+                  "attribute": "kind",
+                  "values": [
+                    "parameter"
+                  ]
+                },
+                {
+                  "attribute": "label",
+                  "inverse": true,
+                  "values": [
+                    "consumer"
+                  ]
+                }
+              ]
+            }
+          }
+        ]
+      }
+    },
+    "__objects": {
+      "fields": {
+        "@IMPORT": [
+          {
+            "sourceFactoryId": "#",
+            "location": "fields",
+            "prefix": "",
+            "filter": {
+              "contains": [
+                {
+                  "attribute": "type",
+                  "values": [
+                    "Object",
+                    "object"
+                  ]
+                }
+              ]
+            }
+          }
+        ]
+      }
+    }
+  }
+}
diff --git a/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/resources/ru/entaxy/factory/remote-file-abstract-connection.json b/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/resources/ru/entaxy/factory/remote-file-abstract-connection.json
index afed5e2e..c0881129 100644
--- a/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/resources/ru/entaxy/factory/remote-file-abstract-connection.json
+++ b/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/resources/ru/entaxy/factory/remote-file-abstract-connection.json
@@ -217,7 +217,10 @@
       "kind": "parameter",
       "required": false,
       "hidden": false,
-      "defaultValue": false,
+      "defaultValue": true,
+      "@UI": {
+        "transmitAlways": true
+      },
       "group": "common",
       "##origin": "camel",
       "##camelDiff": {
diff --git a/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/resources/ru/entaxy/templates/ftps-connection/init.body.ftl b/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/resources/ru/entaxy/templates/ftps-connection/init.body.ftl
new file mode 100644
index 00000000..97172647
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/resources/ru/entaxy/templates/ftps-connection/init.body.ftl
@@ -0,0 +1,9 @@
+[#ftl]
+    
+        [=utils.createBeanProperties(properties, "camel_", true)]
+        [#if properties.username??][/#if]
+        [#if properties.password??][/#if]
+        
+        [#if properties.port??][/#if]
+        [#if properties.directoryName??][/#if]
+    
diff --git a/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/resources/ru/entaxy/templates/ftps-connection/init.ftl b/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/resources/ru/entaxy/templates/ftps-connection/init.ftl
new file mode 100644
index 00000000..b8670743
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/resources/ru/entaxy/templates/ftps-connection/init.ftl
@@ -0,0 +1,19 @@
+[#ftl attributes={"generated.type":"blueprint"}]
+
+
+           
+[#import "templates:object-commons/common-utils.ftl" as utils]
+[#include "templates:ftps-connection/init.body.ftl"]
+
+    
+        
+            
+        
+    
+
+
diff --git a/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/resources/ru/entaxy/templates/ftps-connection/init.private.ftl b/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/resources/ru/entaxy/templates/ftps-connection/init.private.ftl
new file mode 100644
index 00000000..477174a1
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/connection-implementation/standard-connections-pack/src/main/resources/ru/entaxy/templates/ftps-connection/init.private.ftl
@@ -0,0 +1,3 @@
+[#ftl attributes={"generated.type":"blueprint.fragment"}]
+[#import "templates:object-commons/common-utils.ftl" as utils]
+[#include "templates:ftps-connection/init.body.ftl"]
diff --git a/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/pom.xml b/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/pom.xml
index 546e2ee4..efc2e85b 100644
--- a/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/pom.xml
+++ b/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/pom.xml
@@ -3,7 +3,7 @@
   
     ru.entaxy.esb.platform.runtime.core.objects-implementations
     connector-implementation
-    1.10.0
+    1.11.0
   
   ru.entaxy.esb.platform.runtime.core.objects-implementations.connector-implementation
   connector-producing
diff --git a/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/java/ru/entaxy/platform/base/objects/connector/producing/ConnectorProducer.java b/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/java/ru/entaxy/platform/base/objects/connector/producing/ConnectorProducer.java
index a1a5b6cd..1682578e 100644
--- a/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/java/ru/entaxy/platform/base/objects/connector/producing/ConnectorProducer.java
+++ b/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/java/ru/entaxy/platform/base/objects/connector/producing/ConnectorProducer.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * connector-producing
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/resources/ru/entaxy/factory/abstract-connector.json b/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/resources/ru/entaxy/factory/abstract-connector.json
index 412619d5..fbd9f91f 100644
--- a/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/resources/ru/entaxy/factory/abstract-connector.json
+++ b/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/resources/ru/entaxy/factory/abstract-connector.json
@@ -48,12 +48,12 @@
 			"immutable": true,
 			"defaultValue": "main",
 			"description": "Classifier of the connector. Must be unique for each connector of the same direction in the owning system",
-			"@UNIQUE": {
-				"filterProperties": ["direction"]
-			},
 			"@TYPEINFO": {
 				"validation": {
 					"rules": {
+						"checkUniqueness": {
+							"extraProperties": ["direction"]
+						},
 						"content": {
 							"regex": "^[a-zA-Z][a-zA-Z0-9-]*$",
 							"errorMessage": "Value can contain only latin letters, numbers and hyphen and should start with a letter"
diff --git a/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/abstract-connector-in/pre-route.bak.xml b/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/abstract-connector-in/pre-route.bak.xml
new file mode 100644
index 00000000..6bd6af21
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/abstract-connector-in/pre-route.bak.xml
@@ -0,0 +1,7 @@
+
+
+	
+	
+        true
+    
+
\ No newline at end of file
diff --git a/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/abstract-connector-out/pre-output.bak.xml b/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/abstract-connector-out/pre-output.bak.xml
new file mode 100644
index 00000000..b2000645
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/abstract-connector-out/pre-output.bak.xml
@@ -0,0 +1,7 @@
+
+
+	
+	
+        true
+    
+
diff --git a/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/abstract-connector/response-route.bak.xml b/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/abstract-connector/response-route.bak.xml
new file mode 100644
index 00000000..e4de4fbd
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/abstract-connector/response-route.bak.xml
@@ -0,0 +1,5 @@
+
+
+	
+	
+
\ No newline at end of file
diff --git a/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/resources/ru/entaxy/templates/abstract-connector-in/exclusiveSupport.ftl b/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/resources/ru/entaxy/templates/abstract-connector-in/exclusiveSupport.ftl
index 5c69c061..fbb86cfc 100644
--- a/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/resources/ru/entaxy/templates/abstract-connector-in/exclusiveSupport.ftl
+++ b/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/resources/ru/entaxy/templates/abstract-connector-in/exclusiveSupport.ftl
@@ -2,7 +2,7 @@
 
 	
-
+
 	
 	
 
\ No newline at end of file
diff --git a/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/resources/ru/entaxy/templates/abstract-connector/__errorHandler.ftl b/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/resources/ru/entaxy/templates/abstract-connector/__errorHandler.ftl
new file mode 100644
index 00000000..f1750fb4
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/resources/ru/entaxy/templates/abstract-connector/__errorHandler.ftl
@@ -0,0 +1,31 @@
+[#ftl attributes={"generated.type":"blueprint.fragment"}]
+[=properties.errorHandlerType]
+
+
+
+
diff --git a/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/resources/ru/entaxy/templates/abstract-connector/globalOptions.ftl b/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/resources/ru/entaxy/templates/abstract-connector/globalOptions.ftl
new file mode 100644
index 00000000..6f0cd9f1
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/connector-implementation/connector-producing/src/main/resources/ru/entaxy/templates/abstract-connector/globalOptions.ftl
@@ -0,0 +1,2 @@
+[#ftl attributes={"generated.type":"blueprint.fragment"}]
+
diff --git a/platform/runtime/core/objects-implementations/connector-implementation/pom.xml b/platform/runtime/core/objects-implementations/connector-implementation/pom.xml
index 4dc275de..6a7360a0 100644
--- a/platform/runtime/core/objects-implementations/connector-implementation/pom.xml
+++ b/platform/runtime/core/objects-implementations/connector-implementation/pom.xml
@@ -3,7 +3,7 @@
   
     ru.entaxy.esb.platform.runtime.core
     objects-implementations
-    1.10.0
+    1.11.0
   
   ru.entaxy.esb.platform.runtime.core.objects-implementations
   connector-implementation
diff --git a/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/pom.xml b/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/pom.xml
index 322c37e3..da2675a2 100644
--- a/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/pom.xml
+++ b/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/pom.xml
@@ -4,7 +4,7 @@
   
     ru.entaxy.esb.platform.runtime.core.objects-implementations
     connector-implementation
-    1.10.0
+    1.11.0
   
   ru.entaxy.esb.platform.runtime.core.objects-implementations.connector-implementation
   standard-connectors-pack
diff --git a/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/factory/artemis-connector-out.json b/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/factory/artemis-connector-out.json
index 240276c5..931ac597 100644
--- a/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/factory/artemis-connector-out.json
+++ b/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/factory/artemis-connector-out.json
@@ -51,15 +51,24 @@
 				"queueOrTopicType": {},
 				"queueOrTopicName": {},
 				"entaxyOriginConnection": {},
+				"camel_headerFilterStrategy": {
+					"description": "To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. For more details see Camel docs"
+				},
+				"__headerFilterStrategyTemplate": {
+					"type": "entaxy.runtime.connector",
+					"defaultValue": {
+						"type": "entaxy.runtime.connector"
+					}
+				},
 				"@IMPORT": [{
 					"sourceFactoryId": "artemis-connection",
 					"location": "outputs.producer.fields",
 					"prefix": "",
 					"filter": {
 						"contained": [{
-								"attribute": "##origin",
-								"values": ["camel"]
-							},
+							"attribute": "##origin",
+							"values": ["camel"]
+						},
 							{
 								"attribute": "group",
 								"inverse": true,
@@ -69,6 +78,11 @@
 							}
 						]
 					}
+				},
+				{
+					"sourceFactoryId": "header-filter-strategy",
+					"location": "fields",
+					"prefix": ""
 				}
 				]
 			},
@@ -80,6 +94,18 @@
 					"includePatterns":[]
 				}
 			}
+		},
+		"header-filter-strategy": {
+			"fields": {
+				"__headerFilterStrategyTemplate": {}
+			},
+			"scopes": [
+				"private"
+			],
+			"config": {
+				"@SKIP_PUBLISH": {},
+				"configurable": false
+			}
 		}
 	}
 }
diff --git a/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/factory/ftps-connector-in.json b/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/factory/ftps-connector-in.json
new file mode 100644
index 00000000..ba8ea82a
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/factory/ftps-connector-in.json
@@ -0,0 +1,83 @@
+/*  */
+{
+  "factory": {
+    "id": "ftps-connector-in",
+    "type": "entaxy.runtime.connector",
+    "displayName": "FTPS :: IN",
+    "parent": "connection-based-connector-in",
+    "description": "This component provides access to remote file systems over the FTP and SFTP protocols. For more details see Camel docs",
+    "isAbstract": false,
+    "requires": [
+      "ftps-connection"
+    ]
+  },
+  "entaxy.runtime.connector": {
+    "type": "ftps",
+    "protocol": "ftps"
+  },
+  "fields": {
+    "entaxyOriginConnection": {
+      "type": "entaxy.runtime.connection",
+      "filter": "(&(type=entaxy.runtime.connection)(label=*ftps*))"
+    },
+    "connectorSubdirectory": {
+      "displayName": "Subdirectory",
+      "description": "Connector specific part of endpoint directory path. For example you can set value 'documents' in connection's field `Directory Name` and set value '2023september' in connectors's field `Subdirectory`, as a result endpoint will be configured to `/documents2023september` directory. Or you can add slash symbol (/) to one of these fields and make subdirectory for connector - `/documents/2023september`. For more details see Camel docs",
+      "type": "String",
+      "group": "general"
+    }
+  },
+  "outputs": {
+    "init": {
+      "isDefault": true,
+      "fields": {
+        "entaxyOriginConnection": {},
+        "connectorSubdirectory": {},
+        "runExclusive": {
+          "type": "Boolean",
+          "defaultValue": true
+        },
+        "@IMPORT": [
+          {
+            "sourceFactoryId": "ftps-connection",
+            "location": "outputs.consumer.fields",
+            "prefix": "",
+            "filter": {
+              "contained": [
+                {
+                  "attribute": "##origin",
+                  "values": [
+                    "camel"
+                  ]
+                },
+                {
+                  "attribute": "$key",
+                  "inverse": true,
+                  "values": [
+                    "camel_username",
+                    "camel_password"
+                  ]
+                }
+              ]
+            }
+          },
+          {
+            "sourceFactoryId": "ftp-client-config",
+            "location": "fields",
+            "prefix": ""
+          }
+        ]
+      },
+      "config": {
+        "configurable": true,
+        "fieldsConfigurableByDefault": true,
+        "configurableFields": {
+          "includeNames": [
+            "connectorSubdirectory"
+          ],
+          "includePatterns": []
+        }
+      }
+    }
+  }
+}
diff --git a/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/factory/ftps-connector-out.json b/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/factory/ftps-connector-out.json
new file mode 100644
index 00000000..60e79086
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/factory/ftps-connector-out.json
@@ -0,0 +1,71 @@
+/*  */
+{
+  "factory": {
+    "id": "ftps-connector-out",
+    "type": "entaxy.runtime.connector",
+	"displayName": "FTPS :: OUT",
+    "parent": "connection-based-connector-out",
+	"description": "This component provides access to remote file systems over the FTP and SFTP protocols. For more details see Camel docs",
+	"isAbstract": false,
+    "requires": ["ftps-connection"]
+  },
+  "entaxy.runtime.connector": {
+  	"type": "ftps",
+  	"protocol": "ftps"
+  },
+  "fields": {
+		"entaxyOriginConnection": {
+			"type": "entaxy.runtime.connection",
+			"filter": "(&(type=entaxy.runtime.connection)(label=*ftps*))"
+		},
+		"connectorSubdirectory": {
+			"displayName": "Subdirectory",
+			"description": "Connector specific part of endpoint directory path. For example you can set value 'documents' in connection's field `Directory Name` and set value '2023september' in connectors's field `Subdirectory`, as a result endpoint will be configured to `/documents2023september` directory. Or you can add slash symbol (/) to one of these fields and make subdirectory for connector - `/documents/2023september`. For more details see Camel docs",
+			"type": "String",
+			"group": "general"
+		}
+  },
+	"outputs": {
+		"init": {
+			"isDefault": true,
+			"fields": {
+				"entaxyOriginConnection": {},
+				"connectorSubdirectory": {},
+				"@IMPORT": [{
+					"sourceFactoryId": "ftps-connection",
+					"location": "outputs.producer.fields",
+					"prefix": "",
+					"filter": {
+						"contained": [{
+								"attribute": "##origin",
+								"values": ["camel"]
+							},
+							{
+								"attribute": "$key",
+								"inverse": true,
+								"values": [
+									"camel_username",
+									"camel_password"
+								]
+							}
+						]
+					}
+				},
+				{
+					"sourceFactoryId": "ftp-client-config",
+					"location": "fields",
+					"prefix": ""
+				}
+				]
+			},
+			"config": {
+				"configurable": true,
+				"fieldsConfigurableByDefault": true,
+				"configurableFields": {
+					"includeNames":["connectorSubdirectory"],
+					"includePatterns":[]
+				}
+			}
+		}
+	}
+}
diff --git a/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/factory/http-connector-out.json b/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/factory/http-connector-out.json
new file mode 100644
index 00000000..cbfd1ca0
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/factory/http-connector-out.json
@@ -0,0 +1,2708 @@
+{
+  "factory": {
+    "id": "http-connector-out",
+    "type": "entaxy.runtime.connector",
+    "displayName": "HTTP :: OUT",
+    "parent": "abstract-connector-out",
+    "isAbstract": false,
+    "camelOriginComponent": "http",
+    "label": "http",
+    "description": "Send requests to external HTTP servers using Apache HTTP Client 4.x. For more details see Camel docs",
+    "camelOrigin": "camel-http",
+    "camelOriginJavaType": "org.apache.camel.component.http.HttpComponent"
+  },
+  "entaxy.runtime.connector": {
+    "type": "http",
+    "protocol": "http"
+  },
+  "fields": {
+    "removeServiceHeadersBeforeSending": {
+      "displayName": "Remove service headers before sending",
+      "description": "Enable to removing service headers before sending.(<removeHeaders pattern=\"Camel.+|operationName\"/>)",
+      "type": "Boolean",
+      "required": false,
+      "group": "header filter",
+      "defaultValue": true,
+      "@UI": {
+        "transmitAlways": true
+      }
+    },
+    "cookieStore": {
+      "displayName": "Cookie Store",
+      "description": "To use a custom org.apache.http.client.CookieStore. By default the org.apache.http.impl.client.BasicCookieStore is used which is an in-memory only cookie store. Notice if bridgeEndpoint\u003dtrue then the cookie store is forced to be a noop cookie store as cookie shouldn\u0027t be stored as we are just bridging (eg acting as a proxy). For more details see Camel docs",
+      "label": "producer",
+      "type": "object",
+      "required": false,
+      "hidden": false,
+      "group": "producer",
+      "##origin": "camel",
+      "kind": [
+        "property",
+        "parameter"
+      ],
+      "##camelDiff": {
+        "old": {
+          "javaType": "org.apache.http.client.CookieStore",
+          "deprecated": false
+        },
+        "new": {
+          "javaType": "org.apache.http.client.CookieStore",
+          "deprecated": false
+        }
+      }
+    },
+    "lazyStartProducer": {
+      "displayName": "Lazy Start Producer",
+      "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel\u0027s routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. For more details see Camel docs",
+      "label": "producer",
+      "type": "boolean",
+      "required": false,
+      "hidden": false,
+      "defaultValue": false,
+      "group": "producer",
+      "##origin": "camel",
+      "kind": [
+        "property",
+        "parameter"
+      ],
+      "##camelDiff": {
+        "old": {
+          "javaType": "boolean",
+          "deprecated": false
+        },
+        "new": {
+          "javaType": "boolean",
+          "deprecated": false
+        }
+      }
+    },
+    "allowJavaSerializedObject": {
+      "displayName": "Allow Java Serialized Object",
+      "description": "Whether to allow java serialization when a request uses context-type\u003dapplication/x-java-serialized-object. This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk. For more details see Camel docs",
+      "label": "advanced",
+      "type": "boolean",
+      "kind": "property",
+      "required": false,
+      "hidden": false,
+      "defaultValue": false,
+      "group": "advanced",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "boolean",
+        "deprecated": false
+      }
+    },
+    "basicPropertyBinding": {
+      "displayName": "Basic Property Binding",
+      "description": "Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities For more details see Camel docs",
+      "label": "advanced",
+      "type": "boolean",
+      "required": false,
+      "hidden": false,
+      "defaultValue": false,
+      "group": "advanced",
+      "##origin": "camel",
+      "kind": [
+        "property",
+        "parameter"
+      ],
+      "##camelDiff": {
+        "old": {
+          "javaType": "boolean",
+          "deprecated": false
+        },
+        "new": {
+          "javaType": "boolean",
+          "deprecated": false
+        }
+      }
+    },
+    "clientConnectionManager": {
+      "displayName": "Client Connection Manager",
+      "description": "To use a custom and shared HttpClientConnectionManager to manage connections. If this has been configured then this is always used for all endpoints created by this component. For more details see Camel docs",
+      "label": "advanced",
+      "type": "object",
+      "required": false,
+      "hidden": false,
+      "group": "advanced",
+      "##origin": "camel",
+      "kind": [
+        "property",
+        "parameter"
+      ],
+      "##camelDiff": {
+        "old": {
+          "javaType": "org.apache.http.conn.HttpClientConnectionManager",
+          "deprecated": false
+        },
+        "new": {
+          "javaType": "org.apache.http.conn.HttpClientConnectionManager",
+          "deprecated": false
+        }
+      }
+    },
+    "connectionsPerRoute": {
+      "displayName": "Connections Per Route",
+      "description": "The maximum number of connections per route. For more details see Camel docs",
+      "label": "advanced",
+      "type": "number",
+      "required": false,
+      "hidden": false,
+      "defaultValue": 20,
+      "group": "advanced",
+      "##origin": "camel",
+      "kind": [
+        "property",
+        "parameter"
+      ],
+      "##camelDiff": {
+        "old": {
+          "javaType": "int",
+          "deprecated": false
+        },
+        "new": {
+          "javaType": "int",
+          "deprecated": false
+        }
+      }
+    },
+    "connectionTimeToLive": {
+      "displayName": "Connection Time To Live",
+      "description": "The time for connection to live, the time unit is millisecond, the default value is always keep alive. For more details see Camel docs",
+      "label": "advanced",
+      "type": "number",
+      "kind": "property",
+      "required": false,
+      "hidden": false,
+      "group": "advanced",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "long",
+        "deprecated": false
+      }
+    },
+    "httpBinding": {
+      "displayName": "Http Binding",
+      "description": "To use a custom HttpBinding to control the mapping between Camel message and HttpClient. For more details see Camel docs",
+      "label": "advanced",
+      "type": "object",
+      "required": false,
+      "hidden": false,
+      "group": "advanced",
+      "##origin": "camel",
+      "kind": [
+        "property",
+        "parameter"
+      ],
+      "##camelDiff": {
+        "old": {
+          "javaType": "org.apache.camel.http.common.HttpBinding",
+          "deprecated": false
+        },
+        "new": {
+          "javaType": "org.apache.camel.http.common.HttpBinding",
+          "deprecated": false
+        }
+      }
+    },
+    "httpClientConfigurer": {
+      "displayName": "Http Client Configurer",
+      "description": "To use the custom HttpClientConfigurer to perform configuration of the HttpClient that will be used. For more details see Camel docs",
+      "label": "advanced",
+      "type": "object",
+      "required": false,
+      "hidden": false,
+      "group": "advanced",
+      "##origin": "camel",
+      "kind": [
+        "property",
+        "parameter"
+      ],
+      "##camelDiff": {
+        "old": {
+          "javaType": "org.apache.camel.component.http.HttpClientConfigurer",
+          "deprecated": false
+        },
+        "new": {
+          "javaType": "org.apache.camel.component.http.HttpClientConfigurer",
+          "deprecated": false
+        }
+      }
+    },
+    "httpConfiguration": {
+      "displayName": "Http Configuration",
+      "description": "To use the shared HttpConfiguration as base configuration. For more details see Camel docs",
+      "label": "advanced",
+      "type": "object",
+      "kind": "property",
+      "required": false,
+      "hidden": false,
+      "group": "advanced",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "org.apache.camel.http.common.HttpConfiguration",
+        "deprecated": false
+      }
+    },
+    "httpContext": {
+      "displayName": "Http Context",
+      "description": "To use a custom org.apache.http.protocol.HttpContext when executing requests. For more details see Camel docs",
+      "label": "advanced",
+      "type": "object",
+      "required": false,
+      "hidden": false,
+      "group": "advanced",
+      "##origin": "camel",
+      "kind": [
+        "property",
+        "parameter"
+      ],
+      "##camelDiff": {
+        "old": {
+          "javaType": "org.apache.http.protocol.HttpContext",
+          "deprecated": false
+        },
+        "new": {
+          "javaType": "org.apache.http.protocol.HttpContext",
+          "deprecated": false
+        }
+      }
+    },
+    "maxTotalConnections": {
+      "displayName": "Max Total Connections",
+      "description": "The maximum number of connections. For more details see Camel docs",
+      "label": "advanced",
+      "type": "number",
+      "required": false,
+      "hidden": false,
+      "defaultValue": 200,
+      "group": "advanced",
+      "##origin": "camel",
+      "kind": [
+        "property",
+        "parameter"
+      ],
+      "##camelDiff": {
+        "old": {
+          "javaType": "int",
+          "deprecated": false
+        },
+        "new": {
+          "javaType": "int",
+          "deprecated": false
+        }
+      }
+    },
+    "headerFilterStrategy": {
+      "displayName": "Header Filter Strategy",
+      "description": "To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. For more details see Camel docs",
+      "label": "filter",
+      "type": "object",
+      "required": false,
+      "hidden": false,
+      "group": "filter",
+      "##origin": "camel",
+      "kind": [
+        "property",
+        "parameter"
+      ],
+      "##camelDiff": {
+        "old": {
+          "javaType": "org.apache.camel.spi.HeaderFilterStrategy",
+          "deprecated": false
+        },
+        "new": {
+          "javaType": "org.apache.camel.spi.HeaderFilterStrategy",
+          "deprecated": false
+        }
+      }
+    },
+    "sslContextParameters": {
+      "displayName": "Ssl Context Parameters",
+      "description": "To configure security using SSLContextParameters. Important: Only one instance of org.apache.camel.support.jsse.SSLContextParameters is supported per HttpComponent. If you need to use 2 or more different instances, you need to define a new HttpComponent per instance you need. For more details see Camel docs",
+      "label": "security",
+      "type": "object",
+      "required": false,
+      "hidden": false,
+      "group": "security",
+      "##origin": "camel",
+      "kind": [
+        "property",
+        "parameter"
+      ],
+      "##camelDiff": {
+        "old": {
+          "javaType": "org.apache.camel.support.jsse.SSLContextParameters",
+          "deprecated": false
+        },
+        "new": {
+          "javaType": "org.apache.camel.support.jsse.SSLContextParameters",
+          "deprecated": false
+        }
+      }
+    },
+    "useGlobalSslContextParameters": {
+      "displayName": "Use Global Ssl Context Parameters",
+      "description": "Enable usage of global SSL context parameters. For more details see Camel docs",
+      "label": "security",
+      "type": "boolean",
+      "kind": "property",
+      "required": false,
+      "hidden": false,
+      "defaultValue": false,
+      "group": "security",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "boolean",
+        "deprecated": false
+      }
+    },
+    "x509HostnameVerifier": {
+      "displayName": "X509 Hostname Verifier",
+      "description": "To use a custom X509HostnameVerifier such as DefaultHostnameVerifier or NoopHostnameVerifier. For more details see Camel docs",
+      "label": "security",
+      "type": "object",
+      "required": false,
+      "hidden": false,
+      "group": "security",
+      "##origin": "camel",
+      "kind": [
+        "property",
+        "parameter"
+      ],
+      "##camelDiff": {
+        "old": {
+          "javaType": "javax.net.ssl.HostnameVerifier",
+          "deprecated": false
+        },
+        "new": {
+          "javaType": "javax.net.ssl.HostnameVerifier",
+          "deprecated": false
+        }
+      }
+    },
+    "connectionRequestTimeout": {
+      "displayName": "Connection Request Timeout",
+      "description": "The timeout in milliseconds used when requesting a connection from the connection manager. A timeout value of zero is interpreted as an infinite timeout. A timeout value of zero is interpreted as an infinite timeout. A negative value is interpreted as undefined (system default). For more details see Camel docs",
+      "label": "timeout",
+      "type": "number",
+      "kind": "property",
+      "required": false,
+      "hidden": false,
+      "defaultValue": {
+        "value": "-1"
+      },
+      "group": "timeout",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "int",
+        "deprecated": false
+      }
+    },
+    "connectTimeout": {
+      "displayName": "Connect Timeout",
+      "description": "Determines the timeout in milliseconds until a connection is established. A timeout value of zero is interpreted as an infinite timeout. A timeout value of zero is interpreted as an infinite timeout. A negative value is interpreted as undefined (system default). For more details see Camel docs",
+      "label": "timeout",
+      "type": "number",
+      "kind": "property",
+      "required": false,
+      "hidden": false,
+      "defaultValue": {
+        "value": "-1"
+      },
+      "group": "timeout",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "int",
+        "deprecated": false
+      }
+    },
+    "socketTimeout": {
+      "displayName": "Socket Timeout",
+      "description": "Defines the socket timeout in milliseconds, which is the timeout for waiting for data or, put differently, a maximum period inactivity between two consecutive data packets). A timeout value of zero is interpreted as an infinite timeout. A negative value is interpreted as undefined (system default). For more details see Camel docs",
+      "label": "timeout",
+      "type": "number",
+      "kind": "property",
+      "required": false,
+      "hidden": false,
+      "defaultValue": {
+        "value": "-1"
+      },
+      "group": "timeout",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "int",
+        "deprecated": false
+      }
+    },
+    "httpUri": {
+      "displayName": "Http Uri",
+      "description": "The url of the HTTP endpoint to call. For more details see Camel docs",
+      "label": "common",
+      "type": "string",
+      "kind": "path",
+      "required": true,
+      "hidden": false,
+      "group": "common",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "java.net.URI",
+        "deprecated": false,
+        "deprecationNote": ""
+      }
+    },
+    "disableStreamCache": {
+      "displayName": "Disable Stream Cache",
+      "description": "Determines whether or not the raw input stream from Servlet is cached or not (Camel will read the stream into a in memory/overflow to file, Stream caching) cache. By default Camel will cache the Servlet input stream to support reading it multiple times to ensure it Camel can retrieve all data from the stream. However you can set this option to true when you for example need to access the raw stream, such as streaming it directly to a file or other persistent store. DefaultHttpBinding will copy the request input stream into a stream cache and put it into message body if this option is false to support reading the stream multiple times. If you use Servlet to bridge/proxy an endpoint then consider enabling this option to improve performance, in case you do not need to read the message payload multiple times. The http producer will by default cache the response body stream. If setting this option to true, then the producers will not cache the response body stream but use the response stream as-is as the message body. For more details see Camel docs",
+      "label": "common",
+      "type": "boolean",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "defaultValue": false,
+      "group": "common",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "boolean",
+        "deprecated": false
+      }
+    },
+    "bridgeEndpoint": {
+      "displayName": "Bridge Endpoint",
+      "description": "If the option is true, HttpProducer will ignore the Exchange.HTTP_URI header, and use the endpoint\u0027s URI for request. You may also set the option throwExceptionOnFailure to be false to let the HttpProducer send all the fault response back. For more details see Camel docs",
+      "label": "producer",
+      "type": "boolean",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "defaultValue": false,
+      "group": "producer",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "boolean",
+        "deprecated": false
+      }
+    },
+    "chunked": {
+      "displayName": "Chunked",
+      "description": "If this option is false the Servlet will disable the HTTP streaming and set the content-length header on the response For more details see Camel docs",
+      "label": "",
+      "type": "boolean",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "defaultValue": true,
+      "group": "producer",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "boolean",
+        "deprecated": false
+      }
+    },
+    "clearExpiredCookies": {
+      "displayName": "Clear Expired Cookies",
+      "description": "Whether to clear expired cookies before sending the HTTP request. This ensures the cookies store does not keep growing by adding new cookies which is newer removed when they are expired. For more details see Camel docs",
+      "label": "producer",
+      "type": "boolean",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "defaultValue": true,
+      "group": "producer",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "boolean",
+        "deprecated": false
+      }
+    },
+    "connectionClose": {
+      "displayName": "Connection Close",
+      "description": "Specifies whether a Connection Close header must be added to HTTP Request. By default connectionClose is false. For more details see Camel docs",
+      "label": "producer",
+      "type": "boolean",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "defaultValue": false,
+      "group": "producer",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "boolean",
+        "deprecated": false
+      }
+    },
+    "copyHeaders": {
+      "displayName": "Copy Headers",
+      "description": "If this option is true then IN exchange headers will be copied to OUT exchange headers according to copy strategy. Setting this to false, allows to only include the headers from the HTTP response (not propagating IN headers). For more details see Camel docs",
+      "label": "producer",
+      "type": "boolean",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "defaultValue": true,
+      "group": "producer",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "boolean",
+        "deprecated": false
+      }
+    },
+    "customHostHeader": {
+      "displayName": "Custom Host Header",
+      "description": "To use custom host header for producer. When not set in query will be ignored. When set will override host header derived from url. For more details see Camel docs",
+      "label": "producer",
+      "type": "string",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "producer",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "java.lang.String",
+        "deprecated": false
+      }
+    },
+    "httpMethod": {
+      "displayName": "Http Method",
+      "description": "Configure the HTTP method to use. The HttpMethod header cannot override this option if set. For more details see Camel docs",
+      "label": "producer",
+      "type": "string",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "producer",
+      "@TYPEINFO": {
+        "type": "enum",
+        "values": [
+          "GET",
+          "POST",
+          "PUT",
+          "DELETE",
+          "HEAD",
+          "OPTIONS",
+          "TRACE",
+          "PATCH"
+        ]
+      },
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "org.apache.camel.http.common.HttpMethods",
+        "deprecated": false
+      }
+    },
+    "ignoreResponseBody": {
+      "displayName": "Ignore Response Body",
+      "description": "If this option is true, The http producer won\u0027t read response body and cache the input stream For more details see Camel docs",
+      "label": "producer",
+      "type": "boolean",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "defaultValue": false,
+      "group": "producer",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "boolean",
+        "deprecated": false
+      }
+    },
+    "preserveHostHeader": {
+      "displayName": "Preserve Host Header",
+      "description": "If the option is true, HttpProducer will set the Host header to the value contained in the current exchange Host header, useful in reverse proxy applications where you want the Host header received by the downstream server to reflect the URL called by the upstream client, this allows applications which use the Host header to generate accurate URL\u0027s for a proxied service For more details see Camel docs",
+      "label": "producer",
+      "type": "boolean",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "defaultValue": false,
+      "group": "producer",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "boolean",
+        "deprecated": false
+      }
+    },
+    "throwExceptionOnFailure": {
+      "displayName": "Throw Exception On Failure",
+      "description": "Option to disable throwing the HttpOperationFailedException in case of failed responses from the remote server. This allows you to get all responses regardless of the HTTP status code. For more details see Camel docs",
+      "label": "producer",
+      "type": "boolean",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "defaultValue": true,
+      "group": "producer",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "boolean",
+        "deprecated": false
+      }
+    },
+    "transferException": {
+      "displayName": "Transfer Exception",
+      "description": "If enabled and an Exchange failed processing on the consumer side, and if the caused Exception was send back serialized in the response as a application/x-java-serialized-object content type. On the producer side the exception will be deserialized and thrown as is, instead of the HttpOperationFailedException. The caused exception is required to be serialized. This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk. For more details see Camel docs",
+      "label": "",
+      "type": "boolean",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "defaultValue": false,
+      "group": "producer",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "boolean",
+        "deprecated": false
+      }
+    },
+    "cookieHandler": {
+      "displayName": "Cookie Handler",
+      "description": "Configure a cookie handler to maintain a HTTP session For more details see Camel docs",
+      "label": "producer,advanced",
+      "type": "object",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "producer (advanced)",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "org.apache.camel.http.base.cookie.CookieHandler",
+        "deprecated": false
+      }
+    },
+    "deleteWithBody": {
+      "displayName": "Delete With Body",
+      "description": "Whether the HTTP DELETE should include the message body or not. By default HTTP DELETE do not include any HTTP body. However in some rare cases users may need to be able to include the message body. For more details see Camel docs",
+      "label": "producer,advanced",
+      "type": "boolean",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "defaultValue": false,
+      "group": "producer (advanced)",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "boolean",
+        "deprecated": false
+      }
+    },
+    "getWithBody": {
+      "displayName": "Get With Body",
+      "description": "Whether the HTTP GET should include the message body or not. By default HTTP GET do not include any HTTP body. However in some rare cases users may need to be able to include the message body. For more details see Camel docs",
+      "label": "producer,advanced",
+      "type": "boolean",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "defaultValue": false,
+      "group": "producer (advanced)",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "boolean",
+        "deprecated": false
+      }
+    },
+    "okStatusCodeRange": {
+      "displayName": "Ok Status Code Range",
+      "description": "The status codes which are considered a success response. The values are inclusive. Multiple ranges can be defined, separated by comma, e.g. 200-204,209,301-304. Each range must be a single number or from-to with the dash included. For more details see Camel docs",
+      "label": "producer,advanced",
+      "type": "string",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "defaultValue": "200-299",
+      "group": "producer (advanced)",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "java.lang.String",
+        "deprecated": false
+      }
+    },
+    "clientBuilder": {
+      "displayName": "Client Builder",
+      "description": "Provide access to the http client request parameters used on new RequestConfig instances used by producers or consumers of this endpoint. For more details see Camel docs",
+      "label": "advanced",
+      "type": "object",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "advanced",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "org.apache.http.impl.client.HttpClientBuilder",
+        "deprecated": false
+      }
+    },
+    "httpClient": {
+      "displayName": "Http Client",
+      "description": "Sets a custom HttpClient to be used by the producer For more details see Camel docs",
+      "label": "advanced",
+      "type": "object",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "advanced",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "org.apache.http.client.HttpClient",
+        "deprecated": false
+      }
+    },
+    "httpClientOptions": {
+      "displayName": "Http Client Options",
+      "description": "To configure the HttpClient using the key/values from the Map. For more details see Camel docs",
+      "label": "advanced",
+      "type": "object",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "advanced",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "java.util.Map\u003cjava.lang.String, java.lang.Object\u003e",
+        "prefix": "httpClient.",
+        "multiValue": true,
+        "deprecated": false
+      }
+    },
+    "mapHttpMessageBody": {
+      "displayName": "Map Http Message Body",
+      "description": "If this option is true then IN exchange Body of the exchange will be mapped to HTTP body. Setting this to false will avoid the HTTP mapping. For more details see Camel docs",
+      "label": "advanced",
+      "type": "boolean",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "defaultValue": true,
+      "group": "advanced",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "boolean",
+        "deprecated": false
+      }
+    },
+    "mapHttpMessageFormUrlEncodedBody": {
+      "displayName": "Map Http Message Form Url Encoded Body",
+      "description": "If this option is true then IN exchange Form Encoded body of the exchange will be mapped to HTTP. Setting this to false will avoid the HTTP Form Encoded body mapping. For more details see Camel docs",
+      "label": "advanced",
+      "type": "boolean",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "defaultValue": true,
+      "group": "advanced",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "boolean",
+        "deprecated": false
+      }
+    },
+    "mapHttpMessageHeaders": {
+      "displayName": "Map Http Message Headers",
+      "description": "If this option is true then IN exchange Headers of the exchange will be mapped to HTTP headers. Setting this to false will avoid the HTTP Headers mapping. For more details see Camel docs",
+      "label": "advanced",
+      "type": "boolean",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "defaultValue": true,
+      "group": "advanced",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "boolean",
+        "deprecated": false
+      }
+    },
+    "synchronous": {
+      "displayName": "Synchronous",
+      "description": "Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). For more details see Camel docs",
+      "label": "advanced",
+      "type": "boolean",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "defaultValue": false,
+      "group": "advanced",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "boolean",
+        "deprecated": false
+      }
+    },
+    "useSystemProperties": {
+      "displayName": "Use System Properties",
+      "description": "To use System Properties as fallback for configuration For more details see Camel docs",
+      "label": "advanced",
+      "type": "boolean",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "defaultValue": false,
+      "group": "advanced",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "boolean",
+        "deprecated": false
+      }
+    },
+    "proxyAuthDomain": {
+      "displayName": "Proxy Auth Domain",
+      "description": "Proxy authentication domain to use with NTML For more details see Camel docs",
+      "label": "producer,proxy",
+      "type": "string",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "proxy",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "java.lang.String",
+        "deprecated": false
+      }
+    },
+    "proxyAuthHost": {
+      "displayName": "Proxy Auth Host",
+      "description": "Proxy authentication host For more details see Camel docs",
+      "label": "producer,proxy",
+      "type": "string",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "proxy",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "java.lang.String",
+        "deprecated": false
+      }
+    },
+    "proxyAuthMethod": {
+      "displayName": "Proxy Auth Method",
+      "description": "Proxy authentication method to use For more details see Camel docs",
+      "label": "producer,proxy",
+      "type": "string",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "proxy",
+      "@TYPEINFO": {
+        "type": "enum",
+        "values": [
+          "Basic",
+          "Digest",
+          "NTLM"
+        ]
+      },
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "java.lang.String",
+        "deprecated": false
+      }
+    },
+    "proxyAuthPassword": {
+      "displayName": "Proxy Auth Password",
+      "description": "Proxy authentication password For more details see Camel docs",
+      "label": "producer,proxy",
+      "type": "password",
+      "kind": "parameter",
+      "required": false,
+      "hidden": true,
+      "group": "proxy",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "java.lang.String",
+        "deprecated": false
+      }
+    },
+    "proxyAuthPort": {
+      "displayName": "Proxy Auth Port",
+      "description": "Proxy authentication port For more details see Camel docs",
+      "label": "producer,proxy",
+      "type": "number",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "proxy",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "int",
+        "deprecated": false
+      }
+    },
+    "proxyAuthScheme": {
+      "displayName": "Proxy Auth Scheme",
+      "description": "Proxy authentication scheme to use For more details see Camel docs",
+      "label": "producer,proxy",
+      "type": "string",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "proxy",
+      "@TYPEINFO": {
+        "type": "enum",
+        "values": [
+          "http",
+          "https"
+        ]
+      },
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "java.lang.String",
+        "deprecated": false
+      }
+    },
+    "proxyAuthUsername": {
+      "displayName": "Proxy Auth Username",
+      "description": "Proxy authentication username For more details see Camel docs",
+      "label": "producer,proxy",
+      "type": "string",
+      "kind": "parameter",
+      "required": false,
+      "hidden": true,
+      "group": "proxy",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "java.lang.String",
+        "deprecated": false
+      }
+    },
+    "proxyHost": {
+      "displayName": "Proxy Host",
+      "description": "Proxy hostname to use For more details see Camel docs",
+      "label": "producer,proxy",
+      "type": "string",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "proxy",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "java.lang.String",
+        "deprecated": false
+      }
+    },
+    "proxyPort": {
+      "displayName": "Proxy Port",
+      "description": "Proxy port to use For more details see Camel docs",
+      "label": "producer,proxy",
+      "type": "number",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "proxy",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "int",
+        "deprecated": false
+      }
+    },
+    "authDomain": {
+      "displayName": "Auth Domain",
+      "description": "Authentication domain to use with NTML For more details see Camel docs",
+      "label": "producer,security",
+      "type": "string",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "security",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "java.lang.String",
+        "deprecated": false
+      }
+    },
+    "authenticationPreemptive": {
+      "displayName": "Authentication Preemptive",
+      "description": "If this option is true, camel-http sends preemptive basic authentication to the server. For more details see Camel docs",
+      "label": "producer,security",
+      "type": "boolean",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "defaultValue": false,
+      "group": "security",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "boolean",
+        "deprecated": false
+      }
+    },
+    "authHost": {
+      "displayName": "Auth Host",
+      "description": "Authentication host to use with NTML For more details see Camel docs",
+      "label": "producer,security",
+      "type": "string",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "security",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "java.lang.String",
+        "deprecated": false
+      }
+    },
+    "authMethod": {
+      "displayName": "Auth Method",
+      "description": "Authentication methods allowed to use as a comma separated list of values Basic, Digest or NTLM. For more details see Camel docs",
+      "label": "producer,security",
+      "type": "string",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "security",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "java.lang.String",
+        "deprecated": false
+      }
+    },
+    "authMethodPriority": {
+      "displayName": "Auth Method Priority",
+      "description": "Which authentication method to prioritize to use, either as Basic, Digest or NTLM. For more details see Camel docs",
+      "label": "producer,security",
+      "type": "string",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "security",
+      "@TYPEINFO": {
+        "type": "enum",
+        "values": [
+          "Basic",
+          "Digest",
+          "NTLM"
+        ]
+      },
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "java.lang.String",
+        "deprecated": false
+      }
+    },
+    "authPassword": {
+      "displayName": "Auth Password",
+      "description": "Authentication password For more details see Camel docs",
+      "label": "producer,security",
+      "type": "password",
+      "kind": "parameter",
+      "required": false,
+      "hidden": true,
+      "group": "security",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "java.lang.String",
+        "deprecated": false
+      }
+    },
+    "authUsername": {
+      "displayName": "Auth Username",
+      "description": "Authentication username For more details see Camel docs",
+      "label": "producer,security",
+      "type": "string",
+      "kind": "parameter",
+      "required": false,
+      "hidden": true,
+      "group": "security",
+      "##origin": "camel",
+      "##camelDiff": {
+        "javaType": "java.lang.String",
+        "deprecated": false
+      }
+    }
+  },
+  "custom": {
+      "__customObjects": {
+        "type": "entaxy.runtime.connector",
+        "isRef": true,
+        "required": true,
+        "isHidden": true,
+        "isRefByValueOnly": true,
+        "@INTERNAL": true,
+        "defaultValue": {
+            "type": "entaxy.runtime.connector",
+            "factoryId": "#OWNER#",
+            "outputType": "customObjects",
+            "scope": "private",
+            "properties": {
+                "x509HostnameVerifier": {
+                    "@CALCULATED": {
+                        "expression": "${#OWNER#.properties.camel_x509HostnameVerifier}",
+                        "fallbackObject": null,
+                        "lazy": false
+                    }
+                },
+                "cookieStore": {
+                    "@CALCULATED": {
+                        "expression": "${#OWNER#.properties.camel_cookieStore}",
+                        "fallbackObject": null,
+                        "lazy": false
+                    }
+                },
+                "sslContextParameters": {
+                    "@CALCULATED": {
+                        "expression": "${#OWNER#.properties.camel_sslContextParameters}",
+                        "fallbackObject": null,
+                        "lazy": false
+                    }
+                },
+                "sslContextParametersKeyManagersPass": {
+                    "@CALCULATED": {
+                        "expression": "${#OWNER#.properties.sslContextParametersKeyManagersPass}",
+                        "fallbackObject": null,
+                        "lazy": false
+                    }
+                },
+                "sslContextParametersKeyManagersKeyStoreResource": {
+                    "@CALCULATED": {
+                        "expression": "${#OWNER#.properties.sslContextParametersKeyManagersKeyStoreResource}",
+                        "fallbackObject": null,
+                        "lazy": false
+                    }
+                },
+                "sslContextParametersKeyManagersKeyStoreType": {
+                    "@CALCULATED": {
+                        "expression": "${#OWNER#.properties.sslContextParametersKeyManagersKeyStoreType}",
+                        "fallbackObject": null,
+                        "lazy": false
+                    }
+                },
+                "sslContextParametersKeyManagersKeyStorePass": {
+                    "@CALCULATED": {
+                        "expression": "${#OWNER#.properties.sslContextParametersKeyManagersKeyStorePass}",
+                        "fallbackObject": null,
+                        "lazy": false
+                    }
+                },
+                "sslContextParametersTrustManagersKeyStoreResource": {
+                    "@CALCULATED": {
+                        "expression": "${#OWNER#.properties.sslContextParametersTrustManagersKeyStoreResource}",
+                        "fallbackObject": null,
+                        "lazy": false
+                    }
+                },
+                "sslContextParametersTrustManagersKeyStoreType": {
+                    "@CALCULATED": {
+                        "expression": "${#OWNER#.properties.sslContextParametersTrustManagersKeyStoreType}",
+                        "fallbackObject": null,
+                        "lazy": false
+                    }
+                },
+                "sslContextParametersTrustManagersKeyStorePass": {
+                    "@CALCULATED": {
+                        "expression": "${#OWNER#.properties.sslContextParametersTrustManagersKeyStorePass}",
+                        "fallbackObject": null,
+                        "lazy": false
+                    }
+                }
+            }
+        }
+    },
+    "cookieStoreReference": {
+      "displayName": "Reference",
+      "description": "Reference to custom org.apache.http.client.CookieStore without leading # For more details see Camel docs",
+      "label": "producer",
+      "type": "string",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "cookie",
+      "defaultValue": "cookieStore",
+      "@UI": {
+        "transmitAlways": false,
+        "displayBlocksManagedBy": "camel_cookieStore",
+        "displayBlocks": ["custom"],
+        "required": true
+        }
+    },
+    "clientConnectionManagerReference": {
+      "displayName": "Reference",
+      "description": "Reference to custom and shared HttpClientConnectionManager without leading # For more details see Camel docs",
+      "label": "advanced",
+      "type": "string",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "client connection manager",
+      "defaultValue": "clientConnectionManager",
+      "@UI": {
+        "transmitAlways": false,
+        "displayBlocksManagedBy": "camel_clientConnectionManager",
+        "displayBlocks": ["custom"],
+        "required": true
+        }
+    },
+    "httpBindingReference": {
+      "displayName": "Reference",
+      "description": "Reference to custom HttpBinding without leading # For more details see Camel docs",
+      "label": "advanced",
+      "type": "string",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "http binding",
+      "defaultValue": "httpBinding",
+      "@UI": {
+        "transmitAlways": false,
+        "displayBlocksManagedBy": "camel_httpBinding",
+        "displayBlocks": ["custom"],
+        "required": true
+        }
+    },
+    "httpClientConfigurerReference": {
+      "displayName": "Reference",
+      "description": "Reference to custom HttpClientConfigurer without leading # For more details see Camel docs",
+      "label": "advanced",
+      "type": "string",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "http client configurer",
+      "defaultValue": "httpClientConfigurer",
+      "@UI": {
+        "transmitAlways": false,
+        "displayBlocksManagedBy": "camel_httpClientConfigurer",
+        "displayBlocks": ["custom"],
+        "required": true
+        }
+    },
+    "httpContextReference": {
+      "displayName": "Reference",
+      "description": "Reference to custom org.apache.http.protocol.HttpContext without leading # For more details see Camel docs",
+      "label": "advanced",
+      "type": "string",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "http context",
+      "defaultValue": "httpContext",
+      "@UI": {
+        "transmitAlways": false,
+        "displayBlocksManagedBy": "camel_httpContext",
+        "displayBlocks": ["custom"],
+        "required": true
+        }
+    },
+    "x509HostnameVerifierReference": {
+      "displayName": "Reference",
+      "description": "Reference to  custom X509HostnameVerifier without leading # For more details see Camel docs",
+      "label": "advanced",
+      "type": "string",
+      "kind": "parameter",
+      "required": false,
+      "hidden": false,
+      "group": "hostname verifier",
+      "defaultValue": "x509HostnameVerifier",
+      "@UI": {
+        "transmitAlways": false,
+        "displayBlocksManagedBy": "camel_x509HostnameVerifier",
+        "displayBlocks": ["custom"],
+        "required": true
+        }
+    }
+    
+  },
+  "outputs": {
+    "init": {
+      "isDefault": true,
+      "fields": {
+        "removeServiceHeadersBeforeSending": {},
+        "httpUri": {
+          "group": "general"
+        },
+        "camel_httpMethod": {
+          "@UI": {
+              "transmitAlways": true
+          },
+          "@TYPEINFO": {
+            "emptyOptionName": "CAMEL_AUTO"
+          }
+        },
+        "camel_cookieStore": {
+          "group": "cookie",
+          "type": "string",
+          "@TYPEINFO": {
+            "type": "enum",
+            "emptyOptionName": "default",
+            "values": [
+              "org.apache.camel.component.http.NoopCookieStore",
+              "custom"
+            ]
+          },
+          "@UI": {
+            "manageDisplayBlocksByValue": true
+          }
+        },
+        "camel_clientConnectionManager": {
+          "group": "client connection manager",
+          "type": "string",
+          "@TYPEINFO": {
+            "type": "enum",
+            "emptyOptionName": "default",
+            "values": [
+              "custom"
+            ]
+          },
+          "@UI": {
+            "manageDisplayBlocksByValue": true
+          }
+        },
+        "camel_httpBinding": {
+          "group": "http binding",
+          "type": "string",
+          "@TYPEINFO": {
+            "type": "enum",
+            "emptyOptionName": "default",
+            "values": [
+              "custom"
+            ]
+          },
+          "@UI": {
+            "manageDisplayBlocksByValue": true
+          }
+        },
+        "camel_httpClientConfigurer": {
+          "group": "http client configurer",
+          "type": "string",
+          "@TYPEINFO": {
+            "type": "enum",
+            "emptyOptionName": "default",
+            "values": [
+              "custom"
+            ]
+          },
+          "@UI": {
+            "manageDisplayBlocksByValue": true
+          }
+        },
+        "camel_httpContext": {
+          "group": "http context",
+          "type": "string",
+          "@TYPEINFO": {
+            "type": "enum",
+            "emptyOptionName": "default",
+            "values": [
+              "custom"
+            ]
+          },
+          "@UI": {
+            "manageDisplayBlocksByValue": true
+          }
+        },
+        "camel_x509HostnameVerifier": {
+          "group": "hostname verifier",
+          "type": "string",
+          "@TYPEINFO": {
+            "type": "enum",
+            "emptyOptionName": "default",
+            "values": [
+              "org.apache.http.conn.ssl.NoopHostnameVerifier",
+              "custom"
+            ]
+          },
+          "@UI": {
+            "manageDisplayBlocksByValue": true
+          }
+        },
+        "camel_headerFilterStrategy": {
+          "description": "To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. For more details see Camel docs"
+        },
+        "__headerFilterStrategyTemplate": {
+          "type": "entaxy.runtime.connector",
+          "defaultValue": {
+            "type": "entaxy.runtime.connector"
+          }
+        },
+        "@IMPORT": [
+          {
+            "sourceFactoryId": "#",
+            "location": "fields",
+            "prefix": "camel_",
+            "filter": {
+              "contains": [
+                {
+                  "attribute": "kind",
+                  "values": [
+                    "parameter"
+                  ]
+                },
+                {
+                  "attribute": "label",
+                  "inverse": true,
+                  "values": [
+                    "consumer"
+                  ]
+                }
+              ]
+            }
+          },
+          {
+            "sourceFactoryId": "#",
+            "location": "custom",
+            "prefix": ""
+          },
+          {
+            "sourceFactoryId": "ssl-context-parameters",
+            "location": "fields",
+            "prefix": ""
+          },
+          {
+            "sourceFactoryId": "header-filter-strategy",
+            "location": "fields",
+            "prefix": ""
+          }
+        ]
+      },
+      "config": {
+        "configurable": true,
+        "fieldsConfigurableByDefault": true,
+        "configurableFields": {
+          "includeNames":["httpUri", "camel_authUsername", "camel_authPassword"],
+          "includePatterns":[]
+        }
+      }
+    },
+    "ssl-context-parameters": {
+        "fields": {
+            "__sslContextParametersTemplate":{}
+        },
+        "scopes": ["private"],
+        "config": {
+            "@SKIP_PUBLISH": {},
+            "configurable": false
+        }
+    },
+    "customObjects": {
+        "fields": {
+            "x509HostnameVerifier": {},
+            "cookieStore": {}
+        },
+        "scopes": ["private"],
+        "config": {
+            "@SKIP_PUBLISH": {},
+            "configurable": false
+        }
+    },
+    "path": {
+      "fields": {
+        "@IMPORT": [
+          {
+            "sourceFactoryId": "#",
+            "location": "fields",
+            "prefix": "camel_",
+            "filter": {
+              "contains": [
+                {
+                  "attribute": "kind",
+                  "values": [
+                    "path"
+                  ]
+                }
+              ]
+            }
+          }
+        ]
+      }
+    },
+    "consumer": {
+      "fields": {
+        "@IMPORT": [
+          {
+            "sourceFactoryId": "#",
+            "location": "fields",
+            "prefix": "camel_",
+            "filter": {
+              "contains": [
+                {
+                  "attribute": "kind",
+                  "values": [
+                    "parameter"
+                  ]
+                },
+                {
+                  "attribute": "label",
+                  "inverse": true,
+                  "values": [
+                    "producer"
+                  ]
+                }
+              ]
+            }
+          }
+        ]
+      }
+    },
+    "producer": {
+      "fields": {
+        "@IMPORT": [
+          {
+            "sourceFactoryId": "#",
+            "location": "fields",
+            "prefix": "camel_",
+            "filter": {
+              "contains": [
+                {
+                  "attribute": "kind",
+                  "values": [
+                    "parameter"
+                  ]
+                },
+                {
+                  "attribute": "label",
+                  "inverse": true,
+                  "values": [
+                    "consumer"
+                  ]
+                }
+              ]
+            }
+          }
+        ]
+      }
+    },
+    "header-filter-strategy": {
+      "fields": {
+        "__headerFilterStrategyTemplate": {}
+      },
+      "scopes": [
+        "private"
+      ],
+      "config": {
+        "@SKIP_PUBLISH": {},
+        "configurable": false
+      }
+    }
+  },
+  "##camel": {
+    "settings": {
+      "import": {
+        "factory": {
+          "attributes": {
+            "name": [
+              "id",
+              "camelOriginComponent"
+            ],
+            "label": {
+              "target": "label",
+              "replaceIfEmpty": true
+            },
+            "description": {
+              "target": "description",
+              "policy": "firstOnly",
+              "replaceIfEmpty": true
+            },
+            "artifactId": "camelOrigin",
+            "javaType": "camelOriginJavaType"
+          }
+        },
+        "fileds": {
+          "attributes": {
+            "displayName": "displayName",
+            "description": {
+              "target": "description",
+              "policy": "firstOnly"
+            },
+            "label": "label",
+            "type": {
+              "target": "type",
+              "map": {
+                "integer": "number"
+              }
+            },
+            "kind": {
+              "target": "kind",
+              "policy": "both"
+            },
+            "required": "required",
+            "secret": "hidden",
+            "defaultValue": {
+              "target": "defaultValue",
+              "convertTo": "@type"
+            },
+            "group": "group",
+            "enum": {
+              "target": "@TYPEINFO/values",
+              "targetObject": {
+                "@TYPEINFO": {
+                  "type": "enum"
+                }
+              }
+            }
+          }
+        },
+        "outputs": {
+          "init": {
+            "fields": {
+              "@IMPORT": [
+                {
+                  "sourceFactoryId": "#",
+                  "location": "fields",
+                  "prefix": "camel_",
+                  "filter": {
+                    "contains": [
+                      {
+                        "attribute": "kind",
+                        "values": [
+                          "property"
+                        ]
+                      }
+                    ]
+                  }
+                }
+              ]
+            }
+          },
+          "path": {
+            "fields": {
+              "@IMPORT": [
+                {
+                  "sourceFactoryId": "#",
+                  "location": "fields",
+                  "prefix": "camel_",
+                  "filter": {
+                    "contains": [
+                      {
+                        "attribute": "kind",
+                        "values": [
+                          "path"
+                        ]
+                      }
+                    ]
+                  }
+                }
+              ]
+            }
+          },
+          "consumer": {
+            "fields": {
+              "@IMPORT": [
+                {
+                  "sourceFactoryId": "#",
+                  "location": "fields",
+                  "prefix": "camel_",
+                  "filter": {
+                    "contains": [
+                      {
+                        "attribute": "kind",
+                        "values": [
+                          "parameter"
+                        ]
+                      },
+                      {
+                        "attribute": "label",
+                        "inverse": true,
+                        "values": [
+                          "producer"
+                        ]
+                      }
+                    ]
+                  }
+                }
+              ]
+            }
+          },
+          "producer": {
+            "fields": {
+              "@IMPORT": [
+                {
+                  "sourceFactoryId": "#",
+                  "location": "fields",
+                  "prefix": "camel_",
+                  "filter": {
+                    "contains": [
+                      {
+                        "attribute": "kind",
+                        "values": [
+                          "parameter"
+                        ]
+                      },
+                      {
+                        "attribute": "label",
+                        "inverse": true,
+                        "values": [
+                          "consumer"
+                        ]
+                      }
+                    ]
+                  }
+                }
+              ]
+            }
+          },
+          "__objects": {
+            "fields": {
+              "@IMPORT": [
+                {
+                  "sourceFactoryId": "#",
+                  "location": "fields",
+                  "prefix": "",
+                  "filter": {
+                    "contains": [
+                      {
+                        "attribute": "type",
+                        "values": [
+                          "Object",
+                          "object"
+                        ]
+                      }
+                    ]
+                  }
+                }
+              ]
+            }
+          }
+        }
+      }
+    },
+    "origin": {
+      "component": {
+        "kind": "component",
+        "name": "http",
+        "title": "HTTP",
+        "description": "Send requests to external HTTP servers using Apache HTTP Client 4.x.",
+        "deprecated": false,
+        "firstVersion": "2.3.0",
+        "label": "http",
+        "javaType": "org.apache.camel.component.http.HttpComponent",
+        "supportLevel": "Stable",
+        "groupId": "org.apache.camel",
+        "artifactId": "camel-http",
+        "version": "3.4.5",
+        "scheme": "http",
+        "extendsScheme": "",
+        "alternativeSchemes": "http,https",
+        "syntax": "http:httpUri",
+        "async": false,
+        "consumerOnly": false,
+        "producerOnly": true,
+        "lenientProperties": true,
+        "verifiers": "parameters,connectivity"
+      },
+      "componentProperties": {
+        "cookieStore": {
+          "kind": "property",
+          "displayName": "Cookie Store",
+          "group": "producer",
+          "label": "producer",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.http.client.CookieStore",
+          "deprecated": false,
+          "secret": false,
+          "description": "To use a custom org.apache.http.client.CookieStore. By default the org.apache.http.impl.client.BasicCookieStore is used which is an in-memory only cookie store. Notice if bridgeEndpoint\u003dtrue then the cookie store is forced to be a noop cookie store as cookie shouldn\u0027t be stored as we are just bridging (eg acting as a proxy)."
+        },
+        "lazyStartProducer": {
+          "kind": "property",
+          "displayName": "Lazy Start Producer",
+          "group": "producer",
+          "label": "producer",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel\u0027s routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing."
+        },
+        "allowJavaSerializedObject": {
+          "kind": "property",
+          "displayName": "Allow Java Serialized Object",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "Whether to allow java serialization when a request uses context-type\u003dapplication/x-java-serialized-object. This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk."
+        },
+        "basicPropertyBinding": {
+          "kind": "property",
+          "displayName": "Basic Property Binding",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities"
+        },
+        "clientConnectionManager": {
+          "kind": "property",
+          "displayName": "Client Connection Manager",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.http.conn.HttpClientConnectionManager",
+          "deprecated": false,
+          "secret": false,
+          "description": "To use a custom and shared HttpClientConnectionManager to manage connections. If this has been configured then this is always used for all endpoints created by this component."
+        },
+        "connectionsPerRoute": {
+          "kind": "property",
+          "displayName": "Connections Per Route",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "integer",
+          "javaType": "int",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": 20,
+          "description": "The maximum number of connections per route."
+        },
+        "connectionTimeToLive": {
+          "kind": "property",
+          "displayName": "Connection Time To Live",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "integer",
+          "javaType": "long",
+          "deprecated": false,
+          "secret": false,
+          "description": "The time for connection to live, the time unit is millisecond, the default value is always keep alive."
+        },
+        "httpBinding": {
+          "kind": "property",
+          "displayName": "Http Binding",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.camel.http.common.HttpBinding",
+          "deprecated": false,
+          "secret": false,
+          "description": "To use a custom HttpBinding to control the mapping between Camel message and HttpClient."
+        },
+        "httpClientConfigurer": {
+          "kind": "property",
+          "displayName": "Http Client Configurer",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.camel.component.http.HttpClientConfigurer",
+          "deprecated": false,
+          "secret": false,
+          "description": "To use the custom HttpClientConfigurer to perform configuration of the HttpClient that will be used."
+        },
+        "httpConfiguration": {
+          "kind": "property",
+          "displayName": "Http Configuration",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.camel.http.common.HttpConfiguration",
+          "deprecated": false,
+          "secret": false,
+          "description": "To use the shared HttpConfiguration as base configuration."
+        },
+        "httpContext": {
+          "kind": "property",
+          "displayName": "Http Context",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.http.protocol.HttpContext",
+          "deprecated": false,
+          "secret": false,
+          "description": "To use a custom org.apache.http.protocol.HttpContext when executing requests."
+        },
+        "maxTotalConnections": {
+          "kind": "property",
+          "displayName": "Max Total Connections",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "integer",
+          "javaType": "int",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": 200,
+          "description": "The maximum number of connections."
+        },
+        "headerFilterStrategy": {
+          "kind": "property",
+          "displayName": "Header Filter Strategy",
+          "group": "filter",
+          "label": "filter",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.camel.spi.HeaderFilterStrategy",
+          "deprecated": false,
+          "secret": false,
+          "description": "To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message."
+        },
+        "sslContextParameters": {
+          "kind": "property",
+          "displayName": "Ssl Context Parameters",
+          "group": "security",
+          "label": "security",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.camel.support.jsse.SSLContextParameters",
+          "deprecated": false,
+          "secret": false,
+          "description": "To configure security using SSLContextParameters. Important: Only one instance of org.apache.camel.support.jsse.SSLContextParameters is supported per HttpComponent. If you need to use 2 or more different instances, you need to define a new HttpComponent per instance you need."
+        },
+        "useGlobalSslContextParameters": {
+          "kind": "property",
+          "displayName": "Use Global Ssl Context Parameters",
+          "group": "security",
+          "label": "security",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "false",
+          "description": "Enable usage of global SSL context parameters."
+        },
+        "x509HostnameVerifier": {
+          "kind": "property",
+          "displayName": "X509 Hostname Verifier",
+          "group": "security",
+          "label": "security",
+          "required": false,
+          "type": "object",
+          "javaType": "javax.net.ssl.HostnameVerifier",
+          "deprecated": false,
+          "secret": false,
+          "description": "To use a custom X509HostnameVerifier such as DefaultHostnameVerifier or NoopHostnameVerifier."
+        },
+        "connectionRequestTimeout": {
+          "kind": "property",
+          "displayName": "Connection Request Timeout",
+          "group": "timeout",
+          "label": "timeout",
+          "required": false,
+          "type": "integer",
+          "javaType": "int",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "-1",
+          "description": "The timeout in milliseconds used when requesting a connection from the connection manager. A timeout value of zero is interpreted as an infinite timeout. A timeout value of zero is interpreted as an infinite timeout. A negative value is interpreted as undefined (system default)."
+        },
+        "connectTimeout": {
+          "kind": "property",
+          "displayName": "Connect Timeout",
+          "group": "timeout",
+          "label": "timeout",
+          "required": false,
+          "type": "integer",
+          "javaType": "int",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "-1",
+          "description": "Determines the timeout in milliseconds until a connection is established. A timeout value of zero is interpreted as an infinite timeout. A timeout value of zero is interpreted as an infinite timeout. A negative value is interpreted as undefined (system default)."
+        },
+        "socketTimeout": {
+          "kind": "property",
+          "displayName": "Socket Timeout",
+          "group": "timeout",
+          "label": "timeout",
+          "required": false,
+          "type": "integer",
+          "javaType": "int",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "-1",
+          "description": "Defines the socket timeout in milliseconds, which is the timeout for waiting for data or, put differently, a maximum period inactivity between two consecutive data packets). A timeout value of zero is interpreted as an infinite timeout. A negative value is interpreted as undefined (system default)."
+        }
+      },
+      "properties": {
+        "httpUri": {
+          "kind": "path",
+          "displayName": "Http Uri",
+          "group": "common",
+          "label": "common",
+          "required": true,
+          "type": "string",
+          "javaType": "java.net.URI",
+          "deprecated": false,
+          "deprecationNote": "",
+          "secret": false,
+          "description": "The url of the HTTP endpoint to call."
+        },
+        "disableStreamCache": {
+          "kind": "parameter",
+          "displayName": "Disable Stream Cache",
+          "group": "common",
+          "label": "common",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "Determines whether or not the raw input stream from Servlet is cached or not (Camel will read the stream into a in memory/overflow to file, Stream caching) cache. By default Camel will cache the Servlet input stream to support reading it multiple times to ensure it Camel can retrieve all data from the stream. However you can set this option to true when you for example need to access the raw stream, such as streaming it directly to a file or other persistent store. DefaultHttpBinding will copy the request input stream into a stream cache and put it into message body if this option is false to support reading the stream multiple times. If you use Servlet to bridge/proxy an endpoint then consider enabling this option to improve performance, in case you do not need to read the message payload multiple times. The http producer will by default cache the response body stream. If setting this option to true, then the producers will not cache the response body stream but use the response stream as-is as the message body."
+        },
+        "headerFilterStrategy": {
+          "kind": "parameter",
+          "displayName": "Header Filter Strategy",
+          "group": "common",
+          "label": "common",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.camel.spi.HeaderFilterStrategy",
+          "deprecated": false,
+          "secret": false,
+          "description": "To use a custom HeaderFilterStrategy to filter header to and from Camel message."
+        },
+        "httpBinding": {
+          "kind": "parameter",
+          "displayName": "Http Binding",
+          "group": "common (advanced)",
+          "label": "common,advanced",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.camel.http.common.HttpBinding",
+          "deprecated": false,
+          "secret": false,
+          "description": "To use a custom HttpBinding to control the mapping between Camel message and HttpClient."
+        },
+        "bridgeEndpoint": {
+          "kind": "parameter",
+          "displayName": "Bridge Endpoint",
+          "group": "producer",
+          "label": "producer",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "If the option is true, HttpProducer will ignore the Exchange.HTTP_URI header, and use the endpoint\u0027s URI for request. You may also set the option throwExceptionOnFailure to be false to let the HttpProducer send all the fault response back."
+        },
+        "chunked": {
+          "kind": "parameter",
+          "displayName": "Chunked",
+          "group": "producer",
+          "label": "",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "true",
+          "description": "If this option is false the Servlet will disable the HTTP streaming and set the content-length header on the response"
+        },
+        "clearExpiredCookies": {
+          "kind": "parameter",
+          "displayName": "Clear Expired Cookies",
+          "group": "producer",
+          "label": "producer",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "true",
+          "description": "Whether to clear expired cookies before sending the HTTP request. This ensures the cookies store does not keep growing by adding new cookies which is newer removed when they are expired."
+        },
+        "connectionClose": {
+          "kind": "parameter",
+          "displayName": "Connection Close",
+          "group": "producer",
+          "label": "producer",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "false",
+          "description": "Specifies whether a Connection Close header must be added to HTTP Request. By default connectionClose is false."
+        },
+        "copyHeaders": {
+          "kind": "parameter",
+          "displayName": "Copy Headers",
+          "group": "producer",
+          "label": "producer",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "true",
+          "description": "If this option is true then IN exchange headers will be copied to OUT exchange headers according to copy strategy. Setting this to false, allows to only include the headers from the HTTP response (not propagating IN headers)."
+        },
+        "customHostHeader": {
+          "kind": "parameter",
+          "displayName": "Custom Host Header",
+          "group": "producer",
+          "label": "producer",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "description": "To use custom host header for producer. When not set in query will be ignored. When set will override host header derived from url."
+        },
+        "httpMethod": {
+          "kind": "parameter",
+          "displayName": "Http Method",
+          "group": "producer",
+          "label": "producer",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.camel.http.common.HttpMethods",
+          "enum": [
+            "GET",
+            "POST",
+            "PUT",
+            "DELETE",
+            "HEAD",
+            "OPTIONS",
+            "TRACE",
+            "PATCH"
+          ],
+          "deprecated": false,
+          "secret": false,
+          "description": "Configure the HTTP method to use. The HttpMethod header cannot override this option if set."
+        },
+        "ignoreResponseBody": {
+          "kind": "parameter",
+          "displayName": "Ignore Response Body",
+          "group": "producer",
+          "label": "producer",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "If this option is true, The http producer won\u0027t read response body and cache the input stream"
+        },
+        "lazyStartProducer": {
+          "kind": "parameter",
+          "displayName": "Lazy Start Producer",
+          "group": "producer",
+          "label": "producer",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel\u0027s routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing."
+        },
+        "preserveHostHeader": {
+          "kind": "parameter",
+          "displayName": "Preserve Host Header",
+          "group": "producer",
+          "label": "producer",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "If the option is true, HttpProducer will set the Host header to the value contained in the current exchange Host header, useful in reverse proxy applications where you want the Host header received by the downstream server to reflect the URL called by the upstream client, this allows applications which use the Host header to generate accurate URL\u0027s for a proxied service"
+        },
+        "throwExceptionOnFailure": {
+          "kind": "parameter",
+          "displayName": "Throw Exception On Failure",
+          "group": "producer",
+          "label": "producer",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "true",
+          "description": "Option to disable throwing the HttpOperationFailedException in case of failed responses from the remote server. This allows you to get all responses regardless of the HTTP status code."
+        },
+        "transferException": {
+          "kind": "parameter",
+          "displayName": "Transfer Exception",
+          "group": "producer",
+          "label": "",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "If enabled and an Exchange failed processing on the consumer side, and if the caused Exception was send back serialized in the response as a application/x-java-serialized-object content type. On the producer side the exception will be deserialized and thrown as is, instead of the HttpOperationFailedException. The caused exception is required to be serialized. This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk."
+        },
+        "cookieHandler": {
+          "kind": "parameter",
+          "displayName": "Cookie Handler",
+          "group": "producer (advanced)",
+          "label": "producer,advanced",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.camel.http.base.cookie.CookieHandler",
+          "deprecated": false,
+          "secret": false,
+          "description": "Configure a cookie handler to maintain a HTTP session"
+        },
+        "cookieStore": {
+          "kind": "parameter",
+          "displayName": "Cookie Store",
+          "group": "producer (advanced)",
+          "label": "producer,advanced",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.http.client.CookieStore",
+          "deprecated": false,
+          "secret": false,
+          "description": "To use a custom CookieStore. By default the BasicCookieStore is used which is an in-memory only cookie store. Notice if bridgeEndpoint\u003dtrue then the cookie store is forced to be a noop cookie store as cookie shouldn\u0027t be stored as we are just bridging (eg acting as a proxy). If a cookieHandler is set then the cookie store is also forced to be a noop cookie store as cookie handling is then performed by the cookieHandler."
+        },
+        "deleteWithBody": {
+          "kind": "parameter",
+          "displayName": "Delete With Body",
+          "group": "producer (advanced)",
+          "label": "producer,advanced",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "Whether the HTTP DELETE should include the message body or not. By default HTTP DELETE do not include any HTTP body. However in some rare cases users may need to be able to include the message body."
+        },
+        "getWithBody": {
+          "kind": "parameter",
+          "displayName": "Get With Body",
+          "group": "producer (advanced)",
+          "label": "producer,advanced",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "Whether the HTTP GET should include the message body or not. By default HTTP GET do not include any HTTP body. However in some rare cases users may need to be able to include the message body."
+        },
+        "okStatusCodeRange": {
+          "kind": "parameter",
+          "displayName": "Ok Status Code Range",
+          "group": "producer (advanced)",
+          "label": "producer,advanced",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "200-299",
+          "description": "The status codes which are considered a success response. The values are inclusive. Multiple ranges can be defined, separated by comma, e.g. 200-204,209,301-304. Each range must be a single number or from-to with the dash included."
+        },
+        "basicPropertyBinding": {
+          "kind": "parameter",
+          "displayName": "Basic Property Binding",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities"
+        },
+        "clientBuilder": {
+          "kind": "parameter",
+          "displayName": "Client Builder",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.http.impl.client.HttpClientBuilder",
+          "deprecated": false,
+          "secret": false,
+          "description": "Provide access to the http client request parameters used on new RequestConfig instances used by producers or consumers of this endpoint."
+        },
+        "clientConnectionManager": {
+          "kind": "parameter",
+          "displayName": "Client Connection Manager",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.http.conn.HttpClientConnectionManager",
+          "deprecated": false,
+          "secret": false,
+          "description": "To use a custom HttpClientConnectionManager to manage connections"
+        },
+        "connectionsPerRoute": {
+          "kind": "parameter",
+          "displayName": "Connections Per Route",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "integer",
+          "javaType": "int",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": 20,
+          "description": "The maximum number of connections per route."
+        },
+        "httpClient": {
+          "kind": "parameter",
+          "displayName": "Http Client",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.http.client.HttpClient",
+          "deprecated": false,
+          "secret": false,
+          "description": "Sets a custom HttpClient to be used by the producer"
+        },
+        "httpClientConfigurer": {
+          "kind": "parameter",
+          "displayName": "Http Client Configurer",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.camel.component.http.HttpClientConfigurer",
+          "deprecated": false,
+          "secret": false,
+          "description": "Register a custom configuration strategy for new HttpClient instances created by producers or consumers such as to configure authentication mechanisms etc."
+        },
+        "httpClientOptions": {
+          "kind": "parameter",
+          "displayName": "Http Client Options",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "object",
+          "javaType": "java.util.Map\u003cjava.lang.String, java.lang.Object\u003e",
+          "prefix": "httpClient.",
+          "multiValue": true,
+          "deprecated": false,
+          "secret": false,
+          "description": "To configure the HttpClient using the key/values from the Map."
+        },
+        "httpContext": {
+          "kind": "parameter",
+          "displayName": "Http Context",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.http.protocol.HttpContext",
+          "deprecated": false,
+          "secret": false,
+          "description": "To use a custom HttpContext instance"
+        },
+        "mapHttpMessageBody": {
+          "kind": "parameter",
+          "displayName": "Map Http Message Body",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "true",
+          "description": "If this option is true then IN exchange Body of the exchange will be mapped to HTTP body. Setting this to false will avoid the HTTP mapping."
+        },
+        "mapHttpMessageFormUrlEncodedBody": {
+          "kind": "parameter",
+          "displayName": "Map Http Message Form Url Encoded Body",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "true",
+          "description": "If this option is true then IN exchange Form Encoded body of the exchange will be mapped to HTTP. Setting this to false will avoid the HTTP Form Encoded body mapping."
+        },
+        "mapHttpMessageHeaders": {
+          "kind": "parameter",
+          "displayName": "Map Http Message Headers",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "true",
+          "description": "If this option is true then IN exchange Headers of the exchange will be mapped to HTTP headers. Setting this to false will avoid the HTTP Headers mapping."
+        },
+        "maxTotalConnections": {
+          "kind": "parameter",
+          "displayName": "Max Total Connections",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "integer",
+          "javaType": "int",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": 200,
+          "description": "The maximum number of connections."
+        },
+        "synchronous": {
+          "kind": "parameter",
+          "displayName": "Synchronous",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "false",
+          "description": "Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported)."
+        },
+        "useSystemProperties": {
+          "kind": "parameter",
+          "displayName": "Use System Properties",
+          "group": "advanced",
+          "label": "advanced",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": "false",
+          "description": "To use System Properties as fallback for configuration"
+        },
+        "proxyAuthDomain": {
+          "kind": "parameter",
+          "displayName": "Proxy Auth Domain",
+          "group": "proxy",
+          "label": "producer,proxy",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "description": "Proxy authentication domain to use with NTML"
+        },
+        "proxyAuthHost": {
+          "kind": "parameter",
+          "displayName": "Proxy Auth Host",
+          "group": "proxy",
+          "label": "producer,proxy",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "description": "Proxy authentication host"
+        },
+        "proxyAuthMethod": {
+          "kind": "parameter",
+          "displayName": "Proxy Auth Method",
+          "group": "proxy",
+          "label": "producer,proxy",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "enum": [
+            "Basic",
+            "Digest",
+            "NTLM"
+          ],
+          "deprecated": false,
+          "secret": false,
+          "description": "Proxy authentication method to use"
+        },
+        "proxyAuthPassword": {
+          "kind": "parameter",
+          "displayName": "Proxy Auth Password",
+          "group": "proxy",
+          "label": "producer,proxy",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": true,
+          "description": "Proxy authentication password"
+        },
+        "proxyAuthPort": {
+          "kind": "parameter",
+          "displayName": "Proxy Auth Port",
+          "group": "proxy",
+          "label": "producer,proxy",
+          "required": false,
+          "type": "integer",
+          "javaType": "int",
+          "deprecated": false,
+          "secret": false,
+          "description": "Proxy authentication port"
+        },
+        "proxyAuthScheme": {
+          "kind": "parameter",
+          "displayName": "Proxy Auth Scheme",
+          "group": "proxy",
+          "label": "producer,proxy",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "enum": [
+            "http",
+            "https"
+          ],
+          "deprecated": false,
+          "secret": false,
+          "description": "Proxy authentication scheme to use"
+        },
+        "proxyAuthUsername": {
+          "kind": "parameter",
+          "displayName": "Proxy Auth Username",
+          "group": "proxy",
+          "label": "producer,proxy",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": true,
+          "description": "Proxy authentication username"
+        },
+        "proxyHost": {
+          "kind": "parameter",
+          "displayName": "Proxy Host",
+          "group": "proxy",
+          "label": "producer,proxy",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "description": "Proxy hostname to use"
+        },
+        "proxyPort": {
+          "kind": "parameter",
+          "displayName": "Proxy Port",
+          "group": "proxy",
+          "label": "producer,proxy",
+          "required": false,
+          "type": "integer",
+          "javaType": "int",
+          "deprecated": false,
+          "secret": false,
+          "description": "Proxy port to use"
+        },
+        "authDomain": {
+          "kind": "parameter",
+          "displayName": "Auth Domain",
+          "group": "security",
+          "label": "producer,security",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "description": "Authentication domain to use with NTML"
+        },
+        "authenticationPreemptive": {
+          "kind": "parameter",
+          "displayName": "Authentication Preemptive",
+          "group": "security",
+          "label": "producer,security",
+          "required": false,
+          "type": "boolean",
+          "javaType": "boolean",
+          "deprecated": false,
+          "secret": false,
+          "defaultValue": false,
+          "description": "If this option is true, camel-http sends preemptive basic authentication to the server."
+        },
+        "authHost": {
+          "kind": "parameter",
+          "displayName": "Auth Host",
+          "group": "security",
+          "label": "producer,security",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "description": "Authentication host to use with NTML"
+        },
+        "authMethod": {
+          "kind": "parameter",
+          "displayName": "Auth Method",
+          "group": "security",
+          "label": "producer,security",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": false,
+          "description": "Authentication methods allowed to use as a comma separated list of values Basic, Digest or NTLM."
+        },
+        "authMethodPriority": {
+          "kind": "parameter",
+          "displayName": "Auth Method Priority",
+          "group": "security",
+          "label": "producer,security",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "enum": [
+            "Basic",
+            "Digest",
+            "NTLM"
+          ],
+          "deprecated": false,
+          "secret": false,
+          "description": "Which authentication method to prioritize to use, either as Basic, Digest or NTLM."
+        },
+        "authPassword": {
+          "kind": "parameter",
+          "displayName": "Auth Password",
+          "group": "security",
+          "label": "producer,security",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": true,
+          "description": "Authentication password"
+        },
+        "authUsername": {
+          "kind": "parameter",
+          "displayName": "Auth Username",
+          "group": "security",
+          "label": "producer,security",
+          "required": false,
+          "type": "string",
+          "javaType": "java.lang.String",
+          "deprecated": false,
+          "secret": true,
+          "description": "Authentication username"
+        },
+        "sslContextParameters": {
+          "kind": "parameter",
+          "displayName": "Ssl Context Parameters",
+          "group": "security",
+          "label": "security",
+          "required": false,
+          "type": "object",
+          "javaType": "org.apache.camel.support.jsse.SSLContextParameters",
+          "deprecated": false,
+          "secret": false,
+          "description": "To configure security using SSLContextParameters. Important: Only one instance of org.apache.camel.util.jsse.SSLContextParameters is supported per HttpComponent. If you need to use 2 or more different instances, you need to define a new HttpComponent per instance you need."
+        },
+        "x509HostnameVerifier": {
+          "kind": "parameter",
+          "displayName": "X509 Hostname Verifier",
+          "group": "security",
+          "label": "security",
+          "required": false,
+          "type": "object",
+          "javaType": "javax.net.ssl.HostnameVerifier",
+          "deprecated": false,
+          "secret": false,
+          "description": "To use a custom X509HostnameVerifier such as DefaultHostnameVerifier or NoopHostnameVerifier"
+        }
+      }
+    }
+  }
+}
diff --git a/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/custom-connector-in/input-route.bak.xml b/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/custom-connector-in/input-route.bak.xml
new file mode 100644
index 00000000..7c0edc94
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/custom-connector-in/input-route.bak.xml
@@ -0,0 +1,5 @@
+
+
+    
+    
+
diff --git a/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/templates/artemis-connector-out/customObjectReferences.ftl b/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/templates/artemis-connector-out/customObjectReferences.ftl
new file mode 100644
index 00000000..c6402555
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/templates/artemis-connector-out/customObjectReferences.ftl
@@ -0,0 +1,8 @@
+[#if properties.camel_headerFilterStrategy??]
+	[#if properties.camel_headerFilterStrategy == "custom"]
+		[#assign headerFilterStrategyReference = properties.headerFilterStrategyReference]
+	[#else]
+		[#assign headerFilterStrategyReference = "headerFilterStrategy"]
+	[/#if]
+	[#global properties = properties + {"camel_headerFilterStrategy": "#[=headerFilterStrategyReference]"} ]
+[/#if]
diff --git a/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/templates/artemis-connector-out/init.ftl b/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/templates/artemis-connector-out/init.ftl
index cd6eb9ee..e247949f 100644
--- a/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/templates/artemis-connector-out/init.ftl
+++ b/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/templates/artemis-connector-out/init.ftl
@@ -4,12 +4,26 @@
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
 
-[#import "templates:object-commons/common-utils.ftl" as utils]    
-        
+[#import "templates:object-commons/common-utils.ftl" as utils]
+[#include "customObjectReferences.ftl" ]
+
+[#assign queueOrTopicName = properties.queueOrTopicName]
+[#if properties.rawValues.queueOrTopicName?? && properties.rawValues.queueOrTopicName?is_string]
+	[#if properties.rawValues.queueOrTopicName?contains("${") && properties.rawValues.queueOrTopicName?contains("}")]
+		[#assign dynamic = true]
+		[#assign queueOrTopicName = "default"]
+	[/#if]
+[/#if]
+
     
     	
     		
-    		
+			[#if dynamic?? && dynamic]
+			
+				[=utils.convertConfigValue(properties.queueOrTopicName)]
+			
+			[/#if]
+    		
     	
 	           
            
diff --git a/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/templates/ftps-connector-in/init.ftl b/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/templates/ftps-connector-in/init.ftl
new file mode 100644
index 00000000..2f7f2ab7
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/templates/ftps-connector-in/init.ftl
@@ -0,0 +1,17 @@
+[#ftl attributes={"generated.type":"blueprint"}]
+
+
+
+[#import "templates:object-commons/common-utils.ftl" as utils]    
+        
+    
+    	
+    		
+			[#include "templates:abstract-connector/generate-logging-key.ftl"]
+			
+    	
+	           
+           
+
diff --git a/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/templates/ftps-connector-out/init.ftl b/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/templates/ftps-connector-out/init.ftl
new file mode 100644
index 00000000..c5c58f20
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/templates/ftps-connector-out/init.ftl
@@ -0,0 +1,16 @@
+[#ftl attributes={"generated.type":"blueprint"}]
+
+
+
+[#import "templates:object-commons/common-utils.ftl" as utils]    
+        
+    
+    	
+    		
+    		
+    	
+	           
+           
+
diff --git a/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/templates/http-connector-out/customObjectReferences.ftl b/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/templates/http-connector-out/customObjectReferences.ftl
new file mode 100644
index 00000000..259d828d
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/templates/http-connector-out/customObjectReferences.ftl
@@ -0,0 +1,53 @@
+[#if properties.camel_headerFilterStrategy??]
+	[#if properties.camel_headerFilterStrategy == "custom"]
+		[#assign headerFilterStrategyReference = properties.headerFilterStrategyReference]
+	[#else]
+		[#assign headerFilterStrategyReference = "headerFilterStrategy"]
+	[/#if]
+	[#global properties = properties + {"camel_headerFilterStrategy": "#[=headerFilterStrategyReference]"} ]
+[/#if]
+[#if properties.camel_cookieStore??]
+	[#if properties.camel_cookieStore == "custom"]
+		[#assign cookieStoreReference = properties.cookieStoreReference]
+	[#else]
+		[#assign cookieStoreReference = "cookieStore"]
+	[/#if]
+	[#global properties = properties + {"camel_cookieStore": "#[=cookieStoreReference]"} ]
+[/#if]
+[#if properties.camel_clientConnectionManager?? && properties.camel_clientConnectionManager == "custom"]
+	[#global properties = properties + {"camel_clientConnectionManager": "#[=properties.clientConnectionManagerReference]"} ]
+[/#if]
+[#if properties.camel_x509HostnameVerifier??]
+	[#if properties.camel_x509HostnameVerifier == "custom"]
+		[#assign x509HostnameVerifierReference = properties.x509HostnameVerifierReference]
+	[#else]
+		[#assign x509HostnameVerifierReference = "x509HostnameVerifier"]
+	[/#if]
+	[#global properties = properties + {"camel_x509HostnameVerifier": "#[=x509HostnameVerifierReference]"} ]
+[/#if]
+[#if properties.camel_sslContextParameters??]
+	[#if properties.camel_sslContextParameters == "custom"]
+		[#assign sslContextParametersReference = properties.sslContextParametersReference]
+	[#else]
+		[#assign sslContextParametersReference = "sslContextParameters"]
+	[/#if]
+	[#global properties = properties + {"camel_sslContextParameters": "#[=sslContextParametersReference]"} ]
+[/#if]
+[#if properties.camel_cookieStore?? && properties.camel_cookieStore == "custom"]
+	[#global properties = properties + {"camel_cookieStore": "#[=properties.cookieStoreReference]"} ]
+[/#if]
+[#if properties.camel_clientConnectionManager?? && properties.camel_clientConnectionManager == "custom"]
+	[#global properties = properties + {"camel_clientConnectionManager": "#[=properties.clientConnectionManagerReference]"} ]
+[/#if]
+[#if properties.camel_httpBinding?? && properties.camel_httpBinding == "custom"]
+	[#global properties = properties + {"camel_httpBinding": "#[=properties.httpBindingReference]"} ]
+[/#if]
+[#if properties.camel_httpClientConfigurer?? && properties.camel_httpClientConfigurer == "custom"]
+	[#global properties = properties + {"camel_httpClientConfigurer": "#[=properties.httpClientConfigurerReference]"} ]
+[/#if]
+[#if properties.camel_httpConfiguration?? && properties.camel_httpConfiguration == "custom"]
+	[#global properties = properties + {"camel_httpConfiguration": "#[=properties.httpConfigurationReference]"} ]
+[/#if]
+[#if properties.camel_httpContext?? && properties.camel_httpContext == "custom"]
+	[#global properties = properties + {"camel_httpContext": "#[=properties.httpContextReference]"} ]
+[/#if]
\ No newline at end of file
diff --git a/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/templates/http-connector-out/customObjects.ftl b/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/templates/http-connector-out/customObjects.ftl
new file mode 100644
index 00000000..aaeec59c
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/templates/http-connector-out/customObjects.ftl
@@ -0,0 +1,7 @@
+[#ftl attributes={"generated.type":"blueprint.fragment"}]
+[#if properties.x509HostnameVerifier?? && properties.x509HostnameVerifier != "custom"]
+
+[/#if]
+[#if properties.cookieStore?? && properties.cookieStore != "custom"]
+
+[/#if]
diff --git a/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/templates/http-connector-out/init.ftl b/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/templates/http-connector-out/init.ftl
new file mode 100644
index 00000000..8bb57551
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/connector-implementation/standard-connectors-pack/src/main/resources/ru/entaxy/templates/http-connector-out/init.ftl
@@ -0,0 +1,21 @@
+[#ftl attributes={"generated.type":"blueprint"}]
+
+
+           
+[#import "templates:object-commons/common-utils.ftl" as utils]
+[#include "customObjectReferences.ftl" ]
+
+    
+    	
+    		
+			[#if properties.removeServiceHeadersBeforeSending]
+				
+			[/#if]
+			
+    	
+	
+           
+
+
diff --git a/platform/runtime/core/objects-implementations/pom.xml b/platform/runtime/core/objects-implementations/pom.xml
index 3e8c5309..e177be33 100644
--- a/platform/runtime/core/objects-implementations/pom.xml
+++ b/platform/runtime/core/objects-implementations/pom.xml
@@ -3,7 +3,7 @@
   
     ru.entaxy.esb.platform.runtime
     core
-    1.10.0
+    1.11.0
   
   ru.entaxy.esb.platform.runtime.core
   objects-implementations
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/pom.xml b/platform/runtime/core/objects-implementations/profile-implementation/pom.xml
index b566b6ee..3cafe1d3 100644
--- a/platform/runtime/core/objects-implementations/profile-implementation/pom.xml
+++ b/platform/runtime/core/objects-implementations/profile-implementation/pom.xml
@@ -3,7 +3,7 @@
   
     ru.entaxy.esb.platform.runtime.core
     objects-implementations
-    1.10.0
+    1.11.0
   
   ru.entaxy.esb.platform.runtime.core.objects-implementations
   profile-implementation
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/pom.xml b/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/pom.xml
index d0564138..614a767c 100644
--- a/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/pom.xml
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/pom.xml
@@ -4,7 +4,7 @@
   
     ru.entaxy.esb.platform.runtime.core.objects-implementations
     profile-implementation
-    1.10.0
+    1.11.0
   
   ru.entaxy.esb.platform.runtime.core.objects-implementations.profile-implementation
   profile-producing
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/java/ru/entaxy/platform/base/objects/profile/producing/ProfileProducer.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/java/ru/entaxy/platform/base/objects/profile/producing/ProfileProducer.java
index 92200564..ddd1a127 100644
--- a/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/java/ru/entaxy/platform/base/objects/profile/producing/ProfileProducer.java
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/java/ru/entaxy/platform/base/objects/profile/producing/ProfileProducer.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * test-producers
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/factory/common-system-profile.json b/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/factory/common-system-profile.json
index 1e35d6ef..ff2fe501 100644
--- a/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/factory/common-system-profile.json
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/factory/common-system-profile.json
@@ -46,7 +46,7 @@
       "type": "xml:route",
       "required": true,
       "group": "in-flow",
-      "description": "Customize the message processing before further routing within the esb. For more details see Entaxy docs",
+      "description": "Customize the message processing before further routing within the esb. For more details see Entaxy docs",
       "@RESOURCE": {
         "_provider": "entaxy-file-internal",
         "endType": "String",
@@ -98,7 +98,7 @@
     "inFlowProcessResponse": {
       "displayName": "Process response",
       "type": "Boolean",
-      "description": "Enables response processing before further routing to an input connector. For more details see Entaxy docs",
+      "description": "Enables response processing before further routing to an input connector. For more details see Entaxy docs",
       "required": true,
       "group": "in-flow",
       "defaultValue": false
@@ -107,7 +107,7 @@
       "displayName": "In-flow response",
       "type": "xml:route",
       "required": true,
-      "description": "Customize the response processing before further routing to an input connector. For more details see Entaxy docs",
+      "description": "Customize the response processing before further routing to an input connector. For more details see Entaxy docs",
       "group": "in-flow",
       "@RESOURCE": {
         "_provider": "entaxy-file-internal",
@@ -165,7 +165,7 @@
       "type": "xml:route",
       "required": true,
       "group": "out-flow",
-      "description": "Customize the message processing before further routing to an output connector. For more details see Entaxy docs",
+      "description": "Customize the message processing before further routing to an output connector. For more details see Entaxy docs",
       "@RESOURCE": {
         "_provider": "entaxy-file-internal",
         "endType": "String",
@@ -217,7 +217,7 @@
     "outFlowProcessResponse": {
       "displayName": "Postprocess response",
       "type": "Boolean",
-      "description": "Enables response postprocessing before further routing within the esb. For more details see Entaxy docs",
+      "description": "Enables response postprocessing before further routing within the esb. For more details see Entaxy docs",
       "required": true,
       "group": "out-flow",
       "defaultValue": false
@@ -227,7 +227,7 @@
       "type": "xml:route",
       "required": true,
       "group": "out-flow",
-      "description": "Customize the response postprocessing before further routing within the esb. For more details see Entaxy docs",
+      "description": "Customize the response postprocessing before further routing within the esb. For more details see Entaxy docs",
       "@RESOURCE": {
         "_provider": "entaxy-file-internal",
         "endType": "String",
@@ -283,7 +283,7 @@
       "displayName": "Output connector selector",
       "type": "xml:route",
       "required": true,
-      "description": "Defines connector selecting logic based on specified properties and templates. For more details see Entaxy docs",
+      "description": "Defines connector selecting logic based on specified properties and templates. For more details see Entaxy docs",
       "group": "out-flow",
       "@RESOURCE": {
         "_provider": "entaxy-file-internal",
@@ -364,7 +364,7 @@
       "displayName": "Default profile route",
       "type": "xml:route",
       "required": true,
-      "description": "The router that connects the system to other entities in the Entaxy architecture. By default, the message is routed to an entity of the system type. For more details see Entaxy docs",
+      "description": "The router that connects the system to other entities in the Entaxy architecture. By default, the message is routed to an entity of the system type. For more details see Entaxy docs",
       "group": "in-flow",
       "condition": "${useDefaultRoute}",
       "@INTERNAL": true,
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/factory/default-route-2.json b/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/factory/default-route-2.json
index e9f71f55..76b7eb90 100644
--- a/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/factory/default-route-2.json
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/factory/default-route-2.json
@@ -4,7 +4,7 @@
 		"type": "entaxy.runtime.default-route",
 		"label": "route,default",
 		"displayName": "DEFAULT ROUTE",
-		"description": "The router that connects the system to other entities in the Entaxy architecture. By default, the message is routed to an entity of the system type. For more details see Entaxy docs",
+		"description": "The router that connects the system to other entities in the Entaxy architecture. By default, the message is routed to an entity of the system type. For more details see Entaxy docs",
 		"parent": "abstract-route-container-object",
 		"isAbstract": false
 	},
@@ -42,7 +42,7 @@
 			"displayName": "Route",
 			"type": "xml:route",
 			"required": true,
-			"description": "The router that connects the system to other entities in the Entaxy architecture. By default, the message is routed to an entity of the system type. For more details see Entaxy docs and Camel docs",
+			"description": "The router that connects the system to other entities in the Entaxy architecture. By default, the message is routed to an entity of the system type. For more details see Entaxy docs and Camel docs",
 			"@RESOURCE": {
 				"_provider": "entaxy-file-internal",
 				"endType": "String",
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/common-system-profile/in-flow-pre-route.bak.xml b/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/common-system-profile/in-flow-pre-route.bak.xml
new file mode 100644
index 00000000..b9e36574
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/common-system-profile/in-flow-pre-route.bak.xml
@@ -0,0 +1,7 @@
+
+
+	
+	
+        true
+    
+
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/common-system-profile/in-flow-response.bak.xml b/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/common-system-profile/in-flow-response.bak.xml
new file mode 100644
index 00000000..94c41dbc
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/common-system-profile/in-flow-response.bak.xml
@@ -0,0 +1,7 @@
+
+
+	
+	
+        true
+    
+
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/common-system-profile/out-flow-connector-selector.bak.xml b/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/common-system-profile/out-flow-connector-selector.bak.xml
new file mode 100644
index 00000000..68f67c0a
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/common-system-profile/out-flow-connector-selector.bak.xml
@@ -0,0 +1,23 @@
+
+
+
+    
+        
+            connector.type
+            connector.protocol
+            connector.classifier
+        
+        
+            *:*:=
+        
+        
+            
+            false
+            
+            false
+            false
+            false
+        
+    
+
+
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/common-system-profile/out-flow-pre-route.bak.xml b/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/common-system-profile/out-flow-pre-route.bak.xml
new file mode 100644
index 00000000..564ed730
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/common-system-profile/out-flow-pre-route.bak.xml
@@ -0,0 +1,7 @@
+
+
+	
+	
+        true
+    
+
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/common-system-profile/out-flow-response.bak.xml b/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/common-system-profile/out-flow-response.bak.xml
new file mode 100644
index 00000000..68d4d054
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/common-system-profile/out-flow-response.bak.xml
@@ -0,0 +1,7 @@
+
+
+	
+	
+        true
+    
+
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/default-route-2/default-route.bak.xml b/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/default-route-2/default-route.bak.xml
new file mode 100644
index 00000000..ee5831f3
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-producing/src/main/resources/ru/entaxy/resource/entaxy-file-internal/factories/default-route-2/default-route.bak.xml
@@ -0,0 +1,5 @@
+
+
+	
+	
+
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/LICENSE.txt b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/LICENSE.txt
new file mode 100644
index 00000000..4ae94b75
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/LICENSE.txt
@@ -0,0 +1,175 @@
+                                 ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ
+
+Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой)
+версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего
+Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН
+7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова,
+д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу
+https://www.emdev.ru/about (далее - Компания).
+
+Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями»
+(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения,
+Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в
+настоящем документе, в противном случае, он должен не использовать или не получать доступ
+к Программному обеспечению.
+
+                                    1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ
+
+a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии
+или редакции, исключительные права на которую принадлежат Правообладателю.
+b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные
+права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ
+для ЭВМ № 2021610848 от 19.01.2021 года.
+c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта
+https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО.
+d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также
+личные неимущественные права авторов произведений на результат интеллектуальной деятельности.
+e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование
+ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка
+включает предоставление Пользователю неисключительного права использования ПО, в том числе
+получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение
+патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается
+Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается
+для каждого Пользователя индивидуально в Сертификате.
+f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром),
+подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное
+обеспечение в ограниченном объёме и на определённый период времени.
+g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО,
+предоставленных Пользователю согласно условиям Подписки.
+h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного
+обеспечения.
+i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий
+из одного или нескольких файлов, который может быть прочтён человеком.
+j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля
+программы, полученный в результате обработки исходного кода, еще не связанный в полную программу.
+Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый
+продукт.
+k) Некоммерческое использование – индивидуальное личное использование Пользователем программного
+обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации
+возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая
+выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения.
+
+                    2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
+
+2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного
+обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом
+воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения
+в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ.
+2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит
+неисключительный характер.
+2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию,
+лицензия на ограниченное использование Программного обеспечения.
+2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования
+имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан
+обратиться в службу поддержки Правообладателя по адресу:  https://entaxy.ru/ для изменения
+вида лицензии с Базовой бесплатной версии на Подписки.
+2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для
+пробного использования программного обеспечения – не ограничен.
+2.6. Использование Пользователем настоящего программного обеспечения в целях разработки,
+модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю,
+без разрешения Правообладателя не допускается.
+
+                                3. АВТОРСКОЕ ПРАВО.
+
+3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение
+и любые его копии принадлежат Правообладателю.
+3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента,
+к которому можно получить доступ с помощью Программного обеспечения, является собственностью
+соответствующего владельца контента и защищается применимым законодательством об авторском
+праве или другими законами и договорами об интеллектуальной собственности.
+3.3. Условия использования Программного обеспечения.
+Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь
+придерживается следующих условий:
+3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять
+какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании
+Программного обеспечения или на нем.
+3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать,
+расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать
+Программное обеспечение.
+3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования
+ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне.
+3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено
+использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам.
+
+                    4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС»
+
+4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю
+на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с
+использованием Пользователем:
+4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в
+Программное обеспечение;
+4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями
+настоящего соглашения;
+4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием,
+или данными, не предоставленными Пользователю Правообладателем;
+4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем.
+
+
+5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ
+ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ
+И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ
+ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ
+И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ
+ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО.
+
+                        6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ.
+НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ
+ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ,
+ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ;
+ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ.
+ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ
+ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ;
+КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ
+ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ.
+
+                        7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ:
+Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия
+(включая, но не ограничиваясь) по:
+-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код)
+ Программного обеспечения;
+-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный
+код Программного обеспечения, за исключением тех изменений, которые вносятся средствами,
+включёнными в Программное обеспечение и описанными непосредственно в документации к нему;
+-созданию условий для использования Программного обеспечения лицами, не имеющими прав на
+использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство
+третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа
+к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку;
+-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию).
+
+                    8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА.
+
+8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из
+лицензионных продуктов, используемых на законных основаниях, а
+именно https://entaxy.ru/libs/licenses/root-aggregated.deps.
+8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть
+совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения.
+8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться
+Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения,
+содержащих все изменения и дополнения программного обеспечения.
+
+                        9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ.
+
+9.1.  Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым
+программным обеспечением.
+9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно
+с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм
+«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public.
+9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий
+пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя,
+прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер
+ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства
+Российской Федерации.
+
+                                10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ.
+
+10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет
+право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб,
+недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий
+пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере
+2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения
+исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy).
+10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое
+законодательство – Российской Федерации.
+10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным,
+остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать
+исполнять свои обязанности в соответствии с этими положениями.
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/pom.xml b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/pom.xml
new file mode 100644
index 00000000..d9cbdbfe
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/pom.xml
@@ -0,0 +1,41 @@
+
+  4.0.0
+  
+    ru.entaxy.esb.platform.runtime.core.objects-implementations
+    profile-implementation
+    1.11.0
+  
+  ru.entaxy.esb.platform.runtime.core.objects-implementations.profile-implementation
+  profile-runtime-camel-components
+  bundle
+  
+    ENTAXY :: PLATFORM :: CORE :: OBJECTS IMPLEMENTATIONS :: PROFILE :: RUNTIME CAMEL
+    ENTAXY :: PLATFORM :: CORE :: OBJECTS IMPLEMENTATIONS :: PROFILE :: RUNTIME CAMEL
+
+	
+		
+		ru.entaxy.esb.system.component,
+		ru.entaxy.esb.system.component.util,
+		ru.entaxy.esb.system.groups.component,
+		ru.entaxy.esb.system.groups.component.util	
+		
+	
+
+	
+		
+			ru.entaxy.esb.platform.runtime.core
+			core-support-runtime-legacy
+			${project.version}
+		
+		
+			ru.entaxy.esb.platform.runtime.core.objects-implementations.profile-implementation
+			profile-runtime-legacy-support
+			${project.version}
+		
+        
+            org.apache.camel
+            camel-core
+        
+	  
+  
+
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/component/SystemComponent.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/component/SystemComponent.java
new file mode 100644
index 00000000..9d390056
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/component/SystemComponent.java
@@ -0,0 +1,44 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * system-component
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.component;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.support.DefaultComponent;
+
+import java.util.Map;
+
+public class SystemComponent extends DefaultComponent {
+
+    @Override
+    protected Endpoint createEndpoint(String uri, String remaining, Map parameters) throws Exception {
+        SystemEndpoint endpoint = new SystemEndpoint(uri, this);
+
+        endpoint.setSystemName(remaining);
+        setProperties(endpoint, parameters);
+        return endpoint;
+    }
+
+}
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/component/SystemConsumer.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/component/SystemConsumer.java
new file mode 100644
index 00000000..ef87c3d7
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/component/SystemConsumer.java
@@ -0,0 +1,71 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * system-component
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.component;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.support.ScheduledPollConsumer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SystemConsumer extends ScheduledPollConsumer {
+
+    private static final Logger LOG = LoggerFactory.getLogger(SystemConsumer.class);
+
+    private final SystemEndpoint endpoint;
+
+    public SystemConsumer(SystemEndpoint endpoint, Processor processor) {
+        super(endpoint, processor);
+        this.endpoint = endpoint;
+    }
+
+    @Override
+    protected int poll() throws Exception {
+        Exchange exchange = endpoint.createExchange();
+
+        // create a message body
+        exchange.getIn().setBody(readOptions());
+        LOG.info("In SystemConsumer " + exchange.getIn().getBody());
+
+        try {
+            // send message to next processor in the route
+            getProcessor().process(exchange);
+            return 1; // number of messages polled
+        } finally {
+            // log exception if an exception occurred and was not handled
+            if (exchange.getException() != null) {
+                getExceptionHandler().handleException(
+                        "Error processing exchange", exchange,
+                        exchange.getException());
+            }
+        }
+    }
+
+    private String readOptions() {
+        return "Operation name " + endpoint.getSystemName();
+    }
+
+}
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/component/SystemEndpoint.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/component/SystemEndpoint.java
new file mode 100644
index 00000000..25b921c0
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/component/SystemEndpoint.java
@@ -0,0 +1,115 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * system-component
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.component;
+
+import org.apache.camel.Consumer;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriPath;
+import org.apache.camel.support.DefaultEndpoint;
+
+@UriEndpoint(
+        scheme = "system",
+        title = "System",
+        syntax = "system:systemName",
+        label = "custom",
+        producerOnly = true)
+public class SystemEndpoint extends DefaultEndpoint {
+
+    @UriPath
+    @Metadata(required = true)
+    private String systemName;
+    @UriParam(label = "producer")
+    private String connectorProtocol = null;
+    @UriParam(label = "producer")
+    private String connectorClassifier = null;
+    @UriParam(label = "producer")
+    private String connectorType = null;
+    @UriParam(label = "producer")
+    private Boolean connectorMandatory = null;
+
+    public SystemEndpoint() {
+    }
+
+    public SystemEndpoint(String uri, SystemComponent component) {
+        super(uri, component);
+    }
+
+    public Producer createProducer() throws Exception {
+        return new SystemProducer(this);
+    }
+
+    public Consumer createConsumer(Processor processor) throws Exception {
+        return null;
+    }
+
+    public boolean isSingleton() {
+        return true;
+    }
+
+    public String getSystemName() {
+        return systemName;
+    }
+
+    public void setSystemName(String systemName) {
+        this.systemName = systemName;
+    }
+
+    public String getConnectorProtocol() {
+        return connectorProtocol;
+    }
+
+    public void setConnectorProtocol(String connectorProtocol) {
+        this.connectorProtocol = connectorProtocol;
+    }
+
+    public String getConnectorClassifier() {
+        return connectorClassifier;
+    }
+
+    public void setConnectorClassifier(String connectorClassifier) {
+        this.connectorClassifier = connectorClassifier;
+    }
+
+    public String getConnectorType() {
+        return connectorType;
+    }
+
+    public void setConnectorType(String connectorType) {
+        this.connectorType = connectorType;
+    }
+
+    public Boolean isConnectorMandatory() {
+        return connectorMandatory;
+    }
+
+    public void setConnectorMandatory(Boolean connectorMandatory) {
+        this.connectorMandatory = connectorMandatory;
+    }
+}
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/component/SystemProducer.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/component/SystemProducer.java
new file mode 100644
index 00000000..302a4e0f
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/component/SystemProducer.java
@@ -0,0 +1,130 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * system-component
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.support.DefaultProducer;
+import org.apache.commons.lang3.StringUtils;
+import org.osgi.framework.FrameworkUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import ru.entaxy.esb.system.common.exception.ProfileNotFound;
+import ru.entaxy.esb.system.registry.systems.profile.SystemCollectorListener;
+import ru.entaxy.esb.system.registry.systems.profile.SystemProfile;
+import ru.entaxy.platform.base.support.osgi.OSGIUtils;
+
+
+public class SystemProducer extends DefaultProducer {
+
+    private static final Logger LOG = LoggerFactory.getLogger(SystemProducer.class);
+    private final SystemEndpoint endpoint;
+
+    private SystemCollectorListener systemCollectorListener;
+
+    public SystemProducer(SystemEndpoint endpoint) {
+        super(endpoint);
+        this.endpoint = endpoint;
+    }
+
+    public void process(Exchange exchange) throws Exception {
+        LOG.debug("In SystemProducer " + exchange.getIn().getBody());
+
+        // get System Profile from systemRegistry endpoint.getSystemName()
+        SystemProfile systemProfile = null;
+
+        systemProfile = getSystemProfile(endpoint.getSystemName());
+
+        setPreferredConnector(exchange);
+        setConnectorMandatory(exchange);
+
+        LOG.debug("Called system profile " + (systemProfile != null ? systemProfile.getSystemName() : "NULL"));
+
+        systemProfile.send(exchange);
+
+    }
+
+    public SystemProfile getSystemProfile(String nameSystem) throws ProfileNotFound {
+        systemCollectorListener = getSystemProfileNamedListener();
+        LOG.debug("Registry SystemProfile {}; systems count {}", nameSystem,
+                systemCollectorListener.getReferenceNames().size());
+        SystemProfile systemProfile = null;
+        if (systemCollectorListener.isRegistered(nameSystem)) {
+            systemProfile = (SystemProfile) systemCollectorListener.getReference(nameSystem);
+        } else {
+            throw new ProfileNotFound("Profile for system " + nameSystem + " not found");
+        }
+        return systemProfile;
+    }
+
+    public SystemCollectorListener getSystemProfileNamedListener() {
+        if (systemCollectorListener == null) {
+            systemCollectorListener = (SystemCollectorListener) OSGIUtils.getService(
+                    FrameworkUtil.getBundle(SystemProducer.class).getBundleContext(),
+                    SystemCollectorListener.class);
+        }
+        return systemCollectorListener;
+    }
+
+    public void setPreferredConnector(Exchange exchange) {
+        if (!StringUtils.isEmpty(endpoint.getConnectorProtocol())
+                || !StringUtils.isEmpty(endpoint.getConnectorClassifier()) ||
+                !StringUtils.isEmpty(endpoint.getConnectorType())) {
+            List preferredConnectorList = new ArrayList<>();
+            if (!StringUtils.isEmpty(endpoint.getConnectorProtocol())) {
+                preferredConnectorList.add("\"protocol\":\"" + endpoint.getConnectorProtocol() + "\"");
+            }
+            if (!StringUtils.isEmpty(endpoint.getConnectorClassifier())) {
+                preferredConnectorList.add("\"classifier\":\"" + endpoint.getConnectorClassifier() + "\"");
+            }
+            if (!StringUtils.isEmpty(endpoint.getConnectorType())) {
+                preferredConnectorList.add("\"type\":\"" + endpoint.getConnectorType() + "\"");
+            }
+            String jsonPreferredConnector = "{" + joinByComma(preferredConnectorList) + "}";
+            exchange.getMessage().getHeaders().put("NTX_preferred_connector", jsonPreferredConnector);
+        }
+    }
+
+    public void setConnectorMandatory(Exchange exchange) {
+        if (endpoint.isConnectorMandatory() != null)
+            exchange.getMessage().getHeaders().put("NTX_connector_preferred_as_mandatory",
+                    endpoint.isConnectorMandatory());
+    }
+
+    private String joinByComma(List preferredConnectorList) {
+        StringBuilder summary = new StringBuilder();
+        for (int i = 0; i < preferredConnectorList.size(); i++) {
+            summary.append(preferredConnectorList.get(i));
+            if (i < preferredConnectorList.size() - 1) {
+                summary.append(",");
+            }
+        }
+        return summary.toString();
+    }
+}
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/component/util/SystemConstants.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/component/util/SystemConstants.java
new file mode 100644
index 00000000..1825246b
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/component/util/SystemConstants.java
@@ -0,0 +1,34 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * system-component
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.component.util;
+
+public class SystemConstants {
+
+    public static final String PARAMETER_PREFERRED_CONNECTOR = "preferredConnector";
+
+    private SystemConstants() {
+    }
+}
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/groups/component/SystemGroupComponent.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/groups/component/SystemGroupComponent.java
new file mode 100644
index 00000000..410c902d
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/groups/component/SystemGroupComponent.java
@@ -0,0 +1,44 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * system-group-component
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.groups.component;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.support.DefaultComponent;
+
+import java.util.Map;
+
+public class SystemGroupComponent extends DefaultComponent {
+
+    @Override
+    protected Endpoint createEndpoint(String uri, String remaining, Map parameters) throws Exception {
+        SystemGroupEndpoint endpoint = new SystemGroupEndpoint(uri, this);
+
+        endpoint.setSystemName(remaining);
+        setProperties(endpoint, parameters);
+        return endpoint;
+    }
+
+}
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/groups/component/SystemGroupConsumer.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/groups/component/SystemGroupConsumer.java
new file mode 100644
index 00000000..837236f1
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/groups/component/SystemGroupConsumer.java
@@ -0,0 +1,71 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * system-group-component
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.groups.component;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.support.ScheduledPollConsumer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SystemGroupConsumer extends ScheduledPollConsumer {
+
+    private static final Logger LOG = LoggerFactory.getLogger(SystemGroupConsumer.class);
+
+    private final SystemGroupEndpoint endpoint;
+
+    public SystemGroupConsumer(SystemGroupEndpoint endpoint, Processor processor) {
+        super(endpoint, processor);
+        this.endpoint = endpoint;
+    }
+
+    @Override
+    protected int poll() throws Exception {
+        Exchange exchange = endpoint.createExchange();
+
+        // create a message body
+        exchange.getIn().setBody(readOptions());
+        LOG.info("In SystemGroupConsumer  ++++ " + exchange.getIn().getBody());
+
+        try {
+            // send message to next processor in the route
+            getProcessor().process(exchange);
+            return 1; // number of messages polled
+        } finally {
+            // log exception if an exception occurred and was not handled
+            if (exchange.getException() != null) {
+                getExceptionHandler().handleException(
+                        "Error processing exchange", exchange,
+                        exchange.getException());
+            }
+        }
+    }
+
+    private String readOptions() {
+        return "Operation name " + endpoint.getSystemName();
+    }
+
+}
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/groups/component/SystemGroupEndpoint.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/groups/component/SystemGroupEndpoint.java
new file mode 100644
index 00000000..276c8fad
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/groups/component/SystemGroupEndpoint.java
@@ -0,0 +1,86 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * system-group-component
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.groups.component;
+
+import org.apache.camel.Consumer;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriPath;
+import org.apache.camel.support.DefaultEndpoint;
+
+@UriEndpoint(
+        scheme = "system-group",
+        title = "System",
+        syntax = "system-group:systemName",
+        label = "custom",
+        producerOnly = true)
+public class SystemGroupEndpoint extends DefaultEndpoint {
+
+    @UriPath
+    @Metadata(required = true)
+    private String systemName;
+    @UriParam
+    private String preferredConnector = null;
+
+    public SystemGroupEndpoint() {
+    }
+
+    public SystemGroupEndpoint(String uri, SystemGroupComponent component) {
+        super(uri, component);
+    }
+
+    public Producer createProducer() throws Exception {
+        return new SystemGroupProducer(this);
+    }
+
+    public Consumer createConsumer(Processor processor) throws Exception {
+        return null;
+    }
+
+    public boolean isSingleton() {
+        return true;
+    }
+
+    public String getSystemName() {
+        return systemName;
+    }
+
+    public void setSystemName(String systemName) {
+        this.systemName = systemName;
+    }
+
+    public String getPreferredConnector() {
+        return preferredConnector;
+    }
+
+    public void setPreferredConnector(String preferredConnector) {
+        this.preferredConnector = preferredConnector;
+    }
+
+}
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/groups/component/SystemGroupProducer.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/groups/component/SystemGroupProducer.java
new file mode 100644
index 00000000..604890b7
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/groups/component/SystemGroupProducer.java
@@ -0,0 +1,88 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * system-group-component
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.groups.component;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.support.DefaultProducer;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.ServiceReference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import ru.entaxy.esb.system.common.exception.ProfileNotFound;
+import ru.entaxy.esb.system.groups.registry.system.groups.profile.SystemGroupCollectorListener;
+import ru.entaxy.esb.system.groups.registry.system.groups.profile.SystemGroupProfile;
+
+
+public class SystemGroupProducer extends DefaultProducer {
+
+    private static final Logger LOG = LoggerFactory.getLogger(SystemGroupProducer.class);
+    private final SystemGroupEndpoint endpoint;
+
+    private SystemGroupCollectorListener systemGroupCollectorListener;
+
+    public SystemGroupProducer(SystemGroupEndpoint endpoint) {
+        super(endpoint);
+        this.endpoint = endpoint;
+    }
+
+    public void process(Exchange exchange) throws Exception {
+        LOG.debug("In SystemGroupProducer " + exchange.getIn().getBody());
+
+        //get System Group Profile from systemRegistry endpoint.getSystemName()
+        SystemGroupProfile systemGroupProfile = null;
+
+        systemGroupProfile = getSystemGroupProfile(endpoint.getSystemName());
+
+        LOG.debug("Called system group profile " + (systemGroupProfile != null ? systemGroupProfile.getProfileName() : "NULL"));
+
+        systemGroupProfile.send(exchange);
+    }
+
+    public SystemGroupProfile getSystemGroupProfile(String nameSystem) throws ProfileNotFound {
+        systemGroupCollectorListener = getSystemGroupCollectorListener();
+        LOG.info("Registry SystemGroupProfile {}; services count {}", nameSystem, systemGroupCollectorListener.getReferenceNames().size());
+        SystemGroupProfile systemGroupProfile = null;
+        if (systemGroupCollectorListener.isRegistered(nameSystem)) {
+            systemGroupProfile = (SystemGroupProfile) systemGroupCollectorListener.getReference(nameSystem);
+        } else {
+            throw new ProfileNotFound("Profile for group system " + nameSystem + " not found");
+        }
+        return systemGroupProfile;
+    }
+
+
+    public SystemGroupCollectorListener getSystemGroupCollectorListener() {
+        if (systemGroupCollectorListener == null) {
+            BundleContext bundleContext = FrameworkUtil.getBundle(SystemGroupProducer.class).getBundleContext();
+            ServiceReference systemGroupCollectorListenerServiceReference =
+                    bundleContext.getServiceReference(SystemGroupCollectorListener.class);
+            systemGroupCollectorListener = bundleContext.getService(systemGroupCollectorListenerServiceReference);
+        }
+        return systemGroupCollectorListener;
+    }
+
+}
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/groups/component/util/SystemGroupConstants.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/groups/component/util/SystemGroupConstants.java
new file mode 100644
index 00000000..f1f66de8
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/java/ru/entaxy/esb/system/groups/component/util/SystemGroupConstants.java
@@ -0,0 +1,34 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * system-group-component
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.groups.component.util;
+
+public class SystemGroupConstants {
+
+    public static final String PARAMETER_PREFERRED_CONNECTOR = "preferredConnector";
+
+    private SystemGroupConstants() {
+    }
+}
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/resources/META-INF/services/org/apache/camel/component/system b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/resources/META-INF/services/org/apache/camel/component/system
new file mode 100644
index 00000000..6c2e88c8
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/resources/META-INF/services/org/apache/camel/component/system
@@ -0,0 +1 @@
+class=ru.entaxy.esb.system.component.SystemComponent
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/resources/META-INF/services/org/apache/camel/component/system-group b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/resources/META-INF/services/org/apache/camel/component/system-group
new file mode 100644
index 00000000..36f402c5
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-camel-components/src/main/resources/META-INF/services/org/apache/camel/component/system-group
@@ -0,0 +1 @@
+class=ru.entaxy.esb.system.groups.component.SystemGroupComponent
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/LICENSE.txt b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/LICENSE.txt
new file mode 100644
index 00000000..4ae94b75
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/LICENSE.txt
@@ -0,0 +1,175 @@
+                                 ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ
+
+Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой)
+версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего
+Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН
+7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова,
+д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу
+https://www.emdev.ru/about (далее - Компания).
+
+Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями»
+(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения,
+Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в
+настоящем документе, в противном случае, он должен не использовать или не получать доступ
+к Программному обеспечению.
+
+                                    1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ
+
+a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии
+или редакции, исключительные права на которую принадлежат Правообладателю.
+b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные
+права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ
+для ЭВМ № 2021610848 от 19.01.2021 года.
+c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта
+https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО.
+d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также
+личные неимущественные права авторов произведений на результат интеллектуальной деятельности.
+e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование
+ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка
+включает предоставление Пользователю неисключительного права использования ПО, в том числе
+получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение
+патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается
+Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается
+для каждого Пользователя индивидуально в Сертификате.
+f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром),
+подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное
+обеспечение в ограниченном объёме и на определённый период времени.
+g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО,
+предоставленных Пользователю согласно условиям Подписки.
+h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного
+обеспечения.
+i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий
+из одного или нескольких файлов, который может быть прочтён человеком.
+j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля
+программы, полученный в результате обработки исходного кода, еще не связанный в полную программу.
+Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый
+продукт.
+k) Некоммерческое использование – индивидуальное личное использование Пользователем программного
+обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации
+возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая
+выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения.
+
+                    2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
+
+2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного
+обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом
+воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения
+в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ.
+2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит
+неисключительный характер.
+2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию,
+лицензия на ограниченное использование Программного обеспечения.
+2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования
+имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан
+обратиться в службу поддержки Правообладателя по адресу:  https://entaxy.ru/ для изменения
+вида лицензии с Базовой бесплатной версии на Подписки.
+2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для
+пробного использования программного обеспечения – не ограничен.
+2.6. Использование Пользователем настоящего программного обеспечения в целях разработки,
+модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю,
+без разрешения Правообладателя не допускается.
+
+                                3. АВТОРСКОЕ ПРАВО.
+
+3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение
+и любые его копии принадлежат Правообладателю.
+3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента,
+к которому можно получить доступ с помощью Программного обеспечения, является собственностью
+соответствующего владельца контента и защищается применимым законодательством об авторском
+праве или другими законами и договорами об интеллектуальной собственности.
+3.3. Условия использования Программного обеспечения.
+Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь
+придерживается следующих условий:
+3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять
+какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании
+Программного обеспечения или на нем.
+3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать,
+расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать
+Программное обеспечение.
+3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования
+ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне.
+3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено
+использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам.
+
+                    4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС»
+
+4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю
+на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с
+использованием Пользователем:
+4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в
+Программное обеспечение;
+4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями
+настоящего соглашения;
+4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием,
+или данными, не предоставленными Пользователю Правообладателем;
+4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем.
+
+
+5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ
+ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ
+И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ
+ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ
+И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ
+ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО.
+
+                        6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ.
+НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ
+ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ,
+ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ;
+ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ.
+ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ
+ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ;
+КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ
+ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ.
+
+                        7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ:
+Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия
+(включая, но не ограничиваясь) по:
+-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код)
+ Программного обеспечения;
+-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный
+код Программного обеспечения, за исключением тех изменений, которые вносятся средствами,
+включёнными в Программное обеспечение и описанными непосредственно в документации к нему;
+-созданию условий для использования Программного обеспечения лицами, не имеющими прав на
+использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство
+третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа
+к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку;
+-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию).
+
+                    8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА.
+
+8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из
+лицензионных продуктов, используемых на законных основаниях, а
+именно https://entaxy.ru/libs/licenses/root-aggregated.deps.
+8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть
+совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения.
+8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться
+Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения,
+содержащих все изменения и дополнения программного обеспечения.
+
+                        9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ.
+
+9.1.  Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым
+программным обеспечением.
+9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно
+с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм
+«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public.
+9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий
+пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя,
+прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер
+ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства
+Российской Федерации.
+
+                                10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ.
+
+10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет
+право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб,
+недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий
+пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере
+2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения
+исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy).
+10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое
+законодательство – Российской Федерации.
+10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным,
+остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать
+исполнять свои обязанности в соответствии с этими положениями.
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/pom.xml b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/pom.xml
new file mode 100644
index 00000000..7ba5c7b0
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/pom.xml
@@ -0,0 +1,43 @@
+
+  4.0.0
+  
+    ru.entaxy.esb.platform.runtime.core.objects-implementations
+    profile-implementation
+    1.11.0
+  
+  ru.entaxy.esb.platform.runtime.core.objects-implementations.profile-implementation
+  profile-runtime-legacy-support
+  bundle
+  
+    ENTAXY :: PLATFORM :: CORE :: OBJECTS IMPLEMENTATIONS :: PROFILE :: RUNTIME LEGACY
+    ENTAXY :: PLATFORM :: CORE :: OBJECTS IMPLEMENTATIONS :: PROFILE :: RUNTIME LEGACY
+  
+	
+		
+			ru.entaxy.esb.system.profile.commons,
+			ru.entaxy.esb.system.profile.commons.connectors,
+			ru.entaxy.esb.system.profile.commons.connectors.in,
+			ru.entaxy.esb.system.profile.commons.connectors.out,
+			ru.entaxy.esb.system.profile.commons.profile_output,
+			ru.entaxy.esb.system.registry.systems.profile,
+			ru.entaxy.esb.system.registry.systems.profile.collector,
+			ru.entaxy.esb.system.registry.systems.profile.impl.defaults,
+			ru.entaxy.esb.system.groups.registry.system.groups.profile,
+			ru.entaxy.esb.system.groups.registry.system.groups.profile.collector,
+			ru.entaxy.esb.system.groups.registry.system.groups.profile.impl.defaults	
+		
+	
+	
+	
+        
+            org.apache.camel
+            camel-api
+        
+        
+            ru.entaxy.esb.platform.runtime.core
+            core-support-runtime-legacy
+            ${project.version}
+        
+	
+	  
+
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/groups/registry/system/groups/profile/SystemGroupCollectorListener.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/groups/registry/system/groups/profile/SystemGroupCollectorListener.java
new file mode 100644
index 00000000..f1cbe075
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/groups/registry/system/groups/profile/SystemGroupCollectorListener.java
@@ -0,0 +1,31 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * system-group-profile-api
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.groups.registry.system.groups.profile;
+
+import ru.entaxy.platform.base.support.osgi.service.NamedReferenceListener;
+
+public interface SystemGroupCollectorListener extends NamedReferenceListener {
+}
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/groups/registry/system/groups/profile/SystemGroupProfile.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/groups/registry/system/groups/profile/SystemGroupProfile.java
new file mode 100644
index 00000000..c4576a80
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/groups/registry/system/groups/profile/SystemGroupProfile.java
@@ -0,0 +1,36 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * system-group-profile-api
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.groups.registry.system.groups.profile;
+
+import ru.entaxy.esb.system.profile.commons.Profile;
+
+public interface SystemGroupProfile extends Profile {
+
+    String getProfileName();
+
+    void send(Object request);
+
+}
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/groups/registry/system/groups/profile/collector/SystemGroupProfileNamedListener.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/groups/registry/system/groups/profile/collector/SystemGroupProfileNamedListener.java
new file mode 100644
index 00000000..f579f0b4
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/groups/registry/system/groups/profile/collector/SystemGroupProfileNamedListener.java
@@ -0,0 +1,39 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * system-group-profile-collector
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.groups.registry.system.groups.profile.collector;
+
+import ru.entaxy.esb.system.groups.registry.system.groups.profile.SystemGroupCollectorListener;
+import ru.entaxy.esb.system.groups.registry.system.groups.profile.SystemGroupProfile;
+import ru.entaxy.platform.base.support.osgi.service.CommonNamedReferenceListener;
+
+public class SystemGroupProfileNamedListener extends CommonNamedReferenceListener
+        implements SystemGroupCollectorListener {
+
+    @Override
+    protected String getObjectName(SystemGroupProfile systemGroupProfile) {
+        return systemGroupProfile.getProfileName();
+    }
+}
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/groups/registry/system/groups/profile/impl/defaults/DefaultSystemGroupProfile.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/groups/registry/system/groups/profile/impl/defaults/DefaultSystemGroupProfile.java
new file mode 100644
index 00000000..8f4706a9
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/groups/registry/system/groups/profile/impl/defaults/DefaultSystemGroupProfile.java
@@ -0,0 +1,104 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * system-group-profile-impl-default
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.groups.registry.system.groups.profile.impl.defaults;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.component.jms.JmsComponent;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import ru.entaxy.esb.system.groups.registry.system.groups.profile.SystemGroupProfile;
+import ru.entaxy.esb.system.profile.commons.CommonProfile;
+import ru.entaxy.esb.system.registry.systems.profile.SystemCollectorListener;
+
+import javax.jms.ConnectionFactory;
+
+public class DefaultSystemGroupProfile extends CommonProfile implements SystemGroupProfile {
+
+    private static final Log LOG = LogFactory.getLog(DefaultSystemGroupProfile.class);
+    private static final String NAME_JMS_COMPONENT = "jms";
+
+    private String systemGroupName = "system";
+    private String profileName = "default";
+    private String destination = "default";
+    private final String dlq = "DLQ";
+    private ConnectionFactory jmsConnectionFactory;
+
+    private SystemCollectorListener systemCollectorListener;
+
+    public DefaultSystemGroupProfile() {
+    }
+
+    @Override
+    public String getProfileName() {
+        return profileName;
+    }
+
+    @Override
+    protected void doSend(Object request) {
+        LOG.info("Send request " + request + "in " + destination);
+        Exchange exchange = (Exchange) request;
+
+        ProducerTemplate template = exchange.getContext().createProducerTemplate();
+        addJmsComponent(exchange.getContext());
+
+        Message message = exchange.getMessage();
+        message.setHeader("NTX_SystemId", systemGroupName);
+        message.setHeader("ExchangePattern", "InOnly");
+
+        template.send(destination, exchange);
+    }
+
+    private void addJmsComponent(CamelContext context) {
+        if (!context.getComponentNames().contains(NAME_JMS_COMPONENT))
+            addJmsComponent(context, NAME_JMS_COMPONENT);
+    }
+
+    private void addJmsComponent(CamelContext context, String componentName) {
+        JmsComponent component = new JmsComponent(context);
+        component.setConnectionFactory(jmsConnectionFactory);
+
+        context.addComponent(componentName, component);
+    }
+
+    public void setSystemGroupName(String systemGroupName) {
+        this.systemGroupName = systemGroupName;
+    }
+
+    public void setProfileName(String profileName) {
+        this.profileName = profileName;
+    }
+
+    public void setDestination(String destination) {
+        this.destination = destination;
+    }
+
+    public void setJmsConnectionFactory(ConnectionFactory jmsConnectionFactory) {
+        this.jmsConnectionFactory = jmsConnectionFactory;
+    }
+}
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/CommonProfile.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/CommonProfile.java
new file mode 100644
index 00000000..f3c2dce6
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/CommonProfile.java
@@ -0,0 +1,90 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-commons
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.profile.commons;
+
+import ru.entaxy.esb.system.profile.commons.profile_output.ProfileOutput;
+
+import java.util.Objects;
+
+public abstract class CommonProfile implements Profile {
+
+    protected String systemName = "system";
+    protected ProfileOutput profileOutput;
+    protected InConnectorCollector inConnectorCollector;
+
+    @Override
+    public void send(Object request) {
+        doSend(request);
+    }
+
+    protected abstract void doSend(Object request);
+
+    @Override
+    public String getSystemName() {
+        return systemName;
+    }
+
+    public void setSystemName(String systemName) {
+        this.systemName = systemName;
+    }
+
+    @Override
+    public ProfileOutput getProfileOutput() {
+        return profileOutput;
+    }
+
+    public void setProfileOutput(ProfileOutput profileOutput) {
+        this.profileOutput = profileOutput;
+    }
+
+    public InConnectorCollector getInConnectorCollector() {
+        return inConnectorCollector;
+    }
+
+    public void setInConnectorCollector(InConnectorCollector inConnectorCollector) {
+        this.inConnectorCollector = inConnectorCollector;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        CommonProfile that = (CommonProfile) o;
+        return Objects.equals(systemName, that.systemName);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(systemName);
+    }
+
+    @Override
+    public String toString() {
+        return "CommonProfile{" +
+                "systemName='" + systemName + '\'' +
+                '}';
+    }
+}
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/ConnectorRegistry.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/ConnectorRegistry.java
new file mode 100644
index 00000000..b1ed8b68
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/ConnectorRegistry.java
@@ -0,0 +1,60 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-commons
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.profile.commons;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Header;
+
+import ru.entaxy.esb.system.common.exception.ConnectorNotFound;
+import ru.entaxy.esb.system.profile.commons.connectors.Connector;
+import ru.entaxy.platform.base.support.osgi.service.CommonNamedReferenceListener;
+
+public class ConnectorRegistry extends CommonNamedReferenceListener {
+
+    public String getParam(String systemName, String paramName) {
+        Connector connector = getReference(systemName);
+        if (connector != null) {
+            return connector.getParam(paramName);
+        } else {
+            throw new ConnectorNotFound("Connector for " + systemName + " not found");
+        }
+    }
+
+    public void send(@Header("X-SystemName") String systemName, Exchange exchange) {
+        Connector connector = getReference(systemName);
+        if (connector != null) {
+            connector.send(exchange);
+        } else {
+            throw new ConnectorNotFound("Connector for " + systemName + " not found");
+        }
+    }
+
+    @Override
+    protected String getObjectName(Connector Connector) {
+        return Connector.getSystemName();
+    }
+}
+
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/InConnectorCollector.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/InConnectorCollector.java
new file mode 100644
index 00000000..6b0705f0
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/InConnectorCollector.java
@@ -0,0 +1,37 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-commons
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.profile.commons;
+
+import ru.entaxy.esb.system.profile.commons.connectors.in.InConnector;
+import ru.entaxy.platform.base.support.osgi.service.CommonNamedReferenceListener;
+
+public class InConnectorCollector extends CommonNamedReferenceListener {
+
+    @Override
+    protected String getObjectName(InConnector inConnector) {
+        return inConnector == null ? null : inConnector.getEndpointName();
+    }
+}
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/Profile.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/Profile.java
new file mode 100644
index 00000000..abcefc72
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/Profile.java
@@ -0,0 +1,39 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-commons
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.profile.commons;
+
+import ru.entaxy.esb.system.profile.commons.profile_output.ProfileOutput;
+
+public interface Profile {
+
+    ProfileOutput getProfileOutput();
+
+    String getSystemName();
+
+    InConnectorCollector getInConnectorCollector();
+
+    void send(Object request);
+}
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/connectors/CommonConnector.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/connectors/CommonConnector.java
new file mode 100644
index 00000000..8abd571e
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/connectors/CommonConnector.java
@@ -0,0 +1,79 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-commons
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.profile.commons.connectors;
+
+import ru.entaxy.esb.system.profile.commons.Profile;
+
+import java.util.Map;
+
+public abstract class CommonConnector implements Connector {
+    protected String endpointName;
+    protected Profile profile;
+    protected String systemName;
+    protected Map params;
+
+    public void setEndpointName(String endpointName) {
+        this.endpointName = endpointName;
+    }
+
+    public void setProfile(Profile profile) {
+        this.profile = profile;
+    }
+
+    public void setSystemName(String systemName) {
+        this.systemName = systemName;
+    }
+
+    public void setParams(Map params) {
+        this.params = params;
+    }
+
+    @Override
+    public String getEndpointName() {
+        return endpointName;
+    }
+
+    @Override
+    public Profile getProfile() {
+        return profile;
+    }
+
+    @Override
+    public String getSystemName() {
+        return systemName;
+    }
+
+    @Override
+    public Map getParams() {
+        return params;
+    }
+
+    @Override
+    public String getParam(String paramName) {
+        return params.get(paramName);
+    }
+
+}
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/connectors/Connector.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/connectors/Connector.java
new file mode 100644
index 00000000..097f0787
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/connectors/Connector.java
@@ -0,0 +1,53 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-commons
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.profile.commons.connectors;
+
+import org.apache.camel.Exchange;
+import ru.entaxy.esb.system.profile.commons.Profile;
+
+import java.util.Map;
+
+public interface Connector {
+
+    public static final String HEADERS_START = "NTX_Connector_";
+    public static final String ROLE = "role";
+    public static final String TYPE = "type";
+    public static final String SUBTYPE = "subtype";
+
+    String getEndpointName();
+
+    String getEndpointType();
+
+    Profile getProfile();
+
+    String getSystemName();
+
+    Map getParams();
+
+    String getParam(String paramName);
+
+    void send(Exchange exchange);
+}
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/connectors/in/DirectVMInConnectorImpl.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/connectors/in/DirectVMInConnectorImpl.java
new file mode 100644
index 00000000..3ababbc3
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/connectors/in/DirectVMInConnectorImpl.java
@@ -0,0 +1,48 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-commons
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.profile.commons.connectors.in;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.ProducerTemplate;
+import ru.entaxy.esb.system.profile.commons.connectors.CommonConnector;
+
+public class DirectVMInConnectorImpl extends CommonConnector implements InConnector {
+
+    @Override
+    public String getEndpointType() {
+        return endpointType;
+    }
+
+    @Override
+    public void send(Exchange exchange) {
+        ProducerTemplate template = exchange.getContext().createProducerTemplate();
+        exchange.getIn().setHeader(HEADERS_START + ROLE, getParam(ROLE));
+        exchange.getIn().setHeader(HEADERS_START + TYPE, getParam(TYPE));
+        exchange.getIn().setHeader(HEADERS_START + SUBTYPE, getParam(SUBTYPE));
+        template.send("direct-vm:" + endpointName + "-" + endpointType + "-connector-" + systemName +
+                "?block=true&timeout=60000", exchange);
+    }
+}
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/connectors/in/InConnector.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/connectors/in/InConnector.java
new file mode 100644
index 00000000..f42ebebc
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/connectors/in/InConnector.java
@@ -0,0 +1,33 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-commons
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.profile.commons.connectors.in;
+
+import ru.entaxy.esb.system.profile.commons.connectors.Connector;
+
+public interface InConnector extends Connector {
+
+    String endpointType = "in";
+}
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/connectors/out/DirectVMOutConnectorImpl.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/connectors/out/DirectVMOutConnectorImpl.java
new file mode 100644
index 00000000..393a51c7
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/connectors/out/DirectVMOutConnectorImpl.java
@@ -0,0 +1,45 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-commons
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.profile.commons.connectors.out;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.ProducerTemplate;
+import ru.entaxy.esb.system.profile.commons.connectors.CommonConnector;
+
+public class DirectVMOutConnectorImpl extends CommonConnector implements OutConnector {
+
+    @Override
+    public String getEndpointType() {
+        return endpointType;
+    }
+
+    @Override
+    public void send(Exchange exchange) {
+        ProducerTemplate template = exchange.getContext().createProducerTemplate();
+        template.send("direct-vm:" + endpointName + "-" +
+                endpointType + "-connector-" + systemName + "?block=true&timeout=60000", exchange);
+    }
+}
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/connectors/out/OutConnector.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/connectors/out/OutConnector.java
new file mode 100644
index 00000000..a2f3be8b
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/connectors/out/OutConnector.java
@@ -0,0 +1,33 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-commons
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.profile.commons.connectors.out;
+
+import ru.entaxy.esb.system.profile.commons.connectors.Connector;
+
+public interface OutConnector extends Connector {
+
+    String endpointType = "out";
+}
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/profile_output/ProfileOutput.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/profile_output/ProfileOutput.java
new file mode 100644
index 00000000..dd156118
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/profile_output/ProfileOutput.java
@@ -0,0 +1,48 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-commons
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.profile.commons.profile_output;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Header;
+import ru.entaxy.esb.system.profile.commons.connectors.out.OutConnector;
+
+import java.util.List;
+
+import static ru.entaxy.esb.system.profile.commons.connectors.Connector.*;
+
+public interface ProfileOutput {
+    OutConnector getOutConnector(String endpointName, String role, String type, String subtype);
+
+    void send(Exchange exchange);
+
+    void sendTo(@Header("EndpointName") String endpointName,
+                @Header(HEADERS_START + ROLE) String role,
+                @Header(HEADERS_START + TYPE) String type,
+                @Header(HEADERS_START + SUBTYPE) String subtype,
+                Exchange exchange);
+
+    public List getReferenceNames();
+}
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/profile_output/ProfileOutputImpl.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/profile_output/ProfileOutputImpl.java
new file mode 100644
index 00000000..57f96286
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/profile/commons/profile_output/ProfileOutputImpl.java
@@ -0,0 +1,148 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * profile-commons
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.profile.commons.profile_output;
+
+import static ru.entaxy.esb.system.profile.commons.connectors.Connector.HEADERS_START;
+import static ru.entaxy.esb.system.profile.commons.connectors.Connector.ROLE;
+import static ru.entaxy.esb.system.profile.commons.connectors.Connector.SUBTYPE;
+import static ru.entaxy.esb.system.profile.commons.connectors.Connector.TYPE;
+
+import java.util.concurrent.CountDownLatch;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Header;
+import org.apache.camel.ProducerTemplate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import ru.entaxy.esb.system.common.exception.ConnectorNotFound;
+import ru.entaxy.esb.system.profile.commons.connectors.out.OutConnector;
+import ru.entaxy.platform.base.support.osgi.service.CommonNamedReferenceListener;
+
+public class ProfileOutputImpl extends CommonNamedReferenceListener implements ProfileOutput {
+
+    private static final Logger log = LoggerFactory.getLogger(ProfileOutputImpl.class);
+
+    protected String systemName;
+
+    public void setSystemName(String systemName) {
+        this.systemName = systemName;
+    }
+
+    @Override
+    public OutConnector getOutConnector(String endpointName, String role, String type, String subtype) {
+        for (OutConnector outConnector : registeredReferences.values()) {
+            if ((role == null || role.equals(outConnector.getParam(ROLE))) &&
+                    type != null && type.equals(outConnector.getParam(TYPE)) &&
+                    subtype != null && subtype.equals(outConnector.getParam(SUBTYPE))) {
+                return outConnector;
+            } else if ((role == null || role.equals(outConnector.getParam(ROLE))) &&
+                    type != null && type.equals(outConnector.getParam(TYPE))) {
+                return outConnector;
+            } else if (role != null && role.equals(outConnector.getParam(ROLE))) {
+                return outConnector;
+            }
+        }
+        if (endpointName == null || registeredReferences.get(endpointName) == null) {
+            for (OutConnector outConnector : registeredReferences.values()) {
+                return outConnector;
+            }
+        }
+        return registeredReferences.get(endpointName);
+    }
+
+    @Override
+    public void send(Exchange exchange) {
+        /*
+         * !!! WE ARE NOT SURE THE SENDING FROM PROCESSOR (COMPONENT) IS ALLOWED IN CAMEL !!!
+         * but we managed to do this
+         * 
+         * we need another Thread to execute because when sending
+         * from system to itself the execution stops in waiting forever
+         * due to existing running ReactiveExecutor will be found for this thread
+         * and the task will be placed in it's queue while being in
+         * execution of the previous task from another Workers's queue
+         * of the same ReactiveExecutor   
+         * 
+         * Example (without separate thread): 
+         * 
+         * profile_s1 (ExtendedCamelContext_1 -> ReactiveExecutor_1) 
+         * -> task (we're in it now!) -> [switch to ExtendedCamelContext_2] producer (vmdirect) 
+         * -> ExtendedCamelContext_2 (with ReactiveExecutor_2) (route_s1)
+         * -> consumer (profile_s1) 
+         * -> task {
+         * 		Who will execute? Let's check if there's already a ReactiveExecutor !!for current Thread!!
+         * 		in target context. If no, our executor will be used.
+         * 		Oh! We've found ReactiveExecutor_1, it will execute. 
+         * 	} -> enqueue (ReactiveExecutor_1)
+         * -> (execution is still in ExtendedCamelContext_2 - route_s1)
+         * -> wait for task to be executed.
+         * 
+         * Result: being in previous (current) task we're waiting for the next task 
+         * in the same ReactiveExecutor's queue to be executed. 
+         * This will never happen.
+         *   
+         */
+        CountDownLatch latch = new CountDownLatch(1);
+        Thread exec = new Thread(new Runnable() {
+
+            @Override
+            public void run() {
+                ProducerTemplate template = exchange.getContext().createProducerTemplate();
+                template.send("direct-vm:profile-" + systemName + "-enter-point?block=true&timeout=60000", exchange);
+                latch.countDown();
+            }
+        });
+        exec.setContextClassLoader(Thread.currentThread().getContextClassLoader());
+        exec.start();
+        try {
+            // we have to wait the thread to be executed
+            // because we're calling synchronously
+            latch.await();
+        } catch (InterruptedException e) {
+            // e.printStackTrace();
+            log.error("Error awaiting latch", e);
+        }
+    }
+
+    @Override
+    public void sendTo(@Header("ENTAXY_EndpointName") String endpointName,
+            @Header(HEADERS_START + ROLE) String role,
+            @Header(HEADERS_START + TYPE) String type,
+            @Header(HEADERS_START + SUBTYPE) String subtype,
+            Exchange exchange) {
+        try {
+            getOutConnector(endpointName, role, type, subtype).send(exchange);
+        } catch (NullPointerException ex) {
+            throw new ConnectorNotFound("Out connector for " + systemName + " not found");
+        }
+    }
+
+    @Override
+    protected String getObjectName(OutConnector outConnector) {
+        return outConnector == null ? null : outConnector.getEndpointName();
+    }
+}
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/registry/systems/profile/SystemCollectorListener.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/registry/systems/profile/SystemCollectorListener.java
new file mode 100644
index 00000000..72cfe259
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/registry/systems/profile/SystemCollectorListener.java
@@ -0,0 +1,32 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * system-profile-api
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.registry.systems.profile;
+
+import ru.entaxy.platform.base.support.osgi.service.NamedReferenceListener;
+
+public interface SystemCollectorListener extends NamedReferenceListener {
+
+}
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/registry/systems/profile/SystemProfile.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/registry/systems/profile/SystemProfile.java
new file mode 100644
index 00000000..2b527703
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/registry/systems/profile/SystemProfile.java
@@ -0,0 +1,32 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * system-profile-api
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.registry.systems.profile;
+
+import ru.entaxy.esb.system.profile.commons.Profile;
+
+public interface SystemProfile extends Profile {
+
+}
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/registry/systems/profile/collector/SystemProfileNamedListener.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/registry/systems/profile/collector/SystemProfileNamedListener.java
new file mode 100644
index 00000000..f1028d9f
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/registry/systems/profile/collector/SystemProfileNamedListener.java
@@ -0,0 +1,49 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * system-profile-collector
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.registry.systems.profile.collector;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.sun.istack.NotNull;
+
+import ru.entaxy.esb.system.registry.systems.profile.SystemCollectorListener;
+import ru.entaxy.esb.system.registry.systems.profile.SystemProfile;
+import ru.entaxy.platform.base.support.osgi.service.CommonNamedReferenceListener;
+
+public class SystemProfileNamedListener extends CommonNamedReferenceListener
+        implements SystemCollectorListener {
+    protected static final Logger log = LoggerFactory.getLogger(SystemProfileNamedListener.class);
+
+    @Override
+    protected String getObjectName(@NotNull SystemProfile systemProfile) {
+        return systemProfile.getSystemName();
+    }
+
+    private SystemProfile getSystemProfile(String id) {
+        return registeredReferences.get(id);
+    }
+}
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/registry/systems/profile/impl/defaults/DefaultSystemProfile.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/registry/systems/profile/impl/defaults/DefaultSystemProfile.java
new file mode 100644
index 00000000..76ea6c19
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/java/ru/entaxy/esb/system/registry/systems/profile/impl/defaults/DefaultSystemProfile.java
@@ -0,0 +1,45 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * system-profile-impl-default
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.esb.system.registry.systems.profile.impl.defaults;
+
+import org.apache.camel.Exchange;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import ru.entaxy.esb.system.profile.commons.CommonProfile;
+import ru.entaxy.esb.system.registry.systems.profile.SystemProfile;
+
+public class DefaultSystemProfile extends CommonProfile implements SystemProfile {
+
+    private static final Log LOG = LogFactory.getLog(DefaultSystemProfile.class);
+
+    public DefaultSystemProfile() {
+    }
+
+    @Override
+    protected void doSend(Object request) {
+        profileOutput.send((Exchange) request);
+    }
+}
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/resources/OSGI-INF/blueprint/blueprint.xml
new file mode 100644
index 00000000..8df699fc
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime-legacy-support/src/main/resources/OSGI-INF/blueprint/blueprint.xml
@@ -0,0 +1,65 @@
+
+
+
+
+
+	
+
+    
+
+    
+        
+    
+
+    
+
+	
+
+    
+    
+
+    
+        
+    
+
+    
+
+
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/pom.xml b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/pom.xml
index 9798c361..826414a1 100644
--- a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/pom.xml
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/pom.xml
@@ -4,7 +4,7 @@
     
         ru.entaxy.esb.platform.runtime.core.objects-implementations
         profile-implementation
-        1.10.0
+        1.11.0
     
     ru.entaxy.esb.platform.runtime.core.objects-implementations.profile-implementation
     profile-runtime
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/Connector.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/Connector.java
index 22faf76a..1f0dd611 100644
--- a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/Connector.java
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/Connector.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * profile-runtime
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/InConnector.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/InConnector.java
index 5d535f9f..ea5fe18d 100644
--- a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/InConnector.java
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/InConnector.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * profile-runtime
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/OutConnector.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/OutConnector.java
index 8c8027d9..1a15b830 100644
--- a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/OutConnector.java
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/OutConnector.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * profile-runtime
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/Profile.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/Profile.java
index 8d9f9003..ce49101f 100644
--- a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/Profile.java
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/Profile.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * profile-runtime
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/SystemProfile.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/SystemProfile.java
index 179a0339..470f2c19 100644
--- a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/SystemProfile.java
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/SystemProfile.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * profile-runtime
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/impl/AbstractConnector.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/impl/AbstractConnector.java
index 0a61dc7f..cff97083 100644
--- a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/impl/AbstractConnector.java
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/impl/AbstractConnector.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * profile-runtime
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/impl/AbstractProfile.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/impl/AbstractProfile.java
index c191d617..fcda06e9 100644
--- a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/impl/AbstractProfile.java
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/impl/AbstractProfile.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * profile-runtime
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/impl/InConnectorImpl.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/impl/InConnectorImpl.java
index 85621e27..34ed24b6 100644
--- a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/impl/InConnectorImpl.java
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/impl/InConnectorImpl.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * profile-runtime
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/impl/OutConnectorImpl.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/impl/OutConnectorImpl.java
index 0833dacd..2d5e1def 100644
--- a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/impl/OutConnectorImpl.java
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/impl/OutConnectorImpl.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * profile-runtime
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/impl/SystemProfileImpl.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/impl/SystemProfileImpl.java
index 39035af0..b02ce63d 100644
--- a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/impl/SystemProfileImpl.java
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/impl/SystemProfileImpl.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * profile-runtime
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
diff --git a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/support/ConnectorSelector.java b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/support/ConnectorSelector.java
index aa29c401..14c7240e 100644
--- a/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/support/ConnectorSelector.java
+++ b/platform/runtime/core/objects-implementations/profile-implementation/profile-runtime/src/main/java/ru/entaxy/platform/profiles/runtime/support/ConnectorSelector.java
@@ -2,7 +2,7 @@
  * ~~~~~~licensing~~~~~~
  * profile-runtime
  * ==========
- * Copyright (C) 2020 - 2024 EmDev LLC
+ * Copyright (C) 2020 - 2025 EmDev LLC
  * ==========
  * You may not use this file except in accordance with the License Terms of the Copyright
  * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
@@ -60,6 +60,7 @@ public class ConnectorSelector implements Processor {
 
     public static final String PATTERN_ANY = "*";
     public static final String PATTERN_EQUAL = "=";
+    public static final String NTX_LOGGING_KEY = "NTX_loggingKey";
 
     protected SystemProfile profile;
 
@@ -70,11 +71,20 @@ public class ConnectorSelector implements Processor {
     @Override
     public void process(Exchange exchange) throws Exception {
         log.debug("--> SELECTING CONNECTOR !!!");
-        exchange.getIn().removeHeader(PROP_TARGET_CONNECTOR);
-        SelectionExecutor executor = new SelectionExecutor(selectorConfig, profile);
-        OutConnector result = executor.findConnector(exchange);
-        if (result != null)
-            exchange.getIn().setHeader(PROP_TARGET_CONNECTOR, result.getId());
+        try {
+            exchange.getIn().removeHeader(PROP_TARGET_CONNECTOR);
+            SelectionExecutor executor = new SelectionExecutor(selectorConfig, profile);
+            OutConnector result = executor.findConnector(exchange);
+            if (result != null)
+                exchange.getIn().setHeader(PROP_TARGET_CONNECTOR, result.getId());
+        } catch (Exception ex) {
+            log.error(exchange.getIn().getHeader(NTX_LOGGING_KEY) +". Exception: " + ex.getMessage() + "with params: preferred_connector-" + exchange.getIn().getHeader(PROP_PREFERRED_CONNECTOR)
+            + ", connector_preferred_as_mandatory-" +  exchange.getIn().getHeader(PROP_CONNECTOR_PREFERRED_AS_MANDATORY));
+            throw ex;
+        } finally {
+            exchange.getIn().removeHeader(PROP_PREFERRED_CONNECTOR);
+            exchange.getIn().removeHeader(PROP_CONNECTOR_PREFERRED_AS_MANDATORY);
+        }
     }
 
     public SystemProfile getProfile() {
@@ -156,7 +166,7 @@ public class ConnectorSelector implements Processor {
         }
 
         private String getHeaderLoggingKey(Exchange exchange) {
-            Object headerLoggingKey = exchange.getIn().getHeader("NTX_loggingKey");
+            Object headerLoggingKey = exchange.getIn().getHeader(NTX_LOGGING_KEY);
             return headerLoggingKey == null ? "" : headerLoggingKey.toString();
         }
 
diff --git a/platform/runtime/core/objects-implementations/repository-implementation/LICENSE.txt b/platform/runtime/core/objects-implementations/repository-implementation/LICENSE.txt
new file mode 100644
index 00000000..4ae94b75
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/repository-implementation/LICENSE.txt
@@ -0,0 +1,175 @@
+                                 ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ
+
+Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой)
+версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего
+Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН
+7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова,
+д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу
+https://www.emdev.ru/about (далее - Компания).
+
+Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями»
+(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения,
+Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в
+настоящем документе, в противном случае, он должен не использовать или не получать доступ
+к Программному обеспечению.
+
+                                    1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ
+
+a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии
+или редакции, исключительные права на которую принадлежат Правообладателю.
+b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные
+права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ
+для ЭВМ № 2021610848 от 19.01.2021 года.
+c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта
+https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО.
+d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также
+личные неимущественные права авторов произведений на результат интеллектуальной деятельности.
+e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование
+ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка
+включает предоставление Пользователю неисключительного права использования ПО, в том числе
+получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение
+патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается
+Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается
+для каждого Пользователя индивидуально в Сертификате.
+f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром),
+подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное
+обеспечение в ограниченном объёме и на определённый период времени.
+g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО,
+предоставленных Пользователю согласно условиям Подписки.
+h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного
+обеспечения.
+i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий
+из одного или нескольких файлов, который может быть прочтён человеком.
+j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля
+программы, полученный в результате обработки исходного кода, еще не связанный в полную программу.
+Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый
+продукт.
+k) Некоммерческое использование – индивидуальное личное использование Пользователем программного
+обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации
+возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая
+выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения.
+
+                    2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
+
+2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного
+обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом
+воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения
+в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ.
+2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит
+неисключительный характер.
+2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию,
+лицензия на ограниченное использование Программного обеспечения.
+2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования
+имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан
+обратиться в службу поддержки Правообладателя по адресу:  https://entaxy.ru/ для изменения
+вида лицензии с Базовой бесплатной версии на Подписки.
+2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для
+пробного использования программного обеспечения – не ограничен.
+2.6. Использование Пользователем настоящего программного обеспечения в целях разработки,
+модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю,
+без разрешения Правообладателя не допускается.
+
+                                3. АВТОРСКОЕ ПРАВО.
+
+3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение
+и любые его копии принадлежат Правообладателю.
+3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента,
+к которому можно получить доступ с помощью Программного обеспечения, является собственностью
+соответствующего владельца контента и защищается применимым законодательством об авторском
+праве или другими законами и договорами об интеллектуальной собственности.
+3.3. Условия использования Программного обеспечения.
+Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь
+придерживается следующих условий:
+3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять
+какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании
+Программного обеспечения или на нем.
+3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать,
+расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать
+Программное обеспечение.
+3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования
+ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне.
+3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено
+использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам.
+
+                    4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС»
+
+4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю
+на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с
+использованием Пользователем:
+4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в
+Программное обеспечение;
+4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями
+настоящего соглашения;
+4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием,
+или данными, не предоставленными Пользователю Правообладателем;
+4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем.
+
+
+5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ
+ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ
+И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ
+ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ
+И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ
+ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО.
+
+                        6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ.
+НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ
+ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ,
+ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ;
+ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ.
+ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ
+ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ;
+КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ
+ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ.
+
+                        7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ:
+Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия
+(включая, но не ограничиваясь) по:
+-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код)
+ Программного обеспечения;
+-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный
+код Программного обеспечения, за исключением тех изменений, которые вносятся средствами,
+включёнными в Программное обеспечение и описанными непосредственно в документации к нему;
+-созданию условий для использования Программного обеспечения лицами, не имеющими прав на
+использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство
+третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа
+к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку;
+-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию).
+
+                    8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА.
+
+8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из
+лицензионных продуктов, используемых на законных основаниях, а
+именно https://entaxy.ru/libs/licenses/root-aggregated.deps.
+8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть
+совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения.
+8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться
+Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения,
+содержащих все изменения и дополнения программного обеспечения.
+
+                        9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ.
+
+9.1.  Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым
+программным обеспечением.
+9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно
+с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм
+«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public.
+9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий
+пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя,
+прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер
+ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства
+Российской Федерации.
+
+                                10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ.
+
+10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет
+право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб,
+недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий
+пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере
+2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения
+исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy).
+10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое
+законодательство – Российской Федерации.
+10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным,
+остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать
+исполнять свои обязанности в соответствии с этими положениями.
diff --git a/platform/runtime/core/objects-implementations/repository-implementation/pom.xml b/platform/runtime/core/objects-implementations/repository-implementation/pom.xml
new file mode 100644
index 00000000..01f64945
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/repository-implementation/pom.xml
@@ -0,0 +1,16 @@
+
+  4.0.0
+  
+    ru.entaxy.esb.platform.runtime.core
+    objects-implementations
+    1.11.0
+  
+  ru.entaxy.esb.platform.runtime.core.objects-implementations
+  repository-implementation
+  pom
+  ENTAXY :: PLATFORM :: CORE :: OBJECTS IMPLEMENTATION :: REPOSITORY
+  ENTAXY :: PLATFORM :: CORE :: OBJECTS IMPLEMENTATION :: REPOSITORY
+  
+  	repository-producing
+  
+
diff --git a/platform/runtime/core/objects-implementations/repository-implementation/repository-producing/LICENSE.txt b/platform/runtime/core/objects-implementations/repository-implementation/repository-producing/LICENSE.txt
new file mode 100644
index 00000000..4ae94b75
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/repository-implementation/repository-producing/LICENSE.txt
@@ -0,0 +1,175 @@
+                                 ЛИЦЕНЗИЯ ОГРАНИЧЕННОГО ПРИМЕНЕНИЯ
+
+Настоящий документ устанавливает для Пользователя условия применения Базовой (некоммерческой)
+версии лицензии для пробного использования программного обеспечения ENTAXY, принадлежащего
+Правообладателю – Обществу с ограниченной ответственностью "ЕМДЕВ" (ОГРН 1057810026658, ИНН
+7813313860, юридический адрес: 197022, Россия, г. Санкт-Петербург, ул. Профессора Попова,
+д. 23, литера В, помещение 3Н), расположенной в сети Интернет по адресу
+https://www.emdev.ru/about (далее - Компания).
+
+Используя или получая доступ к Программному обеспечению, или нажав «Я согласен с Условиями»
+(или аналогичную кнопку или флажок) после загрузки или установки Программного обеспечения,
+Пользователь выражает свое согласие на обязательность условий и ограничений, изложенных в
+настоящем документе, в противном случае, он должен не использовать или не получать доступ
+к Программному обеспечению.
+
+                                    1. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ
+
+a) ПО – Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) в любой ее версии
+или редакции, исключительные права на которую принадлежат Правообладателю.
+b) Правообладатель (Компания) – ООО «ЕМДЕВ», ОГРН 1057810026658, ИНН 7813313860, исключительные
+права которого подтверждаются Свидетельством о государственной регистрации в Реестре программ
+для ЭВМ № 2021610848 от 19.01.2021 года.
+c) Пользователь – юридическое или физическое лицо, получившее через скачивание с сайта
+https://entaxy.ru или иным образом, дистрибутив ПО, пользующееся ПО.
+d) ИС – интеллектуальная собственность – закреплённое законом исключительное право, а также
+личные неимущественные права авторов произведений на результат интеллектуальной деятельности.
+e) Подписка – это коммерческое предложение Правообладателя, состоящее из Лицензии на использование
+ПО и доступа к технической поддержке программного обеспечения на срок Подписки. Подписка
+включает предоставление Пользователю неисключительного права использования ПО, в том числе
+получение обновлений функционала ПО и безопасности ПО, исправление ошибок ПО и получение
+патчей с обновлениями и исправлениями программного обеспечения. Подписка приобретается
+Пользователем на период времени, указанный в Сертификате. Количество подписок устанавливается
+для каждого Пользователя индивидуально в Сертификате.
+f) Сертификат – документ, выдаваемый Дистрибъютором или Авторизованным партнёром (Партнёром),
+подтверждающий факт приобретения физическим или юридическим лицом Подписки на программное
+обеспечение в ограниченном объёме и на определённый период времени.
+g) Лицензия (простая (неисключительная) – совокупность ограниченных прав использования ПО,
+предоставленных Пользователю согласно условиям Подписки.
+h) Библиотека – совокупность подпрограмм и объектов, используемых для разработки программного
+обеспечения.
+i) Исходный код – текст компьютерной программы на каком-либо языке программирования, состоящий
+из одного или нескольких файлов, который может быть прочтён человеком.
+j) Объектный код – файл (часть машинного кода) с промежуточным представлением отдельного модуля
+программы, полученный в результате обработки исходного кода, еще не связанный в полную программу.
+Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовый
+продукт.
+k) Некоммерческое использование – индивидуальное личное использование Пользователем программного
+обеспечения с целью обучения работе с Программным обеспечением, для оценки или демонстрации
+возможностей Программного обеспечения, при котором, Пользователем не извлекается коммерческая
+выгода и/или не идёт в доход денежное вознаграждение при использовании Программного обеспечения.
+
+                    2. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
+
+2.1. Правообладатель предоставляет Пользователю ограниченное право использования Программного
+обеспечения на условиях простой (неисключительной) лицензии в объёме, ограниченном правом
+воспроизведения полной рабочей версии программного обеспечения, новых версий программного обеспечения
+в памяти оборудования и его запуска на оборудовании в соответствии со ст. 1280 ГК РФ.
+2.2. Право на использование Программного обеспечения, предоставляемое Пользователю, носит
+неисключительный характер.
+2.3. Пользователю предоставляется всемирная, неисключительная, не подлежащая сублицензированию,
+лицензия на ограниченное использование Программного обеспечения.
+2.4. Пользователь, имеющий Базовую (некоммерческую) версию лицензии для пробного использования
+имеет право приобрести Подписку на программное обеспечение. В этом случае Пользователь обязан
+обратиться в службу поддержки Правообладателя по адресу:  https://entaxy.ru/ для изменения
+вида лицензии с Базовой бесплатной версии на Подписки.
+2.5. Срок использования скачанной Пользователем базовой (некоммерческой) версии лицензии для
+пробного использования программного обеспечения – не ограничен.
+2.6. Использование Пользователем настоящего программного обеспечения в целях разработки,
+модификации, обновления другого ПО, принадлежащего третьим лицам, а не Правообладателю,
+без разрешения Правообладателя не допускается.
+
+                                3. АВТОРСКОЕ ПРАВО.
+
+3.1. Все авторские права, все права интеллектуальной собственности на Программное обеспечение
+и любые его копии принадлежат Правообладателю.
+3.2. Все авторские права, все права интеллектуальной собственности в отношении любого контента,
+к которому можно получить доступ с помощью Программного обеспечения, является собственностью
+соответствующего владельца контента и защищается применимым законодательством об авторском
+праве или другими законами и договорами об интеллектуальной собственности.
+3.3. Условия использования Программного обеспечения.
+Лицензия, предоставленная Пользователю, действительна только в том случае, если Пользователь
+придерживается следующих условий:
+3.3.1. Принятие уведомлений об авторских правах. Пользователю запрещается удалять или изменять
+какие-либо уведомления об авторских правах или лицензиях, которые появляются при использовании
+Программного обеспечения или на нем.
+3.3.2. Модификация. Пользователю запрещается модифицировать, изменять, декомпилировать,
+расшифровывать, дизассемблировать, переводить или реверсировать, перепроектировать
+Программное обеспечение.
+3.3.3. Распространение. Пользователю запрещается сублицензировать, передавать право использования
+ПО или иным образом распространять или предоставлять Программное обеспечение любой третьей стороне.
+3.3.4. SaaS. За исключением случаев, когда это разрешено Правообладателем, Пользователю запрещено
+использовать Программное обеспечение в коммерческих целях для оказания услуг третьим лицам.
+
+                    4. ОТВЕТСТВЕННОСТЬ ПРАВООБЛАДАТЕЛЯ ПРИ НАРУШЕНИИ ПОЛЬЗОВАТЕЛЕМ ПРАВ «ИС»
+
+4.1. Правообладатель не несет никаких обязательств в отношении каких-либо претензий к Пользователю
+на предмет нарушения последним прав Интеллектуальной собственности, возникших в связи с
+использованием Пользователем:
+4.1.1. Любых компонентов программного обеспечения с открытым исходным кодом, включенных в
+Программное обеспечение;
+4.1.2. Любого нарушения правил использования Программного обеспечения, установленного условиями
+настоящего соглашения;
+4.1.3. Любого использования Программного обеспечения в сочетании с другими ПО, оборудованием,
+или данными, не предоставленными Пользователю Правообладателем;
+4.1.4. Любого изменения Программного обеспечения любым третьим лицом, а не Правообладателем.
+
+
+5. НАСТОЯЩИМ ПРАВООБЛАДАТЕЛЬ ЗАЯВЛЯЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЮ
+ПО ПРИНЦИПУ «AS IS» - «КАК ЕСТЬ». НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ НЕ ГАРАНТИРУЕТ
+И НЕ ОБЕЩАЕТ, ЧТО ПРЕДОСТАВЛЕННОЕ ИМ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ПОДХОДИТЬ ИЛИ НЕ ПОДХОДИТЬ
+ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ ОТВЕЧАТЬ ВСЕМ КОММЕРЧЕСКИМ
+И ЛИЧНЫМ СУБЪЕКТИВНЫМ ОЖИДАНИЯМ ПОЛЬЗОВАТЕЛЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ
+ИСПРАВНО, БЕЗ ТЕХНИЧЕСКИХ ОШИБОК, БЫСТРО И БЕСПЕРЕБОЙНО.
+
+                        6. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ.
+НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ПРАВООБЛАДАТЕЛЬ ИЛИ ЕГО АФФИЛЛИРОВАННЫЕ ЛИЦА НЕ НЕСУТ ПЕРЕД ПОЛЬЗОВАТЕЛЕМ
+ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ПОЛЬЗОВАТЕЛЯ, ЕГО РАСХОДЫ ИЛИ РЕАЛЬНЫЙ УЩЕРБ,
+ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРОСТОИ; УТРАТУ БИЗНЕСА; УПУЩЕННУЮ ВЫГОДУ; НЕДОПОЛУЧЕННУЮ ПРИБЫЛЬ;
+ПОТЕРЮ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, ИМУЩЕСТВА И ИНОЕ.
+ОГРАНИЧЕНИЯ ПРИМЕНЯЮТСЯ НЕЗАВИСИМО ОТ ОСНОВАНИЯ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ; В ТОМ ЧИСЛЕ ВСЛЕДСТВИЕ
+ДЕЙСТВИЯ ИЛИ БЕЗДЕЙСТВИЯ, НЕБРЕЖНОСТИ, УМЫСЛА, ПРЯМОГО ИЛИ КОСВЕННОГО; НЕОСТОРОЖНОСТИ; ЗАБЛУЖДЕНИЯ;
+КЛЕВЕТЫ; НАРУШЕНИЯ КОНФИДЕНЦИАЛЬНОСТИ ИЛИ ПРАВА ИНТЕЛЛЕКТУАЛЬНОЙ СОБСТВЕННОСТИ; ИЛИ ЛЮБОЕ ДРУГОЕ
+ОСНОВАНИЕ НАСТУПЛЕНИЯ ОТВЕТСТВЕННОСТИ.
+
+                        7. ОБЯЗАННОСТЬ ПОЛЬЗОВАТЕЛЯ:
+Не осуществлять самостоятельно и (или) с привлечением третьих лиц нижеследующие действия
+(включая, но не ограничиваясь) по:
+-дизассемблированию и (или) декомпилированию (преобразованию объектного кода в исходный код)
+ Программного обеспечения;
+-модификации Программного обеспечения, в том числе вносить изменения в объектный код, исходный
+код Программного обеспечения, за исключением тех изменений, которые вносятся средствами,
+включёнными в Программное обеспечение и описанными непосредственно в документации к нему;
+-созданию условий для использования Программного обеспечения лицами, не имеющими прав на
+использование данного Программного обеспечения, включая (но не ограничиваясь) вмешательство
+третьих лиц в функционирование Программного обеспечения, предоставление третьим лицам доступа
+к исследованию и (или) замене настроек Программного обеспечения, включая его первичную установку;
+-распространению Программного обеспечения в целом или в части (включая приложенную к нему документацию).
+
+                    8. БИБЛИОТЕКА ПО. ИСПОЛЬЗУЕМЫЕ ПРОГРАММНЫЕ СРЕДСТВА.
+
+8.1. Настоящим, Правообладатель заверяет, что Библиотека программного обеспечения состоит из
+лицензионных продуктов, используемых на законных основаниях, а
+именно https://entaxy.ru/libs/licenses/root-aggregated.deps.
+8.2. Любые программные средства, применяемые Пользователем при работе с ПО, должны быть
+совместимы с библиотекой ПО, указанной в п.8.1. настоящего соглашения.
+8.3. Перечень внешних модулей ПО, указанный в п.8.1 настоящего соглашения, может изменяться
+Правообладателем в одностороннем порядке, в зависимости от выпуска релизов программного обеспечения,
+содержащих все изменения и дополнения программного обеспечения.
+
+                        9. ВНЕСЕНИЕ ИЗМЕНЕНИЙ В ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ.
+
+9.1.  Программное обеспечение, интеграционная шина «ЭНТАКСИ» (ENTAXY) является свободно распространяемым
+программным обеспечением.
+9.2. Пользователь имеет право вносить изменения в исходный код программного обеспечения исключительно
+с согласия Правообладателя в порядке предложения изменений/правок/дополнений через механизм
+«Pull Requests» в открытом репозитории Правообладателя по адресу: https://git.entaxy.ru/entaxy/entaxy-public.
+9.3. Любые изменения программного обеспечения, осуществляемые Пользователем без соблюдения условий
+пункта 9.2. настоящего документа, являются нарушением авторских и смежных прав Правообладателя,
+прав интеллектуальной собственности Правообладателя и влекут применение к Пользователю мер
+ответственности в соответствии с условиями настоящей Лицензии, а также применимого законодательства
+Российской Федерации.
+
+                                10. ЗАКЛЮЧИТЕЛЬНЫЕ ПОЛОЖЕНИЯ.
+
+10.1. В случае нарушения Пользователем любого из условий настоящей Лицензии, Правообладатель имеет
+право взыскать с Пользователя любые причинённые таким нарушением убытки, реальный ущерб,
+недополученную прибыль, упущенную выгоду, а также в случае нарушения Пользователем условий
+пункта 9.2 настоящего соглашения, в том числе, взыскать с Пользователя штраф в размере
+2 000 000 (Два миллиона) рублей за каждый установленный случай несанкционированного изменения
+исходного или объектного кода Программного обеспечения «Энтакси» (Entaxy).
+10.2. В рамках исполнения Пользователем обязательств по настоящей Лицензии, применимое
+законодательство – Российской Федерации.
+10.3. Если какое-либо положение настоящей Лицензии будет признано судом недействительным,
+остальные положения будут продолжать своё действие, а Пользователь будет обязан продолжать
+исполнять свои обязанности в соответствии с этими положениями.
diff --git a/platform/runtime/core/objects-implementations/repository-implementation/repository-producing/pom.xml b/platform/runtime/core/objects-implementations/repository-implementation/repository-producing/pom.xml
new file mode 100644
index 00000000..7a1575b6
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/repository-implementation/repository-producing/pom.xml
@@ -0,0 +1,30 @@
+
+
+  4.0.0
+  
+    ru.entaxy.esb.platform.runtime.core.objects-implementations
+    repository-implementation
+    1.11.0
+  
+  repository-producing
+    ru.entaxy.esb.platform.runtime.core.objects-implementations.repository-implementation
+  bundle
+  ENTAXY :: PLATFORM :: CORE :: OBJECTS IMPLEMENTATION :: REPOSITORY :: PRODUCING
+  ENTAXY :: PLATFORM :: CORE :: OBJECTS IMPLEMENTATION :: REPOSITORY :: PRODUCING
+  
+    
+      
+        org.apache.felix
+        maven-bundle-plugin
+        true
+        
+          
+            true
+            true
+			true
+          
+        
+      
+    
+  
+
diff --git a/platform/runtime/core/objects-implementations/repository-implementation/repository-producing/src/main/resources/ru/entaxy/extensions/objectproducer/producer/config.json b/platform/runtime/core/objects-implementations/repository-implementation/repository-producing/src/main/resources/ru/entaxy/extensions/objectproducer/producer/config.json
new file mode 100644
index 00000000..1e9c3c05
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/repository-implementation/repository-producing/src/main/resources/ru/entaxy/extensions/objectproducer/producer/config.json
@@ -0,0 +1,3 @@
+{
+	"supportedTypes": ["entaxy.runtime.repository"]
+}
\ No newline at end of file
diff --git a/platform/runtime/core/objects-implementations/repository-implementation/repository-producing/src/main/resources/ru/entaxy/factory/artifact-repository.json b/platform/runtime/core/objects-implementations/repository-implementation/repository-producing/src/main/resources/ru/entaxy/factory/artifact-repository.json
new file mode 100644
index 00000000..135d235c
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/repository-implementation/repository-producing/src/main/resources/ru/entaxy/factory/artifact-repository.json
@@ -0,0 +1,135 @@
+{
+	"factory": {
+		"id": "artifact-repository",
+		"type": "entaxy.runtime.repository",
+		"description": "Factory artifact-repository of entaxy.runtime.repository. For more details see Entaxy docs",
+		"isAbstract": false
+	},
+	"entaxy.runtime.repository": {
+	},
+	"fields": {
+		"repo_name": {
+			"displayName": "Name",
+			"type": "String",
+			"required": true,
+			"isHidden": true,
+			"defaultValue": {
+				"@CALCULATED": {
+					"expression": "${objectId}",
+					"lazy": false
+				}
+			}
+		},
+		"repo_location": {
+			"displayName": "Location",
+			"description": "Path to repository directory. If empty repository created at {Entaxy Home}/data/cave/repository/{Object Id}. For more details see Entaxy docs",
+			"type": "String"
+		},
+		"repo_proxy": {
+			"displayName": "Proxy",
+			"description": "Enable to use remote repositories. For more details see Entaxy docs",
+			"type": "Boolean",
+			"group": "remotes",
+			"required": true,
+			"defaultValue": false
+		},
+		"repo_mirror": {
+			"displayName": "Mirror",
+			"description": "Enable storing a copy of the artifact in the local repository when using a proxy. Required when downloading artifacts from remote repositories. Not required for uploading artifacts to a remote repository. For more details see Entaxy docs",
+			"type": "Boolean",
+			"group": "remotes"
+		},
+		"repo_remotes": {
+			"displayName": "Remotes",
+			"description": "Remote repository address. For more details see Entaxy docs",
+			"type": "String",
+			"group": "remotes"
+		},
+		"repo_readOnly": {
+			"displayName": "Read Only",
+			"description": "Activates read-only mode. For more details see Entaxy docs",
+			"type": "Boolean",
+			"required": true,
+			"defaultValue": false
+		},
+		"repo_copyOnChange": {
+			"displayName": "Copy On Change",
+			"isHidden": true,
+			"type": "Boolean"
+		},
+		"repo_username": {
+			"description": "Specifies the username used to authenticate when accessing to remote repository. For more details see Entaxy docs",
+			"displayName": "Username",
+			"type": "String",
+			"group": "remotes"
+		},
+		"repo_password": {
+			"description": "Specifies the password associated with username for authentication when accessing to remote repository. For more details see Entaxy docs",
+			"displayName": "Password",
+			"type": "password",
+			"group": "remotes"
+		},
+		"repo_snapshots": {
+			"description": "Determines whether this repository should be used for downloading snapshot artifacts. For more details see Entaxy docs",
+			"displayName": "Snapshots",
+			"type": "Boolean"
+		},
+		"repo_enabled": {
+			"displayName": "Enabled",
+			"type": "Boolean",
+			"required": true,
+			"isHidden": true,
+			"defaultValue": true
+		},
+		"repo_remoteHostSuffix": {
+			"description": "Specifies the suffix appended to the base URL of the remote repository, forming the full access URL (e.g., if the base URL is https://nexus.entaxy.ru, and the the suffix is /nexus/, the full URL will become https://nexus.entaxy.ru/nexus/). For more details see Entaxy docs",
+			"displayName": "Remote Host Suffix",
+			"type": "String",
+			"group": "remotes"
+		},
+		"repo_system": {
+			"displayName": "System",
+			"type": "Boolean",
+			"required": true,
+			"isHidden": true,
+			"defaultValue": false
+			
+		},
+		"repo_lookupEnabled": {
+			"displayName": "Lookup Enabled",
+			"description": "Add the repository to the list of repositories to search for artifacts (org.ops4j.pax.url.mvn.repositories). For more details see Entaxy docs",
+			"type": "Boolean",
+			"required": true,
+			"defaultValue": true
+		}
+	},
+	"outputs": {
+		"init": {
+			"isDefault": true,
+			"fields": {
+				"repo_name": {},
+				"repo_location": {},
+				"repo_proxy": {},
+				"repo_mirror": {},
+				"repo_remotes": {},
+				"repo_readOnly": {},
+				"repo_copyOnChange": {},
+				"repo_username": {},
+				"repo_password": {},
+				"repo_snapshots": {},
+				"repo_enabled": {},
+				"repo_remoteHostSuffix": {},
+				"repo_system": {},
+				"repo_lookupEnabled": {}
+			},
+			"config": {
+				"configurable": true,
+				"fieldsConfigurableByDefault": true,
+				"configurableFields": {
+					"includePatterns": ["repo_*"],
+					"excludeNames": ["##publish"]
+				}
+			}
+		}
+	}
+}
diff --git a/platform/runtime/core/objects-implementations/repository-implementation/repository-producing/src/main/resources/ru/entaxy/templates/artifact-repository/init.ftl b/platform/runtime/core/objects-implementations/repository-implementation/repository-producing/src/main/resources/ru/entaxy/templates/artifact-repository/init.ftl
new file mode 100644
index 00000000..61f7f3ca
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/repository-implementation/repository-producing/src/main/resources/ru/entaxy/templates/artifact-repository/init.ftl
@@ -0,0 +1,24 @@
+[#ftl attributes={"generated.type":"blueprint"}]
+
+
+[#import "templates:object-commons/common-utils.ftl" as utils]    
+
+	
+		[=utils.createBeanProperties(properties, "repo_", true, ["##publish"])]
+	
+	
+	
+		
+			
+		
+				                      
+		                      	                      	                      
+
diff --git a/platform/runtime/core/objects-implementations/route-implementation/pom.xml b/platform/runtime/core/objects-implementations/route-implementation/pom.xml
index 849f0392..b89c3bda 100644
--- a/platform/runtime/core/objects-implementations/route-implementation/pom.xml
+++ b/platform/runtime/core/objects-implementations/route-implementation/pom.xml
@@ -4,7 +4,7 @@
     
         ru.entaxy.esb.platform.runtime.core
         objects-implementations
-        1.10.0
+        1.11.0
     
     ru.entaxy.esb.platform.runtime.core.objects-implementations
     route-implementation
diff --git a/platform/runtime/core/objects-implementations/route-implementation/route-producing/pom.xml b/platform/runtime/core/objects-implementations/route-implementation/route-producing/pom.xml
index 9d25ff39..2de182cc 100644
--- a/platform/runtime/core/objects-implementations/route-implementation/route-producing/pom.xml
+++ b/platform/runtime/core/objects-implementations/route-implementation/route-producing/pom.xml
@@ -4,7 +4,7 @@
     
         ru.entaxy.esb.platform.runtime.core.objects-implementations
         route-implementation
-        1.10.0
+        1.11.0
     
     ru.entaxy.esb.platform.runtime.core.objects-implementations.route-implementation
     route-producing
@@ -45,6 +45,24 @@
 	
     
     
+        
+            
+            
+                src/main/resources
+                true
+            
+            
+            
+                src/main/resources
+                
+                    **/*context.xml
+                    **/*blueprint.xml
+                    **/*.ftl
+                    **/*.xslt
+                
+                false
+            
+          
         
             
                 org.apache.felix
diff --git a/platform/runtime/core/objects-implementations/route-implementation/route-producing/redeliveryPolicy-originalFromCamel.json b/platform/runtime/core/objects-implementations/route-implementation/route-producing/redeliveryPolicy-originalFromCamel.json
new file mode 100644
index 00000000..38aa239d
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/route-implementation/route-producing/redeliveryPolicy-originalFromCamel.json
@@ -0,0 +1,41 @@
+{
+  "component": {
+    "kind": "model",
+    "name": "redeliveryPolicy",
+    "title": "Redelivery Policy",
+    "description": "To configure re-delivery for error handling",
+    "deprecated": false,
+    "label": "configuration",
+    "javaType": "org.apache.camel.model.RedeliveryPolicyDefinition",
+    "artifactId": "camel-core-engine",
+    "input": false,
+    "output": false
+  },
+  "componentProperties": {},
+  "properties": {
+    "maximumRedeliveries": { "kind": "attribute", "displayName": "Maximum Redeliveries", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "secret": false, "description": "Sets the maximum redeliveries x = redeliver at most x times 0 = no redeliveries -1 = redeliver forever" },
+    "redeliveryDelay": { "kind": "attribute", "displayName": "Redelivery Delay", "required": false, "type": "duration", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "Sets the initial redelivery delay" },
+    "asyncDelayedRedelivery": { "kind": "attribute", "displayName": "Async Delayed Redelivery", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Allow synchronous delayed redelivery. The route, in particular the consumer's component, must support the Asynchronous Routing Engine (e.g. seda)." },
+    "backOffMultiplier": { "kind": "attribute", "displayName": "Back Off Multiplier", "required": false, "type": "number", "javaType": "java.lang.Double", "deprecated": false, "secret": false, "description": "Sets the back off multiplier" },
+    "useExponentialBackOff": { "kind": "attribute", "displayName": "Use Exponential Back Off", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Turn on exponential backk off" },
+    "collisionAvoidanceFactor": { "kind": "attribute", "displayName": "Collision Avoidance Factor", "required": false, "type": "number", "javaType": "java.lang.Double", "deprecated": false, "secret": false, "description": "Sets the collision avoidance factor" },
+    "useCollisionAvoidance": { "kind": "attribute", "displayName": "Use Collision Avoidance", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Turn on collision avoidance." },
+    "maximumRedeliveryDelay": { "kind": "attribute", "displayName": "Maximum Redelivery Delay", "required": false, "type": "duration", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "Sets the maximum delay between redelivery" },
+    "retriesExhaustedLogLevel": { "kind": "attribute", "displayName": "Retries Exhausted Log Level", "required": false, "type": "object", "javaType": "org.apache.camel.LoggingLevel", "deprecated": false, "secret": false, "description": "Sets the logging level to use when retries has exhausted" },
+    "retryAttemptedLogLevel": { "kind": "attribute", "displayName": "Retry Attempted Log Level", "required": false, "type": "object", "javaType": "org.apache.camel.LoggingLevel", "deprecated": false, "secret": false, "description": "Sets the logging level to use for logging retry attempts" },
+    "retryAttemptedLogInterval": { "kind": "attribute", "displayName": "Retry Attempted Log Interval", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "secret": false, "description": "Sets the interval to use for logging retry attempts" },
+    "logRetryAttempted": { "kind": "attribute", "displayName": "Log Retry Attempted", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Sets whether retry attempts should be logged or not. Can be used to include or reduce verbose." },
+    "logStackTrace": { "kind": "attribute", "displayName": "Log Stack Trace", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Sets whether stack traces should be logged. Can be used to include or reduce verbose." },
+    "logRetryStackTrace": { "kind": "attribute", "displayName": "Log Retry Stack Trace", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Sets whether stack traces should be logged when an retry attempt failed. Can be used to include or reduce verbose." },
+    "logHandled": { "kind": "attribute", "displayName": "Log Handled", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Sets whether handled exceptions should be logged or not. Can be used to include or reduce verbose." },
+    "logNewException": { "kind": "attribute", "displayName": "Log New Exception", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Sets whether new exceptions should be logged or not. Can be used to include or reduce verbose. A new exception is an exception that was thrown while handling a previous exception." },
+    "logContinued": { "kind": "attribute", "displayName": "Log Continued", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Sets whether continued exceptions should be logged or not. Can be used to include or reduce verbose." },
+    "logExhausted": { "kind": "attribute", "displayName": "Log Exhausted", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Sets whether exhausted exceptions should be logged or not. Can be used to include or reduce verbose." },
+    "logExhaustedMessageHistory": { "kind": "attribute", "displayName": "Log Exhausted Message History", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Sets whether exhausted exceptions should be logged including message history or not (supports property placeholders). Can be used to include or reduce verbose." },
+    "logExhaustedMessageBody": { "kind": "attribute", "displayName": "Log Exhausted Message Body", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Sets whether exhausted message body should be logged including message history or not (supports property placeholders). Can be used to include or reduce verbose. Requires logExhaustedMessageHistory to be enabled." },
+    "disableRedelivery": { "kind": "attribute", "displayName": "Disable Redelivery", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Disables redelivery (same as setting maximum redeliveries to 0)" },
+    "delayPattern": { "kind": "attribute", "displayName": "Delay Pattern", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "Sets the delay pattern with delay intervals." },
+    "allowRedeliveryWhileStopping": { "kind": "attribute", "displayName": "Allow Redelivery While Stopping", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Controls whether to allow redelivery while stopping\/shutting down a route that uses error handling." },
+    "exchangeFormatterRef": { "kind": "attribute", "displayName": "Exchange Formatter Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "Sets the reference of the instance of org.apache.camel.spi.ExchangeFormatter to generate the log message from exchange." }
+  }
+}
diff --git a/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/ComponentLibrary.java b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/ComponentLibrary.java
new file mode 100644
index 00000000..838e6ee8
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/ComponentLibrary.java
@@ -0,0 +1,95 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * route-producing
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.routes.design.library;
+
+import java.util.List;
+
+import org.osgi.framework.Filter;
+
+public interface ComponentLibrary {
+
+    String COMPONENT_LIBRARY_PROVIDER_HEADER = "Entaxy-Component-Library-Provider";
+    String COMPONENT_LIBRARY_RESOURCE_PROTOCOL = "component-library";
+
+    String getName();
+
+    String getUrl();
+
+    List getSchemas();
+
+    default Filter getObjectFilter() {
+        return null;
+    };
+
+    public interface Schema {
+
+        String getRoot();
+
+        default String getRootUrl() {
+            return getRoot();
+        }
+
+        String getNamespace();
+
+        String getPrefix();
+
+        boolean isPublic();
+
+        default ComponentLibrary getLibrary() {
+            return null;
+        };
+
+        default Filter getObjectFilter() {
+            return null;
+        };
+
+        List getTransformations();
+
+        String getUiDescriptor();
+
+    }
+
+    public interface Transformation {
+
+        String getProcessor();
+
+        String getSource();
+
+        default String getSourceUrl() {
+            return getSource();
+        }
+
+        default Filter getObjectFilter() {
+            return null;
+        };
+
+        default ComponentLibrary.Schema getSchema() {
+            return null;
+        }
+
+    }
+
+}
diff --git a/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/ComponentLibraryManager.java b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/ComponentLibraryManager.java
new file mode 100644
index 00000000..9f24c5dd
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/ComponentLibraryManager.java
@@ -0,0 +1,49 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * route-producing
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.routes.design.library;
+
+import java.util.List;
+import java.util.Map;
+
+public interface ComponentLibraryManager {
+
+    List getLibraries();
+
+    List getLibrariesForContext(Map context);
+
+    List getSchemasForNamespace(String namespace);
+
+    List getSchemasForPrefix(String prefix);
+
+    List getSchemasForContext(Map context);
+
+    List getAllSchemas();
+
+    List getAllSchemasWithUiDescriptor();
+
+    List getTransformationsForContext(Map context);
+
+}
diff --git a/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/ComponentLibraryResourceProcessor.java b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/ComponentLibraryResourceProcessor.java
new file mode 100644
index 00000000..fa3bab28
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/ComponentLibraryResourceProcessor.java
@@ -0,0 +1,108 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * route-producing
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.routes.design.library;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+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;
+
+import ru.entaxy.platform.core.producer.resources.EntaxyResourceProducingProcessor;
+import ru.entaxy.platform.core.producer.resources.EntaxyResourceProducingProcessorService;
+
+@Component(service = EntaxyResourceProducingProcessor.class, immediate = true)
+public class ComponentLibraryResourceProcessor implements EntaxyResourceProducingProcessor {
+
+    private static final Logger LOG = LoggerFactory.getLogger(ComponentLibraryResourceProcessor.class);
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    EntaxyResourceProducingProcessorService producingProcessorService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    ComponentLibraryManager componentLibraryManager;
+
+    @Override
+    public String getName() {
+        return "component-library";
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public Object process(Object value, Map properties) throws Exception {
+
+        LOG.debug("\n\t ComponentLibraryResourceProcessor:");
+        LOG.debug("\n\t" + properties.toString());
+
+        Map parameters;
+        if (properties.containsKey("resourceContext") && (properties.get("resourceContext") instanceof Map))
+            parameters = new HashMap<>((Map) properties.get("resourceContext"));
+        else
+            parameters = new HashMap<>(properties);
+
+        if (properties.containsKey("parameters") && (properties.get("parameters") instanceof Map))
+            parameters.putAll((Map) properties.get("parameters"));
+
+        // List libraries =
+        // componentLibraryManager.getLibrariesForContext(parameters);
+        // List schemas =
+        // componentLibraryManager.getSchemasForContext(parameters);
+        List transformations =
+                componentLibraryManager.getTransformationsForContext(parameters);
+
+        LOG.info("\n\t TO APPLY:"
+                + "\n\tTRANSFORMATIONS:\n\t"
+                + transformations.stream().map(t -> "[" + t.getProcessor() + "] " + t.getSource())
+                        .collect(Collectors.joining("\n\t")));
+
+
+        Object result = value;
+
+        for (ComponentLibrary.Transformation transformation : transformations) {
+
+            Map processorProperties = new HashMap<>();
+            processorProperties.put(PROP_PROCESSOR, transformation.getProcessor());
+            processorProperties.put("source", transformation.getSourceUrl());
+            processorProperties.put("parameters", parameters);
+
+            LOG.info("\n EXEC TRANSFORM: [{}]/[{}]/[{}]/[{}]\nWITH PROPERTIES:\n{}", transformation.getSourceUrl(),
+                    transformation.getProcessor(), transformation.getSchema().getRoot(),
+                    transformation.getSchema().getLibrary().getName(),
+                    processorProperties);
+
+            result = producingProcessorService.process(result, processorProperties);
+
+        }
+
+        return result;
+    }
+
+}
diff --git a/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/impl/ComponentLibraryManagerImpl.java b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/impl/ComponentLibraryManagerImpl.java
new file mode 100644
index 00000000..334042de
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/impl/ComponentLibraryManagerImpl.java
@@ -0,0 +1,326 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * route-producing
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.routes.design.library.impl;
+
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.osgi.framework.Filter;
+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.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import ru.entaxy.esb.resources.EntaxyResourceURLFactory;
+import ru.entaxy.platform.base.support.CommonUtils;
+import ru.entaxy.platform.routes.design.library.ComponentLibrary;
+import ru.entaxy.platform.routes.design.library.ComponentLibrary.Schema;
+import ru.entaxy.platform.routes.design.library.ComponentLibrary.Transformation;
+import ru.entaxy.platform.routes.design.library.ComponentLibraryManager;
+import ru.entaxy.platform.routes.design.library.storage.ComponentLibraryStorage;
+
+@Component(service = ComponentLibraryManager.class, immediate = true)
+public class ComponentLibraryManagerImpl implements ComponentLibraryManager, ComponentLibraryStorage.StorageListener {
+
+    private static final Logger LOG = LoggerFactory.getLogger(ComponentLibraryManagerImpl.class);
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    ComponentLibraryStorage libraryStorage;
+
+    protected List libraries = new ArrayList<>();
+    protected List schemas = new ArrayList<>();
+    protected List transformations = new ArrayList<>();
+
+    protected Object librariesLock = new Object();
+
+    @Activate
+    public void activate(ComponentContext componentContext) {
+        initialize();
+        this.libraryStorage.registerListener(this);
+    }
+
+    @Deactivate
+    public void deactivate(ComponentContext componentContext) {
+        this.libraryStorage.unregisterListener(this);
+    }
+
+    protected void initialize() {
+        synchronized (librariesLock) {
+            this.libraries = wrap(libraryStorage.getLibraries());
+            for (ComponentLibrary lib : libraries)
+                for (ComponentLibrary.Schema schema : lib.getSchemas()) {
+                    schemas.add(schema);
+                    for (ComponentLibrary.Transformation transformation : schema.getTransformations()) {
+                        transformations.add(transformation);
+                    }
+                }
+        }
+    }
+
+    protected void reload() {
+        synchronized (librariesLock) {
+            libraries.clear();
+            schemas.clear();
+            transformations.clear();
+        }
+        initialize();
+    }
+
+    @Override
+    public List getLibraries() {
+        return this.libraries;
+    }
+
+    @Override
+    public List getLibrariesForContext(Map context) {
+        return this.libraries.stream().filter(l -> l.getObjectFilter() == null || l.getObjectFilter().matches(context))
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public List getSchemasForNamespace(String namespace) {
+        return this.schemas.stream().filter(s -> s.getNamespace().equals(namespace))
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public List getSchemasForPrefix(String prefix) {
+        return this.schemas.stream().filter(s -> s.getPrefix().equals(prefix))
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public List getSchemasForContext(Map context) {
+        return this.schemas.stream().filter(s -> s.getObjectFilter() == null || s.getObjectFilter().matches(context))
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public List getAllSchemas() {
+        return this.schemas;
+    }
+
+    @Override
+    public List getAllSchemasWithUiDescriptor() {
+        return this.schemas.stream().filter(s -> CommonUtils.isValid(s.getUiDescriptor())).collect(Collectors.toList());
+    }
+
+    @Override
+    public List getTransformationsForContext(Map context) {
+        return this.transformations.stream()
+                .filter(t -> t.getObjectFilter() == null || t.getObjectFilter().matches(context))
+                .collect(Collectors.toList());
+    }
+
+    /* ComponentLibraryStorage.StorageListener  */
+    @Override
+    public void storageUpdated() {
+        reload();
+    }
+
+    protected URL resolve(ComponentLibrary library, String relative) {
+        try {
+            URL libraryUrl = new URL(library.getUrl() + "/");
+            URI uri = libraryUrl.toURI().resolve(relative);
+            return uri.toURL();
+        } catch (URISyntaxException | MalformedURLException e) {
+            LOG.error(String.format("Error resolving url [%s] for library [%s]", relative, library.getName()), e);
+            return null;
+        }
+    }
+
+    /* wrappers */
+
+    protected List wrap(List originList) {
+        return originList.stream().map(l -> new LibraryWrapper(l)).collect(Collectors.toList());
+    }
+
+    protected class LibraryWrapper implements ComponentLibrary {
+
+        ComponentLibrary origin;
+
+        List wrappedSchemas = null;
+
+        public LibraryWrapper(ComponentLibrary origin) {
+            this.origin = origin;
+        }
+
+        @Override
+        public String getName() {
+            return origin.getName();
+        }
+
+        @Override
+        public String getUrl() {
+            try {
+                return EntaxyResourceURLFactory.getGlobalUrl(origin.getUrl()).toString();
+            } catch (MalformedURLException e) {
+                LOG.error("Error getting global URL for [{}]", origin.getUrl());
+                return origin.getUrl();
+            }
+        }
+
+        @Override
+        public List getSchemas() {
+            if (wrappedSchemas == null) {
+                wrappedSchemas = new ArrayList<>();
+
+                for (ComponentLibrary.Schema schema : origin.getSchemas())
+                    wrappedSchemas.add(new SchemaWrapper(schema, this));
+
+            }
+            return wrappedSchemas;
+        }
+
+        @Override
+        public Filter getObjectFilter() {
+            return origin.getObjectFilter();
+        }
+
+    }
+
+    protected class SchemaWrapper implements ComponentLibrary.Schema {
+
+        ComponentLibrary library;
+        ComponentLibrary.Schema origin;
+
+        List wrappedTransformations = null;
+
+        public SchemaWrapper(ComponentLibrary.Schema origin, ComponentLibrary library) {
+            this.library = library;
+            this.origin = origin;
+        }
+
+        @Override
+        public String getRoot() {
+            return origin.getRoot();
+        }
+
+        @Override
+        public String getRootUrl() {
+            URL resolved = resolve(library, getRoot());
+            if (resolved != null)
+                return resolved.toString();
+            return getRoot();
+        }
+
+        @Override
+        public String getNamespace() {
+            return origin.getNamespace();
+        }
+
+        @Override
+        public String getPrefix() {
+            return origin.getPrefix();
+        }
+
+        @Override
+        public boolean isPublic() {
+            return origin.isPublic();
+        }
+
+        @Override
+        public List getTransformations() {
+            if (wrappedTransformations == null) {
+                wrappedTransformations = new ArrayList<>();
+
+                for (ComponentLibrary.Transformation transformation : origin.getTransformations())
+                    wrappedTransformations.add(new TransformationWrapper(transformation, this));
+
+            }
+            return wrappedTransformations;
+        }
+
+        @Override
+        public ComponentLibrary getLibrary() {
+            return this.library;
+        }
+
+        @Override
+        public Filter getObjectFilter() {
+            Filter originFilter = origin.getObjectFilter();
+            return originFilter == null ? library.getObjectFilter() : originFilter;
+        }
+
+        @Override
+        public String getUiDescriptor() {
+            return origin.getUiDescriptor();
+        }
+
+    }
+
+    protected class TransformationWrapper implements ComponentLibrary.Transformation {
+
+        ComponentLibrary.Transformation origin;
+        ComponentLibrary.Schema schema;
+
+        public TransformationWrapper(ComponentLibrary.Transformation origin, ComponentLibrary.Schema schema) {
+            this.origin = origin;
+            this.schema = schema;
+        }
+
+        @Override
+        public String getProcessor() {
+            return origin.getProcessor();
+        }
+
+        @Override
+        public String getSource() {
+            return origin.getSource();
+        }
+
+        @Override
+        public String getSourceUrl() {
+            if (!CommonUtils.isValid(getSource()))
+                return null;
+            URL resolved = resolve(schema.getLibrary(), getSource());
+            if (resolved != null)
+                return resolved.toString();
+            return getSource();
+        }
+
+        @Override
+        public Schema getSchema() {
+            return this.schema;
+        }
+
+        @Override
+        public Filter getObjectFilter() {
+            Filter originFilter = origin.getObjectFilter();
+            return originFilter == null ? schema.getObjectFilter() : originFilter;
+        }
+    }
+}
diff --git a/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/shell/CommandLibraryList.java b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/shell/CommandLibraryList.java
new file mode 100644
index 00000000..4f9207f6
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/shell/CommandLibraryList.java
@@ -0,0 +1,65 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * route-producing
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.routes.design.library.shell;
+
+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 ru.entaxy.platform.base.support.karaf.shell.ShellTableExt;
+import ru.entaxy.platform.routes.design.library.ComponentLibrary;
+
+@Service
+@Command(scope = ComponentLibraryCommandSupport.COMMAND_SCOPE, name = "component-library-list")
+public class CommandLibraryList extends ComponentLibraryCommandSupport implements Action {
+
+    @Override
+    public Object execute() throws Exception {
+
+        ShellTableExt tableExt = new ShellTableExt();
+        tableExt.column("Name");
+        tableExt.column("Url");
+        tableExt.column("Filter");
+        tableExt.column("Schemas");
+
+        for (ComponentLibrary library : componentLibraryManager.getLibraries()) {
+            tableExt.addRow().addContent(
+                    library.getName(),
+                    library.getUrl(),
+                    library.getObjectFilter() == null ? "" : library.getObjectFilter().toString(),
+                    library.getSchemas().stream().map(s -> s.getRoot() + " [" + s.getRootUrl() + "]")
+                            .collect(Collectors.joining("\n")));
+        }
+
+        // output to console
+        tableExt.print(System.out);
+        return null;
+
+    }
+
+}
diff --git a/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/shell/ComponentLibraryCommandSupport.java b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/shell/ComponentLibraryCommandSupport.java
new file mode 100644
index 00000000..4e46b7f2
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/shell/ComponentLibraryCommandSupport.java
@@ -0,0 +1,39 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * route-producing
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.routes.design.library.shell;
+
+import org.apache.karaf.shell.api.action.lifecycle.Reference;
+
+import ru.entaxy.platform.routes.design.library.ComponentLibraryManager;
+
+public class ComponentLibraryCommandSupport {
+
+    public static final String COMMAND_SCOPE = "entaxy";
+
+    @Reference
+    ComponentLibraryManager componentLibraryManager;
+
+}
diff --git a/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/storage/ComponentLibraryResourceProvider.java b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/storage/ComponentLibraryResourceProvider.java
new file mode 100644
index 00000000..b85beded
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/storage/ComponentLibraryResourceProvider.java
@@ -0,0 +1,55 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * route-producing
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.routes.design.library.storage;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+
+import ru.entaxy.esb.resources.EntaxyResourceProcessor;
+import ru.entaxy.esb.resources.EntaxyResourceProviderProxy;
+import ru.entaxy.esb.resources.impl.AbstractResourceProviderProxy;
+import ru.entaxy.platform.routes.design.library.ComponentLibrary;
+
+@Component(service = EntaxyResourceProviderProxy.class, immediate = true)
+public class ComponentLibraryResourceProvider extends AbstractResourceProviderProxy {
+
+    @Activate
+    public void activate() {
+
+        setProtocol(ComponentLibrary.COMPONENT_LIBRARY_RESOURCE_PROTOCOL);
+        setTargetProtocol("entaxy-file-internal");
+        setTargetPath(".component-library");
+
+        List processors = new ArrayList<>();
+
+        setProcessors(processors);
+
+    }
+
+}
diff --git a/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/storage/ComponentLibraryStorage.java b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/storage/ComponentLibraryStorage.java
new file mode 100644
index 00000000..be1c87e6
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/storage/ComponentLibraryStorage.java
@@ -0,0 +1,392 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * route-producing
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.routes.design.library.storage;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Filter;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.InvalidSyntaxException;
+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.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.reflect.TypeToken;
+
+import ru.entaxy.esb.resources.EntaxyResource;
+import ru.entaxy.esb.resources.EntaxyResourceProvider;
+import ru.entaxy.platform.base.support.CommonUtils;
+import ru.entaxy.platform.base.support.JSONUtils;
+import ru.entaxy.platform.routes.design.library.ComponentLibrary;
+import ru.entaxy.platform.routes.design.library.storage.ProvidedLibraryDescriptor.ProvidedLibraryResource;
+
+@Component(service = ComponentLibraryStorage.class, immediate = true)
+public class ComponentLibraryStorage {
+
+    private static final Logger LOG = LoggerFactory.getLogger(ComponentLibraryStorage.class);
+
+    protected static final String PROVIDER_FILTER =
+            "(protocol=" + ComponentLibrary.COMPONENT_LIBRARY_RESOURCE_PROTOCOL + ")";
+
+    public static final String LIBRARY_DESCRIPTOR_NAME = "library.json";
+
+    protected static final String LIBRARIES_RESOURCE = "libraries.json";
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY, target = PROVIDER_FILTER)
+    EntaxyResourceProvider resourceProvider;
+
+    protected BundleContext bundleContext;
+
+    // protected ComponentLibraryTracker libraryTracker;
+
+    protected EntaxyResource librariesResource;
+
+    protected Libraries libraries;
+
+    protected Object librariesLock = new Object();
+
+    @Activate
+    public void activate(ComponentContext componentContext) {
+        this.bundleContext = componentContext.getBundleContext();
+        reload();
+
+        /*
+        if (libraryTracker != null)
+            libraryTracker.close();
+        libraryTracker = ComponentLibraryTracker.create(this, this.bundleContext);
+        libraryTracker.open();
+        */
+    }
+
+    @Deactivate
+    public void deactivate() {
+        /*
+        if (libraryTracker != null)
+            libraryTracker.close();
+        */
+    }
+
+    protected void load() {
+        librariesResource = resourceProvider.getResource(LIBRARIES_RESOURCE);
+        if (!librariesResource.exists()) {
+            libraries = new Libraries();
+            try {
+                updateLibrariesResource();
+            } catch (IOException e) {
+                LOG.error("Error saving [" + LIBRARIES_RESOURCE + "]", e);
+            }
+        } else {
+            libraries = new Libraries(librariesResource.getAsString());
+        }
+    }
+
+    protected void updateLibrariesResource() throws IOException {
+        try (InputStream is = new ByteArrayInputStream(libraries.toJson().toString().getBytes())) {
+            librariesResource.save(is);
+        }
+    }
+
+    public void reload() {
+        load();
+    }
+
+    synchronized public void addLibrary(ProvidedLibraryDescriptor descriptor, Library library) {
+        Library existing = libraries.get(library.getName());
+        long bundleLastModified = descriptor.bundle.getLastModified();
+        if (existing != null) {
+            if (existing.lastModified != bundleLastModified) {
+                LOG.info("Library [{}] must be updated", library.getName());
+                synchronized (librariesLock) {
+                    try {
+                        uploadLibraryResources(descriptor);
+                    } catch (Exception e) {
+                        LOG.error(String.format("Error uploading resources for library [%s]", library.getName()), e);
+                    }
+                    libraries.update(library, bundleLastModified);
+                    try {
+                        updateLibrariesResource();
+                        LOG.info("Updated library [{}]", library.getName());
+                        notifyListeners();
+                    } catch (IOException e) {
+                        LOG.error("Error updating libraries", e);
+                    }
+                }
+            } else {
+                LOG.info("Library [{}] not changed", library.getName());
+            }
+        } else {
+            LOG.info("Adding new library [{}]", library.getName());
+            library.lastModified = descriptor.bundle.getLastModified();
+
+            synchronized (librariesLock) {
+                try {
+                    uploadLibraryResources(descriptor);
+                } catch (Exception e) {
+                    LOG.error(String.format("Error uploading resources for library [%s]", library.getName()), e);
+                }
+                libraries.add(library);
+                try {
+                    updateLibrariesResource();
+                    LOG.info("Added new library [{}]", library.getName());
+                    notifyListeners();
+                } catch (IOException e) {
+                    LOG.error("Error updating libraries", e);
+                }
+            }
+
+        }
+    }
+
+    protected void uploadLibraryResources(ProvidedLibraryDescriptor descriptor) throws Exception {
+
+        for (ProvidedLibraryResource provided : descriptor.getLibraryResources()) {
+            String targetPath = descriptor.libraryName + "/" + provided.path;
+            EntaxyResource resource = resourceProvider.getResource(targetPath);
+            try (InputStream is = provided.url.openStream()) {
+                resource.save(is);
+            } catch (IOException e) {
+                LOG.error(String.format("Error uploading resource [%s]", targetPath), e);
+                throw e;
+            }
+
+        }
+
+    }
+
+    public List getLibraries() {
+        return libraries.librariesMap.values().stream().map(l -> (ComponentLibrary) l).collect(Collectors.toList());
+    }
+
+    protected class Libraries {
+
+        Map librariesMap;
+
+        Object librariesMapLock = new Object();
+
+        public Libraries() {
+            librariesMap = new HashMap<>();
+        }
+
+        public Libraries(String jsonOrigin) {
+            JsonObject jo = JSONUtils.getJsonRootObject(jsonOrigin);
+            Type type = new TypeToken>() {}.getType();
+            librariesMap = JSONUtils.GSON.fromJson(jo, type);
+            for (Library lib : librariesMap.values())
+                lib.libraryUrl = resourceProvider.getResource(lib.getName()).getURL();
+        }
+
+        public JsonElement toJson() {
+            return JSONUtils.GSON.toJsonTree(librariesMap);
+        }
+
+        public Library get(String libraryName) {
+            return librariesMap.get(libraryName);
+        }
+
+        public void add(Library library) {
+            synchronized (librariesMapLock) {
+                library.libraryUrl = resourceProvider.getResource(library.getName()).getURL();
+                this.librariesMap.put(library.getName(), library);
+            }
+        }
+
+        public void update(Library library, long lastModified) {
+            this.librariesMap.get(library.getName()).update(library);
+            this.librariesMap.get(library.getName()).lastModified = lastModified;
+        }
+    }
+
+    public static abstract class ObjectFilterAware {
+
+        public String objectFilter;
+
+        transient Filter targetFilter = null;
+
+        public Filter getObjectFilter() {
+            if (!CommonUtils.isValid(objectFilter))
+                return null;
+            if (targetFilter == null) {
+                try {
+                    return FrameworkUtil.createFilter(objectFilter);
+                } catch (InvalidSyntaxException e) {
+                    LOG.error(String.format("Error creating filter for [%s]", objectFilter), e);
+                }
+            }
+            return targetFilter;
+        }
+
+    }
+
+    public static class Library extends ObjectFilterAware implements ComponentLibrary {
+
+        public String library;
+
+        public long lastModified = -1;
+
+        public List schemas;
+
+        transient public String libraryUrl;
+
+        @Override
+        public String getName() {
+            return library;
+        }
+
+        @Override
+        public String getUrl() {
+            return libraryUrl;
+        }
+
+        public void update(Library library) {
+            this.lastModified = library.lastModified;
+            if (this.schemas == null) {
+                this.schemas = new ArrayList<>();
+            } else {
+                this.schemas.clear();
+            }
+            if (library.schemas != null)
+                this.schemas.addAll(library.schemas);
+        }
+
+        @Override
+        public List getSchemas() {
+            return this.schemas.stream().map(s -> (ComponentLibrary.Schema) s).collect(Collectors.toList());
+        }
+
+        public static class IncludedSchema extends ObjectFilterAware implements ComponentLibrary.Schema {
+            public String root;
+            public String namespace;
+            public String prefix;
+            public boolean isPublic;
+            public List> transform;
+            public String uiDescriptor;
+
+            transient List transformations = null;
+
+            @Override
+            public String getRoot() {
+                return root;
+            }
+
+            @Override
+            public String getNamespace() {
+                return namespace;
+            }
+
+            @Override
+            public String getPrefix() {
+                return prefix;
+            }
+
+            @Override
+            public boolean isPublic() {
+                return isPublic;
+            }
+
+            @Override
+            public List getTransformations() {
+                if (this.transformations == null) {
+                    this.transformations = new ArrayList<>();
+                    for (Map transformationData : transform) {
+                        transformations.add(new IncludedTransformation(transformationData));
+                    }
+                }
+                return this.transformations.stream().map(t -> (ComponentLibrary.Transformation) t)
+                        .collect(Collectors.toList());
+            }
+
+            @Override
+            public String getUiDescriptor() {
+                return uiDescriptor;
+            }
+        }
+        public static class IncludedTransformation extends ObjectFilterAware
+                implements ComponentLibrary.Transformation {
+
+            protected Map data;
+
+            public IncludedTransformation(Map data) {
+                this.data = new HashMap<>(data);
+                this.objectFilter = data.getOrDefault("objectFilter", "").toString();
+            }
+
+            @Override
+            public String getProcessor() {
+                return data.getOrDefault("processor", "unknown").toString();
+            }
+
+            @Override
+            public String getSource() {
+                return data.getOrDefault("source", "unknown").toString();
+            }
+
+        }
+    }
+
+    protected List listeners = new ArrayList<>();
+
+    protected Object listenersLock = new Object();
+
+    public void registerListener(StorageListener listener) {
+        synchronized (listenersLock) {
+            if (!listeners.contains(listener))
+                listeners.add(listener);
+        }
+    }
+
+    public void unregisterListener(StorageListener listener) {
+        synchronized (listenersLock) {
+            listeners.remove(listener);
+        }
+    }
+
+    protected void notifyListeners() {
+        synchronized (listenersLock) {
+            for (StorageListener listener : listeners)
+                listener.storageUpdated();
+        }
+    }
+
+    public interface StorageListener {
+        void storageUpdated();
+    }
+}
diff --git a/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/storage/ProvidedLibraryDescriptor.java b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/storage/ProvidedLibraryDescriptor.java
new file mode 100644
index 00000000..89168ef4
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/storage/ProvidedLibraryDescriptor.java
@@ -0,0 +1,107 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * route-producing
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.routes.design.library.storage;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+
+import org.osgi.framework.Bundle;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import ru.entaxy.platform.routes.design.library.ComponentLibrary;
+
+public class ProvidedLibraryDescriptor {
+
+    private static final Logger LOG = LoggerFactory.getLogger(ProvidedLibraryDescriptor.class);
+
+    public static final String LIBRARY_PATH = "/ru/entaxy/" + ComponentLibrary.COMPONENT_LIBRARY_RESOURCE_PROTOCOL;
+
+    public Bundle bundle;
+    public String libraryPath;
+    public String libraryName;
+
+    protected List libraryResources = null;
+
+    public ProvidedLibraryDescriptor(Bundle bundle, String path, String name) {
+        this.bundle = bundle;
+        this.libraryPath = path;
+        this.libraryName = name;
+    }
+
+    public List getLibraryResources() {
+        if (libraryResources == null) {
+            libraryResources = new ArrayList<>();
+
+            Enumeration entries = bundle.findEntries(libraryPath, "*.*", true);
+            if (entries != null) {
+
+                while (entries.hasMoreElements()) {
+                    URL entry = entries.nextElement();
+                    String entryUrl = entry.toString();
+
+                    if (entryUrl.endsWith("/"))
+                        continue;
+
+                    String resourcePath = entryUrl.substring(entryUrl.indexOf(libraryPath) + libraryPath.length());
+
+                    /*
+                    if (resourcePath.equals(ComponentLibraryStorage.LIBRARY_DESCRIPTOR_NAME))
+                        continue;
+                    */
+
+                    String resourceName = null;
+                    int index = resourcePath.lastIndexOf('/');
+                    if (index < 0)
+                        resourceName = resourcePath;
+                    else
+                        resourceName = resourcePath.substring(index + 1);
+
+                    ProvidedLibraryResource resource = new ProvidedLibraryResource();
+                    resource.url = entry;
+                    resource.path = resourcePath;
+                    resource.name = resourceName;
+
+                    libraryResources.add(resource);
+                }
+
+            }
+
+        }
+        return libraryResources;
+    }
+
+    public static class ProvidedLibraryResource {
+
+        URL url;
+        String name;
+        String path;
+
+    }
+
+}
diff --git a/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/tracker/ComponentLibraryTracker.java b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/tracker/ComponentLibraryTracker.java
new file mode 100644
index 00000000..a3d1a2af
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/java/ru/entaxy/platform/routes/design/library/tracker/ComponentLibraryTracker.java
@@ -0,0 +1,223 @@
+/*-
+ * ~~~~~~licensing~~~~~~
+ * route-producing
+ * ==========
+ * Copyright (C) 2020 - 2025 EmDev LLC
+ * ==========
+ * You may not use this file except in accordance with the License Terms of the Copyright
+ * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
+ * rights to the Software and any copies are the property of the Copyright Holder. Unless
+ * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
+ * Software for commercial purposes to provide services to third parties.
+ * 
+ * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
+ * Under no circumstances does the Copyright Holder guarantee or promise that the
+ * Software provided by him will be suitable or not suitable for the specific purposes
+ * of the User, that the Software will meet all commercial and personal subjective
+ * expectations of the User, that the Software will work properly, without technical
+ * errors, quickly and uninterruptedly.
+ * 
+ * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
+ * to the User for any direct or indirect losses of the User, his expenses or actual
+ * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
+ * or damage to data, property, etc.
+ * ~~~~~~/licensing~~~~~~
+ */
+package ru.entaxy.platform.routes.design.library.tracker;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Map;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleEvent;
+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.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.util.tracker.BundleTracker;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.gson.JsonObject;
+
+import ru.entaxy.platform.base.support.CommonUtils;
+import ru.entaxy.platform.base.support.JSONUtils;
+import ru.entaxy.platform.base.support.osgi.tracker.BundleTrackerCustomizerListener;
+import ru.entaxy.platform.base.support.osgi.tracker.BundleTrackerUtils;
+import ru.entaxy.platform.base.support.osgi.tracker.UniformBundleTrackerCustomizer;
+import ru.entaxy.platform.base.support.osgi.tracker.filter.BundleHeaderFilter;
+import ru.entaxy.platform.routes.design.library.ComponentLibrary;
+import ru.entaxy.platform.routes.design.library.storage.ComponentLibraryStorage;
+import ru.entaxy.platform.routes.design.library.storage.ComponentLibraryStorage.Library;
+import ru.entaxy.platform.routes.design.library.storage.ProvidedLibraryDescriptor;
+
+@Component(service = ComponentLibraryTracker.class, immediate = true)
+public class ComponentLibraryTracker {
+
+    private static final Logger LOG = LoggerFactory.getLogger(ComponentLibraryTracker.class);
+
+    public static ComponentLibraryTracker create(ComponentLibraryStorage storage, BundleContext bundleContext) {
+        return new ComponentLibraryTracker(storage, bundleContext);
+    }
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected ComponentLibraryStorage storage;
+
+    protected BundleContext bundleContext;
+
+    protected BundleTracker> tracker;
+
+    public ComponentLibraryTracker() {
+        super();
+    }
+
+    @Activate
+    public void activate(ComponentContext componentContext) {
+        this.bundleContext = componentContext.getBundleContext();
+        tracker = BundleTrackerUtils.>createBuilder()
+                .addFilter(
+                        (new BundleHeaderFilter()).header(ComponentLibrary.COMPONENT_LIBRARY_PROVIDER_HEADER))
+                .customizer(
+                        (new LibraryTrackerCusomizer())
+                                .listener(new LibraryTrackerCusomizerListener()))
+                .bundleState(Bundle.ACTIVE | Bundle.INSTALLED | Bundle.RESOLVED)
+                .get();
+        tracker.open();
+    }
+
+    @Deactivate
+    public void deactivate() {
+        if (tracker != null)
+            tracker.close();
+    }
+
+    protected ComponentLibraryTracker(ComponentLibraryStorage storage, BundleContext bundleContext) {
+
+        this.storage = storage;
+        this.bundleContext = bundleContext;
+
+
+
+    }
+
+    public void open() {
+        if (tracker != null)
+            tracker.open();
+    }
+
+    public void close() {
+        if (tracker != null)
+            tracker.close();
+    }
+
+    protected class LibraryTrackerCusomizer extends UniformBundleTrackerCustomizer> {
+
+        @Override
+        protected List createManagedObject(Bundle bundle, BundleEvent event,
+                Map> filterResults) {
+
+            Enumeration foundEntries = bundle.findEntries(ProvidedLibraryDescriptor.LIBRARY_PATH, "*", false);
+            if (foundEntries == null) {
+                LOG.warn("Bundle [{}] marked as library provider but contains no libraries", bundle.getSymbolicName());
+                return null;
+            }
+
+            List result = new ArrayList<>();
+
+            while (foundEntries.hasMoreElements()) {
+
+                URL entry = foundEntries.nextElement();
+                String entryUrl = entry.toString();
+                if (!entryUrl.endsWith("/"))
+                    continue;
+
+                int index = entryUrl.indexOf(ProvidedLibraryDescriptor.LIBRARY_PATH);
+                String libraryPath = entryUrl.substring(index);
+                String libraryName = libraryPath.substring(ProvidedLibraryDescriptor.LIBRARY_PATH.length() + 1,
+                        libraryPath.length() - 1);
+                LOG.info("Found library [{}] in bundle [{}]", libraryName, bundle.getSymbolicName());
+                result.add(new ProvidedLibraryDescriptor(bundle, libraryPath, libraryName));
+            }
+
+            return result;
+        }
+
+    }
+
+    protected class LibraryTrackerCusomizerListener
+            implements BundleTrackerCustomizerListener> {
+
+        @Override
+        public void added(List managedObject) {
+            for (ProvidedLibraryDescriptor descriptor : managedObject) {
+
+                URL entry = descriptor.bundle
+                        .getEntry(descriptor.libraryPath + ComponentLibraryStorage.LIBRARY_DESCRIPTOR_NAME);
+                if (entry == null) {
+                    LOG.warn("Descrptor not found for library [{}] in bundle [{}]", descriptor.libraryName,
+                            descriptor.bundle.getSymbolicName());
+                    continue;
+                }
+
+                String content = null;
+
+                try (InputStream is = entry.openStream()) {
+                    content = new String(is.readAllBytes());
+                } catch (IOException e) {
+                    LOG.error(String.format("Error reading library descriptor [%s] in bundle [%s]",
+                            descriptor.libraryPath + ComponentLibraryStorage.LIBRARY_DESCRIPTOR_NAME,
+                            descriptor.bundle.getSymbolicName()), e);
+                    continue;
+                }
+
+                if (!CommonUtils.isValid(content)) {
+                    LOG.error(String.format("Library descriptor is empty: [%s] in bundle [%s]",
+                            descriptor.libraryPath + ComponentLibraryStorage.LIBRARY_DESCRIPTOR_NAME,
+                            descriptor.bundle.getSymbolicName()));
+                    continue;
+                }
+
+                JsonObject jo = JSONUtils.getJsonRootObject(content);
+                if ((jo == null) || jo.keySet().isEmpty()) {
+                    LOG.error(String.format("Invalid library descriptor: [%s] in bundle [%s]",
+                            descriptor.libraryPath + ComponentLibraryStorage.LIBRARY_DESCRIPTOR_NAME,
+                            descriptor.bundle.getSymbolicName()));
+                    continue;
+                }
+
+                Library library = JSONUtils.GSON.fromJson(jo, Library.class);
+                if ((library == null) || !CommonUtils.isValid(library.library)) {
+                    LOG.error(String.format("Invalid library descriptor content: [%s] in bundle [%s]",
+                            descriptor.libraryPath + ComponentLibraryStorage.LIBRARY_DESCRIPTOR_NAME,
+                            descriptor.bundle.getSymbolicName()));
+                    continue;
+                }
+
+                LOG.info("Recognized library [{}] having [{}] schemas", library.library,
+                        library.schemas == null ? -1 : library.schemas.size());
+
+                storage.addLibrary(descriptor, library);
+
+            }
+        }
+
+        @Override
+        public void modified(List managedObject) {
+            // ignore
+        }
+
+        @Override
+        public void removed(List managedObject) {
+            // ignore
+        }
+
+    }
+}
diff --git a/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/blueprint-entaxy.xsd b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/blueprint-entaxy.xsd
new file mode 100644
index 00000000..7284de26
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/blueprint-entaxy.xsd
@@ -0,0 +1,993 @@
+
+
+
+	
+		
+
+                if used as a qualified namespace, "bp" is the recommended
+                namespace prefix.
+            ]]>
+	
+	
+	
+		
+			 , ,
+                    and  elements are all derived from
+                    the Tcomponent type.  This type defines an id attribute
+                    that is used create references between different components.
+                    Component elements can also be inlined within other component
+                    definitions.  The id attribute is not valid when inlined.
+                ]]>
+		
+		
+		
+			
+				 element.
+                    ]]>
+			
+		
+		
+			
+				 or  elements with unstatisfied
+                    manadatory references, then the depends-on relationship will also
+                    be used to determine whether this service is enabled or not.
+                    ]]>
+			
+		
+	
+	
+		
+			 element is the root element for a blueprint
+                configuration file.  A blueprint configuration has two sections.
+                The first section (contained within the  element)
+                identifies components that are used for converting values into
+                different target types.  The type converters are optional, so
+                the file does not need to specify a type converter section.
+
+                Following the type converters are the component definitions.
+                Components are , , , and
+                 elements that identify the bundle components that will
+                be managed by the blueprint service.
+                ]]>
+		
+	
+	
+		
+			
+			
+			
+			
+				
+				
+				
+				
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				 element can override the specified configuration
+                    default.
+                    ]]>
+			
+		
+		
+			
+				, and  components.  The
+                    normal default is "mandatory", and can be changed by individual
+                    service reference components.
+                    ]]>
+			
+		
+		
+		
+	
+	
+		
+			 element.  The
+                 section is a set of , , or
+                 elements that identify the type converter components.
+                ]]>
+		
+		
+			
+			
+			
+			
+		
+	
+	
+	
+		
+			 element
+                or an inlined  or .
+                ]]>
+		
+		
+			
+			
+			
+			
+		
+	
+	
+		
+			, , ,  and .
+                ]]>
+		
+		
+			
+			
+			
+		
+	
+	
+		
+			 element.
+                ]]>
+		
+		
+			
+			
+				
+				
+				
+			
+		
+	
+	
+		
+			 component.  The  
+                attributes provide the characteristics for how to create a
+                bean instance.  Constructor arguments and injected properties
+                are specified via child  and  elements.
+                ]]>
+		
+		
+			
+				
+				
+				
+				
+				
+				
+				
+				
+			
+		
+	
+	
+		
+			 elements.  Those elements have some restrictions on
+                the attributes that can be used to define them.
+                ]]>
+		
+		
+			
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+			
+		
+	
+	
+		
+			
+                component.  The  elements are the arguments for the
+                bean class constructor or passed to the bean factory method.
+
+                The type, if specified, is used to disambiguate the constructor
+                or method signature.  Arguments may also be matched up with
+                arguments by explicitly specifying the index position.  If the
+                index is used, then all  elements for the bean must
+                also specify the index.
+
+                The value and ref attributes are convenience shortcuts to make
+                the  tag easier to code.  A fuller set of injected
+                values and types can be specified using one of the "value"
+                type elements.
+                ]]>
+		
+		
+			
+			
+		
+		
+		
+		
+		
+	
+	
+		
+			
+                component.  The  elements correspond to named
+                JavaBean setting methods for a created bean object.
+
+                The value and ref attributes are convenience shortcuts to make
+                the  tag easier to code.  A fuller set of injected
+                values and types can be specified using one of the "value"
+                type elements.
+                ]]>
+		
+		
+			
+			
+		
+		
+		
+		
+	
+	
+		
+			 element.
+                ]]>
+		
+		
+	
+	
+	
+		
+			 element.  These
+                are instances of the TserviceReference type, with the addition
+                of a timeout attribute.  If the timeout is not specified,
+                the default-timeout value is inherited from the encapsulating
+                 definition.
+                ]]>
+		
+		
+			
+				
+					
+				
+				
+			
+		
+	
+	
+		
+			 elements.
+                ]]>
+		
+		
+			
+				
+					
+					
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+			
+		
+	
+	
+	
+		
+			.  This adds in the characteristics that
+                only apply to collections of references (e.g., member-type).
+                ]]>
+		
+		
+			
+				
+					
+				
+				
+			
+		
+	
+	
+		
+			 elements.
+                ]]>
+		
+		
+			
+				
+					
+					
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+			
+		
+	
+	
+	
+		
+			
+                and  elements.  This type defines all of the
+                characteristics common to both sorts of references.
+                ]]>
+		
+		
+			
+				
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						 element.
+                            ]]>
+					
+				
+				
+			
+		
+	
+	
+		
+			
+			
+			
+				
+					 to a  or  element, or an inline
+                         or .
+                        ]]>
+				
+			
+		
+	
+	
+		
+			 or  element.  The listener
+                object can be specified as a  or as an inline  or
+                 component.  Listener events are mapped to the indicated
+                bind or unbind methods.
+                ]]>
+		
+		
+			
+		
+		
+		
+		
+	
+	
+		
+			 default-activation attribute and the
+                activation attribute.
+                ]]>
+		
+		
+			
+			
+		
+	
+	
+		
+			 default-availability attribute and the
+                 and  availability attribute.
+                ]]>
+		
+		
+			
+			
+		
+	
+	
+	
+		
+			 to a  component or an
+                 bean component.
+                ]]>
+		
+		
+			
+				
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+			
+		
+	
+	
+		
+			 elements.
+                ]]>
+		
+		
+			
+				
+					
+				
+				
+				
+				
+				
+				
+				
+				
+				
+			
+		
+	
+	
+		
+			
+			
+				
+					 element also has
+                        a shortcut interface attribute for the usual case of just
+                        a single interface being used.  This also cannot be used if
+                        the auto-export attribute is used.
+                        ]]>
+				
+			
+			
+				
+					
+				
+			
+			
+				
+					
+				
+			
+		
+	
+	
+		
+			
+		
+		
+			
+			
+				
+					
+				
+			
+		
+	
+	
+		
+			 to a  or  component, or an inline
+                 or  component definition.  The registration-method and
+                unregistration-method attributes define the methods that will be called
+                for the respective events.
+
+                For the very common case of using a  to a listener component, the
+                ref attribute may also be used as a shortcut.
+                ]]>
+		
+		
+			
+		
+		
+		
+		
+	
+	
+	
+		
+			 and  elements, any of the
+                component types (, , etc.) as inline components, the
+                generic  element for types sourced from string values, any of the
+                collection types (, , , , ), and the
+                 type to inject a null value.
+                ]]>
+		
+		
+			
+			
+		
+	
+	
+		
+			 value type.
+                ]]>
+		
+	
+	
+		
+			 and  elements, any of the
+                component types (, , etc.) as inline components, the
+                generic  element for types sourced from string values, and any of the
+                collection types (, , , , ).
+
+                The  type is NOT a member of this group.
+                ]]>
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+		
+	
+	
+		
+			 elements.  This specifies a required
+                component id for the reference component.
+                ]]>
+		
+		
+	
+	
+		
+			 elements.  The  element
+                is used for types that can be created from a single string value.
+                The string value is the data value for the element.  The optional
+                type attribute allows a target conversion value to be explicitly
+                specified.
+                ]]>
+		
+		
+	
+	
+	
+		
+			
+		
+		
+	
+	
+		
+			, , and  elements.
+                ]]>
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			 value element.  The prop elements
+                are pairs of string-valued keys and values.
+                ]]>
+		
+		
+			
+		
+	
+	
+		
+			 value type.  The property
+                value can be specified using either the attribute, or as value data for
+                the property element.
+                ]]>
+		
+		
+		
+	
+	
+	
+		
+			 elements.  A map may have a
+                default value type specified, so it inherits from the TtypeCollection
+                type.  A key type can also be specified, and the map members are
+                created from the entry elements, which require a key/value pair.
+                ]]>
+		
+		
+			
+				
+					
+				
+				
+			
+		
+	
+	
+	
+		
+			 elements nested inside of a  element.
+                Each  instance defines a key/value pair that will be added to the
+                Map.  Both the keys and values may be arbitrary types.  Keys must not
+                be  but  is permitted for entry values.  A default type
+                can be specified for both the keys and the values, but individual keys
+                or values can override the default.
+                ]]>
+		
+		
+			
+			
+		
+		
+		
+		
+		
+	
+	
+	
+		
+			 elements.
+                The syntax is similar to what is defined for , but keys must be
+                string values and there are no type defaults that can be specified.
+                created from the entry elements, which require a key/value pair.
+                ]]>
+		
+		
+			
+			
+		
+	
+	
+	
+		
+			
+                element.  This does not allow a child  element and there are no
+                key-ref or value-ref attributes.
+                ]]>
+		
+		
+			
+		
+		
+		
+	
+	
+	
+		
+			 element type to allow documentation to added to the
+                blueprint configuration.
+                ]]>
+		
+		
+	
+	
+		
+			 element used for 
+                ]]>
+		
+		
+			
+		
+	
+	
+		
+			 element.
+                This is just a xxxxx element where the contained
+                value is the name of an interface class.
+                ]]>
+		
+		
+	
+	
+		
+			
+		
+		
+	
+	
+		
+			
+		
+		
+			
+		
+	
+	
+		
+			
+		
+		
+	
+	
+	
+		
+			
+		
+		
+	
+	
+		
+			
+		
+		
+	
+	
+		
+			
+		
+		
+			
+			
+			
+			
+		
+	
+	
+		
+			
+		
+		
+	
+	
+		
+			
+		
+		
+			
+				
+			
+			
+		
+	
+	
+		
+			
+				
+					
+					
+				
+			
+			
+				
+					
+				
+			
+		
+	
+	
+		
+			
+		
+		
+			
+			
+		
+	
+	
+	
+
diff --git a/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/blueprint.xsd b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/blueprint.xsd
new file mode 100644
index 00000000..f608e141
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/blueprint.xsd
@@ -0,0 +1,991 @@
+
+
+
+	
+		
+
+                if used as a qualified namespace, "bp" is the recommended
+                namespace prefix.
+            ]]>
+	
+	
+	
+		
+			 , ,
+                    and  elements are all derived from
+                    the Tcomponent type.  This type defines an id attribute
+                    that is used create references between different components.
+                    Component elements can also be inlined within other component
+                    definitions.  The id attribute is not valid when inlined.
+                ]]>
+		
+		
+		
+			
+				 element.
+                    ]]>
+			
+		
+		
+			
+				 or  elements with unstatisfied
+                    manadatory references, then the depends-on relationship will also
+                    be used to determine whether this service is enabled or not.
+                    ]]>
+			
+		
+	
+	
+		
+			 element is the root element for a blueprint
+                configuration file.  A blueprint configuration has two sections.
+                The first section (contained within the  element)
+                identifies components that are used for converting values into
+                different target types.  The type converters are optional, so
+                the file does not need to specify a type converter section.
+
+                Following the type converters are the component definitions.
+                Components are , , , and
+                 elements that identify the bundle components that will
+                be managed by the blueprint service.
+                ]]>
+		
+	
+	
+		
+			
+			
+			
+			
+				
+				
+				
+				
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				 element can override the specified configuration
+                    default.
+                    ]]>
+			
+		
+		
+			
+				, and  components.  The
+                    normal default is "mandatory", and can be changed by individual
+                    service reference components.
+                    ]]>
+			
+		
+		
+		
+	
+	
+		
+			 element.  The
+                 section is a set of , , or
+                 elements that identify the type converter components.
+                ]]>
+		
+		
+			
+			
+			
+			
+		
+	
+	
+	
+		
+			 element
+                or an inlined  or .
+                ]]>
+		
+		
+			
+			
+			
+			
+		
+	
+	
+		
+			, , ,  and .
+                ]]>
+		
+		
+			
+			
+			
+		
+	
+	
+		
+			 element.
+                ]]>
+		
+		
+			
+			
+				
+				
+				
+			
+		
+	
+	
+		
+			 component.  The  
+                attributes provide the characteristics for how to create a
+                bean instance.  Constructor arguments and injected properties
+                are specified via child  and  elements.
+                ]]>
+		
+		
+			
+				
+				
+				
+				
+				
+				
+				
+				
+			
+		
+	
+	
+		
+			 elements.  Those elements have some restrictions on
+                the attributes that can be used to define them.
+                ]]>
+		
+		
+			
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+			
+		
+	
+	
+		
+			
+                component.  The  elements are the arguments for the
+                bean class constructor or passed to the bean factory method.
+
+                The type, if specified, is used to disambiguate the constructor
+                or method signature.  Arguments may also be matched up with
+                arguments by explicitly specifying the index position.  If the
+                index is used, then all  elements for the bean must
+                also specify the index.
+
+                The value and ref attributes are convenience shortcuts to make
+                the  tag easier to code.  A fuller set of injected
+                values and types can be specified using one of the "value"
+                type elements.
+                ]]>
+		
+		
+			
+			
+		
+		
+		
+		
+		
+	
+	
+		
+			
+                component.  The  elements correspond to named
+                JavaBean setting methods for a created bean object.
+
+                The value and ref attributes are convenience shortcuts to make
+                the  tag easier to code.  A fuller set of injected
+                values and types can be specified using one of the "value"
+                type elements.
+                ]]>
+		
+		
+			
+			
+		
+		
+		
+		
+	
+	
+		
+			 element.
+                ]]>
+		
+		
+	
+	
+	
+		
+			 element.  These
+                are instances of the TserviceReference type, with the addition
+                of a timeout attribute.  If the timeout is not specified,
+                the default-timeout value is inherited from the encapsulating
+                 definition.
+                ]]>
+		
+		
+			
+				
+					
+				
+				
+			
+		
+	
+	
+		
+			 elements.
+                ]]>
+		
+		
+			
+				
+					
+					
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+			
+		
+	
+	
+	
+		
+			.  This adds in the characteristics that
+                only apply to collections of references (e.g., member-type).
+                ]]>
+		
+		
+			
+				
+					
+				
+				
+			
+		
+	
+	
+		
+			 elements.
+                ]]>
+		
+		
+			
+				
+					
+					
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+			
+		
+	
+	
+	
+		
+			
+                and  elements.  This type defines all of the
+                characteristics common to both sorts of references.
+                ]]>
+		
+		
+			
+				
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						 element.
+                            ]]>
+					
+				
+				
+			
+		
+	
+	
+		
+			
+			
+			
+				
+					 to a  or  element, or an inline
+                         or .
+                        ]]>
+				
+			
+		
+	
+	
+		
+			 or  element.  The listener
+                object can be specified as a  or as an inline  or
+                 component.  Listener events are mapped to the indicated
+                bind or unbind methods.
+                ]]>
+		
+		
+			
+		
+		
+		
+		
+	
+	
+		
+			 default-activation attribute and the
+                activation attribute.
+                ]]>
+		
+		
+			
+			
+		
+	
+	
+		
+			 default-availability attribute and the
+                 and  availability attribute.
+                ]]>
+		
+		
+			
+			
+		
+	
+	
+	
+		
+			 to a  component or an
+                 bean component.
+                ]]>
+		
+		
+			
+				
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+			
+		
+	
+	
+		
+			 elements.
+                ]]>
+		
+		
+			
+				
+					
+				
+				
+				
+				
+				
+				
+				
+				
+				
+			
+		
+	
+	
+		
+			
+			
+				
+					 element also has
+                        a shortcut interface attribute for the usual case of just
+                        a single interface being used.  This also cannot be used if
+                        the auto-export attribute is used.
+                        ]]>
+				
+			
+			
+				
+					
+				
+			
+			
+				
+					
+				
+			
+		
+	
+	
+		
+			
+		
+		
+			
+			
+				
+					
+				
+			
+		
+	
+	
+		
+			 to a  or  component, or an inline
+                 or  component definition.  The registration-method and
+                unregistration-method attributes define the methods that will be called
+                for the respective events.
+
+                For the very common case of using a  to a listener component, the
+                ref attribute may also be used as a shortcut.
+                ]]>
+		
+		
+			
+		
+		
+		
+		
+	
+	
+	
+		
+			 and  elements, any of the
+                component types (, , etc.) as inline components, the
+                generic  element for types sourced from string values, any of the
+                collection types (, , , , ), and the
+                 type to inject a null value.
+                ]]>
+		
+		
+			
+			
+		
+	
+	
+		
+			 value type.
+                ]]>
+		
+	
+	
+		
+			 and  elements, any of the
+                component types (, , etc.) as inline components, the
+                generic  element for types sourced from string values, and any of the
+                collection types (, , , , ).
+
+                The  type is NOT a member of this group.
+                ]]>
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+		
+	
+	
+		
+			 elements.  This specifies a required
+                component id for the reference component.
+                ]]>
+		
+		
+	
+	
+		
+			 elements.  The  element
+                is used for types that can be created from a single string value.
+                The string value is the data value for the element.  The optional
+                type attribute allows a target conversion value to be explicitly
+                specified.
+                ]]>
+		
+		
+	
+	
+	
+		
+			
+		
+		
+	
+	
+		
+			, , and  elements.
+                ]]>
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			 value element.  The prop elements
+                are pairs of string-valued keys and values.
+                ]]>
+		
+		
+			
+		
+	
+	
+		
+			 value type.  The property
+                value can be specified using either the attribute, or as value data for
+                the property element.
+                ]]>
+		
+		
+		
+	
+	
+	
+		
+			 elements.  A map may have a
+                default value type specified, so it inherits from the TtypeCollection
+                type.  A key type can also be specified, and the map members are
+                created from the entry elements, which require a key/value pair.
+                ]]>
+		
+		
+			
+				
+					
+				
+				
+			
+		
+	
+	
+	
+		
+			 elements nested inside of a  element.
+                Each  instance defines a key/value pair that will be added to the
+                Map.  Both the keys and values may be arbitrary types.  Keys must not
+                be  but  is permitted for entry values.  A default type
+                can be specified for both the keys and the values, but individual keys
+                or values can override the default.
+                ]]>
+		
+		
+			
+			
+		
+		
+		
+		
+		
+	
+	
+	
+		
+			 elements.
+                The syntax is similar to what is defined for , but keys must be
+                string values and there are no type defaults that can be specified.
+                created from the entry elements, which require a key/value pair.
+                ]]>
+		
+		
+			
+			
+		
+	
+	
+	
+		
+			
+                element.  This does not allow a child  element and there are no
+                key-ref or value-ref attributes.
+                ]]>
+		
+		
+			
+		
+		
+		
+	
+	
+	
+		
+			 element type to allow documentation to added to the
+                blueprint configuration.
+                ]]>
+		
+		
+	
+	
+		
+			 element used for 
+                ]]>
+		
+		
+			
+		
+	
+	
+		
+			 element.
+                This is just a xxxxx element where the contained
+                value is the name of an interface class.
+                ]]>
+		
+		
+	
+	
+		
+			
+		
+		
+	
+	
+		
+			
+		
+		
+			
+		
+	
+	
+		
+			
+		
+		
+	
+	
+	
+		
+			
+		
+		
+	
+	
+		
+			
+		
+		
+	
+	
+		
+			
+		
+		
+			
+			
+			
+			
+		
+	
+	
+		
+			
+		
+		
+	
+	
+		
+			
+		
+		
+			
+				
+			
+			
+		
+	
+	
+		
+			
+				
+					
+					
+				
+			
+			
+				
+					
+				
+			
+		
+	
+	
+		
+			
+		
+		
+			
+			
+		
+	
+
diff --git a/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/camel-entaxy.xsd b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/camel-entaxy.xsd
new file mode 100644
index 00000000..8757653a
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/camel-entaxy.xsd
@@ -0,0 +1,13755 @@
+
+
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+						
+						
+						
+						
+						
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+			
+			
+		
+	
+	
+		
+			
+			
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+					
+					
+						
+						
+						
+						
+						
+					
+					
+						
+						
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+		
+			
+				
+			
+		
+	
+	
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+		
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+					
+						
+					
+				
+				
+					
+						
+					
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+			
+		
+	
+	
+		
+		
+		
+		
+	
+	
+		
+			
+				
+				
+				
+			
+		
+	
+	
+		
+			
+				
+				
+				
+			
+		
+	
+	
+		
+			
+				
+				
+				
+			
+		
+	
+	
+		
+			
+				
+				
+				
+			
+		
+	
+	
+		
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+	
+	
+		
+			
+				
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+			
+			
+			
+			
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+	
+	
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+					
+				
+			
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+					
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+	
+	
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+			
+		
+	
+	
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+				
+				
+			
+		
+	
+	
+		
+			
+				
+				
+				
+				
+				
+			
+		
+	
+	
+		
+			
+				
+				
+				
+			
+		
+	
+	
+		
+			
+				
+				
+				
+				
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+					
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+					
+					
+						
+						
+						
+						
+						
+					
+					
+						
+						
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+				
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+				
+				
+				
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+				
+				
+				
+			
+		
+	
+	
+		
+			
+			
+		
+	
+	
+		
+			
+			
+		
+	
+	
+		
+			
+			
+			
+		
+	
+	
+		
+			
+			
+			
+			
+			
+			
+		
+	
+	
+		
+			
+			
+			
+		
+	
+	
+		
+			
+			
+			
+			
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+			
+			
+		
+	
+	
+		
+			
+			
+			
+			
+			
+		
+	
+	
+		
+			
+			
+			
+			
+			
+		
+	
+	
+		
+			
+			
+			
+			
+			
+		
+	
+	
+		
+			
+			
+			
+			
+			
+		
+	
+	
+		
+			
+			
+		
+	
+	
+		
+			
+			
+		
+	
+	
+		
+			
+			
+			
+			
+			
+			
+		
+	
+	
+		
+			
+			
+			
+			
+			
+			
+			
+		
+	
+	
+		
+			
+			
+			
+		
+	
+	
+		
+			
+			
+		
+	
+
diff --git a/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/camel.xsd b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/camel.xsd
new file mode 100644
index 00000000..e75023b1
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/camel.xsd
@@ -0,0 +1,13730 @@
+
+
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+						
+						
+						
+						
+						
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+			
+			
+		
+	
+	
+		
+			
+			
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+					
+					
+						
+						
+						
+						
+						
+					
+					
+						
+						
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+		
+			
+				
+			
+		
+	
+	
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+		
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+					
+						
+					
+				
+				
+					
+						
+					
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+			
+		
+	
+	
+		
+		
+		
+		
+	
+	
+		
+			
+				
+				
+				
+			
+		
+	
+	
+		
+			
+				
+				
+				
+			
+		
+	
+	
+		
+			
+				
+				
+				
+			
+		
+	
+	
+		
+			
+				
+				
+				
+			
+		
+	
+	
+		
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+	
+	
+		
+			
+				
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+			
+			
+			
+			
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+	
+	
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+					
+				
+			
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+					
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+	
+	
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+			
+		
+	
+	
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+				
+				
+			
+		
+	
+	
+		
+			
+				
+				
+				
+				
+				
+			
+		
+	
+	
+		
+			
+				
+				
+				
+			
+		
+	
+	
+		
+			
+				
+				
+				
+				
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+					
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+						
+						
+						
+						
+						
+						
+						
+					
+					
+						
+						
+						
+						
+						
+					
+					
+						
+						
+					
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+				
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+					
+					
+					
+					
+					
+				
+				
+				
+				
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+			
+		
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+					
+					
+					
+				
+				
+				
+			
+		
+	
+	
+		
+			
+			
+		
+	
+	
+		
+			
+			
+		
+	
+	
+		
+			
+			
+			
+		
+	
+	
+		
+			
+			
+			
+			
+			
+			
+		
+	
+	
+		
+			
+			
+			
+		
+	
+	
+		
+			
+			
+			
+			
+			
+		
+	
+	
+		
+			
+		
+	
+	
+		
+			
+			
+			
+		
+	
+	
+		
+			
+			
+			
+			
+			
+		
+	
+	
+		
+			
+			
+			
+			
+			
+		
+	
+	
+		
+			
+			
+			
+			
+			
+		
+	
+	
+		
+			
+			
+			
+			
+			
+		
+	
+	
+		
+			
+			
+		
+	
+	
+		
+			
+			
+		
+	
+	
+		
+			
+			
+			
+			
+			
+			
+		
+	
+	
+		
+			
+			
+			
+			
+			
+			
+			
+		
+	
+	
+		
+			
+			
+			
+		
+	
+	
+		
+			
+			
+		
+	
+
diff --git a/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/connector-selector.json b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/connector-selector.json
new file mode 100644
index 00000000..d0877f95
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/connector-selector.json
@@ -0,0 +1,38 @@
+{
+  "m:connector-selector": {
+    "topChild": true,
+    "children": [
+      "m:properties-to-use",
+      "m:patterns",
+      "m:options"
+    ]
+  },
+  "m:properties-to-use": {
+    "children": [
+      "m:property"
+    ]
+  },
+  "m:property": {"children": []},
+  "m:patterns": {
+    "children": [
+      "m:pattern"
+    ]
+  },
+  "m:pattern": {"children": []},
+  "m:options": {
+    "children": [
+      "m:fail-back-to-legacy-router",
+      "m:use-the-only-connector",
+      "m:use-default-connector",
+      "m:connector-preferred-as-mandatory",
+      "m:allow-all-stars-pattern",
+      "m:treat-no-property-as-any"
+    ]
+  },
+  "m:fail-back-to-legacy-router": {"children": []},
+  "m:use-the-only-connector": {"children": []},
+  "m:use-default-connector": {"children": []},
+  "m:connector-preferred-as-mandatory": {"children": []},
+  "m:allow-all-stars-pattern": {"children": []},
+  "m:treat-no-property-as-any": {"children": []}
+}
\ No newline at end of file
diff --git a/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/connector-selector.xsd b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/connector-selector.xsd
new file mode 100644
index 00000000..c61abeb6
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/connector-selector.xsd
@@ -0,0 +1,38 @@
+
+
+	
+		
+			Comment describing your root element
+		
+	
+	
+		
+			
+				
+					
+						
+					
+				
+			
+			
+				
+					
+						
+					
+				
+			
+			
+				
+					
+						
+						
+						
+						
+						
+						
+					
+				
+			
+		
+	
+
diff --git a/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/connector-selector.xslt b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/connector-selector.xslt
new file mode 100644
index 00000000..c54f9903
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/connector-selector.xslt
@@ -0,0 +1,148 @@
+
+
+
+
+    
+
+    
+    
+    
+
+    
+        
+            
+        
+        
+            
+                
+            
+            
+        
+    
+
+    
+        
+        
+    
+
+    
+        
+            
+            
+        
+    
+
+    
+        generated from 'connector-selector'
+        
+            
+                bean:selector-
+             
+        
+    
+
+    
+        
+            
+                selector-
+            
+            
+            
+                
+            
+            
+                
+            
+        
+    
+
+    
+        
+        {
+        
+        "_end":true}
+    
+
+    
+        "properties":[
+        
+            ""
+            
+                ,
+            
+        
+        ],
+    
+
+    
+        "patterns":[
+        
+            ""
+            
+                ,
+            
+        
+        ],
+    
+
+    
+        "options":{
+        
+            "":
+            
+                
+                    
+                    
+                        
+                            ,
+                        
+                        
+                            "",
+                        
+                    
+                
+                
+                    true,
+                
+            
+        
+        "_end":true},
+    
+
+    
+        
+            
+        
+    
+
+
diff --git a/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/entaxy-connectors.xslt b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/entaxy-connectors.xslt
new file mode 100644
index 00000000..0eebfb60
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/entaxy-connectors.xslt
@@ -0,0 +1,194 @@
+
+
+
+
+    
+
+    
+    
+    
+
+    
+
+    
+        .
+    
+
+    
+        
+            
+                
+                
+
+                    
+                        
+                            
+                                direct:connector--response-route
+                            
+                            

+                            generated from 'entaxy:object-route' for :/
+                            
+                            
+                                
+                            
+                            
+                        
+                    
+
+                    
+                        
+                            
+                                direct:connector--pre-route
+                            
+                            

+                            generated from 'entaxy:object-route' for :/
+                            
+                            
+                                
+                            
+                            
+                        
+                    
+
+                    
+                        
+                            
+                                direct:connector--pre-output
+                            
+                            

+                            generated from 'entaxy:object-route' for :/
+                            
+                            
+                                
+                            
+                            
+                        
+                    
+
+                    
+                    
+                        
+                            
+                                
+                            
+                            

+                            generated from 'entaxy:object-route' for :/
+                            
+                            
+                                
+                                    
+                                
+                            
+                            
+                        
+                    
+
+                    
+                        
+                            
+                        
+                    
+                
+            
+
+            
+                
+                    
+                
+            
+        
+
+    
+
+    
+        
+            
+                
+                
+
+                    
+                    
+                        
+                            
+                                
+                            
+                            

+                            generated from 'entaxy:object-route' for :/
+                            
+                            
+                            
+                                
+                                    
+                                
+                            
+                        
+                    
+
+                    
+                        
+                            
+                        
+                    
+                
+            
+
+            
+                
+                    
+                
+            
+        
+
+    
+
+
+    
+        
+    
+
+    
+        
+            
+        
+    
+
+
diff --git a/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/entaxy-mediators.json b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/entaxy-mediators.json
new file mode 100644
index 00000000..62e454a0
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/entaxy-mediators.json
@@ -0,0 +1,1113 @@
+{
+  "m:standard-router": {
+    "topChild": true,
+    "children": []
+  },
+  "m:set-destination": {
+    "topChild": true,
+    "children": []
+  },
+  "m:default-destination": {
+    "topChild": true,
+    "children": []
+  },
+  "m:prefer-connector": {
+    "topChild": true,
+    "children": [
+      "m:protocol",
+      "m:classifier",
+      "m:type"
+    ]
+  },
+  "protocol": {
+    "children": []
+  },
+  "classifier": {
+    "children": []
+  },
+  "type": {
+    "children": []
+  },
+  "m:next-route": {
+    "topChild": true,
+    "attrs": {
+      "local": [
+        "true",
+        "false"
+      ],
+      "async": [
+        "true",
+        "false"
+      ]
+    }
+  },
+  "m:respond": {
+    "topChild": true,
+    "attrs": {
+      "now": [
+        "true",
+        "false"
+      ],
+      "continue": [
+        "true",
+        "false"
+      ],
+      "continueAsync": [
+        "true",
+        "false"
+      ]
+    }
+  },
+  "m:xslt": {
+    "topChild": true,
+    "attrs": {
+      "resource": null,
+      "id": null,
+      "targetType": [
+        "body",
+        "header",
+        "property"
+      ],
+      "target": null,
+      "basicPropertyBinding": [
+        "true",
+        "false"
+      ],
+      "saxonConfiguration": null,
+      "synchronous": [
+        "true",
+        "false"
+      ],
+      "contentCache": [
+        "true",
+        "false"
+      ],
+      "allowStAX": [
+        "true",
+        "false"
+      ],
+      "deleteOutputFile": [
+        "true",
+        "false"
+      ],
+      "output": null,
+      "errorListener": null,
+      "lazyStartProducer": [
+        "true",
+        "false"
+      ],
+      "entityResolver": null,
+      "transformerFactoryConfigurationStrategy": null,
+      "saxonExtensionFunctions": null,
+      "failOnNullBody": [
+        "true",
+        "false"
+      ],
+      "transformerCacheSize": null,
+      "resultHandlerFactory": null,
+      "transformerFactoryClass": null,
+      "transformerFactory": null,
+      "uriResolver": null
+    },
+    "children": []
+  },
+  "m:xpath": {
+    "topChild": true,
+    "attrs": {
+      "target": null,
+      "targetType": [
+        "header",
+        "body",
+        "property"
+      ],
+      "documentType": null,
+      "resultType": null,
+      "factoryRef": null,
+      "objectModel": null,
+      "logNamespaces": [
+        "true",
+        "false"
+      ],
+      "trim": [
+        "true",
+        "false"
+      ],
+      "threadSafety": [
+        "true",
+        "false"
+      ]
+    },
+    "children": []
+  },
+  "m:xslt-xalan": {
+    "topChild": true,
+    "attrs": {
+      "resource": null,
+      "id": null,
+      "targetType": [
+        "body",
+        "header",
+        "property"
+      ],
+      "target": null,
+      "basicPropertyBinding": [
+        "true",
+        "false"
+      ],
+      "synchronous": [
+        "true",
+        "false"
+      ],
+      "contentCache": [
+        "true",
+        "false"
+      ],
+      "deleteOutputFile": [
+        "true",
+        "false"
+      ],
+      "output": null,
+      "errorListener": null,
+      "lazyStartProducer": [
+        "true",
+        "false"
+      ],
+      "entityResolver": null,
+      "transformerFactoryConfigurationStrategy": null,
+      "failOnNullBody": [
+        "true",
+        "false"
+      ],
+      "transformerCacheSize": null,
+      "resultHandlerFactory": null,
+      "transformerFactoryClass": null,
+      "transformerFactory": null,
+      "uriResolver": null
+    },
+    "children": []
+  },
+  "m:atlasmap": {
+    "topChild": true,
+    "attrs": {
+      "resource": null,
+      "id": null,
+      "targetType": [
+        "body",
+        "header",
+        "property"
+      ],
+      "target": null,
+      "loaderCache": [
+        "true",
+        "false"
+      ],
+      "encoding": [
+        "true",
+        "false"
+      ],
+      "sourceMapName": null,
+      "targetMapMode": [
+        "MAP",
+        "MESSAGE_HEADER",
+        "EXCHANGE_PROPERTY"
+      ],
+      "targetMapName": null,
+      "propertiesFile": null
+    },
+    "children": []
+  },
+  "m:read-secret": {
+    "topChild": true,
+    "attrs": {
+      "vault": null,
+      "property": null,
+      "alias": null
+    },
+    "children": []
+  },
+  "m:to-connection": {
+    "topChild": true,
+    "attrs": {
+      "name": null,
+      "path": null,
+      "dynamic": [
+        "true",
+        "false"
+      ]
+    },
+    "children": []
+  },
+  "m:use-connection": {
+    "topChild": true,
+    "attrs": {
+      "name": null
+    },
+    "children": []
+  },
+  "m:entaxy-trace": {
+    "topChild": true,
+    "attrs": {
+      "reset": [
+        "true",
+        "false"
+      ]
+    },
+    "children": [
+      "expressionDefinition",
+      "constant",
+      "exchangeProperty",
+      "groovy",
+      "header",
+      "hl7terser",
+      "jsonpath",
+      "language",
+      "method",
+      "mvel",
+      "ognl",
+      "ref",
+      "simple",
+      "spel",
+      "tokenize",
+      "xtokenize",
+      "xpath",
+      "xquery"
+    ]
+  },
+  "m:call-route": {
+    "topChild": true,
+    "attrs": {
+      "name": null,
+      "library": null,
+      "async": [
+        "true",
+        "false"
+      ]
+    },
+    "children": []
+  },
+  "m:set-log-key": {
+    "topChild": true,
+    "children": [
+      "m:service",
+      "m:operation",
+      "m:objectId",
+      "m:parameter",
+      "m:sender",
+      "m:receiver",
+      "m:custom"
+    ]
+  },
+  "m:service": {
+    "attrs": {
+      "reset": [
+        "true",
+        "false"
+      ]
+    },
+    "children": [
+      "expressionDefinition",
+      "constant",
+      "exchangeProperty",
+      "groovy",
+      "header",
+      "hl7terser",
+      "jsonpath",
+      "language",
+      "method",
+      "mvel",
+      "ognl",
+      "ref",
+      "simple",
+      "spel",
+      "tokenize",
+      "xtokenize",
+      "xpath",
+      "xquery"
+    ]
+  },
+  "m:operation": {
+    "attrs": {
+      "reset": [
+        "true",
+        "false"
+      ]
+    },
+    "children": [
+      "expressionDefinition",
+      "constant",
+      "exchangeProperty",
+      "groovy",
+      "header",
+      "hl7terser",
+      "jsonpath",
+      "language",
+      "method",
+      "mvel",
+      "ognl",
+      "ref",
+      "simple",
+      "spel",
+      "tokenize",
+      "xtokenize",
+      "xpath",
+      "xquery"
+    ]
+  },
+  "m:objectId": {
+    "attrs": {
+      "reset": [
+        "true",
+        "false"
+      ]
+    },
+    "children": [
+      "expressionDefinition",
+      "constant",
+      "exchangeProperty",
+      "groovy",
+      "header",
+      "hl7terser",
+      "jsonpath",
+      "language",
+      "method",
+      "mvel",
+      "ognl",
+      "ref",
+      "simple",
+      "spel",
+      "tokenize",
+      "xtokenize",
+      "xpath",
+      "xquery"
+    ]
+  },
+  "m:parameter": {
+    "attrs": {
+      "reset": [
+        "true",
+        "false"
+      ]
+    },
+    "children": [
+      "expressionDefinition",
+      "constant",
+      "exchangeProperty",
+      "groovy",
+      "header",
+      "hl7terser",
+      "jsonpath",
+      "language",
+      "method",
+      "mvel",
+      "ognl",
+      "ref",
+      "simple",
+      "spel",
+      "tokenize",
+      "xtokenize",
+      "xpath",
+      "xquery"
+    ]
+  },
+  "m:sender": {
+    "attrs": {
+      "reset": [
+        "true",
+        "false"
+      ]
+    },
+    "children": [
+      "expressionDefinition",
+      "constant",
+      "exchangeProperty",
+      "groovy",
+      "header",
+      "hl7terser",
+      "jsonpath",
+      "language",
+      "method",
+      "mvel",
+      "ognl",
+      "ref",
+      "simple",
+      "spel",
+      "tokenize",
+      "xtokenize",
+      "xpath",
+      "xquery"
+    ]
+  },
+  "m:receiver": {
+    "attrs": {
+      "reset": [
+        "true",
+        "false"
+      ]
+    },
+    "children": [
+      "expressionDefinition",
+      "constant",
+      "exchangeProperty",
+      "groovy",
+      "header",
+      "hl7terser",
+      "jsonpath",
+      "language",
+      "method",
+      "mvel",
+      "ognl",
+      "ref",
+      "simple",
+      "spel",
+      "tokenize",
+      "xtokenize",
+      "xpath",
+      "xquery"
+    ]
+  },
+  "m:custom": {
+    "attrs": {
+      "name": null,
+      "reset": [
+        "true",
+        "false"
+      ]
+    },
+    "children": [
+      "expressionDefinition",
+      "constant",
+      "exchangeProperty",
+      "groovy",
+      "header",
+      "hl7terser",
+      "jsonpath",
+      "language",
+      "method",
+      "mvel",
+      "ognl",
+      "ref",
+      "simple",
+      "spel",
+      "tokenize",
+      "xtokenize",
+      "xpath",
+      "xquery"
+    ]
+  },
+  "m:log": {
+    "topChild": true,
+    "attrs": {
+      "message": null,
+      "loggingLevel": [
+        "TRACE",
+        "DEBUG",
+        "INFO",
+        "WARN",
+        "ERROR",
+        "OFF"
+      ],
+      "logName": null,
+      "marker": null,
+      "loggerRef": null,
+      "inheritErrorHandler": [
+        "true",
+        "false"
+      ],
+      "customId": [
+        "true",
+        "false"
+      ],
+      "id": null
+    },
+    "children": [
+      "description"
+    ]
+  },
+  "m:map-data": {
+    "topChild": true,
+    "attrs": {
+      "mapper": null,
+      "map": null,
+      "trimForString": [
+        "true",
+        "false"
+      ],
+      "noDataAction": [
+        "USE_ORIGIN",
+        "RETURN_NULL",
+        "RETURN_VALUE",
+        "THROW_EXCEPTION"
+      ],
+      "noDataValue": null,
+      "returnTo": null
+    },
+    "children": [
+      "expressionDefinition",
+      "constant",
+      "exchangeProperty",
+      "groovy",
+      "header",
+      "hl7terser",
+      "jsonpath",
+      "language",
+      "method",
+      "mvel",
+      "ognl",
+      "ref",
+      "simple",
+      "spel",
+      "tokenize",
+      "xtokenize",
+      "xpath",
+      "xquery"
+    ]
+  },
+  "m:ignite-cache": {
+    "topChild": true,
+    "attrs": {
+      "target": null,
+      "targetType": [
+        "header",
+        "body",
+        "property"
+      ],
+      "key": null,
+      "action": [
+        "GET",
+        "PUT",
+        "REMOVE",
+        "SIZE",
+        "REBALANCE",
+        "QUERY",
+        "CLEAR"
+      ],
+      "cacheName": null,
+      "propagateIncomingBodyIfNoReturnValue": [
+        "true",
+        "false"
+      ],
+      "synchronous": [
+        "true",
+        "false"
+      ],
+      "query": null,
+      "exchangePattern": [
+        "InOnly",
+        "InOut",
+        "InOptionalOut"
+      ],
+      "pageSize": null,
+      "remoteFilter": null,
+      "autoUnsubscribe": [
+        "true",
+        "false"
+      ],
+      "lazyStartProducer": [
+        "true",
+        "false"
+      ],
+      "bridgeErrorHandler": [
+        "true",
+        "false"
+      ],
+      "oneExchangePerUpdate": [
+        "true",
+        "false"
+      ],
+      "treatCollectionsAsCacheObjects": [
+        "true",
+        "false"
+      ],
+      "fireExistingQueryResults": [
+        "true",
+        "false"
+      ],
+      "cachePeekMode": [
+        "ALL",
+        "NEAR",
+        "PRIMARY",
+        "BACKUP",
+        "ONHEAP",
+        "OFFHEAP"
+      ],
+      "failIfInexistentCache": [
+        "true",
+        "false"
+      ],
+      "timeInterval": null,
+      "exceptionHandler": null
+    },
+    "children": [
+      "expressionDefinition",
+      "constant",
+      "exchangeProperty",
+      "groovy",
+      "header",
+      "hl7terser",
+      "jsonpath",
+      "language",
+      "method",
+      "mvel",
+      "ognl",
+      "ref",
+      "simple",
+      "spel",
+      "tokenize",
+      "xtokenize",
+      "xpath",
+      "xquery"
+    ]
+  },
+  "m:cache-read": {
+    "topChild": true,
+    "attrs": {
+      "target": null,
+      "targetType": [
+        "header",
+        "body",
+        "property"
+      ],
+      "key": null,
+      "cacheName": null,
+      "propagateIncomingBodyIfNoReturnValue": [
+        "true",
+        "false"
+      ],
+      "synchronous": [
+        "true",
+        "false"
+      ],
+      "query": null,
+      "exchangePattern": [
+        "InOnly",
+        "InOut",
+        "InOptionalOut"
+      ],
+      "pageSize": null,
+      "remoteFilter": null,
+      "autoUnsubscribe": [
+        "true",
+        "false"
+      ],
+      "lazyStartProducer": [
+        "true",
+        "false"
+      ],
+      "bridgeErrorHandler": [
+        "true",
+        "false"
+      ],
+      "oneExchangePerUpdate": [
+        "true",
+        "false"
+      ],
+      "treatCollectionsAsCacheObjects": [
+        "true",
+        "false"
+      ],
+      "fireExistingQueryResults": [
+        "true",
+        "false"
+      ],
+      "cachePeekMode": [
+        "ALL",
+        "NEAR",
+        "PRIMARY",
+        "BACKUP",
+        "ONHEAP",
+        "OFFHEAP"
+      ],
+      "failIfInexistentCache": [
+        "true",
+        "false"
+      ],
+      "timeInterval": null,
+      "exceptionHandler": null
+    },
+    "children": []
+  },
+  "m:cache-write": {
+    "topChild": true,
+    "attrs": {
+      "cacheName": null,
+      "propagateIncomingBodyIfNoReturnValue": [
+        "true",
+        "false"
+      ],
+      "synchronous": [
+        "true",
+        "false"
+      ],
+      "query": null,
+      "exchangePattern": [
+        "InOnly",
+        "InOut",
+        "InOptionalOut"
+      ],
+      "pageSize": null,
+      "remoteFilter": null,
+      "autoUnsubscribe": [
+        "true",
+        "false"
+      ],
+      "lazyStartProducer": [
+        "true",
+        "false"
+      ],
+      "bridgeErrorHandler": [
+        "true",
+        "false"
+      ],
+      "oneExchangePerUpdate": [
+        "true",
+        "false"
+      ],
+      "treatCollectionsAsCacheObjects": [
+        "true",
+        "false"
+      ],
+      "fireExistingQueryResults": [
+        "true",
+        "false"
+      ],
+      "cachePeekMode": [
+        "ALL",
+        "NEAR",
+        "PRIMARY",
+        "BACKUP",
+        "ONHEAP",
+        "OFFHEAP"
+      ],
+      "failIfInexistentCache": [
+        "true",
+        "false"
+      ],
+      "timeInterval": null,
+      "exceptionHandler": null
+    },
+    "children": [
+      "expressionDefinition",
+      "constant",
+      "exchangeProperty",
+      "groovy",
+      "header",
+      "hl7terser",
+      "jsonpath",
+      "language",
+      "method",
+      "mvel",
+      "ognl",
+      "ref",
+      "simple",
+      "spel",
+      "tokenize",
+      "xtokenize",
+      "xpath",
+      "xquery"
+    ]
+  },
+  "m:filter": {
+    "topChild": true,
+    "attrs": {
+      "inheritErrorHandler": [
+        "true",
+        "false"
+      ],
+      "customId": [
+        "true",
+        "false"
+      ],
+      "id": null
+    },
+    "children": [
+      "description",
+      "expressionDefinition",
+      "constant",
+      "exchangeProperty",
+      "groovy",
+      "header",
+      "hl7terser",
+      "jsonpath",
+      "language",
+      "method",
+      "mvel",
+      "ognl",
+      "ref",
+      "simple",
+      "spel",
+      "tokenize",
+      "xtokenize",
+      "xpath",
+      "xquery",
+      "onException",
+      "when",
+      "onCompletion",
+      "intercept",
+      "interceptFrom",
+      "interceptSendToEndpoint",
+      "to",
+      "toD",
+      "route",
+      "aggregate",
+      "bean",
+      "doCatch",
+      "choice",
+      "otherwise",
+      "circuitBreaker",
+      "claimCheck",
+      "convertBodyTo",
+      "delay",
+      "dynamicRouter",
+      "enrich",
+      "filter",
+      "doFinally",
+      "idempotentConsumer",
+      "inOnly",
+      "inOut",
+      "loadBalance",
+      "log",
+      "loop",
+      "marshal",
+      "multicast",
+      "onFallback",
+      "pipeline",
+      "policy",
+      "pollEnrich",
+      "process",
+      "recipientList",
+      "removeHeader",
+      "removeHeaders",
+      "removeProperties",
+      "removeProperty",
+      "resequence",
+      "rollback",
+      "routingSlip",
+      "saga",
+      "sample",
+      "script",
+      "setBody",
+      "setExchangePattern",
+      "setHeader",
+      "setProperty",
+      "sort",
+      "split",
+      "step",
+      "stop",
+      "threads",
+      "throttle",
+      "throwException",
+      "transacted",
+      "transform",
+      "doTry",
+      "unmarshal",
+      "validate",
+      "whenSkipSendToEndpoint",
+      "wireTap",
+      "serviceCall",
+      "m:standard-router",
+      "m:set-destination",
+      "m:default-destination",
+      "m:prefer-connector",
+      "m:next-route",
+      "m:respond",
+      "m:xpath",
+      "m:xslt",
+      "m:xslt-xalan",
+      "m:atlasmap",
+      "m:read-secret",
+      "m:to-connection",
+      "m:use-connection",
+      "m:entaxy-trace",
+      "m:call-route",
+      "m:set-log-key",
+      "m:log",
+      "m:map-data",
+      "m:ignite-cache",
+      "m:cache-read",
+      "m:cache-write",
+      "m:set-content",
+      "m:filter",
+      "m:threshold-filter"
+    ]
+  },
+  "m:threshold-filter": {
+    "topChild": true,
+    "attrs": {
+      "id": null,
+      "accept": [
+        "greaterOrEqual",
+        "greater",
+        "less",
+        "lessOrEqual",
+        "equal"
+      ],
+      "update": [
+        "true",
+        "false"
+      ],
+      "acceptNull": [
+        "true",
+        "false"
+      ]
+    },
+    "children": [
+      "m:filter-key",
+      "m:test-value"
+    ]
+  },
+  "m:filter-key": {
+    "children": [
+      "expressionDefinition",
+      "constant",
+      "exchangeProperty",
+      "groovy",
+      "header",
+      "hl7terser",
+      "jsonpath",
+      "language",
+      "method",
+      "mvel",
+      "ognl",
+      "ref",
+      "simple",
+      "spel",
+      "tokenize",
+      "xtokenize",
+      "xpath",
+      "xquery"
+    ]
+  },
+  "m:test-value": {
+    "children": [
+      "expressionDefinition",
+      "constant",
+      "exchangeProperty",
+      "groovy",
+      "header",
+      "hl7terser",
+      "jsonpath",
+      "language",
+      "method",
+      "mvel",
+      "ognl",
+      "ref",
+      "simple",
+      "spel",
+      "tokenize",
+      "xtokenize",
+      "xpath",
+      "xquery"
+    ]
+  },
+  "m:description": {
+    "attrs": {
+      "lang": null
+    },
+    "children": []
+  },
+  "m:set-content": {
+    "topChild": true,
+    "attrs": {
+      "id": null,
+      "targetType": [
+        "body",
+        "header",
+        "property"
+      ],
+      "target": null,
+      "type": [
+        "xml",
+        "json",
+        "raw"
+      ]
+    },
+    "children": [
+      "m:description",
+      "m:args",
+      "m:content",
+      "m:freemarker"
+    ]
+  },
+  "m:content": {
+    "children": []
+  },
+  "m:freemarker": {
+    "attrs": {
+      "contentCache": [
+        "true",
+        "false"
+      ],
+      "encoding": null,
+      "allowContextMapAll": [
+        "true",
+        "false"
+      ],
+      "lazyStartProducer": [
+        "true",
+        "false"
+      ],
+      "templateUpdateDelay": null,
+      "basicPropertyBinding": [
+        "true",
+        "false"
+      ],
+      "synchronous": [
+        "true",
+        "false"
+      ],
+      "localizedLookup": [
+        "true",
+        "false"
+      ],
+      "configuration": null,
+      "interpolationSyntax": [
+        "20",
+        "21",
+        "22"
+      ],
+      "tagSyntax": [
+        "0",
+        "1",
+        "2"
+      ],
+      "resource": null,
+      "fromBody": [
+        "true",
+        "false"
+      ],
+      "fromHeader": null
+    },
+    "children": []
+  },
+  "m:args": {
+    "children": [
+      "m:arg"
+    ]
+  },
+  "m:arg": {
+    "attrs": {
+      "index": null,
+      "name": null
+    },
+    "children": [
+      "expressionDefinition",
+      "constant",
+      "exchangeProperty",
+      "groovy",
+      "header",
+      "hl7terser",
+      "jsonpath",
+      "language",
+      "method",
+      "mvel",
+      "ognl",
+      "ref",
+      "simple",
+      "spel",
+      "tokenize",
+      "xtokenize",
+      "xpath",
+      "xquery"
+    ]
+  }
+}
diff --git a/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/entaxy-mediators.xsd b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/entaxy-mediators.xsd
new file mode 100644
index 00000000..96a348c4
--- /dev/null
+++ b/platform/runtime/core/objects-implementations/route-implementation/route-producing/src/main/resources/ru/entaxy/component-library/entaxy-main/entaxy-mediators.xsd
@@ -0,0 +1,1253 @@
+
+
+    
+    
+    
+    
+    
+        
+            
+                
+                
+                
+                
+            
+        
+    
+    
+        
+            
+            
+        
+    
+    
+        
+            
+            
+            
+        
+    
+    
+        
+            
+            
+            
+            
+                
+                    
+                        
+                        
+                        
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+        
+    
+    
+        
+            
+            
+                
+                    
+                        
+                        
+                        
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+            
+                
+                    
+                
+            
+        
+    
+    
+        
+            
+            
+            
+            
+                
+                    
+                        
+                        
+                        
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+        
+    
+    
+        
+            
+            
+            
+            
+                
+                    
+                        
+                        
+                        
+                    
+                
+            
+            
+            
+            
+            
+                
+                    
+                        
+                        
+                        
+                    
+                
+            
+            
+            
+        
+    
+    
+        
+            
+            
+            
+        
+    
+    
+        
+            
+                
+            
+            
+            
+            
+        
+    
+    
+        
+            
+        
+    
+    
+    
+        
+            
+            
+            
+        
+    
+    
+        
+            
+                
+                
+                
+                
+                
+                
+                
+                    
+                        
+                            
+                                
+                            
+                        
+                    
+                
+            
+        
+    
+    
+        
+            
+                
+                    
+                    
+                        
+                            
+                        
+                    
+                    
+                        
+                            
+                        
+                        
+                            
+                                
+                                
+                                
+                                
+                                
+                            
+                        
+                    
+                    
+                        
+                            
+                        
+                    
+                    
+                        
+                            
+                        
+                    
+                    
+                        
+                            
+                        
+                    
+                
+            
+        
+    
+    
+        
+            
+        
+    
+    
+        
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+        
+        
+    
+    
+        
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+        
+    
+    
+        
+            
+                
+                
+                
+                
+                    
+                        
+                            
+                            
+                            
+                            
+                        
+                    
+                
+                
+                
+            
+        
+    
+    
+    
+        
+            
+                
+                
+                    
+                        
+                            
+                            
+                            
+                        
+                    
+                
+                
+                
+                    
+                        
+                            
+                            
+                            
+                            
+                            
+                            
+                            
+                        
+                    
+                
+                
+                
+                    
+                        
+                    
+                
+                
+                    
+                        
+                    
+                
+                
+                    
+                        
+                    
+                
+                
+                    
+                        
+                    
+                     
+                        
+                            
+                            
+                            
+                        
+                    
+                
+                
+                    
+                        
+                    
+                
+                
+                    
+                        
+                    
+                
+                
+                    
+                        
+                    
+                
+                
+                    
+                        
+                    
+                
+                
+                    
+                        
+                    
+                
+                
+                    
+                        
+                    
+                
+                
+                    
+                        
+                    
+                
+                
+                    
+                        
+                    
+                
+                
+                    
+                        
+                    
+                    
+                        
+                            
+                            
+                            
+                            
+                            
+                            
+                        
+                    
+                
+                
+                    
+                        
+                    
+                
+                
+                    
+                        
+                    
+                
+                
+                    
+                        
+                    
+                
+            
+        
+    
+    
+
+    
+        
+        
+            
+                
+                    
+                    
+                    
+                
+            
+        
+        
+        
+        
+            
+                
+            
+        
+        
+            
+                
+            
+        
+        
+            
+                
+            
+        
+        
+            
+                
+            
+            
+                
+                    
+                    
+                    
+                
+            
+        
+        
+            
+                
+            
+        
+        
+            
+                
+            
+        
+        
+            
+                
+            
+        
+        
+            
+                
+            
+        
+        
+            
+                
+            
+        
+        
+            
+                
+            
+        
+        
+            
+                
+            
+        
+        
+            
+                
+            
+        
+        
+            
+                
+            
+            
+                
+                    
+                    
+                    
+                    
+                    
+                    
+                
+            
+        
+        
+            
+                
+            
+        
+        
+            
+                
+            
+        
+        
+            
+                
+            
+        
+    
+    
+
+    
+        
+            
+                
+                
+                    
+                        
+                    
+                
+                
+                    
+                        
+                    
+                
+                
+                    
+                        
+                    
+                
+                
+                    
+                        
+                    
+                    
+                        
+                            
+                            
+                            
+                        
+                    
+                
+                
+                    
+                        
+                    
+                
+                
+                    
+                        
+                    
+                
+                
+                    
+                        
+                    
+                
+                
+                    
+                        
+                    
+                
+                
+                    
+                        
+                    
+                
+                
+                    
+                        
+                    
+                
+                
+                    
+                        
+                    
+                
+                
+                    
+                        
+                    
+                
+                
+                    
+                        
+                    
+                    
+                        
+                            
+                            
+                            
+                            
+                            
+                            
+                        
+                    
+                
+                
+                    
+                        
+                    
+                
+                
+                    
+                        
+                    
+                
+                
+                    
+                        
+                    
+                
+            
+        
+    
+    
+
+    
+        
+            
+                
+                    
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                    
+                    
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                        
+                    
+                
+            
+        
+    
+    
+
+    
+        
+            
+            
+        
+        
+        
+            
+                
+                    
+                    
+                    
+                    
+                    
+                
+            
+        
+        
+        
+    
+    
+
+    
+        
+            
+                
+            
+            
+                
+                
+            
+            
+        
+        
+        
+            
+                
+                    
+                    
+                    
+                
+            
+        
+        
+            
+                
+                    
+                    
+                    
+                
+            
+        
+        
+    
+    
+    
+        
+             use template from resource provider
+