ENTAXY-248 release 1.8.1

This commit is contained in:
2022-02-28 15:20:38 +03:00
parent 4d274c4fcc
commit c826adf1db
1958 changed files with 195926 additions and 10280 deletions

View File

@ -5,7 +5,7 @@
<parent>
<groupId>ru.entaxy.esb.platform.runtime.base.connecting</groupId>
<artifactId>generator</artifactId>
<version>1.8.0</version>
<version>1.8.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@ -18,15 +18,56 @@
<properties>
<bundle.osgi.export.pkg>
ru.entaxy.base.generator.template,
ru.entaxy.esb.platform.runtime.base.connecting.generator
</bundle.osgi.export.pkg>
<bundle.osgi.private.pkg>
ru.entaxy.base.generator.template.impl,
ru.entaxy.esb.platform.runtime.base.connecting.generator.impl
</bundle.osgi.private.pkg>
</properties>
<dependencies>
<dependencies>
<dependency>
<groupId>org.apache.karaf</groupId>
<artifactId>org.apache.karaf.util</artifactId>
</dependency>
<dependency>
<groupId>ru.entaxy.esb.platform.runtime.base</groupId>
<artifactId>base-support</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>ru.entaxy.esb.system.management.blueprint.generator</groupId>
<artifactId>blueprint-generator</artifactId>
<version>${project.version}</version>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
</dependencies>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.service.component.annotations</artifactId>
<version>1.4.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ru.entaxy.esb.system.core</groupId>
<artifactId>template</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>${maven-bundle-plugin.version}</version>
<extensions>true</extensions>
<configuration>
<instructions>
<_dsannotations>*</_dsannotations>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,33 @@
/*-
* ~~~~~~licensing~~~~~~
* generator-api
* ==========
* Copyright (C) 2020 - 2021 EmDev LLC
* ==========
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ~~~~~~/licensing~~~~~~
*/
package ru.entaxy.base.generator.template;
import java.net.URL;
public interface Template {
public URL getTemplateLocation();
public String getId();
public String getType();
public String getTemplateName();
public String getTemplateFileName();
public String getTemplateFullName();
}

View File

@ -0,0 +1,32 @@
/*-
* ~~~~~~licensing~~~~~~
* generator-api
* ==========
* Copyright (C) 2020 - 2021 EmDev LLC
* ==========
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ~~~~~~/licensing~~~~~~
*/
package ru.entaxy.base.generator.template;
import java.util.List;
import java.util.Map;
import ru.entaxy.esb.platform.runtime.base.connecting.generator.Generated;
public interface TemplateAwareGenerator {
public List<String> getSupportedTemplateTypes();
public Generated generate(Template template, Map<String, Object> properties) throws Exception;
}

View File

@ -0,0 +1,124 @@
/*-
* ~~~~~~licensing~~~~~~
* generator-api
* ==========
* Copyright (C) 2020 - 2021 EmDev LLC
* ==========
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ~~~~~~/licensing~~~~~~
*/
package ru.entaxy.base.generator.template;
import java.net.MalformedURLException;
import java.net.URL;
import org.osgi.framework.BundleContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.entaxy.base.generator.template.impl.ProvidedTemplate;
import ru.entaxy.platform.base.support.CommonUtils;
public class TemplateImpl implements Template {
private static final Logger log = LoggerFactory.getLogger(TemplateImpl.class);
protected BundleContext bundleContext;
protected String id;
protected String name;
protected String filename;
protected String fullname;
protected String type;
protected String path;
protected String description;
protected String templateLocation;
public void load(ProvidedTemplate providedTemplate) {
id = providedTemplate.getId();
name = providedTemplate.getName();
filename = providedTemplate.getFilename();
fullname = providedTemplate.getFullname();
type = providedTemplate.getType();
path = providedTemplate.getPath();
if (!path.endsWith("/"))
path += "/";
description = providedTemplate.getDescription();
}
@Override
public URL getTemplateLocation() {
if (CommonUtils.isValid(templateLocation))
try {
return new URL(templateLocation);
} catch (MalformedURLException e) {
log.warn("Invalid template location: [" + templateLocation + "]", e);
}
return this.bundleContext.getBundle().getEntry(path);
}
@Override
public String getTemplateFileName() {
return !CommonUtils.isValid(filename) ? name : filename;
}
@Override
public String getTemplateFullName() {
return CommonUtils.getValid(fullname, getTemplateFileName() + "." + type);
};
@Override
public String getType() {
return type;
}
@Override
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public void setType(String type) {
this.type = type;
}
public void setTemplateFullName(String fullname) {
this.fullname = fullname;
}
public void setTemplateLocation(String templateLocation) {
this.templateLocation = templateLocation;
}
public void setPath(String path) {
this.path = path;
}
@Override
public String getTemplateName() {
return name;
}
public void setTemplateName(String name) {
this.name = name;
}
public void setBundleContext(BundleContext bundleContext) {
this.bundleContext = bundleContext;
}
}

