package fi.otavanopisto.muikku.plugins.schooldatapyramus;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Observes;
import javax.enterprise.event.TransactionPhase;
import javax.inject.Inject;
import fi.otavanopisto.muikku.schooldata.SchoolDataIdentifier;
import fi.otavanopisto.muikku.schooldata.events.SchoolDataWorkspaceDiscoveredEvent;
@ApplicationScoped
public class WorkspaceDiscoveryWaiter {
private static final long INTERVAL = 10;
private static final long TIMEOUT = 60000;
@Inject
private Logger logger;
@PostConstruct
public void init() {
waits = new HashMap<>();
}
public Long waitDiscovered(SchoolDataIdentifier workspaceIdentifier) {
long timeoutTime = System.currentTimeMillis() + TIMEOUT;
Long result = null;
if (waits.containsKey(workspaceIdentifier.toId())) {
return waits.remove(workspaceIdentifier.toId());
}
waits.put(workspaceIdentifier.toId(), null);
while (result == null) {
result = getWorkspaceEntityId(workspaceIdentifier);
if (System.currentTimeMillis() > timeoutTime) {
logger.severe("Timeouted when waiting for new workspace");
return null;
}
if (result != null) {
waits.remove(workspaceIdentifier.toId());
} else {
try {
Thread.sleep(INTERVAL);
} catch (InterruptedException e) {
}
}
}
return result;
}
public void onWaitingWorkspaceDiscoveredEvent(@Observes (during = TransactionPhase.AFTER_SUCCESS) SchoolDataWorkspaceDiscoveredEvent event) {
SchoolDataIdentifier workspaceIdentifier = new SchoolDataIdentifier(event.getIdentifier(), event.getDataSource());
String id = workspaceIdentifier.toId();
if (waits.containsKey(id)) {
waits.put(id, event.getDiscoveredWorkspaceEntityId());
}
}
private Long getWorkspaceEntityId(SchoolDataIdentifier workspaceIdentifier) {
return waits.get(workspaceIdentifier.toId());
}
private Map<String, Long> waits;
}