/*
* Copyright 2014-2016 CyberVision, Inc.
*
* 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 org.kaaproject.kaa.server.control.service.sdk.event;
import org.kaaproject.kaa.common.dto.event.ApplicationEventAction;
import org.kaaproject.kaa.common.dto.event.ApplicationEventMapDto;
import org.kaaproject.kaa.server.control.service.sdk.SdkGenerator;
import org.kaaproject.kaa.server.control.service.sdk.compiler.JavaDynamicBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class JavaEventClassesGenerator {
private static final Logger LOG = LoggerFactory.getLogger(JavaEventClassesGenerator.class);
private static final String FOLDER = "sdk/java/event/";
private static final String EVENT_FAMILY_FACTORY = "EventFamilyFactory";
private static final String EVENT_FAMILY_JAVA_TEMPLATE = FOLDER + "EventFamily.java.template";
private static final String EVENT_FAMILY_FACTORY_JAVA_TEMPLATE = FOLDER
+ "EventFamilyFactory.java.template";
private static final String EVENT_FAMILY_ADD_SUPPORTED_FQN_TEMPLATE = FOLDER
+ "eventFamilyAddSupportedFqn.template";
private static final String EVENT_FAMILY_ON_GENERIC_EVENT_TEMPLATE = FOLDER
+ "eventFamilyOnGenericEvent.template";
private static final String EVENT_FAMILY_SEND_EVENT_METHODS_TEMPLATE = FOLDER
+ "eventFamilySendEventMethods.template";
private static final String EVENT_FAMILY_LISTENER_METHOD_TEMPLATE = FOLDER
+ "eventFamilyListenerMethod.template";
private static final String EVENT_FAMILY_FACTORY_METHOD_TEMPLATE = FOLDER
+ "eventFamilyFactoryMethod.template";
private static final String EVENT_FAMILY_NAMESPACE_VAR = "\\$\\{event_family_namespace\\}";
private static final String EVENT_FAMILY_CLASS_NAME_VAR = "\\$\\{event_family_class_name\\}";
private static final String EVENT_FAMILY_VAR_NAME_VAR = "\\$\\{event_family_var_name\\}";
private static final String ADD_SUPPORTED_EVENT_CLASS_FQNS_VAR =
"\\$\\{add_supported_event_class_fqns\\}";
private static final String EVENT_FAMILY_LISTENERS_ON_GENERIC_EVENT_VAR =
"\\$\\{event_family_listeners_on_generic_event\\}";
private static final String EVENT_FAMILY_SEND_EVENT_METHODS_VAR =
"\\$\\{event_family_send_event_methods\\}";
private static final String EVENT_FAMILY_LISTENER_METHODS_VAR =
"\\$\\{event_family_listener_methods\\}";
private static final String EVENT_CLASS_FQN_VAR = "\\$\\{event_class_fqn\\}";
private static final String EVENT_FAMILY_FACTORY_IMPORTS_VAR =
"\\$\\{event_family_factory_imports\\}";
private static final String EVENT_FAMILY_FACTORY_METHODS_VAR =
"\\$\\{event_family_factory_methods\\}";
private static String eventFamilyJava;
private static String eventFamilyAddSupportedFqn;
private static String eventFamilyOnGenericEvent;
private static String eventFamilySendEventMethod;
private static String eventFamilyListenerMethod;
private static String eventFamilyFactoryJava;
private static String eventFamilyFactoryMethod;
static {
try {
eventFamilyJava = SdkGenerator.readResource(EVENT_FAMILY_JAVA_TEMPLATE);
eventFamilyAddSupportedFqn = SdkGenerator
.readResource(EVENT_FAMILY_ADD_SUPPORTED_FQN_TEMPLATE);
eventFamilyOnGenericEvent = SdkGenerator
.readResource(EVENT_FAMILY_ON_GENERIC_EVENT_TEMPLATE);
eventFamilySendEventMethod = SdkGenerator
.readResource(EVENT_FAMILY_SEND_EVENT_METHODS_TEMPLATE);
eventFamilyListenerMethod = SdkGenerator.readResource(EVENT_FAMILY_LISTENER_METHOD_TEMPLATE);
eventFamilyFactoryJava = SdkGenerator.readResource(EVENT_FAMILY_FACTORY_JAVA_TEMPLATE);
eventFamilyFactoryMethod = SdkGenerator.readResource(EVENT_FAMILY_FACTORY_METHOD_TEMPLATE);
} catch (IOException ex) {
LOG.error("Unable to initialize JavaEventClassesGenerator", ex);
}
}
private JavaEventClassesGenerator() {
}
/**
* Generate event classes for event family metadata.
*
* @param eventFamilies the event family metadata
* @return the list of event classes
*/
public static List<JavaDynamicBean> generateEventClasses(
List<EventFamilyMetadata> eventFamilies) {
List<JavaDynamicBean> javaSources = new ArrayList<>();
String eventFamilyFactoryImports = "";
String eventFamilyFactoryMethods = "";
for (EventFamilyMetadata efm : eventFamilies) {
eventFamilyFactoryImports += "import "
+ efm.getEcfNamespace()
+ "."
+ efm.getEcfClassName() + ";\n";
String eventFamilyVarName = efm.getEcfClassName().substring(0, 1).toLowerCase();
if (efm.getEcfClassName().length() > 1) {
eventFamilyVarName += efm.getEcfClassName().substring(1);
}
eventFamilyFactoryMethods += eventFamilyFactoryMethod
.replaceAll(EVENT_FAMILY_CLASS_NAME_VAR, efm.getEcfClassName())
.replaceAll(EVENT_FAMILY_VAR_NAME_VAR, eventFamilyVarName);
String addSupportedEventClassFqns = "";
String eventFamilyListenersOnGenericEvent = "";
String eventFamilySendEventMethods = "";
String eventFamilyListenerMethods = "";
for (ApplicationEventMapDto eventMap : efm.getEventMaps()) {
if (eventMap.getAction() == ApplicationEventAction.SINK
|| eventMap.getAction() == ApplicationEventAction.BOTH) {
addSupportedEventClassFqns += eventFamilyAddSupportedFqn
.replaceAll(EVENT_CLASS_FQN_VAR, eventMap.getFqn()) + "\n";
if (eventFamilyListenersOnGenericEvent.length() > 0) {
eventFamilyListenersOnGenericEvent += "else ";
}
eventFamilyListenersOnGenericEvent += eventFamilyOnGenericEvent
.replaceAll(EVENT_CLASS_FQN_VAR, eventMap.getFqn()) + "\n";
eventFamilyListenerMethods += eventFamilyListenerMethod
.replaceAll(EVENT_CLASS_FQN_VAR, eventMap.getFqn()) + "\n";
}
if (eventMap.getAction() == ApplicationEventAction.SOURCE
|| eventMap.getAction() == ApplicationEventAction.BOTH) {
eventFamilySendEventMethods += eventFamilySendEventMethod
.replaceAll(EVENT_CLASS_FQN_VAR, eventMap.getFqn()) + "\n";
}
}
String eventFamilySource = eventFamilyJava
.replaceAll(EVENT_FAMILY_NAMESPACE_VAR, efm.getEcfNamespace())
.replaceAll(EVENT_FAMILY_CLASS_NAME_VAR, efm.getEcfClassName())
.replaceAll(ADD_SUPPORTED_EVENT_CLASS_FQNS_VAR, addSupportedEventClassFqns)
.replaceAll(
EVENT_FAMILY_LISTENERS_ON_GENERIC_EVENT_VAR,
eventFamilyListenersOnGenericEvent
)
.replaceAll(EVENT_FAMILY_SEND_EVENT_METHODS_VAR, eventFamilySendEventMethods)
.replaceAll(EVENT_FAMILY_LISTENER_METHODS_VAR, eventFamilyListenerMethods);
LOG.trace("Going to compile {} using source {}", efm.getEcfClassName(), eventFamilySource);
JavaDynamicBean eventFamily = new JavaDynamicBean(efm.getEcfClassName(), eventFamilySource);
javaSources.add(eventFamily);
}
String eventFamilyFactorySource = eventFamilyFactoryJava
.replaceAll(EVENT_FAMILY_FACTORY_IMPORTS_VAR, eventFamilyFactoryImports)
.replaceAll(EVENT_FAMILY_FACTORY_METHODS_VAR, eventFamilyFactoryMethods);
LOG.trace("Going to compile {} using source {}",
EVENT_FAMILY_FACTORY, eventFamilyFactorySource);
JavaDynamicBean eventFamilyFactory = new JavaDynamicBean(
EVENT_FAMILY_FACTORY, eventFamilyFactorySource);
javaSources.add(eventFamilyFactory);
return javaSources;
}
}