package com.evolveum.midpoint.web.component.wizard.resource.component;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectSynchronizationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceObjectTypeDefinitionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType;
import org.jetbrains.annotations.NotNull;
import java.util.HashSet;
import java.util.Set;
/**
* @author mederly
*/
public class DuplicateObjectTypeDetector {
@NotNull final private Set<ObjectTypeRecord> records = new HashSet<>();
@NotNull final private Set<ObjectTypeRecord> duplicates = new HashSet<>();
public boolean hasDuplicates() {
return !duplicates.isEmpty();
}
public String getDuplicatesList() {
StringBuilder sb = new StringBuilder();
boolean first = true;
for (ObjectTypeRecord duplicate : duplicates) {
if (first) {
first = false;
} else {
sb.append(", ");
}
sb.append(duplicate.kind).append("/").append(duplicate.intent);
}
return sb.toString();
}
private class ObjectTypeRecord {
@NotNull public final ShadowKindType kind;
@NotNull public final String intent;
ObjectTypeRecord(ShadowKindType kind, String intent) {
this.kind = kind != null ? kind : ShadowKindType.ACCOUNT;
this.intent = intent != null ? intent : SchemaConstants.INTENT_DEFAULT;
}
ObjectTypeRecord(ResourceObjectTypeDefinitionType definition) {
this(definition.getKind(), definition.getIntent());
}
ObjectTypeRecord(ObjectSynchronizationType synchronization) {
this(synchronization.getKind(), synchronization.getIntent());
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
ObjectTypeRecord that = (ObjectTypeRecord) o;
return kind == that.kind && intent.equals(that.intent);
}
@Override
public int hashCode() {
int result = kind.hashCode();
result = 31 * result + intent.hashCode();
return result;
}
}
public void add(ResourceObjectTypeDefinitionType objectType) {
add(new ObjectTypeRecord(objectType));
}
public void add(ObjectSynchronizationType synchronization) {
add(new ObjectTypeRecord(synchronization));
}
private void add(ObjectTypeRecord objectTypeRecord) {
if (!records.add(objectTypeRecord)) {
duplicates.add(objectTypeRecord);
}
}
}