/**
 * 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.ui.api.useraccess.IUserAccessService;
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.authorizationdsl.validation.AbstractAuthorizationDSLValidator;
import org.eclipse.osbp.xtext.basic.validation.IBasicValidatorDelegate;
import org.eclipse.xtend2.lib.StringConcatenation;
import org.eclipse.xtext.validation.Check;

/**
 * This class contains custom validation rules.
 * 
 * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#validation
 */
@SuppressWarnings("all")
public class AuthorizationDSLValidator extends AbstractAuthorizationDSLValidator {
  @Inject(optional = true)
  private IBasicValidatorDelegate delegate;
  
  @Check
  public void checkSecurityLicensed(final Role role) {
    boolean _equals = IUserAccessService.NAME_ADMINISTRATOR.equals(role.getName());
    if (_equals) {
      StringConcatenation _builder = new StringConcatenation();
      _builder.append("The role \'");
      _builder.append(IUserAccessService.NAME_ADMINISTRATOR);
      _builder.append("\' is the already existing default role and its explicit definition is not allowed!");
      this.error(_builder.toString(), role, null);
    } else {
      if (((this.delegate != null) && (!this.delegate.validateCommercial("authorization", "net.osbee.organization.permissions")))) {
        StringConcatenation _builder_1 = new StringConcatenation();
        _builder_1.append("Authorization is needed and not yet licensed. License Authorization at www.osbee.net");
        this.info(_builder_1.toString(), role, null);
      }
    }
  }
  
  @Check
  public void checkBPMLicensed(final RoleBlipProcess process) {
    if (((this.delegate != null) && (!this.delegate.validateCommercial("authorization", "net.osbee.bpm")))) {
      StringConcatenation _builder = new StringConcatenation();
      _builder.append("BPM is needed and not yet licensed. License BPM at www.osbee.net");
      this.info(_builder.toString(), process, AuthorizationDSLPackage.Literals.ROLE_BLIP_PROCESS__PROCESS);
    }
  }
}
