package org.netmelody.cieye.spies.demo; import static com.google.common.cache.CacheLoader.from; import static com.google.common.collect.Lists.newArrayList; import static com.google.common.collect.Maps.newHashMap; import static org.netmelody.cieye.core.domain.Status.UNKNOWN; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.netmelody.cieye.core.domain.Feature; import org.netmelody.cieye.core.domain.Percentage; import org.netmelody.cieye.core.domain.RunningBuild; import org.netmelody.cieye.core.domain.Status; import org.netmelody.cieye.core.domain.TargetDetail; import org.netmelody.cieye.core.domain.TargetDigest; import org.netmelody.cieye.core.domain.TargetDigestGroup; import org.netmelody.cieye.core.domain.TargetId; import org.netmelody.cieye.core.observation.CiSpy; import org.netmelody.cieye.core.observation.KnownOffendersDirectory; import org.netmelody.cieye.spies.demo.DemoModeFakeCiServer.BuildData; import org.netmelody.cieye.spies.demo.DemoModeFakeCiServer.TargetData; import com.google.common.base.Function; import com.google.common.cache.CacheBuilder; import com.google.common.cache.LoadingCache; public final class DemoModeSpy implements CiSpy { private final LoadingCache<String, DemoModeFakeCiServer> demoCiServers = CacheBuilder.newBuilder().build(from(new Function<String, DemoModeFakeCiServer>() { @Override public DemoModeFakeCiServer apply(String featureName) { return new DemoModeFakeCiServer(featureName); } })); private final KnownOffendersDirectory detective; private static final class TargetInfo { public final String featureName; public final String targetName; public TargetInfo(String featureName, String targetName) { this.featureName = featureName; this.targetName = targetName; } } private final Map<TargetId, TargetInfo> recognisedTargets = newHashMap(); public DemoModeSpy(final KnownOffendersDirectory detective) { this.detective = detective; } @Override public TargetDigestGroup targetsConstituting(Feature feature) { final String featureName = feature.name(); final List<TargetDigest> digests = newArrayList(); for (String targetName : demoCiServers.getUnchecked(featureName).getTargetNames()) { TargetDigest digest = new TargetDigest(featureName+targetName, "http://www.example.com/", targetName, UNKNOWN); digests.add(digest); recognisedTargets.put(digest.id(), new TargetInfo(featureName, targetName)); } return new TargetDigestGroup(digests); } @Override public TargetDetail statusOf(final TargetId target) { final TargetInfo targetInfo = recognisedTargets.get(target); if (null == targetInfo) { return null; } return detailsOf(targetInfo.featureName, targetInfo.targetName); } private TargetDetail detailsOf(String featureName, String targetName) { final DemoModeFakeCiServer ciServer = demoCiServers.getUnchecked(featureName); final TargetData data = ciServer.getDataFor(targetName); final List<RunningBuild> builds = new ArrayList<RunningBuild>(); final StringBuilder commentry = new StringBuilder(); for (BuildData buildData : data.builds) { builds.add(new RunningBuild(Percentage.percentageOf(buildData.progress), buildData.green ? Status.GREEN : data.note.isEmpty() ? Status.BROKEN : Status.UNDER_INVESTIGATION)); commentry.append(buildData.checkinComments); } Status status = data.green ? Status.GREEN : (data.note.isEmpty() ? Status.BROKEN : Status.UNDER_INVESTIGATION); return new TargetDetail(featureName+targetName, data.url, targetName, status, 0L, builds, detective.search(commentry.toString())); } @Override public boolean takeNoteOf(TargetId target, String note) { if (!recognisedTargets.containsKey(target)) { return false; } final TargetInfo targetInfo = recognisedTargets.get(target); demoCiServers.getUnchecked(targetInfo.featureName).addNote(targetInfo.targetName, note); return true; } }