package com.jivesoftware.os.amza.ui.region;
import com.google.common.collect.Maps;
import com.jivesoftware.os.amza.api.ring.RingHost;
import com.jivesoftware.os.amza.api.ring.RingMember;
import com.jivesoftware.os.amza.service.ring.AmzaRingReader;
import com.jivesoftware.os.amza.service.ring.AmzaRingWriter;
import com.jivesoftware.os.amza.ui.soy.SoyRenderer;
import com.jivesoftware.os.mlogger.core.MetricLogger;
import com.jivesoftware.os.mlogger.core.MetricLoggerFactory;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;
import static com.jivesoftware.os.amza.ui.region.MetricsPluginRegion.getDurationBreakdown;
/**
*
*/
// soy.page.amzaRingPluginRegion
public class AmzaRingsPluginRegion implements PageRegion<AmzaRingsPluginRegion.AmzaRingsPluginRegionInput> {
private static final MetricLogger LOG = MetricLoggerFactory.getLogger();
private final String template;
private final SoyRenderer renderer;
private final AmzaRingWriter ringWriter;
private final AmzaRingReader ringReader;
public AmzaRingsPluginRegion(String template,
SoyRenderer renderer,
AmzaRingWriter ringWriter,
AmzaRingReader ringReader) {
this.template = template;
this.renderer = renderer;
this.ringWriter = ringWriter;
this.ringReader = ringReader;
}
public static class AmzaRingsPluginRegionInput {
final String ringName;
final String status;
final String member;
final String action;
public AmzaRingsPluginRegionInput(String ringName, String status, String member, String action) {
this.ringName = ringName;
this.status = status;
this.member = member;
this.action = action;
}
}
@Override
public String render(AmzaRingsPluginRegionInput input) {
Map<String, Object> data = Maps.newHashMap();
try {
if (input.action.equals("add")) {
ringWriter.addRingMember(input.ringName.getBytes(), new RingMember(input.member));
} else if (input.action.equals("remove")) {
ringWriter.removeRingMember(input.ringName.getBytes(), new RingMember(input.member));
}
List<Map<String, String>> rows = new ArrayList<>();
if (!input.ringName.isEmpty() || !input.member.isEmpty()) {
long start = System.currentTimeMillis();
AtomicLong hits = new AtomicLong();
AtomicLong missed = new AtomicLong();
ringReader.allRings((byte[] ringName, RingMember ringMember, RingHost ringHost) -> {
if ((input.ringName.isEmpty() || new String(ringName).contains(input.ringName))
&& (input.member.isEmpty() || ringMember.getMember().contains(input.member))) {
Map<String, String> row = new HashMap<>();
row.put("ringName", new String(ringName));
row.put("member", ringMember.getMember());
row.put("host", ringHost.getHost());
row.put("port", String.valueOf(ringHost.getPort()));
rows.add(row);
hits.incrementAndGet();
} else {
missed.incrementAndGet();
}
return true;
});
data.put("message", "Found " + hits + "/" + missed + " in " + getDurationBreakdown(System.currentTimeMillis() - start));
data.put("messageType", "info");
} else {
data.put("message", "Please input Ring or Logical Name");
data.put("messageType", "info");
}
data.put("rings", rows);
} catch (Exception e) {
LOG.error("Unable to retrieve data", e);
}
return renderer.render(template, data);
}
@Override
public String getTitle() {
return "Amza Rings";
}
}