View File

@ -0,0 +1,36 @@
/*-
* ~~~~~~licensing~~~~~~
* generator-api
* ==========
* Copyright (C) 2020 - 2021 EmDev LLC
* ==========
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ~~~~~~/licensing~~~~~~
*/
package ru.entaxy.base.generator.template;
import java.util.List;
public interface TemplateService {
public static final String TEMPLATE_PROVIDER_HEADER = "Entaxy-Template-Provider";
public static final String PROP_ID = "template.id";
public static final String PROP_TYPE = "template.type";
public static final String PROP_NAME = "template.name";
public static final String PROP_DESCRIPTION = "template.description";
public List<Template> getAllTemplates();
public Template getTemplateById(String id);
}

View File

@ -0,0 +1,49 @@
/*-
* ~~~~~~licensing~~~~~~
* generator-api
* ==========
* Copyright (C) 2020 - 2021 EmDev LLC
* ==========
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ~~~~~~/licensing~~~~~~
*/
package ru.entaxy.base.generator.template.impl;
import org.apache.karaf.util.tracker.annotation.Services;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
@Services
public class Activator implements BundleActivator {
TemplateBundleTracker tracker;
@Override
public void start(BundleContext context) throws Exception {
tracker = new TemplateBundleTracker(context
, Bundle.ACTIVE
, new TemplateBundleTrackerCustomizer());
tracker.open();
}
@Override
public void stop(BundleContext context) throws Exception {
tracker.close();
}
}

View File

@ -0,0 +1,129 @@
/*-
* ~~~~~~licensing~~~~~~
* generator-api
* ==========
* Copyright (C) 2020 - 2021 EmDev LLC
* ==========
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ~~~~~~/licensing~~~~~~
*/
package ru.entaxy.base.generator.template.impl;
import java.net.URL;
import java.util.ArrayList;
import java.util.Dictionary;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
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 ru.entaxy.base.generator.template.TemplateService;
import ru.entaxy.esb.system.core.template.Template;
@Component(immediate = true)
public class LegacyTemplateAdapter {
BundleContext bundleContext = null;
List<Template> delayedTemplates = new ArrayList<>();
Map<Template, ServiceRegistration<ru.entaxy.base.generator.template.Template>> services = new HashMap<>();
protected class TemplateWrapper implements ru.entaxy.base.generator.template.Template {
Template template;
public TemplateWrapper(Template template) {
this.template = template;
}
@Override
public URL getTemplateLocation() {
return template.getTemplateLocation();
}
@Override
public String getId() {
return template.getTemplateName();
}
@Override
public String getType() {
return "ftl";
}
@Override
public String getTemplateName() {
return template.getTemplateName();
}
@Override
public String getTemplateFileName() {
return template.getTemplateFileName();
}
@Override
public String getTemplateFullName() {
return template.getTemplateFileName() + ".ftl";
}
}
@Reference(cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC, unbind = "removeTemplate")
public void addTemplate(Template template) {
if (bundleContext == null)
delayedTemplates.add(template);
else
wrapTemplate(template);
}
public void removeTemplate(Template template) {
this.services.remove(template);
}
@Activate
public void activate(BundleContext context) {
this.bundleContext = context;
processDelayed();
}
protected void processDelayed() {
for (Template t: delayedTemplates)
wrapTemplate(t);
delayedTemplates.clear();
}
protected void wrapTemplate(Template template) {
URL url = template.getTemplateLocation();
Dictionary<String, String> props = new Hashtable<>();
props.put(TemplateService.PROP_ID, template.getTemplateName());
props.put(TemplateService.PROP_NAME, template.getTemplateName());
props.put(TemplateService.PROP_DESCRIPTION, template.getTemplateName());
props.put(TemplateService.PROP_TYPE, "ftl");
props.put("origin.location", url.toString());
props.put("origin.filename", template.getTemplateFileName());
ServiceRegistration<ru.entaxy.base.generator.template.Template> service =
this.bundleContext.registerService(ru.entaxy.base.generator.template.Template.class
, new TemplateWrapper(template)
, props);
this.services.put(template, service);
}
}

