/**
 * 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.ADMINISTRATOR.equals(role.getName());
    if (_equals) {
      StringConcatenation _builder = new StringConcatenation();
      _builder.append("The role \'");
      _builder.append(IUserAccessService.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);
    }
  }
}
