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

com.lapissea.datamanager.managers.DataManagerMulti Maven / Gradle / Ivy

Go to download

An abstraction of folder/zip/jar reading with multi source fallback and lazy caching and SQL emulated mutable file system.

There is a newer version: 1.0.4
Show newest version
package com.lapissea.datamanager.managers;

import com.lapissea.datamanager.DataSignature;
import com.lapissea.datamanager.Domain;
import com.lapissea.datamanager.DomainRegistry;
import com.lapissea.datamanager.IDataManager;
import com.lapissea.util.NotNull;
import com.lapissea.util.Nullable;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.ObjIntConsumer;
import java.util.stream.Stream;

@SuppressWarnings("CatchMayIgnoreException")
public class DataManagerMulti implements IDataManager{
	
	private final List domains=new ArrayList<>(2);
	
	public DataManagerMulti(){ }
	
	public DataManagerMulti(@NotNull String... domainPaths){
		for(String path : domainPaths){
			registerDomain(path);
		}
	}
	
	@NotNull
	public DataManagerMulti registerDomain(@NotNull String path){
		Domain domain=DomainRegistry.create(path);
		if(domains.contains(domain)) return this;
		domains.add(domain);
		return this;
	}
	
	@Nullable
	@Override
	public BufferedInputStream getInStream(@NotNull String localPath){
		checkInitialization();
		
		for(Domain domain : domains){
			try{
				BufferedInputStream t=domain.getInStream(localPath);
				if(t!=null) return t;
			}catch(Exception e){}
		}
		return null;
	}
	
	@Nullable
	@Override
	public BufferedReader getReader(@NotNull String localPath){
		checkInitialization();
		
		for(Domain domain : domains){
			try{
				BufferedReader t=domain.getReader(localPath);
				if(t!=null) return t;
			}catch(Exception e){}
		}
		return null;
	}
	
	@Override
	public long getSize(@NotNull String localPath){
		checkInitialization();
		
		for(Domain domain : domains){
			try{
				long t=domain.getSize(localPath);
				if(t!=-1) return t;
			}catch(Exception e){}
		}
		return -1;
	}
	
	@Nullable
	@Override
	public byte[] readAllBytes(@NotNull String localPath){
		checkInitialization();
		
		for(Domain domain : domains){
			try{
				byte[] t=domain.getBytes(localPath);
				if(t!=null) return t;
			}catch(Exception e){}
		}
		return null;
	}
	
	@Nullable
	@Override
	public char[] readAllChars(@NotNull String localPath){
		checkInitialization();
		
		for(Domain domain : domains){
			try{
				char[] t=domain.getChars(localPath);
				if(t!=null) return t;
			}catch(Exception e){}
		}
		return null;
	}
	
	@Nullable
	@Override
	public String readAll(@NotNull String localPath){
		checkInitialization();
		
		for(Domain domain : domains){
			try{
				String t=domain.readAll(localPath);
				if(t!=null) return t;
			}catch(Exception e){}
		}
		return null;
	}
	
	@Nullable
	@Override
	public List getLines(@NotNull String localPath){
		checkInitialization();
		
		for(Domain domain : domains){
			try{
				List t=domain.getLines(localPath);
				if(t!=null) return t;
			}catch(Exception e){}
		}
		return null;
	}
	
	@NotNull
	@Override
	public DataManagerMulti getLines(@NotNull String localPath, @NotNull Consumer lineConsumer){
		checkInitialization();
		
		for(Domain domain : domains){
			try{
				if(domain.getLines(localPath, lineConsumer)) return this;
			}catch(Exception e){}
		}
		return this;
	}
	
	@NotNull
	@Override
	public DataManagerMulti getLines(@NotNull String localPath, @NotNull ObjIntConsumer lineConsumer){
		checkInitialization();
		
		for(Domain domain : domains){
			try{
				if(domain.getLines(localPath, lineConsumer)) return this;
			}catch(Exception e){}
		}
		return this;
	}
	
