package adullact.publicrowdfunding.model.local.cache;
+import java.util.ArrayList;
import java.util.Comparator;
import org.joda.time.DateTime;
import adullact.publicrowdfunding.model.server.event.RetrieveEvent;
/**
- * Created by Ferrand on 18/07/2014.
+ * @author Ferrand and Nelaupe
*/
public class Cache<TResource extends Resource<TResource, ?, ?>> {
private Sync<TResource> m_resource;
private DateTime m_dateTime;
+ private ArrayList<WhatToDo<TResource>> m_pendingWhatToDo;
public Cache(TResource resource) {
this.m_resource = new Sync<TResource>(resource);
+ this.m_pendingWhatToDo = new ArrayList<WhatToDo<TResource>>();
+
this.m_dateTime = null;
}
return m_resource.id;
}
+ final public Cache<TResource> useIt() {
+ m_resource.resource.overrideCache(this);
+
+ return this;
+ }
+
public Cache<TResource> declareUpToDate() {
m_dateTime = DateTime.now();
return this;
}
+ public void setResource(TResource resource) {
+ m_resource.resource = resource;
+ }
+
public Cache<TResource> forceRetrieve() {
m_dateTime = null;
}
public void toResource(final WhatToDo<TResource> whatToDo) {
- boolean timeToRetrieve;
- if(m_dateTime == null) {
- timeToRetrieve = true;
- }
- else {
- Duration duration = new Duration(m_dateTime, DateTime.now());
- timeToRetrieve = (duration.getStandardMinutes() > 15);// Data may be outdated
- }
- if(timeToRetrieve) {
+ if(timeToRetrieve()) {
final RetrieveEvent<TResource> event = new RetrieveEvent<TResource>() {
@Override
public void errorResourceIdDoesNotExists(String id) {
m_resource.setState(Sync.State.deleted);
- whatToDo.give(m_resource);
- whatToDo.eventually();
+ workWithResource();
}
@Override
else {
m_resource.setState(Sync.State.unchanged);
}
- m_dateTime = DateTime.now();
- whatToDo.give(m_resource);
- whatToDo.eventually();
+ afterRetrieve();
+
+ workWithResource();
}
@Override
public void errorNetwork() {
- whatToDo.give(m_resource);
- whatToDo.eventually();
+ workWithResource();
+ }
+
+ @Override
+ public void errorServer() {
+ workWithResource();
}
};
- m_resource.resource.serverRetrieve(event);
+
+ if(addToPendingWhatToDo(whatToDo)) {
+ m_resource.resource.serverRetrieve(event);
+ }
}
else {
whatToDo.give(m_resource);
whatToDo.eventually();
}
}
+
+ protected boolean timeToRetrieve() {
+ if(m_dateTime == null) {
+ return true;
+ }
+ else {
+ Duration duration = new Duration(m_dateTime, DateTime.now());
+ return (duration.getStandardMinutes() > 15);// Data may be outdated
+ }
+ }
+
+ protected void afterRetrieve() {
+ m_dateTime = DateTime.now();
+ }
+
+ /**
+ *
+ * @param whatToDo
+ * @return true if new queue was created
+ */
+ private boolean addToPendingWhatToDo(WhatToDo<TResource> whatToDo) {
+ boolean res = m_pendingWhatToDo.isEmpty();
+ m_pendingWhatToDo.add(whatToDo);
+
+ return res;
+ }
+
+ private void workWithResource() {
+ for(WhatToDo<TResource> whatToDo : m_pendingWhatToDo) {
+ whatToDo.give(m_resource);
+ whatToDo.eventually();
+ }
+ m_pendingWhatToDo.clear();
+ }
}