PermissionWrappedGdb.java

package hu.ddsi.java.database;

import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Set;

import eu.javaexperience.interfaces.simple.SimpleGet;
import eu.javaexperience.query.LogicalGroup;
import eu.javaexperience.reflect.Mirror;

public class PermissionWrappedGdb extends GenericStoreDatabase
{
	protected GenericStoreDatabase gdb;
	protected SimpleGet<Set<String>> permissions;
	public PermissionWrappedGdb(GenericStoreDatabase gdb, SimpleGet<Set<String>> perms)
	{
		this.gdb = gdb;
		this.permissions = perms;
		try
		{
			mustCallAfterConnectionEstablishedBeforeUse();
		}
		catch(Exception e)
		{
			Mirror.propagateAnyway(e);
		}
	}
	
	public GenericStoreDatabase getBackend()
	{
		return gdb;
	}

	protected void resolvePlacements() throws IOException, Exception
	{
		gdb.resolvePlacements();
	}
	
	protected GenericStorable getFromCacheOrPublishRead(long id, Object res, Class<GenericStorable> re, String cls, FieldData[] fds) throws Exception
	{
		return gdb.getFromCacheOrPublishRead(id, res, re, cls, fds);
	}
	
	protected void setupReadedObject(GenericStorable gs,long id)
	{
		gdb.setupReadedObject(gs, id);
	}
	
	protected GenericStorable getSingleObjectByID(long id, List<Class<? extends GenericStorable>> clss) throws Exception
	{
		return gdb.getSingleObjectByID(id, clss);
	}
	
	public List<Class<? extends GenericStorable>> getDescendantClassesFor(Class<? extends GenericStorable> cls) throws Exception
	{
		return gdb.getDescendantClassesFor(cls);
	}
	
	public boolean isStored(Class<? extends GenericStorable> cls) throws Exception
	{
		return gdb.isStored(cls);
	}
	
	protected boolean isStored(Class<? extends GenericStorable> cls,String[] lst)
	{
		return gdb.isStored(cls, lst);
	}
	
	@Override
	public GenericStoreDataWriter getWriter(String cls) throws Exception
	{
		return gdb.getWriter(cls);
	}
	@Override
	public String getDatabaseName()
	{
		return gdb.getDatabaseName();
	}
	
	protected void assertPermission(String perm)
	{
		if(!permissions.get().contains(perm))
		{
			throw new RuntimeException("You have no `"+perm+"` permission for this database");
		}
	}
	
	@Override
	public GenericStoreQueryResult getIDListByQuery(Class<? extends GenericStorable> cls, LogicalGroup lg, boolean all_field) throws Exception
	{
		assertPermission("read");
		return gdb.getIDListByQuery(cls, lg, all_field);
	}
	@Override
	public void createStorageForClass(Class<? extends GenericStorable> cls, FieldData[] data) throws Exception
	{
		assertPermission("write");
		gdb.createStorageForClass(cls, data);
	}
	
	@Override
	protected void dropClassStorageImpl(Class<? extends GenericStorable> cls) throws Exception
	{
		assertPermission("delete");
		gdb.dropClassStorage(cls);
	}
	
	@Override
	public void deleteObjectByIDSByClass(long[] id, Class<? extends GenericStorable>[] cls) throws Exception
	{
		assertPermission("delete");
		gdb.deleteObjectByIDSByClass(id, cls);
	}
	
	@Override
	public String[] listStoredClasses() throws Exception
	{
		assertPermission("read");
		return gdb.listStoredClasses();
	}
	
	@Override
	public GenericStoreDataReader getReader(String clas) throws Exception
	{
		return gdb.getReader(clas);
	}
	
	@Override
	public void storeAll(Map<Class<? extends GenericStorable>, List<? extends GenericStorable>> map) throws Exception
	{
		assertPermission("write");
		gdb.storeAll(map);
	}
	
	@Override
	protected List<Long> reserveNextIDRangeAtomic(int size) throws Exception
	{
		assertPermission("create");
		return gdb.reserveNextIDRangeAtomic(size);
	}
	
	@Override
	protected long getCurrentId() throws Exception
	{
		return gdb.getCurrentId();
	}
	
	@Override
	public void close()
	{
		gdb.close();
	}
}