blob: 08fffeb5e024beed860e747050980b915cb67278 [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
*
*
* This copyright notice shows up in the generated Java code
*
*/
package org.eclipse.osbp.xtext.signal.jvmmodel
import com.google.common.util.concurrent.ThreadFactoryBuilder
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.io.IOException
import java.io.PrintWriter
import java.io.StringWriter
import java.net.URI
import java.net.URL
import java.nio.file.FileSystems
import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.Paths
import java.nio.file.WatchEvent
import java.util.ArrayList
import java.util.Date
import java.util.HashMap
import java.util.HashSet
import java.util.Map
import java.util.Properties
import java.util.concurrent.Executors
import javax.inject.Inject
import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.resource.Resource
import org.eclipse.emf.ecore.util.EcoreUtil
import org.eclipse.osbp.core.api.persistence.IPersistenceService
import org.eclipse.osbp.datainterchange.api.IDataInterchange
import org.eclipse.osbp.preferences.ProductConfiguration
import org.eclipse.osbp.xtext.addons.EObjectHelper
import org.eclipse.osbp.xtext.basic.generator.BasicDslGeneratorUtils
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeGroup
import org.eclipse.osbp.xtext.datainterchange.common.WorkerThreadRunnable
import org.eclipse.osbp.xtext.i18n.I18NModelGenerator
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.SignalPackage
import org.eclipse.osbp.xtext.signal.SignalScheduler
import org.eclipse.osbp.xtext.signal.SignalWatcher
import org.eclipse.osbp.xtext.signal.WeeklyScheduler
import org.eclipse.osbp.xtext.signal.common.SignalConstants
import org.eclipse.osbp.xtext.signal.common.WatcherImpl
import org.eclipse.xtext.generator.IFileSystemAccess
import org.eclipse.xtext.naming.IQualifiedNameProvider
import org.eclipse.xtext.xbase.compiler.GeneratorConfig
import org.eclipse.xtext.xbase.compiler.ImportManager
import org.quartz.JobDetail
import org.quartz.JobExecutionException
import org.quartz.SchedulerException
import org.quartz.Trigger
import org.quartz.impl.StdSchedulerFactory
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import static org.eclipse.osbp.xtext.signal.common.SignalConstants.*
class SignalModelGenerator extends I18NModelGenerator {
@Inject extension BasicDslGeneratorUtils
@Inject extension IQualifiedNameProvider
override createAppendable(EObject context, ImportManager importManager, GeneratorConfig config) {
// required to initialize the needed builder to avoid deprecated methods
builder = context.eResource
// ---------
addImportFor(
importManager, _typeReferenceBuilder, WatcherImpl, SignalConstants, Paths, WorkerThreadRunnable, IPersistenceService,IDataInterchange,
Files, FileSystems, FileOutputStream, Logger, LoggerFactory, HashMap, WatchEvent, Path, URL, Executors, Map, ArrayList, ProductConfiguration,
File, FileInputStream, Properties, StringWriter, PrintWriter, SchedulerException, IOException, Date, JobDetail, JobExecutionException, Trigger,
URI, ThreadFactoryBuilder, StdSchedulerFactory
)
super.createAppendable(context, importManager, config)
}
override doGenerate(Resource input, IFileSystemAccess fsa) {
EcoreUtil.getAllContents(EObjectHelper.getSemanticElement(input), false).filter(typeof(SignalPackage)).forEach[
fsa.generatePathConfig(it)
]
super.doGenerate(input, fsa)
}
def void generatePathConfig(IFileSystemAccess access, SignalPackage pck) {
var dir = new File('''«System.getProperty("user.home")»/.osbee''')
if(!dir.exists) {
dir.mkdir
}
val dataGroups = new HashSet<DataInterchangeGroup>
pck.signals.forEach[
if(it instanceof SignalWatcher){
dataGroups.add(it.interchangegroup)
}
else if(it instanceof SignalScheduler){
dataGroups.add(it.interchangegroup)
}
]
// making sure that a configuration file is written only once
// with all corresponding watchers and schedulers config data
for(group : dataGroups){
var file = new File('''«System.getProperty("user.home")»/.osbee/«group.name»Config.xml''');
file.setWritable(true, false);
if(file.exists) {
// first read the file content
val properties = new Properties();
var fileInput = new FileInputStream(file);
properties.loadFromXML(fileInput);
fileInput.close();
pck.signals.forEach[
var tempgroup = null as DataInterchangeGroup
if(it instanceof SignalWatcher){
tempgroup = it.interchangegroup
}
else if(it instanceof SignalScheduler){
tempgroup = it.interchangegroup
}
if(group === tempgroup){
if(it instanceof SignalWatcher){
// maximum thread count for parallel job execution
if(!properties.containsKey(MAXPARALLELTHREADCOUNT_NAME)){
properties.put(MAXPARALLELTHREADCOUNT_NAME, DEFAULT_PARALLEL_THREADCOUNT.toString)
}
// watcher config filemask
if(it.hasFileMask ){
if(!properties.containsKey(it.fullyQualifiedName +"Watcher"+ FILEMASK)){
properties.put(it.fullyQualifiedName +"Watcher"+FILEMASK, (it.identifier))
}
}else { // watcher config filename
if(!properties.containsKey(it.fullyQualifiedName +"Watcher"+ FILENAME)){
properties.put(it.fullyQualifiedName +"Watcher"+ FILENAME, it.identifier)
}
}
}
else if (it instanceof SignalScheduler){
// cron scheduler
if(it.schedulertype instanceof CronScheduler && !properties.containsKey(it.fullyQualifiedName +"Scheduler"+ CRON_SCHEDULER) ) {
properties.put(it.fullyQualifiedName +"Scheduler"+ CRON_SCHEDULER,(it.schedulertype as CronScheduler).expression)
}
// hourly scheduler
else if(it.schedulertype instanceof HourlyScheduler && !properties.containsKey(it.fullyQualifiedName +"Scheduler"+ HOURLY_SCHEDULER) ) {
properties.put(it.fullyQualifiedName +"Scheduler"+ HOURLY_SCHEDULER,(it.schedulertype as HourlyScheduler).minute.toString)
}
// daily scheduler
else if(it.schedulertype instanceof DailyScheduler && !properties.containsKey(it.fullyQualifiedName +"Scheduler"+ DAILY_SCHEDULER_HOUR) ) {
properties.put(it.fullyQualifiedName +"Scheduler"+ DAILY_SCHEDULER_HOUR, '''«(it.schedulertype as DailyScheduler).hour»'''.toString)
}
else if(it.schedulertype instanceof DailyScheduler && !properties.containsKey(it.fullyQualifiedName +"Scheduler"+ DAILY_SCHEDULER_MIN) ) {
properties.put(it.fullyQualifiedName +"Scheduler"+ DAILY_SCHEDULER_MIN, '''«(it.schedulertype as DailyScheduler).minute»'''.toString)
}
// weekly scheduler
else if(it.schedulertype instanceof WeeklyScheduler && !properties.containsKey(it.fullyQualifiedName +"Scheduler"+ WEEKLY_SCHEDULER_DAYOFWEEK) ) {
properties.put(it.fullyQualifiedName +"Scheduler"+ WEEKLY_SCHEDULER_DAYOFWEEK, '''«(it.schedulertype as WeeklyScheduler).dayofweek»'''.toString)
}
else if(it.schedulertype instanceof WeeklyScheduler && !properties.containsKey(it.fullyQualifiedName +"Scheduler"+ WEEKLY_SCHEDULER_HOUR) ) {
properties.put(it.fullyQualifiedName +"Scheduler"+ WEEKLY_SCHEDULER_HOUR, '''«(it.schedulertype as WeeklyScheduler).hour»'''.toString)
}
else if(it.schedulertype instanceof WeeklyScheduler && !properties.containsKey(it.fullyQualifiedName +"Scheduler"+ WEEKLY_SCHEDULER_MIN) ) {
properties.put(it.fullyQualifiedName +"Scheduler"+ WEEKLY_SCHEDULER_MIN, '''«(it.schedulertype as WeeklyScheduler).minute»'''.toString)
}
// monthly scheduler
else if(it.schedulertype instanceof MonthlyScheduler && !properties.containsKey(it.fullyQualifiedName +"Scheduler"+ MONTHLY_SCHEDULER_DAYOFMONTH) ) {
properties.put(it.fullyQualifiedName +"Scheduler"+ MONTHLY_SCHEDULER_DAYOFMONTH, '''«(it.schedulertype as MonthlyScheduler).dayofmonth»'''.toString)
}
else if(it.schedulertype instanceof MonthlyScheduler && !properties.containsKey(it.fullyQualifiedName +"Scheduler"+ MONTHLY_SCHEDULER_HOUR) ) {
properties.put(it.fullyQualifiedName +"Scheduler"+ MONTHLY_SCHEDULER_HOUR, '''«(it.schedulertype as MonthlyScheduler).hour»'''.toString)
}
else if(it.schedulertype instanceof MonthlyScheduler && !properties.containsKey(it.fullyQualifiedName +"Scheduler"+ MONTHLY_SCHEDULER_MIN) ) {
properties.put(it.fullyQualifiedName +"Scheduler"+ MONTHLY_SCHEDULER_MIN, '''«(it.schedulertype as MonthlyScheduler).minute»'''.toString)
}
}
}
]
// write the all watcher and scheduler configurations to the file
var fileOutput = new FileOutputStream(file);
properties.storeToXML(fileOutput, "dataInterchange file URLs");
fileOutput.close
}
}
}
}