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

import com.google.inject.Inject
import org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSLPackage
import org.eclipse.osbp.xtext.authorizationdsl.Role
import org.eclipse.osbp.xtext.authorizationdsl.RoleBlipProcess
import org.eclipse.osbp.xtext.basic.validation.IBasicValidatorDelegate
import org.eclipse.xtext.validation.Check
import org.eclipse.osbp.ui.api.useraccess.IUserAccessService

/**
 * This class contains custom validation rules. 
 *
 * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#validation
 */
class AuthorizationDSLValidator extends AbstractAuthorizationDSLValidator {
	@Inject(optional=true) IBasicValidatorDelegate delegate
	
	@Check
	def checkSecurityLicensed(Role role) {
		if (IUserAccessService.NAME_ADMINISTRATOR.equals(role.name)) {
			error('''The role '«IUserAccessService.NAME_ADMINISTRATOR»' is the already existing default role and its explicit definition is not allowed!''', role, null)
		} else if(delegate !== null && !delegate.validateCommercial("authorization", "net.osbee.organization.permissions")) {
			info('''Authorization is needed and not yet licensed. License Authorization at www.osbee.net''', role, null)
		}
		
	}
	
	@Check
	def checkBPMLicensed(RoleBlipProcess process) {
		if(delegate !== null && !delegate.validateCommercial("authorization", "net.osbee.bpm")) {
			info('''BPM is needed and not yet licensed. License BPM at www.osbee.net''', process,  AuthorizationDSLPackage.Literals.ROLE_BLIP_PROCESS__PROCESS)
		}
	}
}
