package com.clouck.comparator; import java.lang.reflect.ParameterizedType; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Objects; import org.apache.commons.lang3.Validate; import org.apache.commons.lang3.tuple.Pair; import org.springframework.beans.factory.annotation.Autowired; import com.amazonaws.services.ec2.model.Tag; import com.clouck.model.Event; import com.clouck.model.EventType; import com.clouck.model.aws.AbstractResource; import com.clouck.util.ResourceUtil; public abstract class AbstractEc2Comparator<R extends AbstractResource<?>> implements Ec2Comparator<R> { @Autowired protected ResourceUtil resourceUtil; @SuppressWarnings("unchecked") @Override public Class<R> getType() { ParameterizedType superclass = (ParameterizedType) getClass().getGenericSuperclass(); return (Class<R>) superclass.getActualTypeArguments()[0]; } protected boolean notEqual(Object o1, Object o2) { return !Objects.equals(o1, o2); } protected boolean equal(Object o1, Object o2) { return Objects.equals(o1, o2); } @Override public abstract Event firstScan(); @Override public abstract Event initialise(R newResource); @Override public abstract Event add(R newResource); @Override public abstract Event delete(R oldResource); @Override public List<Event> update(R oldResource, R newResource) { Validate.isTrue(!oldResource.equals(newResource)); List<Event> result = new ArrayList<>(); update(result, oldResource, newResource); if (result.size() == 0) { result.add(createEvent(oldResource, newResource, EventType.Unknown)); } return result; } protected abstract void update(List<Event> result, R oldResource, R newResource); protected Event createFirstScanEvent(EventType eventType) { Event event = new Event(); event.setEventType(eventType); return event; } protected Event createEvent(R oldResource, R newResource, EventType eventType, String... values) { Validate.isTrue(oldResource != null || newResource != null); Event e = new Event(); e.setEventType(eventType); if (oldResource != null) { e.setUniqueId(oldResource.getUniqueId()); } else { e.setUniqueId(newResource.getUniqueId()); } if (oldResource != null) { e.setOldResourceId(oldResource.getId()); } if (newResource != null) { e.setNewResourceId(newResource.getId()); } Validate.isTrue(values.length < 5); int size = values.length; if (size > 0) { String s = values[0]; e.setValue(s); } if (size > 1) { String s = values[1]; e.setValue1(s); } if (size > 2) { String s = values[2]; e.setValue2(s); } if (size > 3) { String s = values[3]; e.setValue3(s); } return e; } protected void compareTags(Collection<Event> result, List<Tag> oldTags, List<Tag> newTags, R oldResource, R newResource) { CompareResult<Tag> compareResult = resourceUtil.compareTags(oldTags, newTags); for (Tag tag : compareResult.getAdd()) { result.add(createEvent(oldResource, newResource, EventType.Tag_Add, tag.getKey(), tag.getValue())); } for (Pair<Tag, Tag> pair : compareResult.getUpdate()) { result.add(createEvent(oldResource, newResource, EventType.Tag_Update, pair.getLeft().getKey(), pair.getLeft().getValue(), pair.getRight().getValue())); } for (Tag tag : compareResult.getDelete()) { result.add(createEvent(oldResource, newResource, EventType.Tag_Delete, tag.getKey(), tag.getValue())); } } }