blob: b23af0d22d42023247d28866194c7ba6fef582d8 [file] [log] [blame]
/*
* Copyright (c) 2013, 2015 Eike Stepper (Berlin, Germany) and others.
* 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:
* Christian W. Damus (CEA LIST) - initial API and implementation
*/
package org.eclipse.emf.cdo.security.util;
import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
import org.eclipse.emf.cdo.common.revision.CDORevision;
import org.eclipse.emf.cdo.common.revision.CDORevisionProvider;
import org.eclipse.emf.cdo.internal.security.bundle.OM;
import org.eclipse.emf.cdo.security.Access;
import org.eclipse.emf.cdo.security.AndFilter;
import org.eclipse.emf.cdo.security.Assignee;
import org.eclipse.emf.cdo.security.ClassFilter;
import org.eclipse.emf.cdo.security.ClassPermission;
import org.eclipse.emf.cdo.security.CombinedFilter;
import org.eclipse.emf.cdo.security.Directory;
import org.eclipse.emf.cdo.security.ExpressionFilter;
import org.eclipse.emf.cdo.security.FilterPermission;
import org.eclipse.emf.cdo.security.Group;
import org.eclipse.emf.cdo.security.LinkedFilter;
import org.eclipse.emf.cdo.security.NotFilter;
import org.eclipse.emf.cdo.security.ObjectFilter;
import org.eclipse.emf.cdo.security.ObjectPermission;
import org.eclipse.emf.cdo.security.OrFilter;
import org.eclipse.emf.cdo.security.PackageFilter;
import org.eclipse.emf.cdo.security.PackagePermission;
import org.eclipse.emf.cdo.security.PatternStyle;
import org.eclipse.emf.cdo.security.Permission;
import org.eclipse.emf.cdo.security.PermissionFilter;
import org.eclipse.emf.cdo.security.Realm;
import org.eclipse.emf.cdo.security.ResourceFilter;
import org.eclipse.emf.cdo.security.ResourcePermission;
import org.eclipse.emf.cdo.security.Role;
import org.eclipse.emf.cdo.security.SecurityElement;
import org.eclipse.emf.cdo.security.SecurityItem;
import org.eclipse.emf.cdo.security.SecurityPackage;
import org.eclipse.emf.cdo.security.User;
import org.eclipse.emf.cdo.security.UserPassword;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.DiagnosticChain;
import org.eclipse.emf.common.util.ResourceLocator;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.util.EObjectValidator;
import java.util.Map;
import java.util.Queue;
import java.util.Set;
/**
* <!-- begin-user-doc -->
* The <b>Validator</b> for the model.
* @since 4.3
* <!-- end-user-doc -->
* @see org.eclipse.emf.cdo.security.SecurityPackage
* @generated
*/
@SuppressWarnings("deprecation")
public class SecurityValidator extends EObjectValidator
{
/**
* The cached model package
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public static final SecurityValidator INSTANCE = new SecurityValidator();
/**
* A constant for the {@link org.eclipse.emf.common.util.Diagnostic#getSource() source} of diagnostic {@link org.eclipse.emf.common.util.Diagnostic#getCode() codes} from this package.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see org.eclipse.emf.common.util.Diagnostic#getSource()
* @see org.eclipse.emf.common.util.Diagnostic#getCode()
* @generated
*/
public static final String DIAGNOSTIC_SOURCE = "org.eclipse.emf.cdo.security"; //$NON-NLS-1$
/**
* A constant with a fixed name that can be used as the base value for additional hand written constants.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
private static final int GENERATED_DIAGNOSTIC_CODE_COUNT = 0;
/**
* A constant with a fixed name that can be used as the base value for additional hand written constants in a derived class.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected static final int DIAGNOSTIC_CODE_COUNT = GENERATED_DIAGNOSTIC_CODE_COUNT;
/**
* Creates an instance of the switch.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public SecurityValidator()
{
super();
}
/**
* Returns the package of this validator switch.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
protected EPackage getEPackage()
{
return SecurityPackage.eINSTANCE;
}
/**
* Calls <code>validateXXX</code> for the corresponding classifier of the model.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
protected boolean validate(int classifierID, Object value, DiagnosticChain diagnostics, Map<Object, Object> context)
{
switch (classifierID)
{
case SecurityPackage.SECURITY_ELEMENT:
return validateSecurityElement((SecurityElement)value, diagnostics, context);
case SecurityPackage.SECURITY_ITEM:
return validateSecurityItem((SecurityItem)value, diagnostics, context);
case SecurityPackage.REALM:
return validateRealm((Realm)value, diagnostics, context);
case SecurityPackage.DIRECTORY:
return validateDirectory((Directory)value, diagnostics, context);
case SecurityPackage.ROLE:
return validateRole((Role)value, diagnostics, context);
case SecurityPackage.ASSIGNEE:
return validateAssignee((Assignee)value, diagnostics, context);
case SecurityPackage.GROUP:
return validateGroup((Group)value, diagnostics, context);
case SecurityPackage.USER:
return validateUser((User)value, diagnostics, context);
case SecurityPackage.USER_PASSWORD:
return validateUserPassword((UserPassword)value, diagnostics, context);
case SecurityPackage.PERMISSION:
return validatePermission((Permission)value, diagnostics, context);
case SecurityPackage.CLASS_PERMISSION:
return validateClassPermission((ClassPermission)value, diagnostics, context);
case SecurityPackage.PACKAGE_PERMISSION:
return validatePackagePermission((PackagePermission)value, diagnostics, context);
case SecurityPackage.RESOURCE_PERMISSION:
return validateResourcePermission((ResourcePermission)value, diagnostics, context);
case SecurityPackage.OBJECT_PERMISSION:
return validateObjectPermission((ObjectPermission)value, diagnostics, context);
case SecurityPackage.FILTER_PERMISSION:
return validateFilterPermission((FilterPermission)value, diagnostics, context);
case SecurityPackage.PERMISSION_FILTER:
return validatePermissionFilter((PermissionFilter)value, diagnostics, context);
case SecurityPackage.LINKED_FILTER:
return validateLinkedFilter((LinkedFilter)value, diagnostics, context);
case SecurityPackage.PACKAGE_FILTER:
return validatePackageFilter((PackageFilter)value, diagnostics, context);
case SecurityPackage.CLASS_FILTER:
return validateClassFilter((ClassFilter)value, diagnostics, context);
case SecurityPackage.RESOURCE_FILTER:
return validateResourceFilter((ResourceFilter)value, diagnostics, context);
case SecurityPackage.OBJECT_FILTER:
return validateObjectFilter((ObjectFilter)value, diagnostics, context);
case SecurityPackage.EXPRESSION_FILTER:
return validateExpressionFilter((ExpressionFilter)value, diagnostics, context);
case SecurityPackage.COMBINED_FILTER:
return validateCombinedFilter((CombinedFilter)value, diagnostics, context);
case SecurityPackage.NOT_FILTER:
return validateNotFilter((NotFilter)value, diagnostics, context);
case SecurityPackage.AND_FILTER:
return validateAndFilter((AndFilter)value, diagnostics, context);
case SecurityPackage.OR_FILTER:
return validateOrFilter((OrFilter)value, diagnostics, context);
case SecurityPackage.PATTERN_STYLE:
return validatePatternStyle((PatternStyle)value, diagnostics, context);
case SecurityPackage.ACCESS:
return validateAccess((Access)value, diagnostics, context);
case SecurityPackage.ACCESS_OBJECT:
return validateAccessObject((Access)value, diagnostics, context);
default:
return true;
}
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validateSecurityElement(SecurityElement securityElement, DiagnosticChain diagnostics,
Map<Object, Object> context)
{
return validate_EveryDefaultConstraint(securityElement, diagnostics, context);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validateSecurityItem(SecurityItem securityItem, DiagnosticChain diagnostics,
Map<Object, Object> context)
{
return validate_EveryDefaultConstraint(securityItem, diagnostics, context);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validateRealm(Realm realm, DiagnosticChain diagnostics, Map<Object, Object> context)
{
if (!validate_NoCircularContainment(realm, diagnostics, context))
{
return false;
}
boolean result = validate_EveryMultiplicityConforms(realm, diagnostics, context);
if (result || diagnostics != null)
{
result &= validate_EveryDataValueConforms(realm, diagnostics, context);
}
if (result || diagnostics != null)
{
result &= validate_EveryReferenceIsContained(realm, diagnostics, context);
}
if (result || diagnostics != null)
{
result &= validate_EveryBidirectionalReferenceIsPaired(realm, diagnostics, context);
}
if (result || diagnostics != null)
{
result &= validate_EveryProxyResolves(realm, diagnostics, context);
}
if (result || diagnostics != null)
{
result &= validate_UniqueID(realm, diagnostics, context);
}
if (result || diagnostics != null)
{
result &= validate_EveryKeyUnique(realm, diagnostics, context);
}
if (result || diagnostics != null)
{
result &= validate_EveryMapEntryUnique(realm, diagnostics, context);
}
if (result || diagnostics != null)
{
result &= validateRealm_HasAdministrator(realm, diagnostics, context);
}
return result;
}
/**
* Validates the HasAdministrator constraint of '<em>Realm</em>'.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
public boolean validateRealm_HasAdministrator(Realm realm, DiagnosticChain diagnostics, Map<Object, Object> context)
{
final CDORevision realmRevision = realm.cdoRevision();
final CDORevisionProvider revisionProvider = getRevisionProvider(realm, context);
final CDOBranchPoint securityContext = getSecurityContext(realm, context);
for (User user : realm.getAllUsers())
{
if (user.getDefaultAccess() == Access.WRITE)
{
// Constraint is satisfied: this user can write anything at all in the repository
return true;
}
for (Permission permission : user.getAllPermissions())
{
if (permission.getAccess() == Access.WRITE
&& permission.isApplicable(realmRevision, revisionProvider, securityContext))
{
// Constraint is satisfied: this user can write the realm
return true;
}
}
}
if (diagnostics != null)
{
diagnostics.add(createDiagnostic(Diagnostic.ERROR, DIAGNOSTIC_SOURCE, 0, "_UI_Realm_hasAdministrator_diagnostic", //$NON-NLS-1$
new Object[0], new Object[] { realm }, context));
}
return false;
}
protected <T> T getContextByClassKey(Map<Object, Object> context, Class<T> key, T defaultValue)
{
if (context != null)
{
Object value = context.get(key);
if (key.isInstance(value))
{
return key.cast(value);
}
}
return defaultValue;
}
protected CDORevisionProvider getRevisionProvider(Realm realm, Map<Object, Object> context)
{
return getContextByClassKey(context, CDORevisionProvider.class, realm.cdoView());
}
protected CDOBranchPoint getSecurityContext(Realm realm, Map<Object, Object> context)
{
return getContextByClassKey(context, CDOBranchPoint.class, realm.cdoView());
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validateDirectory(Directory directory, DiagnosticChain diagnostics, Map<Object, Object> context)
{
return validate_EveryDefaultConstraint(directory, diagnostics, context);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validateRole(Role role, DiagnosticChain diagnostics, Map<Object, Object> context)
{
return validate_EveryDefaultConstraint(role, diagnostics, context);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validateAssignee(Assignee assignee, DiagnosticChain diagnostics, Map<Object, Object> context)
{
return validate_EveryDefaultConstraint(assignee, diagnostics, context);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validateGroup(Group group, DiagnosticChain diagnostics, Map<Object, Object> context)
{
if (!validate_NoCircularContainment(group, diagnostics, context))
{
return false;
}
boolean result = validate_EveryMultiplicityConforms(group, diagnostics, context);
if (result || diagnostics != null)
{
result &= validate_EveryDataValueConforms(group, diagnostics, context);
}
if (result || diagnostics != null)
{
result &= validate_EveryReferenceIsContained(group, diagnostics, context);
}
if (result || diagnostics != null)
{
result &= validate_EveryBidirectionalReferenceIsPaired(group, diagnostics, context);
}
if (result || diagnostics != null)
{
result &= validate_EveryProxyResolves(group, diagnostics, context);
}
if (result || diagnostics != null)
{
result &= validate_UniqueID(group, diagnostics, context);
}
if (result || diagnostics != null)
{
result &= validate_EveryKeyUnique(group, diagnostics, context);
}
if (result || diagnostics != null)
{
result &= validate_EveryMapEntryUnique(group, diagnostics, context);
}
if (result || diagnostics != null)
{
result &= validateGroup_AcyclicInheritance(group, diagnostics, context);
}
return result;
}
/**
* Validates the AcyclicInheritance constraint of '<em>Group</em>'.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
public boolean validateGroup_AcyclicInheritance(Group group, DiagnosticChain diagnostics, Map<Object, Object> context)
{
final Set<Group> visited = new java.util.HashSet<Group>();
final Queue<Group> toVisit = new java.util.LinkedList<Group>();
toVisit.offer(group);
for (Group next = toVisit.poll(); next != null; next = toVisit.poll())
{
if (visited.add(next))
{
toVisit.addAll(next.getInheritedGroups());
}
else
{
// Detected a cycle
if (diagnostics != null)
{
diagnostics
.add(createDiagnostic(Diagnostic.ERROR, DIAGNOSTIC_SOURCE, 0, "_UI_Group_acyclicInheritance_diagnostic", //$NON-NLS-1$
new Object[] { group.getId() }, new Object[] { group }, context));
}
return false;
}
}
return true;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validateUser(User user, DiagnosticChain diagnostics, Map<Object, Object> context)
{
return validate_EveryDefaultConstraint(user, diagnostics, context);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validateUserPasswordGen(UserPassword userPassword, DiagnosticChain diagnostics,
Map<Object, Object> context)
{
return validate_EveryDefaultConstraint(userPassword, diagnostics, context);
}
/**
* No user, not even the Administrator, is permitted to read the properties of a
* {@link UserPassword}, so this validation is a no-op.
*/
public boolean validateUserPassword(UserPassword userPassword, DiagnosticChain diagnostics,
Map<Object, Object> context)
{
return true;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validatePermission(Permission permission, DiagnosticChain diagnostics, Map<Object, Object> context)
{
return validate_EveryDefaultConstraint(permission, diagnostics, context);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validateClassPermission(ClassPermission classPermission, DiagnosticChain diagnostics,
Map<Object, Object> context)
{
return validate_EveryDefaultConstraint(classPermission, diagnostics, context);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validatePackagePermission(PackagePermission packagePermission, DiagnosticChain diagnostics,
Map<Object, Object> context)
{
return validate_EveryDefaultConstraint(packagePermission, diagnostics, context);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validateResourcePermission(ResourcePermission resourcePermission, DiagnosticChain diagnostics,
Map<Object, Object> context)
{
return validate_EveryDefaultConstraint(resourcePermission, diagnostics, context);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validateObjectPermission(ObjectPermission objectPermission, DiagnosticChain diagnostics,
Map<Object, Object> context)
{
return validate_EveryDefaultConstraint(objectPermission, diagnostics, context);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validateFilterPermission(FilterPermission filterPermission, DiagnosticChain diagnostics,
Map<Object, Object> context)
{
return validate_EveryDefaultConstraint(filterPermission, diagnostics, context);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validatePermissionFilter(PermissionFilter permissionFilter, DiagnosticChain diagnostics,
Map<Object, Object> context)
{
return validate_EveryDefaultConstraint(permissionFilter, diagnostics, context);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validateLinkedFilter(LinkedFilter linkedFilter, DiagnosticChain diagnostics,
Map<Object, Object> context)
{
return validate_EveryDefaultConstraint(linkedFilter, diagnostics, context);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validatePackageFilter(PackageFilter packageFilter, DiagnosticChain diagnostics,
Map<Object, Object> context)
{
return validate_EveryDefaultConstraint(packageFilter, diagnostics, context);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validateClassFilter(ClassFilter classFilter, DiagnosticChain diagnostics, Map<Object, Object> context)
{
return validate_EveryDefaultConstraint(classFilter, diagnostics, context);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validateResourceFilter(ResourceFilter resourceFilter, DiagnosticChain diagnostics,
Map<Object, Object> context)
{
return validate_EveryDefaultConstraint(resourceFilter, diagnostics, context);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validateObjectFilter(ObjectFilter objectFilter, DiagnosticChain diagnostics,
Map<Object, Object> context)
{
return validate_EveryDefaultConstraint(objectFilter, diagnostics, context);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validateExpressionFilter(ExpressionFilter expressionFilter, DiagnosticChain diagnostics,
Map<Object, Object> context)
{
return validate_EveryDefaultConstraint(expressionFilter, diagnostics, context);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validateCombinedFilter(CombinedFilter combinedFilter, DiagnosticChain diagnostics,
Map<Object, Object> context)
{
return validate_EveryDefaultConstraint(combinedFilter, diagnostics, context);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validateNotFilter(NotFilter notFilter, DiagnosticChain diagnostics, Map<Object, Object> context)
{
return validate_EveryDefaultConstraint(notFilter, diagnostics, context);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validateAndFilter(AndFilter andFilter, DiagnosticChain diagnostics, Map<Object, Object> context)
{
return validate_EveryDefaultConstraint(andFilter, diagnostics, context);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validateOrFilter(OrFilter orFilter, DiagnosticChain diagnostics, Map<Object, Object> context)
{
return validate_EveryDefaultConstraint(orFilter, diagnostics, context);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validatePatternStyle(PatternStyle patternStyle, DiagnosticChain diagnostics,
Map<Object, Object> context)
{
return true;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validateAccess(Access access, DiagnosticChain diagnostics, Map<Object, Object> context)
{
return true;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validateAccessObject(Access accessObject, DiagnosticChain diagnostics, Map<Object, Object> context)
{
return true;
}
/**
* Returns the resource locator that will be used to fetch messages for this validator's diagnostics.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
@Override
public ResourceLocator getResourceLocator()
{
return OM.EMF_PLUGIN;
}
} // SecurityValidator