All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.kero.security.core.agent.KeroAccessAgentImpl Maven / Gradle / Ivy

package com.kero.security.core.agent;

import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.kero.security.core.access.Access;
import com.kero.security.core.agent.exception.AccessSchemeIncorrectTypeException;
import com.kero.security.core.configurator.KeroAccessConfigurator;
import com.kero.security.core.protector.KeroProtector;
import com.kero.security.core.protector.storage.KeroProtectorStorage;
import com.kero.security.core.role.Role;
import com.kero.security.core.role.storage.RoleStorage;
import com.kero.security.core.scheme.AccessScheme;
import com.kero.security.core.scheme.ClassAccessScheme;
import com.kero.security.core.scheme.configurator.AccessSchemeConfigurator;
import com.kero.security.core.scheme.configurator.KsdlAccessSchemeConfigurator;
import com.kero.security.core.scheme.definition.ClassAccessSchemeDefinition;
import com.kero.security.core.scheme.definition.configurator.AccessSchemeDefinitionConfigurator;
import com.kero.security.core.scheme.storage.AccessSchemeStorage;
import com.kero.security.core.scheme.strategy.AccessSchemeNamingStrategy;
import com.kero.security.core.scheme.strategy.DefaultAccessSchemeNamingStrategy;
import com.kero.security.lang.provider.BaseCompositeProvider;
import com.kero.security.lang.provider.CompositeProvider;
import com.kero.security.lang.provider.KsdlProvider;

public class KeroAccessAgentImpl implements KeroAccessAgent {
	
	protected static Logger LOGGER = LoggerFactory.getLogger("Kero-Security");
	
	protected RoleStorage roleStorage = RoleStorage.create();
	protected AccessSchemeStorage schemeStorage = AccessSchemeStorage.create();
	protected KeroProtectorStorage protectorStorage = KeroProtectorStorage.create();
	protected KeroAccessConfigurator configurator = new KeroAccessConfigurator(this);
		
	protected Access defaultAccess = Access.GRANT;
	
	protected Set ignoreList = new HashSet<>();

	protected Map namesMap = new HashMap<>();

	protected Set configurators = new HashSet<>();
	protected Set definitionConfigurators = new HashSet<>();
	
	protected AccessSchemeNamingStrategy schemeNamingStrategy = new DefaultAccessSchemeNamingStrategy();
	
	protected CompositeProvider mainKsdlProvider;
	
	KeroAccessAgentImpl() {
		
		ignoreType(String.class);
		
		ignoreType(Integer.class);
		ignoreType(int.class);
		
		ignoreType(Long.class);
		ignoreType(long.class);
		
		ignoreType(Float.class);
		ignoreType(float.class);
		
		ignoreType(Double.class);
		ignoreType(double.class);
		
		ignoreType(Character.class);
		ignoreType(char.class);
		
		ignoreType(Boolean.class);
		ignoreType(boolean.class);
		
		this.mainKsdlProvider = new BaseCompositeProvider();
		
		this.addConfigurator(new KsdlAccessSchemeConfigurator(this.mainKsdlProvider));
	}
	
	public void preloadMainProvider() {
		
		this.mainKsdlProvider.preloadResource();
	}
	
	public void addKsdlProvider(KsdlProvider provider) {
		
		this.mainKsdlProvider.addProvider(provider);
	}
	
	public void setMainProvider(CompositeProvider provider) {
		
		this.mainKsdlProvider = provider;
	}
	
	public CompositeProvider getMainProvider() {
		
		return this.mainKsdlProvider;
	}
	
	public void setSchemeNamingStrategy(AccessSchemeNamingStrategy strategy) {
	
		this.schemeNamingStrategy = strategy;
	}
	
	public void addConfigurator(AccessSchemeConfigurator configurator) {
		
		this.configurators.add(configurator);
	}
	
	public void addDefinitionConfigurator(AccessSchemeDefinitionConfigurator configurator) {
		
		this.definitionConfigurators.add(configurator);
	}
	
	public void setTypeName(String name, Class type) {
		
		this.namesMap.put(type, name);
	}
	
	public void ignoreType(Class type) {
		
		ignoreList.add(type);
	}
	
	@Override
	public boolean hasScheme(Class rawType) {
		
		return schemeStorage.has(rawType);
	}

	@Override
	public AccessScheme getScheme(Class rawType) {
		
		return schemeStorage.getOrDefault(rawType, AccessScheme.EMPTY);
	}
	
	@Override
	public AccessScheme getSchemeByName(String name) {
		
		return schemeStorage.getByName(name);
	}

	public AccessScheme getOrCreateScheme(Class rawType){
		
		return hasScheme(rawType) ? getScheme(rawType) : createScheme(rawType);
	}
	
	public AccessScheme createScheme(Class rawType) {
		
		if(rawType == null) return AccessScheme.EMPTY;	
		if(rawType.isInterface()) throw new AccessSchemeIncorrectTypeException("Can't create scheme for interface!");
		
		String name = schemeNamingStrategy.getName(rawType);
		
			if(namesMap.containsKey(rawType)) {
				
				name = namesMap.get(rawType);
			}
		
		LOGGER.debug("Creating access scheme for class: "+rawType.getCanonicalName());	
			
		ClassAccessSchemeDefinition definition = new ClassAccessSchemeDefinition(this, name, rawType);
			
			for(AccessSchemeDefinitionConfigurator configurator : definitionConfigurators) {
				
				configurator.configure(definition);
			}
		
		AccessScheme scheme = definition.createScheme();

			for(AccessSchemeConfigurator configurator : configurators) {
				
				configurator.configure(scheme);
			}
		
		schemeStorage.add(scheme);
		
		return scheme;
	}

	@Override
	public  T protect(T object, Collection roles) {
		
		if(object == null) return null;
		if(object instanceof Enum) return object;
		if(this.ignoreList.contains(object.getClass())) return object;
		
		ClassAccessScheme scheme = (ClassAccessScheme) getOrCreateScheme(object.getClass());
		KeroProtector protector = protectorStorage.getOrCreateProtector(scheme);
		
		return protector.protect(object, roles);
	}
	
	public String extractPropertyName(String rawName) {
		
		String name = rawName;
		
		if(name.startsWith("get")) {
			
			name = name.replaceFirst("get", "");
		}
		
		name = name.toLowerCase();
	
		return name;
	}
	
	@Override
	public Access getDefaultAccess() {
		
		return this.defaultAccess;
	}
	
	@Override
	public KeroAccessConfigurator getKeroAccessConfigurator() {
		
		return this.configurator;
	}

	@Override
	public Role createRole(String name) {
		
		return this.roleStorage.create(name);
	}

	@Override
	public Role getRole(String name) {
		
		return this.roleStorage.get(name);
	}

	@Override
	public Role hasRole(String name) {
		
		return this.roleStorage.create(name);
	}

	@Override
	public Role getOrCreateRole(String name) {
		
		return this.roleStorage.getOrCreate(name);
	}

	@Override
	public Set getOrCreateRole(Collection names) {
		
		return this.roleStorage.getOrCreate(names);
	}

	@Override
	public Set getOrCreateRole(String[] names) {
		
		return this.roleStorage.getOrCreate(names);
	}

	@Override
	public RoleStorage getRoleStorage() {
		
		return this.roleStorage;
	}

	@Override
	public AccessSchemeStorage getSchemeStorage() {
		
		return this.schemeStorage;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy