/**
 *                                                                            
 *  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.table.validation

import java.util.List
import org.eclipse.xtext.common.types.JvmGenericType
import org.eclipse.xtext.validation.Check
import org.eclipse.osbp.dsl.semantic.common.types.LTypedPackage
import org.eclipse.xtext.common.types.util.TypeReferences
import org.vaadin.hene.popupbutton.PopupButton
import org.eclipse.osbp.xtext.table.TableDSLPackage
import org.tepi.filtertable.FilterTable
import org.eclipse.osbp.xtext.table.TablePackage
import org.eclipse.osbp.xtext.table.TableModel

//import org.eclipse.xtext.validation.Check

/**
 * Custom validation rules. 
 *
 * see http://www.eclipse.org/Xtext/documentation.html#validation
 */
class TableDSLValidator extends AbstractTableDSLValidator {

//  public static val INVALID_NAME = 'invalidName'
//
//	@Check
//	def checkGreetingStartsWithCapital(Greeting greeting) {
//		if (!Character.isUpperCase(greeting.name.charAt(0))) {
//			warning('Name should start with a capital', 
//					MyDslPackage.Literals.GREETING__NAME,
//					INVALID_NAME)
//		}
//	}

	public static val String CODE__MISSING__L_RUNTIME_COMMON = "0_108"
	public static val String CODE__MISSING__DATATYPE_LIB = "0_109"
	public static val String CODE__MISSING__XBASE_LIB = "0_111"
	public static val String CODE__MISSING__JDK_1_5 = "0_112"

	@Check
	def checkClassPath(TableModel tableModel) {
		var typeReferences = services.typeReferences
		val listType = typeReferences.findDeclaredType(List, tableModel) as JvmGenericType
		if (listType == null || listType.getTypeParameters().isEmpty()) {
			error("Couldn't find a JDK 1.5 or higher on the project's classpath.",
					tableModel, TableDSLPackage.Literals.TABLE_MODEL__PACKAGES,
					CODE__MISSING__JDK_1_5);
		}
		if (typeReferences.findDeclaredType(PopupButton, tableModel) == null) {
			error("Couldn't find a the mandatory library 'popupbutton.osgi' on the project's classpath.",
					tableModel, TableDSLPackage.Literals.TABLE_MODEL__PACKAGES,
					"");
		}
		if (typeReferences.findDeclaredType(FilterTable, tableModel) == null) {
			error("Couldn't find a the mandatory library 'filteringtable.osgi' on the project's classpath.",
					tableModel, TableDSLPackage.Literals.TABLE_MODEL__PACKAGES,
					"");
		}
		if (typeReferences.findDeclaredType(
				"org.eclipse.osbp.runtime.common.annotations.Dispose", tableModel) == null) {
			error("Couldn't find the mandatory library 'org.eclipse.osbp.runtime.common' on the project's classpath.",
					tableModel, TableDSLPackage.Literals.TABLE_MODEL__PACKAGES,
					CODE__MISSING__L_RUNTIME_COMMON);
		}
		if (typeReferences.findDeclaredType(
				"org.eclipse.osbp.dsl.common.datatypes.IDatatypeConstants", tableModel) == null) {
			warning("Couldn't find the optional library 'org.eclipse.osbp.dsl.datatype.lib' on the project's classpath. This may cause resolving problems.",
					tableModel, TableDSLPackage.Literals.TABLE_MODEL__PACKAGES,
					CODE__MISSING__DATATYPE_LIB);
		}
		if (typeReferences.findDeclaredType("javax.validation.Valid", tableModel) == null) {
			error("Couldn't find the library 'javax.validation' on the project's classpath. This may cause resolving problems.",
					tableModel, TableDSLPackage.Literals.TABLE_MODEL__PACKAGES,
					CODE__MISSING__DATATYPE_LIB);
		}
	}

}
