blob: beb44a2e82ed9ce601d749f946f584eae45b240b [file] [log] [blame]
/**
*
* Copyright (c) 2011, 2018 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
*
* generated by Xtext 2.11.0
*
*/
package org.eclipse.osbp.xtext.signal.jvmmodel
import java.nio.file.Path
import java.util.Date
import java.util.HashSet
import javax.inject.Inject
import org.eclipse.osbp.core.api.persistence.IPersistenceService
import org.eclipse.osbp.datainterchange.api.IDataInterchange
import org.eclipse.osbp.dsl.common.xtext.extensions.AnnotationExtension
import org.eclipse.osbp.runtime.common.event.IEventDispatcher
import org.eclipse.osbp.ui.api.customfields.IBlobService
import org.eclipse.osbp.xtext.datainterchange.DataInterchange
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeGroup
import org.eclipse.osbp.xtext.datainterchange.common.WorkerThreadRunnable
import org.eclipse.osbp.xtext.datainterchange.jvmmodel.DataDSLJvmModelInferrer
import org.eclipse.osbp.xtext.datainterchange.validation.DataDSLValidator
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryPackage
import org.eclipse.osbp.xtext.signal.CronScheduler
import org.eclipse.osbp.xtext.signal.DailyScheduler
import org.eclipse.osbp.xtext.signal.HourlyScheduler
import org.eclipse.osbp.xtext.signal.MonthlyScheduler
import org.eclipse.osbp.xtext.signal.SignalActionTypeEnum
import org.eclipse.osbp.xtext.signal.SignalDSLPackage
import org.eclipse.osbp.xtext.signal.SignalDatainterchange
import org.eclipse.osbp.xtext.signal.SignalDefinition
import org.eclipse.osbp.xtext.signal.SignalExecutionTypeEnum
import org.eclipse.osbp.xtext.signal.SignalFunction
import org.eclipse.osbp.xtext.signal.SignalPackage
import org.eclipse.osbp.xtext.signal.SignalScheduler
import org.eclipse.osbp.xtext.signal.SignalTask
import org.eclipse.osbp.xtext.signal.SignalWatcher
import org.eclipse.osbp.xtext.signal.WeeklyScheduler
import org.eclipse.osbp.xtext.signal.common.SchedulerImpl
import org.eclipse.osbp.xtext.signal.common.SchedulerJobImpl
import org.eclipse.osbp.xtext.signal.common.WatcherImpl
import org.eclipse.osbp.xtext.signal.common.WatcherJobImpl
import org.eclipse.xtext.common.types.JvmField
import org.eclipse.xtext.common.types.JvmGenericType
import org.eclipse.xtext.common.types.JvmVisibility
import org.eclipse.xtext.naming.IQualifiedNameProvider
import org.eclipse.xtext.xbase.jvmmodel.AbstractModelInferrer
import org.eclipse.xtext.xbase.jvmmodel.IJvmDeclaredTypeAcceptor
import org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder
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.quartz.Job
import org.quartz.JobDetail
import org.quartz.JobExecutionContext
import org.quartz.JobExecutionException
import org.quartz.Scheduler
import org.quartz.SchedulerException
import org.quartz.Trigger
import org.slf4j.Logger
import java.nio.file.FileSystem
import java.nio.file.FileSystems
/**
* <p>Infers a JVM model from the source model.</p>
*
* <p>The JVM model should contain all elements that would appear in the Java code
* which is generated from the source model. Other models link against the JVM model rather than the source model.</p>
*/
class SignalDSLJvmModelInferrer extends AbstractModelInferrer {
/**
* convenience API to build and initialize JVM types and their members.
*/
@Inject extension JvmTypesBuilder
@Inject extension IQualifiedNameProvider
@Inject extension AnnotationExtension
@Inject extension DataDSLJvmModelInferrer df
@Inject extension DataDSLValidator dv
private var operationlist = <String>newHashSet
/**
* infer model on package base. Will be called for every defined package.
*
* @param dataInterchangePackage
* An instance of {@link SignalDSLPackage}
* @param acceptor
* the xtext acceptor interface
* @param isPreIndexingPhase
* true if in preindexing phase
*/
def dispatch void infer(SignalPackage signalPackage, IJvmDeclaredTypeAcceptor acceptor,
boolean isPreIndexingPhase) {
val pckgName = signalPackage.name;
for (signal : signalPackage.signals) {
// create watchers and schedulers if at least on task has been defined
if(signal !== null && signal.tasks !== null && !signal.tasks.empty) {
var signalClass = signal.toClass(signal.fullyQualifiedName)
if(signal instanceof SignalWatcher) {
signalClass.simpleName = signal.name.toFirstUpper + "Watcher"
// create the watcher tasks file
var signalWatcherJobClass = signal.toClass(signal.fullyQualifiedName)
signalWatcherJobClass.simpleName = signal.name.toFirstUpper + "WatcherJob"
signalWatcherJobClass.packageName = pckgName
acceptor.accept(signalWatcherJobClass, [
superTypes += _typeReferenceBuilder.typeRef(WatcherJobImpl)
it.documentation = "Implements the list of tasks of "+ signal.name.toFirstUpper + "Watcher to be executed."
it.toWatcherJobFields(signal)
it.toWatcherJobOperations(signal)
])
}
else if(signal instanceof SignalScheduler){
signalClass.simpleName = signal.name.toFirstUpper + "Scheduler"
// create the scheduler tasks file
var signalSchedulerJobClass = signal.toClass(signal.fullyQualifiedName)
signalSchedulerJobClass.simpleName = signal.name.toFirstUpper + "SchedulerJob"
signalSchedulerJobClass.packageName = pckgName
acceptor.accept(signalSchedulerJobClass, [
superTypes += _typeReferenceBuilder.typeRef(SchedulerJobImpl)
it.documentation = "Implements the list of tasks of "+ signal.name.toFirstUpper + "Scheduler to be executed."
it.toSchedulerJobFields(signal)
it.toSchedulerJobOperations(signal)
])
}
signalClass.packageName = pckgName
// create the watcher and scheduler files
acceptor.accept(signalClass, [
if(signal instanceof SignalWatcher){
superTypes += _typeReferenceBuilder.typeRef(WatcherImpl)
}
else if(signal instanceof SignalScheduler){
superTypes += _typeReferenceBuilder.typeRef(SchedulerImpl)
superTypes += _typeReferenceBuilder.typeRef(Job)
}
var annotationRef = _annotationTypesBuilder.annotationRef(typeof(Component))
annotationRef.addAnnAttr(signalPackage, "immediate", Boolean.TRUE)
annotations += annotationRef
it.fileHeader = signalPackage.documentation
it.toFields(signal)
it.toConstructor(signal)
it.toOperations(signal)
it.toBinderOperations(signal)
])
}
}
}
def void toSchedulerJobOperations(JvmGenericType type, SignalScheduler scheduler){
//the constructor
type.members += scheduler.toConstructor [
parameters += scheduler.toParameter("persistenceService", _typeReferenceBuilder.typeRef(IPersistenceService))
parameters += scheduler.toParameter("dataInterchange", _typeReferenceBuilder.typeRef(IDataInterchange))
parameters += scheduler.toParameter("blobService", _typeReferenceBuilder.typeRef(IBlobService))
parameters += scheduler.toParameter("eventDispatcher", _typeReferenceBuilder.typeRef(IEventDispatcher))
parameters += scheduler.toParameter("schedulerid", _typeReferenceBuilder.typeRef(String))
body = [
append(
'''
this.persistenceService = persistenceService;
this.dataInterchange = dataInterchange;
this.blobService = blobService;
this.eventDispatcher = eventDispatcher;
setSchedulerId(schedulerid);
«IF scheduler.hasFunctionWithFile»paths = new HashMap<String, Path>();
«ENDIF»''')
]
]
//create the execute task operation
type.members += scheduler.toMethod("executeListOfTasks", _typeReferenceBuilder.typeRef(Void::TYPE), [
annotations += _annotationTypesBuilder.annotationRef(Override)
body = [append('''«scheduler.executeSchedulerTasksList»''')]
])
// create all scheduler operations
operationlist.clear
// a list of all available tasks
createTaskOperations(type, scheduler)
}
def void toSchedulerJobFields(JvmGenericType type, SignalScheduler signal) {
var JvmField field = null
// create persistence service field
field = signal.toField("log", _typeReferenceBuilder.typeRef(Logger))
field.visibility = JvmVisibility::PRIVATE
field.documentation = "the log"
field.initializer = '''LoggerFactory.getLogger("signal")'''
type.members += field
// create persistence service field
field = signal.toField("persistenceService", _typeReferenceBuilder.typeRef(IPersistenceService))
field.static = true
field.visibility = JvmVisibility::PRIVATE
type.members += field
// create datainterchange service field
field = signal.toField("dataInterchange", _typeReferenceBuilder.typeRef(IDataInterchange))
field.static = true
field.visibility = JvmVisibility::PRIVATE
type.members += field
// create blob service field
field = signal.toField("blobService", _typeReferenceBuilder.typeRef(IBlobService))
field.static = true
field.visibility = JvmVisibility::PRIVATE
type.members += field
// create event dispatcher service field
field = signal.toField("eventDispatcher", _typeReferenceBuilder.typeRef(IEventDispatcher))
field.static = true
field.visibility = JvmVisibility::PRIVATE
type.members += field
// create the file path field
if(signal.hasFunctionWithFile){
field = signal.toField("paths", _typeReferenceBuilder.typeRef("HashMap<String,Path>"))
field.visibility = JvmVisibility::PRIVATE
field.static = true
type.members += field
}
}
def void toWatcherJobOperations(JvmGenericType type, SignalWatcher watcher){
//the constructor
type.members += watcher.toConstructor [
parameters += watcher.toParameter("persistenceService", _typeReferenceBuilder.typeRef(IPersistenceService))
parameters += watcher.toParameter("dataInterchange", _typeReferenceBuilder.typeRef(IDataInterchange))
parameters += watcher.toParameter("blobService", _typeReferenceBuilder.typeRef(IBlobService))
parameters += watcher.toParameter("eventDispatcher", _typeReferenceBuilder.typeRef(IEventDispatcher))
parameters += watcher.toParameter("file", _typeReferenceBuilder.typeRef(Path))
parameters += watcher.toParameter("watcherid", _typeReferenceBuilder.typeRef(String))
body = [
append(
'''
this.persistenceService = persistenceService;
this.dataInterchange = dataInterchange;
this.blobService = blobService;
this.eventDispatcher = eventDispatcher;
«if(watcher.hasFileMask){
'''setParallelJobExecutionAllowed(true);'''
setTriggerfile(file);
setWatcherId(watcherid);
«IF watcher.hasFunctionWithFile»paths = new HashMap<String, Path>();
«ENDIF»''')
]
]
//create the execute task operation
type.members += watcher.toMethod("executeListOfTasks", _typeReferenceBuilder.typeRef(Void::TYPE), [
annotations += _annotationTypesBuilder.annotationRef(Override)
body = [append('''«watcher.executeWatcherTasksList»''')]
])
// create all watcher operations
operationlist = new HashSet()
createTaskOperations(type, watcher)
}
def void toWatcherJobFields(JvmGenericType type, SignalWatcher signal) {
var JvmField field = null
// create persistence service field
field = signal.toField("log", _typeReferenceBuilder.typeRef(Logger))
field.visibility = JvmVisibility::PRIVATE
field.documentation = "the log"
field.initializer = '''LoggerFactory.getLogger("signal")'''
type.members += field
// create persistence service field
field = signal.toField("persistenceService", _typeReferenceBuilder.typeRef(IPersistenceService))
field.static = true
field.visibility = JvmVisibility::PRIVATE
type.members += field
// create datainterchange service field
field = signal.toField("dataInterchange", _typeReferenceBuilder.typeRef(IDataInterchange))
field.static = true
field.visibility = JvmVisibility::PRIVATE
type.members += field
// create blob service field
field = signal.toField("blobService", _typeReferenceBuilder.typeRef(IBlobService))
field.static = true
field.visibility = JvmVisibility::PRIVATE
type.members += field
// create event dispatcher service field
field = signal.toField("eventDispatcher", _typeReferenceBuilder.typeRef(IEventDispatcher))
field.static = true
field.visibility = JvmVisibility::PRIVATE
type.members += field
// create the file paths field
if(signal.hasFunctionWithFile){
field = signal.toField("paths", _typeReferenceBuilder.typeRef("HashMap<String,Path>"))
field.visibility = JvmVisibility::PRIVATE
field.static = true
type.members += field
}
}
def void toBinderOperations(JvmGenericType type, SignalDefinition signal) {
// getter sor services
type.members += signal.toMethod("getDataInterchange", _typeReferenceBuilder.typeRef(IDataInterchange), [
visibility = JvmVisibility.PUBLIC
static = true
body = [append('''return dataInterchange;''')]
])
type.members += signal.toMethod("getBlobService", _typeReferenceBuilder.typeRef(IBlobService), [
visibility = JvmVisibility.PUBLIC
static = true
body = [append('''return blobService;''')]
])
type.members += signal.toMethod("getEventDispatcher", _typeReferenceBuilder.typeRef(IEventDispatcher), [
visibility = JvmVisibility.PUBLIC
static = true
body = [append('''return eventDispatcher;''')]
])
type.members += signal.toMethod("getPersistenceService", _typeReferenceBuilder.typeRef(IPersistenceService), [
visibility = JvmVisibility.PUBLIC
static = true
body = [append('''return persistenceService;''')]
])
// bind datainterchange service
type.members += signal.toMethod("bindDataInterchangeMethod", _typeReferenceBuilder.typeRef(Void::TYPE), [
var annotationRef = _annotationTypesBuilder.annotationRef(typeof(Reference))
annotationRef.addAnnAttr(signal, "cardinality", ReferenceCardinality.MANDATORY)
annotationRef.addAnnAttr(signal, "policy", ReferencePolicy.STATIC)
annotations += annotationRef
visibility = JvmVisibility.PUBLIC
synchronized = true
parameters += signal.toParameter("dataInterchange", _typeReferenceBuilder.typeRef(IDataInterchange))
body = [
append('''
this.dataInterchange = dataInterchange;
«if(signal instanceof SignalWatcher){
'''log.info("«signal.name.toFirstUpper + "Watcher"» - DataInterchange bound");'''
}else if (signal instanceof SignalScheduler){
'''log.info("«signal.name.toFirstUpper + "Scheduler"» - DataInterchange bound");'''
}»''')
]
])
// unbind datainterchange service
type.members += signal.toMethod("unbindDataInterchangeMethod", _typeReferenceBuilder.typeRef(Void::TYPE), [
visibility = JvmVisibility.PUBLIC
synchronized = true
parameters += signal.toParameter("dataInterchange", _typeReferenceBuilder.typeRef(IDataInterchange))
body = [
append(
'''
this.dataInterchange = null;
«if(signal instanceof SignalWatcher){
'''log.info("«signal.name.toFirstUpper + "Watcher"» - DataInterchange unbound");'''
}else if (signal instanceof SignalScheduler){
'''log.info("«signal.name.toFirstUpper + "Scheduler"» - DataInterchange unbound");'''
''')
]
])
// bind blob service
type.members += signal.toMethod("bindBlobMethod", _typeReferenceBuilder.typeRef(Void::TYPE), [
var annotationRef = _annotationTypesBuilder.annotationRef(typeof(Reference))
annotationRef.addAnnAttr(signal, "cardinality", ReferenceCardinality.MANDATORY)
annotationRef.addAnnAttr(signal, "policy", ReferencePolicy.STATIC)
annotations += annotationRef
visibility = JvmVisibility.PUBLIC
synchronized = true
parameters += signal.toParameter("blobService", _typeReferenceBuilder.typeRef(IBlobService))
body = [
append(
'''
this.blobService = blobService;
«if(signal instanceof SignalWatcher){
'''log.info("«signal.name.toFirstUpper + "Watcher"» - BlobService bound");'''
}else if (signal instanceof SignalScheduler){
'''log.info("«signal.name.toFirstUpper + "Scheduler"» - BlobService bound");'''
''')
]
])
// unbind blob service
type.members += signal.toMethod("unbindBlobMethod", _typeReferenceBuilder.typeRef(Void::TYPE), [
visibility = JvmVisibility.PUBLIC
synchronized = true
parameters += signal.toParameter("blobService", _typeReferenceBuilder.typeRef(IBlobService))
body = [
append(
'''
this.blobService = null;
«if(signal instanceof SignalWatcher){
'''log.info("«signal.name.toFirstUpper + "Watcher"» - BlobService unbound");'''
}else if (signal instanceof SignalScheduler){
'''log.info("«signal.name.toFirstUpper + "Scheduler"» - BlobService unbound");'''
''')
]
])
// bind eventDispatcher service
type.members += signal.toMethod("bindEventDispatcher", _typeReferenceBuilder.typeRef(Void::TYPE), [
var annotationRef = _annotationTypesBuilder.annotationRef(typeof(Reference))
annotationRef.addAnnAttr(signal, "cardinality", ReferenceCardinality.MANDATORY)
annotationRef.addAnnAttr(signal, "policy", ReferencePolicy.STATIC)
annotations += annotationRef
visibility = JvmVisibility.PUBLIC
synchronized = true
parameters += signal.toParameter("eventDispatcher", _typeReferenceBuilder.typeRef(IEventDispatcher))
body = [
append(
'''
this.eventDispatcher = eventDispatcher;
«if(signal instanceof SignalWatcher){
'''log.info("«signal.name.toFirstUpper + "Watcher"» - EventDispatcher bound");'''
}else if (signal instanceof SignalScheduler){
'''log.info("«signal.name.toFirstUpper + "Scheduler"» - EventDispatcher bound");'''
''')
]
])
// unbind eventDispatcher service
type.members += signal.toMethod("unbindEventDispatcher", _typeReferenceBuilder.typeRef(Void::TYPE), [
visibility = JvmVisibility.PUBLIC
synchronized = true
parameters += signal.toParameter("eventDispatcher", _typeReferenceBuilder.typeRef(IEventDispatcher))
body = [
append(
'''
this.eventDispatcher = null;
«if(signal instanceof SignalWatcher){
'''log.info("«signal.name.toFirstUpper + "Watcher"» - EventDispatcher unbound");'''
}else if (signal instanceof SignalScheduler){
'''log.info("«signal.name.toFirstUpper + "Scheduler"» - EventDispatcher unbound");'''
''')
]
])
// bind persistence service
type.members += signal.toMethod("bindPersistenceMethod", _typeReferenceBuilder.typeRef(Void::TYPE), [
var annotationRef = _annotationTypesBuilder.annotationRef(typeof(Reference))
annotationRef.addAnnAttr(signal, "cardinality", ReferenceCardinality.MANDATORY)
annotationRef.addAnnAttr(signal, "policy", ReferencePolicy.STATIC)
annotations += annotationRef
visibility = JvmVisibility.PUBLIC
synchronized = true
parameters += signal.toParameter("persistenceService", _typeReferenceBuilder.typeRef(IPersistenceService))
body = [
append(
'''
this.persistenceService = persistenceService;
«if(signal instanceof SignalWatcher){
'''log.info("«signal.name.toFirstUpper + "Watcher"» - PersistenceService bound");'''
}else if (signal instanceof SignalScheduler){
'''log.info("«signal.name.toFirstUpper + "Scheduler"» - PersistenceService bound");'''
''')
]
])
// unbind persistence service
type.members += signal.toMethod("unbindPersistenceMethod", _typeReferenceBuilder.typeRef(Void::TYPE), [
visibility = JvmVisibility.PUBLIC
synchronized = true
parameters += signal.toParameter("persistenceService", _typeReferenceBuilder.typeRef(IPersistenceService))
body = [
append(
'''
this.persistenceService = null;
«if(signal instanceof SignalWatcher){
'''log.info("«signal.name.toFirstUpper + "Watcher"» - PersistenceService unbound");'''
}else if (signal instanceof SignalScheduler){
'''log.info("«signal.name.toFirstUpper + "Scheduler"» - PersistenceService unbound");'''
''')
]
])
}
def void toOperations(JvmGenericType type, SignalDefinition signal) {
if(signal instanceof SignalWatcher){
// creating the register operation, detailing the order
// of execution of each operation after a signal is caught
type.members += signal.toMethod("handleEvent", _typeReferenceBuilder.typeRef(Void::TYPE), [
annotations += _annotationTypesBuilder.annotationRef(Override)
parameters += signal.toParameter("file", _typeReferenceBuilder.typeRef(Path))
body = [append('''«signal.handleEvent»''')]
])
// create watcher executeWatcherService
type.members += signal.toMethod("executeWatcherService", _typeReferenceBuilder.typeRef(Void::TYPE), [
body = [append('''«signal.executeService»''')]
])
}
if(signal instanceof SignalScheduler){
// create startScheduler operation
type.members += signal.toMethod("startScheduler", _typeReferenceBuilder.typeRef(Void::TYPE), [
documentation =
'''
Starts the {@link #scheduler}.'''
exceptions += _typeReferenceBuilder.typeRef(SchedulerException)
body = [append('''«signal.startScheduler»''')]
])
// create shutdownScheduler operation
type.members += signal.toMethod("shutdownScheduler", _typeReferenceBuilder.typeRef(Void::TYPE), [
documentation =
'''
Halts the Scheduler's firing of Triggers, and cleans up all resources associated with the Scheduler.
@param waitForJobsToComplete whether or not the scheduler shuts down immediately or wait for jobs to finish.
@throws SchedulerException'''
exceptions += _typeReferenceBuilder.typeRef(SchedulerException)
parameters += signal.toParameter("waitForJobsToComplete", _typeReferenceBuilder.typeRef(boolean))
body = [append('''«signal.shutdownScheduler»''')]
])
// create scheduleJob operation
type.members += signal.toMethod("scheduleJob", _typeReferenceBuilder.typeRef(Date), [
documentation =
'''
Schedules a given job based on a given trigger.
@param job the {@link JobDetail} to be scheduled
@param trigger the corresponding trigger
@return'''
exceptions += _typeReferenceBuilder.typeRef(SchedulerException)
parameters += signal.toParameter("job", _typeReferenceBuilder.typeRef(JobDetail))
parameters += signal.toParameter("trigger", _typeReferenceBuilder.typeRef(Trigger))
body = [append('''«signal.scheduleJob»''')]
])
// create watcher scheduleAllJobs
type.members += signal.toMethod("scheduleAllJobs", _typeReferenceBuilder.typeRef(Void::TYPE), [
exceptions += _typeReferenceBuilder.typeRef(SchedulerException)
body = [append('''«signal.scheduleAllJobs»''')]
])
// create watcher executeSchedulerService
type.members += signal.toMethod("executeSchedulerService", _typeReferenceBuilder.typeRef(Void::TYPE), [
body = [append('''«signal.executeService»''')]
])
// create job execute method
type.members += signal.toMethod("execute", _typeReferenceBuilder.typeRef(Void::TYPE), [
exceptions += _typeReferenceBuilder.typeRef(JobExecutionException)
annotations += _annotationTypesBuilder.annotationRef(Override)
parameters += signal.toParameter("context", _typeReferenceBuilder.typeRef(JobExecutionContext))
documentation = "Executes the list of tasks as job's logic."
body = [
append(
'''
new «signal.name.toFirstUpper»SchedulerJob(persistenceService, dataInterchange, blobService, eventDispatcher,
"«signal.fullyQualifiedName»Scheduler").executeListOfTasks();''')]
])
}
// creating the getHandlerPropertyFromConfigurationFile operation
type.members += signal.toMethod("getHandlerPropertyFromConfigurationFile", _typeReferenceBuilder.typeRef(String), [
documentation = "Gives the property value of the given property name if existing."
parameters += signal.toParameter("propertyname", _typeReferenceBuilder.typeRef(String))
body = [append('''«signal.handlerPropertyFromConfigurationFile»''')]
])
// create watcher activate
type.members += signal.toMethod("activate", _typeReferenceBuilder.typeRef(Void::TYPE), [
annotations += _annotationTypesBuilder.annotationRef(Activate)
body = [append('''«signal.activate»''')]
])
// create watcher deactivate
type.members += signal.toMethod("deactivate", _typeReferenceBuilder.typeRef(Void::TYPE), [
annotations += _annotationTypesBuilder.annotationRef(Deactivate)
body = [append('''«signal.deactivate»''')]
])
}
def String scheduleJob(SignalScheduler scheduler){
return
'''
try {
return scheduler.scheduleJob(job, trigger);
} catch (SchedulerException e) {
e.printStackTrace();
}
return null;'''
}
def String shutdownScheduler(SignalScheduler scheduler){
return
'''
log.info("Shutdowns "+scheduler.getSchedulerName()+" ...");
scheduler.shutdown(waitForJobsToComplete);'''
}
def String startScheduler(SignalScheduler scheduler){
return
'''
scheduler.start();
log.info(scheduler.getSchedulerName() + " service successfully started!");'''
}
def String handleEvent(SignalWatcher watcher) {
if(watcher !== null) {
return
'''
«if(watcher.hasFileMask){
'''
String maskcfg = getFilemaskValue(getHandlerPropertyFromConfigurationFile("«watcher.fullyQualifiedName»Watcher" + SignalConstants.FILEMASK));
String modelfilemask = "«watcher.identifier»";
if(isFileMaskValid(maskcfg) && isFileMaskValidWithExpectedFileExtension(maskcfg, "«watcher.baseInterchange.fileEndpoint.getValidExtensionToInterchange»")){
modelfilemask = maskcfg;
log.info("«watcher.name»Watcher - The file mask used for file identification is ["+maskcfg+"].");
}else{
log.info("«watcher.name»Watcher - The default file mask watcher.identifier»] is used for file identification.");
}
if(isFileNameValidToFileMask(file.getFileName().toString(), modelfilemask)){
addWatcherJob(new «watcher.name.toFirstUpper»WatcherJob(persistenceService, dataInterchange, blobService, eventDispatcher, file, "«watcher.fullyQualifiedName»Watcher"));
}'''
}
else{
'''
String namecfg = getFilemaskValue(getHandlerPropertyFromConfigurationFile("«watcher.fullyQualifiedName»Watcher" + SignalConstants.FILENAME));
String filemask = namecfg != null ? namecfg : "«watcher.identifier»";
if(isFileNameValidToBaseFileName(file.getFileName().toString(), filemask)){
addWatcherJob(new «watcher.name.toFirstUpper»WatcherJob(persistenceService, dataInterchange, blobService, eventDispatcher, file, "«watcher.fullyQualifiedName»Watcher"));
}'''
}
»
else{
log.info("«watcher.name.toFirstUpper»Watcher - No action planed for file ["+file+"].");
}'''
}
return ''''''
}
def void toConstructor(JvmGenericType type, SignalDefinition signal) {
type.members += signal.toConstructor [
if(signal instanceof SignalWatcher){
exceptions += _typeReferenceBuilder.typeRef(Exception)
body = [append('''super("«signal.name.toFirstUpper + "Watcher"»");''')]
}
]
}
def String executeWatcherTasksList(SignalWatcher watcher) {
return
'''
«if(watcher !== null) {
var operationList = ""
var functionWithFile = watcher.hasFunctionWithFile
for (task : watcher.tasks) {
operationList = operationList + getTaskListOperationName(task, functionWithFile)
}
if(watcher.executiontype.equals(SignalExecutionTypeEnum.SEQ)){
'''
log.info("WatcherJobsHandler - START - Sequential execution of «watcher.name.toFirstUpper»WatcherJob ...");
try {
«operationList»
deleteFile(getTriggerfile(), "«watcher.name.toFirstUpper»WatcherJob - Triggerfile");
} catch(Exception e){
log.error("WatcherJobsHandler - ERROR during sequential execution of «watcher.name.toFirstUpper»WatcherJob!", e);
}
setDone(true); // for the WatcherhandlerJob to continue
log.info("WatcherJobsHandler - END - Sequential execution of «watcher.name.toFirstUpper»WatcherJob ...");'''
}
else{
'''
log.info("WatcherJobsHandler - START - Parallel execution of «watcher.name.toFirstUpper»WatcherJob ...");
try { «operationList»
finalizeTaskExecution("«watcher.name.toFirstUpper»WatcherJob");
} catch(Exception e){
log.error("WatcherJobsHandler - ERROR during parallel execution of «watcher.name.toFirstUpper»WatcherJob!", e);
setDone(true); // for the WatcherhandlerJob to continue
log.info("WatcherJobsHandler - END - Parallel execution of «watcher.name.toFirstUpper»WatcherJob ...");
}'''
}
'''
}
def String executeSchedulerTasksList(SignalScheduler scheduler) {
return
'''
«if(scheduler !== null){
var operationList = ""
var functionWithFile = scheduler.hasFunctionWithFile
for (task : scheduler.tasks) {
operationList = operationList + getTaskListOperationName(task, functionWithFile)
}
if(scheduler.executiontype.equals(SignalExecutionTypeEnum.SEQ)){
'''
log.info("START - Sequential execution of «scheduler.name.toFirstUpper»SchedulerJob ...");
try {
«operationList»
} catch(Exception e){
log.error("ERROR during sequential execution of «scheduler.name.toFirstUpper»SchedulerJob!", e);
}
log.info("END - Sequential execution of «scheduler.name.toFirstUpper»SchedulerJob.");'''
}
else{
'''
log.info("START - Parallel execution of «scheduler.name.toFirstUpper»SchedulerJob ...");
try {
«operationList»
finalizeTaskExecution("«scheduler.name.toFirstUpper»SchedulerJob");
} catch(Exception e){
log.error("ERROR during parallel execution of «scheduler.name.toFirstUpper»SchedulerJob!", e);
log.info("END - Parallel execution of «scheduler.name.toFirstUpper»SchedulerJob.");
}'''
}
'''
}
def getTaskListOperationName(SignalTask task, boolean existFunctionWithFile){
if(task instanceof SignalFunction){
if(task !== null && task.doExecuteFunction !== null ) {
if((task.onExportFile || task.onImportFile) && !task.doExecuteFunction.params.empty){
var operationName = ""
if(task.onExportFile){
operationName = "export" + task.supportInterchange.name.toFirstUpper
}
else if(task.onImportFile){
operationName = "import" + task.supportInterchange.name.toFirstUpper
}
return
'''«(task.group.eContainer as FunctionLibraryPackage).fullyQualifiedName».«task.group.name.toString.toFirstUpper».«task.doExecuteFunction.name.toString»(paths.get("«operationName»"));
'''
}
else if(!task.onExportFile && !task.onImportFile){
return
'''«(task.group.eContainer as FunctionLibraryPackage).fullyQualifiedName».«task.group.name.toString.toFirstUpper».«task.doExecuteFunction.name.toString»();
'''
}
}
}
else{
return
'''«IF existFunctionWithFile» paths.put("«task.getAppropriateTaskOperationName»", «task.getAppropriateTaskOperationName»()); «ELSE»«task.getAppropriateTaskOperationName»(); «ENDIF»
'''
}
}
/**
* Returns the operation name of the given task.
*/
def String getAppropriateTaskOperationName(SignalTask task) {
var operation_name = ""
if(task instanceof SignalDatainterchange){
if (task.getActionType == SignalActionTypeEnum.DATAIMPORT && task.dataRef !== null) {
operation_name = "import" + task.dataRef.name.toFirstUpper
} else if (task.dataRef !== null) {
operation_name = "export" + task.dataRef.name.toFirstUpper
}
}
return operation_name
}
/**
* Creates the content of each task operation for scheduler and watcher jobs task files.
*/
def createTaskOperations(JvmGenericType type, SignalDefinition signal) {
for(task : signal.tasks){
var operationname = task.getAppropriateTaskOperationName
// create the operation only if it has not already been created
if (!operationlist.contains(operationname)) {
if(task instanceof SignalDatainterchange){
if(signal instanceof SignalWatcher){
watcherInterchangeOperation(type, signal, task, operationname)
}
else if(signal instanceof SignalScheduler){
schedulerInterchangeOperation(type, signal, task, operationname)
}
}
operationlist.add(operationname)
}
}
}
def schedulerInterchangeOperation(JvmGenericType type, SignalScheduler signal, SignalDatainterchange interchange, String operationname){
if (interchange.getActionType == SignalActionTypeEnum.DATAIMPORT) {
type.members += signal.toMethod(operationname, _typeReferenceBuilder.typeRef(Path), [
exceptions += _typeReferenceBuilder.typeRef(Exception)
body = [append(
'''
«getConfigFileURL((interchange.dataRef.eContainer as DataInterchangeGroup).name)»
«interchange.dataRef.getBasicRunConfiguration(true, WorkerThreadRunnable.Direction.IMPORT.name, null)»
«interchange.dataRef.defaultVariableName».setDirection(WorkerThreadRunnable.Direction.IMPORT);
try {
«if((signal as SignalScheduler).executiontype.equals(SignalExecutionTypeEnum.SEQ)){
'''«signal.name.toFirstUpper + "Scheduler"».getExecutorService().submit(«interchange.dataRef.defaultVariableName»).get();'''
}else{
'''«signal.name.toFirstUpper + "Scheduler"».getExecutorService().execute(«interchange.dataRef.defaultVariableName»);'''
}catch (Exception e) {
log.error("Execution - " + «interchange.dataRef.defaultVariableName».getDirection() + " for " + «interchange.dataRef.defaultVariableName».getName() + " interupted!\n" + e.getMessage());
«if (interchange.getActionType == SignalActionTypeEnum.DATAIMPORT) {
'''
«IF interchange.dataRef.isDeleteFileAfterImport»
renameFile(Paths.get(«interchange.dataRef.defaultVariableName».getFileURL().toString()), "«signal.name.toFirstUpper»SchedulerJob");
«ENDIF»
'''
}
return Paths.get(«interchange.dataRef.defaultVariableName».getFileURL().getPath().substring(1));
''')]
])
} else {
type.members += signal.toMethod(operationname, _typeReferenceBuilder.typeRef(Path), [
body = [
append(
'''
«getConfigFileURL((interchange.dataRef.eContainer as DataInterchangeGroup).name)»
«interchange.dataRef.getBasicRunConfiguration(true, WorkerThreadRunnable.Direction.EXPORT.name, null)»
«interchange.dataRef.defaultVariableName».setDirection(WorkerThreadRunnable.Direction.EXPORT);
try {
«if((signal as SignalScheduler).executiontype.equals(SignalExecutionTypeEnum.SEQ)){
'''«signal.name.toFirstUpper + "Scheduler"».getExecutorService().submit(«interchange.dataRef.defaultVariableName»).get();'''
}else{
'''«signal.name.toFirstUpper + "Scheduler"».getExecutorService().execute(«interchange.dataRef.defaultVariableName»);'''
}catch (Exception e) {
log.error("Execution - " + «interchange.dataRef.defaultVariableName».getDirection() + " for " + «interchange.dataRef.defaultVariableName».getName() + " interupted!\n" + e.getMessage());
}
return «interchange.dataRef.defaultVariableName».getExportPath();
'''
)]
])
}
}
def watcherInterchangeOperation(JvmGenericType type, SignalWatcher watcher, SignalDatainterchange interchange, String operationname){
if(watcher.executiontype.equals(SignalExecutionTypeEnum.SEQ)){
type.members += watcher.toMethod(operationname, _typeReferenceBuilder.typeRef(Path), [
exceptions += _typeReferenceBuilder.typeRef(Exception)
body = [
append(
'''
«if (interchange.getActionType == SignalActionTypeEnum.DATAIMPORT) {
'''
«interchange.dataRef.getBasicRunConfiguration(true, WorkerThreadRunnable.Direction.IMPORT.name, watcher.baseInterchange)»
«interchange.dataRef.defaultVariableName».setDirection(WorkerThreadRunnable.Direction.IMPORT);
'''
} else {
'''
«getConfigFileURL((interchange.dataRef.eContainer as DataInterchangeGroup).name)»
«interchange.dataRef.getBasicRunConfiguration(true, WorkerThreadRunnable.Direction.EXPORT.name, watcher.baseInterchange)»
«interchange.dataRef.defaultVariableName».setDirection(WorkerThreadRunnable.Direction.EXPORT);
'''
«if(interchange == watcher.baseInterchange){ // for the (trigger)interchange marked with the keyword 'applyon'
'''
URI uri = getTriggerfile().toUri();
«interchange.dataRef.defaultVariableName».setFileURL(uri.toString());
'''
}else{
'''«interchange.dataRef.defaultVariableName».setFileURL(getTriggerfile().getParent().toString() + File.separator + "«interchange.dataRef.getDataInterchangeFileName»");'''
try{
WatcherImpl.getExecutorService().submit(«interchange.dataRef.defaultVariableName»).get();
}catch (Exception e) {
log.error("Execution - " + «interchange.dataRef.defaultVariableName».getDirection() + " for " + «interchange.dataRef.defaultVariableName».getName() + " interupted!\n" + e.getMessage());
«interchange.dataRef.defaultVariableName».setExecutionDone(true);
«if (interchange.getActionType == SignalActionTypeEnum.DATAIMPORT) {
if(interchange.dataRef == watcher.baseInterchange && interchange.dataRef.deleteFileAfterImport){
'''renameFile(getTriggerfile(), "«watcher.name.toFirstUpper»WatcherJob");'''
}
else if(interchange.dataRef.deleteFileAfterImport){
'''renameFile(Paths.get(«interchange.dataRef.defaultVariableName».getFileURL().toString()), "«watcher.name.toFirstUpper»WatcherJob");'''
}
}
«if (interchange.getActionType == SignalActionTypeEnum.DATAIMPORT) {
'''return Paths.get(«interchange.dataRef.defaultVariableName».getFileURL().getPath().substring(1));'''
}
else{
'''return «interchange.dataRef.defaultVariableName».getExportPath();'''
''')
]
])
}
else{
type.members += watcher.toMethod(operationname, _typeReferenceBuilder.typeRef(Path), [
exceptions += _typeReferenceBuilder.typeRef(Exception)
body = [
append(
'''
«if (interchange.getActionType == SignalActionTypeEnum.DATAIMPORT) {
'''
«interchange.dataRef.getBasicRunConfiguration(true, WorkerThreadRunnable.Direction.IMPORT.name, watcher.baseInterchange)»
«interchange.dataRef.defaultVariableName».setDirection(WorkerThreadRunnable.Direction.IMPORT);
'''
} else {
'''
«getConfigFileURL((interchange.dataRef.eContainer as DataInterchangeGroup).name)»
«interchange.dataRef.getBasicRunConfiguration(true, WorkerThreadRunnable.Direction.EXPORT.name, watcher.baseInterchange)»
«interchange.dataRef.defaultVariableName».setDirection(WorkerThreadRunnable.Direction.EXPORT);
'''
«if(interchange == watcher.baseInterchange){
'''
URI uri = getTriggerfile().toUri();
«interchange.dataRef.defaultVariableName».setFileURL(uri.toString());'''
}else{
'''«interchange.dataRef.defaultVariableName».setFileURL(getTriggerfile().getParent().toString() + File.separator + "«interchange.dataRef.getDataInterchangeFileName»");'''
checkForCompletion(«interchange.dataRef.defaultVariableName»);
try{
WatcherImpl.getExecutorService().execute(«interchange.dataRef.defaultVariableName»);
}catch (Exception e) {
log.error("Execution - " + «interchange.dataRef.defaultVariableName».getDirection() + " for " + «interchange.dataRef.defaultVariableName».getName() + " interupted!\n" + e.getMessage());
«interchange.dataRef.defaultVariableName».setExecutionDone(true);
«if (interchange.getActionType == SignalActionTypeEnum.DATAIMPORT) {
if(interchange.dataRef == watcher.baseInterchange && interchange.dataRef.deleteFileAfterImport){
'''renameFile(getTriggerfile(), "«watcher.name.toFirstUpper»WatcherJob");'''
}
else if(interchange.dataRef.deleteFileAfterImport){
'''renameFile(Paths.get(«interchange.dataRef.defaultVariableName».getFileURL().toString()), "«watcher.name.toFirstUpper»WatcherJob");'''
}
}
«if (interchange.getActionType == SignalActionTypeEnum.DATAIMPORT) {
'''return Paths.get(«interchange.dataRef.defaultVariableName».getFileURL().getPath().substring(1));'''
}
else{
'''return «interchange.dataRef.defaultVariableName».getExportPath();'''
''')
]
])
}
}
/**
* Creates the fields for all watcher and scheduler files.
*/
def void toFields(JvmGenericType type, SignalDefinition signal) {
var JvmField field = null
// create thread field
field = signal.toField("thread", _typeReferenceBuilder.typeRef(Thread)) [
visibility = JvmVisibility::PRIVATE
]
type.members += field
// create persistence service field
field = signal.toField("persistenceService", _typeReferenceBuilder.typeRef(IPersistenceService))
field.static = true
field.visibility = JvmVisibility::PRIVATE
type.members += field
// create datainterchange service field
field = signal.toField("dataInterchange", _typeReferenceBuilder.typeRef(IDataInterchange))
field.static = true
field.visibility = JvmVisibility::PRIVATE
type.members += field
// create blob service field
field = signal.toField("blobService", _typeReferenceBuilder.typeRef(IBlobService))
field.static = true
field.visibility = JvmVisibility::PRIVATE
type.members += field
// create event dispatcher service field
field = signal.toField("eventDispatcher", _typeReferenceBuilder.typeRef(IEventDispatcher))
field.static = true
field.visibility = JvmVisibility::PRIVATE
type.members += field
if(signal instanceof SignalScheduler){
// create executor service dispatcher service field
field = signal.toField("scheduler", _typeReferenceBuilder.typeRef(Scheduler))
field.documentation = '''the scheduler instance'''
field.static = true
field.visibility = JvmVisibility::PRIVATE
type.members += field
}
}
def String getActivate(SignalDefinition signal) {
var signalName = ""
if(signal instanceof SignalWatcher){
signalName = signal.name.toFirstUpper + "Watcher"
}else if(signal instanceof SignalScheduler){
signalName = signal.name.toFirstUpper + "Scheduler"
}
return
'''
thread = new Thread("«signalName»") {
@Override
public void run() {
«if(signal instanceof SignalWatcher){
'''
setMaxParallelThreadsCount(getHandlerPropertyFromConfigurationFile(SignalConstants.MAXPARALLELTHREADCOUNT_NAME));
initMaxThreadCount();
startWatcherJobsHandling();
executeWatcherService();
'''
}
else if(signal instanceof SignalScheduler){
'''
setMaxParallelThreadsCount(getHandlerPropertyFromConfigurationFile(SignalConstants.MAXPARALLELTHREADCOUNT_NAME));
initMaxThreadCount();
setExecutorService("«signalName»");
executeSchedulerService();
'''
}
};
thread.start();'''
}
def String getExecuteService(SignalDefinition signal) {
var signalName = ""
if(signal instanceof SignalWatcher){
signalName = signal.name.toFirstUpper + "Watcher"
}else if(signal instanceof SignalScheduler){
signalName = signal.name.toFirstUpper + "Scheduler"
}
return
'''
«if(signal instanceof SignalWatcher){
'''
try {
«signal.registerHandlerPathToWatch»
log.info("«signalName» service successfully started.");
processEvents();
} catch (Exception e) {
log.error("«signalName» service interrupted due to: ", e);
}'''
}
else if(signal instanceof SignalScheduler){
'''
try {
scheduler = createScheduler("«signalName»");
scheduleAllJobs();
startScheduler();
} catch (Exception e) {
log.error("«signalName» service interrupted due to: ", e);
}'''}»'''
}
def String getDeactivate(SignalDefinition signal) {
var signalName = ""
if(signal instanceof SignalWatcher){
signalName = signal.name.toFirstUpper + "Watcher"
}else if(signal instanceof SignalScheduler){
signalName = signal.name.toFirstUpper + "Scheduler"
}
return
'''
«if(signal instanceof SignalScheduler){
'''
try {
if(scheduler != null){
shutdownScheduler(false);
}
thread.join();
} catch (Exception e) {
log.error("«signalName» service shortly interrupted ...", e);
}
log.info("«signalName» service shutted down...");
'''
}else{
'''
try {
closeWatcher();
stopWatcherJobsHandling();
thread.join();
} catch (Exception e) {
log.error("«signalName» service shortly interrupted ...", e);
}
log.info("«signalName» service shutted down...");
'''
'''
}
def String scheduleAllJobs(SignalScheduler scheduler) {
var signalName = scheduler.name.toFirstUpper + "Scheduler"
var index = 1
var result = '''
log.info("«signalName» - Starting scheduling all jobs ...");
Trigger trigger; JobDetail job; Date ft; String expr; int hour; int min; int dOw; int dOm; String key;String keyOne;String keyTwo;
'''
if (scheduler.getSchedulertype instanceof CronScheduler) {
var type = scheduler.getSchedulertype as CronScheduler
if (type !== null && type.expression !== null && !type.expression.empty) {
result = result.concat('''
job = createDataTransferJob("«scheduler.fullyQualifiedName»SchedulerJob«index»", "jobs", "-", «scheduler.executiontype.equals(SignalExecutionTypeEnum.SEQ)», "«scheduler.fullyQualifiedName»", «signalName».class);
key = "«scheduler.fullyQualifiedName»Scheduler" + SignalConstants.CRON_SCHEDULER;
expr = getCronExpressionValue(getHandlerPropertyFromConfigurationFile(key));
trigger = createCronTrigger("«scheduler.fullyQualifiedName»SchedulerTrigger«index»", "triggers", expr != null ? expr : "«type.expression»");
ft = scheduleJob(job, trigger);
log.info("«scheduler.name.toFirstUpper»SchedulerJob«index» has been scheduled to run at: " + ft);
''')
}
} else if (scheduler.getSchedulertype instanceof HourlyScheduler) {
var type = scheduler.getSchedulertype as HourlyScheduler
if (type !== null && type.minute > -1) {
result = result.concat('''
job = createDataTransferJob("«scheduler.fullyQualifiedName»SchedulerJob«index»", "jobs", "-", «scheduler.executiontype.equals(SignalExecutionTypeEnum.SEQ)», "«scheduler.fullyQualifiedName»", «signalName».class);
key = "«scheduler.fullyQualifiedName»Scheduler" + SignalConstants.HOURLY_SCHEDULER;
min = getMinutesValue(getHandlerPropertyFromConfigurationFile(key));
trigger = createHourlyTrigger("«scheduler.fullyQualifiedName»SchedulerTrigger«index»", "triggers", min>=0? min : «type.minute»);
ft = scheduleJob(job, trigger);
log.info("«scheduler.name.toFirstUpper»SchedulerJob«index» has been scheduled to run at: " + ft);
''')
}
} else if (scheduler.getSchedulertype instanceof DailyScheduler) {
var type = scheduler.getSchedulertype as DailyScheduler
if (type !== null && type.hour > -1 && type.minute > -1) {
result = result.concat('''
job = createDataTransferJob("«scheduler.fullyQualifiedName»SchedulerJob«index»", "jobs", "-", «scheduler.executiontype.equals(SignalExecutionTypeEnum.SEQ)», "«scheduler.fullyQualifiedName»", «signalName».class);
key = "«scheduler.fullyQualifiedName»Scheduler" + SignalConstants.DAILY_SCHEDULER_HOUR;
hour = getHourValue(getHandlerPropertyFromConfigurationFile(key));
keyOne = "«scheduler.fullyQualifiedName»Scheduler" + SignalConstants.DAILY_SCHEDULER_MIN;
min = getMinutesValue(getHandlerPropertyFromConfigurationFile(keyOne));
trigger = createDailyTriggerAtHourandMins("«scheduler.fullyQualifiedName»SchedulerTrigger«index»", "triggers", hour>=0 ? hour : «type.hour», min>=0 ? min : «type.minute»);
ft = scheduleJob(job, trigger);
log.info("«scheduler.name.toFirstUpper»SchedulerJob«index» has been scheduled to run at: " + ft);
''')
}
} else if (scheduler.getSchedulertype instanceof WeeklyScheduler) {
var type = scheduler.getSchedulertype as WeeklyScheduler
if (type !== null && type.dayofweek !== null && type.hour > -1 &&
type.minute > -1) {
result = result.concat('''
job = createDataTransferJob("«scheduler.fullyQualifiedName»SchedulerJob«index»", "jobs", "-", «scheduler.executiontype.equals(SignalExecutionTypeEnum.SEQ)», "«scheduler.fullyQualifiedName»", «signalName».class);
key = "«scheduler.fullyQualifiedName»Scheduler" + SignalConstants.WEEKLY_SCHEDULER_DAYOFWEEK;
dOw = getDayOfWeekValue(getHandlerPropertyFromConfigurationFile(key));
keyOne = "«scheduler.fullyQualifiedName»Scheduler" + SignalConstants.WEEKLY_SCHEDULER_HOUR;
hour = getHourValue(getHandlerPropertyFromConfigurationFile(keyOne));
keyTwo = "«scheduler.fullyQualifiedName»Scheduler" + SignalConstants.WEEKLY_SCHEDULER_MIN;
min = getMinutesValue(getHandlerPropertyFromConfigurationFile(keyTwo));
trigger = createWeeklyTriggerOnDayAndHourAndMinute("«scheduler.fullyQualifiedName»SchedulerTrigger«index»", "triggers", dOw>0? dOw : «type.dayofweek.ordinal», hour>=0 ? hour : «type.hour», min>=0 ? min : «type.minute»);
ft = scheduleJob(job, trigger);
log.info("«scheduler.name.toFirstUpper»SchedulerJob«index» has been scheduled to run at: " + ft);
''')
}
} else if (scheduler.getSchedulertype instanceof MonthlyScheduler) {
var type = scheduler.getSchedulertype as MonthlyScheduler
if (type !== null && type.dayofmonth > -1 && type.hour > -1 && type.minute > -1) {
result = result.concat('''
job = createDataTransferJob("«scheduler.fullyQualifiedName»SchedulerJob«index»", "jobs", "-", «scheduler.executiontype.equals(SignalExecutionTypeEnum.SEQ)», "«scheduler.fullyQualifiedName»", «signalName».class);
key = "«scheduler.fullyQualifiedName»Scheduler" + SignalConstants.MONTHLY_SCHEDULER_DAYOFMONTH;
dOm = getDayOfMonthValue(getHandlerPropertyFromConfigurationFile(key));
keyOne = "«scheduler.fullyQualifiedName»Scheduler" + SignalConstants.MONTHLY_SCHEDULER_HOUR;
hour = getHourValue(getHandlerPropertyFromConfigurationFile(keyOne));
keyTwo = "«scheduler.fullyQualifiedName»Scheduler" + SignalConstants.MONTHLY_SCHEDULER_MIN;
min = getMinutesValue(getHandlerPropertyFromConfigurationFile(keyTwo));
trigger = createMonthlyTriggerOnDayAndHourAndMinute("«scheduler.fullyQualifiedName»SchedulerTrigger«index»", "triggers", dOm>0? dOm : «type.dayofmonth», hour>=0 ? hour : «type.hour», min>=0 ? min : «type.minute»);
ft = scheduleJob(job, trigger);
log.info("«scheduler.name.toFirstUpper»SchedulerJob«index» has been scheduled to run at: " + ft);
''')
}
}
index++
result = result.concat('''log.info("«signalName» - Scheduling all jobs done.");''')
return result
}
def String registerHandlerPathToWatch(SignalWatcher signal){
var result = "";
var interchange = signal.baseInterchange
if(interchange !== null){
var modelurl = interchange.getDataInterchangeDirectoryUrlPath
result = result.concat('''registerUrl(getHandlerPropertyFromConfigurationFile("«interchange.name»-import"),"«modelurl»");
''')
}
return result
}
/**
* Special function to read signal (watcher or scheduler) properties
* from configuration files.
*/
def String handlerPropertyFromConfigurationFile(SignalDefinition signal){
if(signal !== null) {
var signalName = ""
if(signal instanceof SignalWatcher){
signalName = signal.name.toFirstUpper + "Watcher"
}else if(signal instanceof SignalScheduler){
signalName = signal.name.toFirstUpper + "Scheduler"
}
return
'''
if (propertyname != null) {
«getConfigFileURL(signal.interchangegroup.name)»
File file = new File(url);
if (file.exists()) {
try {
FileInputStream fileInput = new FileInputStream(file);
Properties properties = new Properties();
properties.loadFromXML(fileInput);
fileInput.close();
String value = properties.getProperty(propertyname);
if (value != null) {
if (log.isDebugEnabled()) {
log.debug("«signalName» - getHandlerPropertyFromConfigurationFile propertyname[" + propertyname
+ "] -> value [" + value + "]");
}
return value;
}
} catch (IOException e) {
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
log.error("«signalName» - Error during getHandlerPropertyFromConfigurationFile of propertyname: [" + propertyname
+ "] ... {}", sw.toString());
}
}
}
if (log.isDebugEnabled()) {
log.debug("«signalName» - getHandlerPropertyFromConfigurationFile propertyname[" + propertyname + "] -> value [null] because the given path"
+ " in 'Window->Preferences->OSBP Application Configuration->External Data Sources->DataInterchange Settings' is non-existing or the propertyname is not defined.");
}
return null;
'''
}
return '''return "";'''
}
def boolean hasSchedulers(SignalPackage pck) {
if (pck !== null && pck.signals!== null && !pck.signals.isEmpty) {
for(signal : pck.signals){
if(signal instanceof SignalScheduler){
return true
}
}
}
return false
}
def boolean hasWatchers(SignalPackage pck) {
if (pck !== null && pck.signals !== null && !pck.signals.isEmpty) {
for(signal : pck.signals){
if(signal instanceof SignalScheduler){
return true
}
}
}
return false;
}
def int getSignalCount(SignalPackage pck, boolean isWatcher) {
if (pck !== null && pck.signals !== null && !pck.signals.isEmpty) {
var count = 0
for(signal : pck.signals){
if(isWatcher && (signal instanceof SignalWatcher)){
count++
}
else if(!isWatcher && signal instanceof SignalScheduler){
count++
}
}
return count
}
return -1
}
def boolean hasFunctionWithFile(SignalDefinition signal){
if(signal !== null && signal.tasks !== null && !signal.tasks.empty){
for(task : signal.tasks){
if(task instanceof SignalFunction){
if(task.onExportFile || task.onImportFile){
return true
}
}
}
}
return false
}
/**
* Gives back the default interchange unit.
*/
def DataInterchange baseInterchange(SignalDefinition signal){
if(signal instanceof SignalWatcher) {
if(signal.defaultInterchange !== null){
return signal.defaultInterchange
}
else if (signal.tasks !== null && !signal.tasks.empty){
for(task : signal.tasks){
if(task instanceof SignalDatainterchange){
if(task.baseinterchange){
return task.dataRef
}
}
}
}
}
return null
}
def int definedBaseInterchangeCount(SignalDefinition signal) {
var count = 0
for (task : signal.tasks) {
if(task instanceof SignalDatainterchange){
if(task.baseinterchange){
count++
}
}
}
return count
}
def SignalDatainterchange definedBaseInterchange(SignalDefinition signal) {
for (task : signal.tasks) {
if(task instanceof SignalDatainterchange){
if(task.baseinterchange){
return task
}
}
}
return null
}
def int taskCount(SignalDefinition signal, boolean interchange) {
var count = 0
for (task : signal.tasks) {
if(interchange){
if(task instanceof SignalDatainterchange){
count++
}
}
else if(task instanceof SignalFunction){
count++
}
}
return count
}
}