View File

@ -0,0 +1,109 @@
/*-
* ~~~~~~licensing~~~~~~
* generator-api
* ==========
* Copyright (C) 2020 - 2021 EmDev LLC
* ==========
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ~~~~~~/licensing~~~~~~
*/
package ru.entaxy.base.generator.template.impl;
import org.osgi.framework.ServiceRegistration;
import ru.entaxy.base.generator.template.Template;
public class ProvidedTemplate {
protected String id;
protected String name;
protected String filename;
protected String fullname;
protected String type;
protected String path;
protected String description;
public ServiceRegistration<Template> registration;
public ProvidedTemplate() {
}
public ProvidedTemplate(TemplateMetadata templateMetadata) {
this.id = templateMetadata.getId();
this.name = templateMetadata.getName();
this.filename = templateMetadata.getFilename();
this.fullname = templateMetadata.getFullname();
this.type = templateMetadata.getType();
this.path = templateMetadata.getPath();
this.description = templateMetadata.getDescription();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
public String getFullname() {
return fullname;
}
public void setFullname(String fullname) {
this.fullname = fullname;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}

View File

@ -0,0 +1,34 @@
/*-
* ~~~~~~licensing~~~~~~
* generator-api
* ==========
* Copyright (C) 2020 - 2021 EmDev LLC
* ==========
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ~~~~~~/licensing~~~~~~
*/
package ru.entaxy.base.generator.template.impl;
import org.osgi.framework.BundleContext;
import org.osgi.util.tracker.BundleTracker;
import org.osgi.util.tracker.BundleTrackerCustomizer;
public class TemplateBundleTracker extends BundleTracker<TemplateProvider> {
public TemplateBundleTracker(BundleContext context, int stateMask,
BundleTrackerCustomizer<TemplateProvider> customizer) {
super(context, stateMask, customizer);
}
}

View File

@ -0,0 +1,157 @@
/*-
* ~~~~~~licensing~~~~~~
* generator-api
* ==========
* Copyright (C) 2020 - 2021 EmDev LLC
* ==========
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ~~~~~~/licensing~~~~~~
*/
package ru.entaxy.base.generator.template.impl;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.Optional;
import java.util.Properties;
import java.util.stream.Collectors;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleEvent;
import org.osgi.framework.ServiceRegistration;
import org.osgi.util.tracker.BundleTrackerCustomizer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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 com.google.gson.JsonParser;
import ru.entaxy.base.generator.template.Template;
import ru.entaxy.base.generator.template.TemplateImpl;
import ru.entaxy.base.generator.template.TemplateService;
public class TemplateBundleTrackerCustomizer implements BundleTrackerCustomizer<TemplateProvider> {
private static final Logger log = LoggerFactory.getLogger(TemplateBundleTrackerCustomizer.class);
@Override
public TemplateProvider addingBundle(Bundle bundle, BundleEvent event) {
try {
TemplateProvider provider = createTemplateProvider(bundle);
if (provider != null)
register(provider);
return provider;
} catch (Exception e) {
log.error("Error creating TemplateProvider for bundle ["
+ bundle.getBundleId() + "]"
, e);
}
return null;
}
@Override
public void modifiedBundle(Bundle bundle, BundleEvent event, TemplateProvider object) {
// TODO Auto-generated method stub
}
@Override
public void removedBundle(Bundle bundle, BundleEvent event, TemplateProvider object) {
unregister(object);
}
protected TemplateProvider createTemplateProvider(Bundle bundle) throws Exception {
TemplateProvider result = new TemplateProvider();
result.bundle = bundle;
result.bundleContext = bundle.getBundleContext();
boolean isTemplateProvider = Boolean.valueOf(
Optional
.ofNullable(bundle.getHeaders().get(TemplateService.TEMPLATE_PROVIDER_HEADER))
.orElse("false")
);
if (!isTemplateProvider)
return null;
URL metadataUrl = bundle.getEntry(TemplateProvider.TEMPLATE_PATH + "/metadata.json");
String metadata = new BufferedReader (
new InputStreamReader(
metadataUrl.openStream(), StandardCharsets.UTF_8))
.lines()
.collect(Collectors.joining("\n"));
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.create();
JsonElement je = (new JsonParser()).parse(metadata);
JsonObject root = je.getAsJsonObject();
JsonElement templatesElement = root.get("templates");
if (templatesElement == null)
return null;
if (!templatesElement.isJsonArray())
return null;
JsonArray templates = templatesElement.getAsJsonArray();
for (int i=0; i<templates.size(); i++) {
TemplateMetadata meta = gson.fromJson(templates.get(i), TemplateMetadata.class);
ProvidedTemplate providedTemplate = new ProvidedTemplate(meta);
result.providedTemplates.add(providedTemplate);
}
return result;
}
protected void register(TemplateProvider templateProvider) {
for (ProvidedTemplate provided: templateProvider.providedTemplates) {
TemplateImpl template = new TemplateImpl();
template.setBundleContext(templateProvider.bundleContext);
template.load(provided);
// TODO fill object
Dictionary<String, String> props = new Hashtable<String, String>();
props.put(TemplateService.PROP_ID, provided.getId());
props.put(TemplateService.PROP_NAME, provided.getName());
props.put(TemplateService.PROP_TYPE, provided.getType());
props.put(TemplateService.PROP_DESCRIPTION, provided.getDescription());
ServiceRegistration<Template> registration =
templateProvider.bundleContext.registerService(
Template.class, template, props
);
provided.registration = registration;
}
}
protected void unregister(TemplateProvider templateProvider) {
for (ProvidedTemplate provided: templateProvider.providedTemplates) {
provided.registration.unregister();
}
}
}

View File

@ -0,0 +1,97 @@
/*-
* ~~~~~~licensing~~~~~~
* generator-api
* ==========
* Copyright (C) 2020 - 2021 EmDev LLC
* ==========
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ~~~~~~/licensing~~~~~~
*/
package ru.entaxy.base.generator.template.impl;
import java.util.UUID;
import ru.entaxy.platform.base.support.CommonUtils;
public class TemplateMetadata {
protected String id = UUID.randomUUID().toString();
protected String name;
protected String type = "ftl";
protected String filename;
protected String fullname;
protected String path;
protected String description = "";
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getExactName() {
return name;
}
public String getName() {
return CommonUtils.getValid(name, id);
}
public void setName(String name) {
this.name = name;
}
public String getExactFilename() {
return filename;
}
public String getFilename() {
return CommonUtils.getValid(filename, getName());
}
public void setFilename(String filename) {
this.filename = filename;
}
public String getExactFullname() {
return fullname;
}
public String getFullname() {
return CommonUtils.getValid(fullname, getFilename() + "." + getType());
}
public void setFullname(String fullname) {
this.fullname = fullname;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getExactPath() {
return path;
}
public String getPath() {
if (CommonUtils.isValid(path)) {
if (!path.startsWith("/"))
return TemplateProvider.TEMPLATE_PATH + "/" + path;
else
return path;
}
return TemplateProvider.TEMPLATE_PATH;
}
public void setPath(String path) {
this.path = path;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}

View File

@ -0,0 +1,36 @@
/*-
* ~~~~~~licensing~~~~~~
* generator-api
* ==========
* Copyright (C) 2020 - 2021 EmDev LLC
* ==========
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ~~~~~~/licensing~~~~~~
*/
package ru.entaxy.base.generator.template.impl;
import java.util.ArrayList;
import java.util.List;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
public class TemplateProvider {
public static final String TEMPLATE_PATH = "/ru/entaxy/templates";
Bundle bundle;
BundleContext bundleContext;
List<ProvidedTemplate> providedTemplates = new ArrayList<>();
}

View File

@ -0,0 +1,94 @@
/*-
* ~~~~~~licensing~~~~~~
* generator-api
* ==========
* Copyright (C) 2020 - 2021 EmDev LLC
* ==========
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ~~~~~~/licensing~~~~~~
*/
package ru.entaxy.base.generator.template.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.entaxy.base.generator.template.Template;
import ru.entaxy.base.generator.template.TemplateService;
@Component(service = TemplateService.class, immediate = true)
public class TemplateServiceImpl implements TemplateService {
private static final Logger log = LoggerFactory.getLogger(TemplateServiceImpl.class);
private BundleContext bundleContext = null;
protected final Map<String, Template> templates = new HashMap<>();
protected List<ServiceReference<Template>> delayed = new ArrayList<>();
@Reference(cardinality = ReferenceCardinality.MULTIPLE, collectionType = CollectionType.REFERENCE
, policy = ReferencePolicy.DYNAMIC, unbind = "removeTemplate")
public void addTemplate(ServiceReference<Template> templateService) {
log.info("Added template service with id [" + templateService.getProperty(PROP_ID) + "]");
if (this.bundleContext == null)
this.delayed.add(templateService);
else
processTemplate(templateService);
}
public void removeTemplate(ServiceReference<Template> templateService) {
String id = templateService.getProperty(PROP_ID).toString();
this.bundleContext.ungetService(templateService);
this.templates.remove(id);
}
@Activate
public void activate(BundleContext context) {
this.bundleContext = context;
processDelayed();
}
protected void processDelayed() {
for (ServiceReference<Template> ref: delayed)
processTemplate(ref);
delayed.clear();
}
protected void processTemplate(ServiceReference<Template> reference) {
Template t = this.bundleContext.getService(reference);
this.templates.put(t.getId(), t);
}
@Override
public List<Template> getAllTemplates() {
return new ArrayList<>(this.templates.values());
}
@Override
public Template getTemplateById(String id) {
return this.templates.get(id);
}
}

View File

@ -0,0 +1,67 @@
/*-
* ~~~~~~licensing~~~~~~
* generator-api
* ==========
* Copyright (C) 2020 - 2021 EmDev LLC
* ==========
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ~~~~~~/licensing~~~~~~
*/
package ru.entaxy.esb.platform.runtime.base.connecting.generator;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public abstract class AbstractSelfPublishGenerator<T extends AbstractSelfPublishGenerator<T>> implements Generator, GeneratorService {
private static final Logger log = LoggerFactory.getLogger(AbstractSelfPublishGenerator.class);
protected Map<String, Object> initialProperties = new HashMap<>();
@Override
public Generator getGenerator(Map<String, Object> initialProperties) {
String errorClass = "CLASS=[" + this.getClass().getName() + "]";
try {
Constructor<T> constructor = ((Class<T>)this.getClass()).getConstructor();
T instance = constructor.newInstance();
instance.init(initialProperties);
return (Generator) instance;
} catch (NoSuchMethodException | SecurityException e) {
log.error(errorClass, e);
} catch (InstantiationException e) {
log.error(errorClass, e);
} catch (IllegalAccessException e) {
log.error(errorClass, e);
} catch (IllegalArgumentException e) {
log.error(errorClass, e);
} catch (InvocationTargetException e) {
log.error(errorClass, e);
}
return null;
}
@Override
public String getGeneratorId() {
return this.getClass().getName();
}
protected void init(Map<String, Object> initialProperties) {
this.initialProperties.putAll(initialProperties);
}
}

View File

@ -0,0 +1,55 @@
/*-
* ~~~~~~licensing~~~~~~
* generator-api
* ==========
* Copyright (C) 2020 - 2021 EmDev LLC
* ==========
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ~~~~~~/licensing~~~~~~
*/
package ru.entaxy.esb.platform.runtime.base.connecting.generator;
import java.util.Map;
import ru.entaxy.esb.platform.runtime.base.connecting.generator.impl.GeneratedImpl;
public interface Generated {
public static final String GENERATED_TYPE_UNKNOWN = "unknown";
public static final String GENERATED_TYPE_BLUEPRINT = "blueprint";
public static final String GENERATED_TYPE_BLUEPRINT_NODE = "blueprint-node";
public static Generated create() {
return new GeneratedImpl();
}
public static Generated create(Object object) {
return new GeneratedImpl(object);
}
public static Generated create(String type, Object object) {
return new GeneratedImpl(type, object);
}
public String getType();
public Object getObject();
public Map<String, Object> getProperties();
public default boolean isUnknown() {
return GENERATED_TYPE_UNKNOWN.equals(getType());
}
}

View File

@ -19,11 +19,13 @@
*/
package ru.entaxy.esb.platform.runtime.base.connecting.generator;
import ru.entaxy.esb.system.management.blueprint.generator.Blueprint;
import java.util.Map;
public interface Generator {
// TODO: 09.07.2021 Artifact wrapper needed instead of Blueprint (not only blueprint can be return from generator)
public Blueprint generate(Map<String, Object> properties) throws Exception;
public static final String PROP_USAGE_TYPE = "generator.usage.type";
public static final String PROP_TARGET_BUNDLE_CONTEXT = "generator.target.bundle.context";
public String getGeneratorId();
public Generated generate(Map<String, Object> properties) throws Exception;
}

View File

@ -0,0 +1,35 @@
/*-
* ~~~~~~licensing~~~~~~
* generator-api
* ==========
* Copyright (C) 2020 - 2021 EmDev LLC
* ==========
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ~~~~~~/licensing~~~~~~
*/
package ru.entaxy.esb.platform.runtime.base.connecting.generator;
import java.util.HashMap;
import java.util.Map;
public interface GeneratorService {
public static final String PROP_GENERATOR_TYPE = "generator.type";
public default Generator getGenerator() {
return this.getGenerator(new HashMap<String, Object>());
};
public Generator getGenerator(Map<String, Object> initialProperties);
}

View File

@ -0,0 +1,61 @@
/*-
* ~~~~~~licensing~~~~~~
* generator-api
* ==========
* Copyright (C) 2020 - 2021 EmDev LLC
* ==========
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ~~~~~~/licensing~~~~~~
*/
package ru.entaxy.esb.platform.runtime.base.connecting.generator.impl;
import java.util.HashMap;
import java.util.Map;
import ru.entaxy.esb.platform.runtime.base.connecting.generator.Generated;
public class GeneratedImpl implements Generated {
protected String type;
protected Object object;
protected Map<String, Object> properties = new HashMap<>();
public GeneratedImpl() {
this(Generated.GENERATED_TYPE_UNKNOWN, null);
}
public GeneratedImpl(Object object) {
this(Generated.GENERATED_TYPE_UNKNOWN, object);
}
public GeneratedImpl(String type, Object object) {
this.type = null==type?Generated.GENERATED_TYPE_UNKNOWN:type;
this.object = object;
}
@Override
public String getType() {
return this.type;
}
@Override
public Object getObject() {
return this.object;
};
@Override
public Map<String, Object> getProperties() {
return this.properties;
}
}