/*
 *                                                                            
 *  Copyright (c) 2013, 2016 - 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
 * 
 */
package org.eclipse.osbp.xtext.datamartdsl.jvmmodel

import com.vaadin.ui.Notification
import java.math.BigDecimal
import java.sql.Date
import java.sql.DriverManager
import java.sql.ResultSet
import java.sql.SQLException
import java.sql.Timestamp
import java.util.HashMap
import java.util.List
import java.util.Locale
import java.util.ResourceBundle
import javax.inject.Inject
import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.resource.Resource
import org.eclipse.osbp.bpm.api.BPMTaskSummary
import org.eclipse.osbp.core.api.persistence.IPersistenceService
import org.eclipse.osbp.dsl.common.datatypes.IDto
import org.eclipse.osbp.preferences.ProductConfiguration
import org.eclipse.osbp.runtime.common.event.IDualData
import org.eclipse.osbp.runtime.common.i18n.ITranslator
import org.eclipse.osbp.ui.api.datamart.DatamartData
import org.eclipse.osbp.ui.api.datamart.DatamartFilter
import org.eclipse.osbp.ui.api.datamart.IDataMart
import org.eclipse.osbp.ui.api.datamart.IDataMart.EType
import org.eclipse.osbp.user.User
import org.eclipse.osbp.xtext.basic.generator.BasicDslGeneratorUtils
import org.eclipse.osbp.xtext.datamart.common.DatamartDtoMapper
import org.eclipse.osbp.xtext.datamart.common.olap.DerivedAxis
import org.eclipse.osbp.xtext.datamart.common.olap.DerivedMember
import org.eclipse.osbp.xtext.datamart.common.olap.DerivedPosition
import org.eclipse.osbp.xtext.datamart.common.sql.SqlCellSet
import org.eclipse.osbp.xtext.i18n.I18NModelGenerator
import org.eclipse.xtext.generator.IFileSystemAccess
import org.eclipse.xtext.xbase.compiler.GeneratorConfig
import org.eclipse.xtext.xbase.compiler.ImportManager
import org.olap4j.Axis
import org.osgi.service.component.annotations.ReferenceCardinality
import org.osgi.service.component.annotations.ReferencePolicy
import org.eclipse.osbp.ui.api.date.SimpleDateFormatter

//compex@10.1.13.14/osbpgit/org.eclipse.osbp.xtext.datamart.git

class DatamartModelGenerator extends I18NModelGenerator {
	@Inject extension BasicDslGeneratorUtils
 	
	override doGenerate(Resource input, IFileSystemAccess fsa) {
		super.doGenerate(input, fsa)
	}
	
	override createAppendable(EObject context, ImportManager importManager, GeneratorConfig config) {
		// required to initialize the needed builder to avoid deprecated methods
		builder = context.eResource
		// ---------
		addImportFor(importManager, _typeReferenceBuilder
			,DriverManager
			,SQLException
			,List
			,DerivedAxis
			,DerivedPosition
			,DerivedMember
			,ResultSet
			,SqlCellSet 
			,Axis 
			,IPersistenceService 
			,ProductConfiguration
			,EType
			,IDualData
			,SimpleDateFormatter
			,DatamartData
			,DatamartFilter
			,ReferenceCardinality
			,ReferencePolicy
			,User
			,HashMap
			,IDataMart
			// workload handling
			,IDto
			,DatamartDtoMapper
			// jbpm task imports
			,BPMTaskSummary
			,Notification
	
			// filler text generation
			,BigDecimal
			,Timestamp
			,Date
			// this stuff for translations
			,ResourceBundle
			,Locale
			,ITranslator
		)
		super.createAppendable(context, importManager, config)
	}
		
}
