package org.openstack.atlas.api.atom;
import org.openstack.atlas.service.domain.events.entities.*;
import org.openstack.atlas.service.domain.events.repository.LoadBalancerEventRepository;
import org.apache.abdera.model.Entry;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
public class EntryBuilder {
private LoadBalancerEventRepository eventRepository;
public void setEventRepository(LoadBalancerEventRepository eventsRepository) {
this.eventRepository = eventsRepository;
}
public List<Entry> createEntries(Map<String, Object> attributes, String baseUri) {
List<Entry> entries = new ArrayList<Entry>();
FeedType feedType = (FeedType) attributes.get("feedType");
Integer accountId = (Integer) attributes.get("accountId");
Integer page = (Integer) attributes.get("page");
Integer loadBalancerId = null;
if (!feedType.equals(FeedType.PARENT_FEED)) {
loadBalancerId = (Integer) attributes.get("loadBalancerId");
}
switch (feedType) {
case PARENT_FEED:
List<LoadBalancerServiceEvent> lbServiceEvents = eventRepository.getAllEventsForAccount(accountId, page);
for (LoadBalancerServiceEvent event : lbServiceEvents) {
Entry entry = createGenericEntry(event, baseUri);
entries.add(entry);
}
break;
case LOADBALANCER_FEED:
List<LoadBalancerEvent> lbEvents = eventRepository.getAllLoadBalancerEvents(accountId, loadBalancerId, page);
for (LoadBalancerEvent event : lbEvents) {
Entry entry = createGenericEntry(event, baseUri);
entries.add(entry);
}
break;
case NODES_FEED:
List<NodeEvent> lbNodeEvents = eventRepository.getAllNodeEvents(accountId, loadBalancerId, page);
for (NodeEvent event : lbNodeEvents) {
Entry entry = createGenericEntry(event, baseUri);
entries.add(entry);
}
break;
case NODE_SERVICE_FEED:
List<NodeServiceEvent> lbNodeServiceEvents = eventRepository.getNodeServiceEvents(accountId, loadBalancerId, page);
for (NodeServiceEvent event : lbNodeServiceEvents) {
Entry entry = createGenericEntry(event, baseUri);
entry.setSummary(event.getDescription());
entry.setContent("Details: " + event.getDetailedMessage() + "\nCallback Host: " + event.getCallbackHost());
entries.add(entry);
}
break;
case NODE_FEED:
Integer nodeId = (Integer) attributes.get("nodeId");
List<NodeEvent> nodeEvents = eventRepository.getNodeEvents(accountId, loadBalancerId, nodeId, page);
for (NodeEvent event : nodeEvents) {
Entry entry = createGenericEntry(event, baseUri);
entries.add(entry);
}
break;
case VIRTUAL_IPS_FEED:
List<VirtualIpEvent> virtualIpEvents = eventRepository.getAllVirtualIpEvents(accountId, loadBalancerId, page);
for (VirtualIpEvent event : virtualIpEvents) {
Entry entry = createGenericEntry(event, baseUri);
entries.add(entry);
}
break;
case ACCESS_LIST_FEED:
List<AccessListEvent> accessListEvents = eventRepository.getAllAccessListEvents(accountId, loadBalancerId, page);
for (AccessListEvent event : accessListEvents) {
Entry entry = createGenericEntry(event, baseUri);
entries.add(entry);
}
break;
case CONNECTION_THROTTLE_FEED:
List<ConnectionLimitEvent> connectionLimitEvents = eventRepository.getAllConnectionLimitEvents(accountId, loadBalancerId, page);
for (ConnectionLimitEvent event : connectionLimitEvents) {
Entry entry = createGenericEntry(event, baseUri);
entries.add(entry);
}
break;
case HEALTH_MONITOR_FEED:
List<HealthMonitorEvent> healthMonitorEvents = eventRepository.getAllHealthMonitorEvents(accountId, loadBalancerId, page);
for (HealthMonitorEvent event : healthMonitorEvents) {
Entry entry = createGenericEntry(event, baseUri);
entries.add(entry);
}
break;
case SESSION_PERSISTENCE_FEED:
List<SessionPersistenceEvent> sessionPersistenceEvents = eventRepository.getAllSessionPersistenceEvents(accountId, loadBalancerId, page);
for (SessionPersistenceEvent event : sessionPersistenceEvents) {
Entry entry = createGenericEntry(event, baseUri);
entries.add(entry);
}
break;
}
return entries;
}
private Entry createGenericEntry(Event event, String baseUri) {
Entry entry = AbderaSupport.getAbderaInstance().newEntry();
entry.setTitle(event.getTitle());
entry.setSummary(event.getDescription());
if(event.getAuthor() != null) entry.addAuthor(event.getAuthor());
entry.addLink(buildCompleteUri(event.getRelativeUri(), baseUri));
entry.setId(generateEntryId(event));
entry.addCategory(event.getCategory().toString());
entry.setUpdated(event.getCreated().getTime());
return entry;
}
public String buildCompleteUri(String relativeUri, String baseUri) {
return relativeUri == null ? null : baseUri + relativeUri;
}
public String generateEntryId(Event event) {
if (event.getRelativeUri() == null || event.getRelativeUri().equals(""))
return generateIdCompatibleTimestamp(event.getCreated());
String[] uriComponenets = event.getRelativeUri().split("/");
String entryId = "";
for (String uriComponenet : uriComponenets) {
if (!uriComponenet.equals("")) entryId = entryId + uriComponenet + "-";
}
entryId = entryId + (generateIdCompatibleTimestamp(event.getCreated()));
return entryId;
}
public String generateIdCompatibleTimestamp(Calendar cal) {
return String.valueOf(cal.get(Calendar.YEAR))
+ String.valueOf(cal.get(Calendar.DAY_OF_YEAR))
+ String.valueOf(cal.get(Calendar.HOUR_OF_DAY))
+ String.valueOf(cal.get(Calendar.MINUTE))
+ String.valueOf(cal.get(Calendar.SECOND))
+ String.valueOf(cal.get(Calendar.MILLISECOND));
}
}