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

prompto.store.datomic.StorableDocument Maven / Gradle / Ivy

package prompto.store.datomic;

import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import prompto.error.PromptoError;
import prompto.intrinsic.PromptoBinary;
import prompto.intrinsic.PromptoDate;
import prompto.intrinsic.PromptoDateTime;
import prompto.intrinsic.PromptoTime;
import prompto.store.Family;
import prompto.store.IStorable;
import prompto.store.datomic.Constants.DbPart;
import datomic.Peer;

public class StorableDocument implements IStorable  {

	DatomicFacts facts = null;
	List categories;
	IDbIdListener listener;
	
	public StorableDocument(List categories, IDbIdListener listener) {
		this.categories = categories;
		this.listener = listener;
	}

	@Override
	public void setCategories(String[] categories) throws PromptoError {
		this.categories = Arrays.asList(categories);
	}
	
	@Override
	public void setDbId(Object dbId) {
		ensureFacts(null);
		facts.setDbId(dbId);
	}

	@Override
	public Object getOrCreateDbId() {
		ensureFacts(null);
		return facts.getDbId();
	}

	@Override
	public void clear() {
		facts = null;
	}

	@Override
	public boolean isDirty() {
		return facts != null;
	}

	@Override
	public void setData(String name, Object value, IDbIdProvider provider) throws PromptoError {
		ensureFacts(provider);
		setData(name, value);
	}

	@Override
	public void setData(String name, Object value) throws PromptoError {
		ensureFacts(null);
		if(value instanceof PromptoDate) {
			facts.add(name + "/family", Family.DATE.name());
			value = ((PromptoDate)value).toJavaTime();
			facts.add(name, value);
		} else if(value instanceof PromptoTime) {
			facts.add(name + "/family", Family.TIME.name());
			value = ((PromptoTime)value).getNativeMillisOfDay();
			facts.add(name, value);
		} else if(value instanceof PromptoDateTime) {
			facts.add(name + "/family", Family.DATETIME.name());
			String zone = ((PromptoDateTime)value).getTzName();
			if(zone!=null)
				facts.add(name + "/zone", zone);
			else {
				Long offset = ((PromptoDateTime)value).getTzOffset();
				if(offset!=null)
					facts.add(name + "/offset", offset);
			}
			value = new Date(((PromptoDateTime)value).toJavaTime());
			facts.add(name, value);
		} else if(value instanceof PromptoBinary) {
			// TODO PromptoBinary value = toBytes((PromptoBinary)value);
		} else
			facts.add(name, value);
	}

	
	private void ensureFacts(IDbIdProvider provider) {
		if(facts==null) {
			Object dbId = provider==null ? null : provider.get();
			// the scenario where we get an existing dbId is when  
			// an instance passes a provider when calling setData
			// in such a case, the scenario is an update scenario
			boolean isUpdate = dbId!=null;
			if(dbId==null)
				dbId = Peer.tempid(DbPart.USER.dbName());
			facts = new DatomicFacts(dbId);
			if(categories!=null && !isUpdate) {
				facts.add("category", categories); 
				final AtomicInteger counter = new AtomicInteger(0);
				facts.add("category/ordered", categories.stream().map(c->"" + counter.incrementAndGet() + ":" + c).collect(Collectors.toSet())); 
			}
		}
	}
	
	public Stream> getAddedFacts() {
		return facts.getAddedFacts();
	}

	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy