| /** |
| * |
| * 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 |
| } |
| } |