/**
 *                                                                            
 * Copyright (c) 2011, 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 v1.0       
 * which accompanies this distribution, and is available at                  
 * http://www.eclipse.org/legal/epl-v10.html                                 
 *                                                                            
 * Contributors:   
 * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation 
 * 
 * 
 *  This copyright notice shows up in the generated Java code
 *
 */
 
package org.eclipse.osbp.xtext.entitymock.generator

import com.google.inject.Inject
import java.io.BufferedInputStream
import java.io.File
import java.io.FileInputStream
import java.io.IOException
import java.io.InputStream
import java.io.PrintWriter
import java.io.StringWriter
import java.util.ArrayList
import java.util.Date
import java.util.HashMap
import java.util.Iterator
import java.util.LinkedHashMap
import java.util.List
import java.util.Properties
import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.resource.Resource
import org.eclipse.osbp.blob.service.BlobService
import org.eclipse.osbp.blob.service.BlobTypingAPI
import org.eclipse.osbp.preferences.ProductConfiguration
import org.eclipse.osbp.xtext.addons.AdvancedJvmModelGenerator
import org.eclipse.osbp.xtext.basic.generator.BasicDslGeneratorUtils
import org.eclipse.osbp.xtext.entitymock.common.ABaseMockEntity
import org.eclipse.osbp.xtext.entitymock.common.ABaseMockObject
import org.eclipse.osbp.xtext.entitymock.common.ABaseMockResource
import org.eclipse.osbp.xtext.entitymock.common.AEntityMockDataGenerator
import org.eclipse.osbp.xtext.entitymock.common.IEntityMockDataDbFiller
import org.eclipse.osbp.xtext.entitymock.common.Iterators
import org.eclipse.osbp.xtext.entitymock.common.MockedEntityDto
import org.eclipse.xtext.generator.IFileSystemAccess
import org.eclipse.xtext.xbase.compiler.GeneratorConfig
import org.eclipse.xtext.xbase.compiler.ImportManager
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.eclipse.osbp.ui.api.customfields.IBlobService

class EntityMockDslGenerator extends AdvancedJvmModelGenerator {
    @Inject extension BasicDslGeneratorUtils
    
    override doGenerate(Resource input, IFileSystemAccess fsa) {
        super.doGenerate(input, fsa)
    }

    /**
     * add all relevant Java import statements for necessary classes
     */
    override createAppendable(EObject context, ImportManager importManager, GeneratorConfig config) {
		// required to initialize the needed builder to avoid deprecated methods
		builder = context.eResource
		// ---------
    	addImportFor(importManager, _typeReferenceBuilder
    		, Iterator
    		, Iterators.DateIterator
    		, Iterators.IntegerIterator
         	, ABaseMockEntity
			, ABaseMockObject
			, ABaseMockResource
			, AEntityMockDataGenerator
			, MockedEntityDto
			, Date
			, ArrayList
			, HashMap
			, LinkedHashMap
			, List
			, BlobTypingAPI
			, BlobService
			, InputStream
			, BufferedInputStream
			, Logger
			, LoggerFactory
			, IEntityMockDataDbFiller
			, IOException
			, File
			, FileInputStream
			, Properties
			, ProductConfiguration
			, PrintWriter
			, StringWriter
			, IBlobService
			
			)
        super.createAppendable(context, importManager, config)
    }
}
