package ch.rasc.wampspring.demo.various.scheduler;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.fasterxml.jackson.databind.ObjectMapper;
import ch.rasc.wampspring.EventMessenger;
import ch.rasc.wampspring.annotation.WampCallListener;
import ch.rasc.wampspring.annotation.WampPublishListener;
import ch.rasc.wampspring.message.PublishMessage;
@Service
public class SchedulerHandler {
@Autowired
private EventMessenger eventMessenger;
private final static ObjectMapper mapper = new ObjectMapper();
@WampCallListener(value = "schdemo#doInitialLoad")
public Map<String, Collection<CustomEvent>> doInitialLoad() {
return Collections.singletonMap("data", CustomEventDb.list());
}
@WampPublishListener(value = "schdemo#clientDoUpdate",
replyTo = "schdemo#serverDoUpdate", excludeSender = true)
public CustomEvent update(CustomEvent record) {
CustomEventDb.update(record);
return record;
}
@WampPublishListener(value = "schdemo#clientDoAdd", replyTo = "schdemo#serverDoAdd",
excludeSender = true)
public Map<String, List<Object>> add(PublishMessage message,
List<Map<String, Object>> records) {
List<Object> updatedRecords = new ArrayList<>();
List<Map<String, Object>> ids = new ArrayList<>();
for (Map<String, Object> r : records) {
@SuppressWarnings("unchecked")
Map<String, Object> record = (Map<String, Object>) r.get("data");
String internalId = (String) r.get("internalId");
CustomEvent event = mapper.convertValue(record, CustomEvent.class);
CustomEventDb.create(event);
updatedRecords.add(event);
Map<String, Object> result = new HashMap<>();
result.put("internalId", internalId);
result.put("record", event);
ids.add(result);
}
this.eventMessenger.sendTo("schdemo#serverSyncId",
Collections.singletonMap("records", ids),
message.getWebSocketSessionId());
return Collections.singletonMap("records", updatedRecords);
}
@WampPublishListener(value = "schdemo#clientDoRemove",
replyTo = "schdemo#serverDoRemove", excludeSender = true)
public Map<String, List<Integer>> remove(List<Integer> ids) {
CustomEventDb.delete(ids);
return Collections.singletonMap("ids", ids);
}
}