	@Nullable
	@Override
	public String[] getDirNames(@NotNull String localPath){
		checkInitialization();
		
		for(Domain domain : domains){
			try{
				String[] t=domain.getDirNames(localPath);
				if(t!=null) return t;
			}catch(Exception e){}
		}
		return null;
	}
	
	@Override
	public boolean exists(@NotNull String localPath){
		checkInitialization();
		
		for(Domain domain : domains){
			try{
				if(domain.exists(localPath)) return true;
			}catch(Exception e){}
		}
		return false;
	}
	
	@Nullable
	@Override
	public String[] getDirPaths(@NotNull String localPath){
		checkInitialization();
		
		for(Domain domain : domains){
			try{
				String[] t=domain.getDirPaths(localPath);
				if(t!=null) return t;
			}catch(Exception e){}
		}
		return null;
	}
	
	@Nullable
	@Override
	public String[] getDirPathsDeep(@NotNull String localPath){
		checkInitialization();
		
		for(Domain domain : domains){
			try{
				String[] t=domain.getDirPathsDeep(localPath);
				if(t!=null) return t;
			}catch(Exception e){}
		}
		return null;
	}
	
	@Nullable
	@Override
	public Stream getDirPathsS(@NotNull String localPath){
		checkInitialization();
		
		for(Domain domain : domains){
			try{
				Stream t=domain.getDirPathsS(localPath);
				if(t!=null) return t;
			}catch(Exception e){}
		}
		return null;
	}
	
	@Nullable
	@Override
	public Stream getDirPathsDeepS(@NotNull String localPath){
		checkInitialization();
		
		for(Domain domain : domains){
			try{
				Stream t=domain.getDirPathsDeepS(localPath);
				if(t!=null) return t;
			}catch(Exception e){}
		}
		return null;
	}
	
	@Override
	public boolean canEditCreate(@NotNull String localPath){
		checkInitialization();
		for(Domain d : domains){
			if(d.canEditCreate(localPath)){
				return true;
			}
		}
		return false;
	}
	
	@NotNull
	@Override
	public BufferedOutputStream makeFile(@NotNull String localPath){
		checkInitialization();
		for(Domain d : domains){
			if(d.canEditCreate(localPath)){
				return d.makeFile(localPath);
			}
		}
		throw new UnsupportedOperationException();
	}
	
	@Override
	public void makeFile(@NotNull String localPath, byte[] data){
		checkInitialization();
		for(Domain d : domains){
			if(d.canEditCreate(localPath)){
				d.makeFile(localPath, data);
				return;
			}
		}
		throw new UnsupportedOperationException();
	}
	
	@Nullable
	@Override
	public Stream getDirNamesS(@NotNull String localPath){
		checkInitialization();
		
		for(Domain domain : domains){
			try{
				Stream t=domain.getDirNamesS(localPath);
				if(t!=null) return t;
			}catch(Exception e){}
		}
		return null;
	}
	
	@NotNull
	@Override
	public IDataManager subData(@NotNull String localPath){
		checkInitialization();
		
		if(!exists(localPath)){
			StringBuilder sb=new StringBuilder(localPath+" does not exist in any of:\n");
			for(Domain domain : domains){
				sb.append("    ").append(domain.getSignature()).append('\n');
			}
			throw new IllegalStateException(sb.toString());
		}
		return new SubDataManager(this, localPath);
	}
	
	@NotNull
	@Override
	public DataSignature createSignature(@NotNull String localPath){
		return new DataSignature(localPath, this);
	}
	
	@Override
	public long getLastChange(@NotNull String localPath){
		checkInitialization();
		
		for(Domain domain : domains){
			long time=domain.getLastChange(localPath);
			if(time!=-1) return time;
		}
		return -1;
	}
	
	private void checkInitialization(){
		if(domains.isEmpty()) throw new IllegalStateException("Domain can not be used without registering a domain!");
	}
	
	@NotNull
	@Override
	public String toString(){
		if(domains.isEmpty()) return "";
		if(domains.size()==1) return domains.get(0).getSignature();
		return "";
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy