[code=Java]public class DataObject implements Comparable<DataObject> {
private final String name;
/**
* default constructor <br>
*
* @param name
*/
public DataObject(@NonNull String name) {
log.debug("create a new {} object", DataObject.class.getSimpleName());
this.name = name;
}
@Override
public int compareTo(@NonNull DataObject dataObject) {
return name.compareTo(dataObject.name);
}
@Override
public int hashCode() {
return 31 + name.hashCode();
}
@Override
public boolean equals(@NonNull Object object) {
DataObject dataObject = (DataObject) object;
return name.equals(dataObject.name);
}
@Override
public String toString() {
return name;
}
}[/code]
[code=Java]@Slf4j
public abstract class SportsObject extends DataObject{
/**
* default constructor <br>
*
* @param name
*/
public <T extends SportsObject> SportsObject(@NonNull String name) {
super(name);
log.debug("create a new {} object", VolleyballListObject.class.getSimpleName());
}
/**
* update the element <br>
*
* @param element
*/
public abstract <T extends SportsObject> void updateElement(@NonNull T element);
}
[/code]
[code=Java]public abstract class SportsListObject extends SportsObject {
@Getter(AccessLevel.NONE)
private Set<Class<?>> acceptedElementType = Sets.newHashSet();
@Getter(AccessLevel.NONE)
private List<SportsObject> elementList = Lists.newArrayList();
/**
* default constructor <br>
*
* @param name
*/
public SportsListObject(@NonNull String name) {
super(name);
log.debug("create a new {} object", SportsListObject.class.getSimpleName());
}
/**
* add the element class to the acceptedElementType list <br<
*
* @param list
*/
protected void acceptedElementType(List<Class<?>> list) {
for (Class<?> type : list) {
log.debug("accept {} ", type.getSimpleName());
acceptedElementType.add(type);
}
}
/**
* add the list elements to the elementList <br>
* check if the element class is accepted <br>
* update the list element if it exists already <br>
*
* @param elements
*/
public <T extends SportsObject> void addElement(@NonNull List<T> elements) {
for (T element : elements) {
if (acceptedElementType.contains(element.getClass())) {
// check if the element exists already
Optional<SportsObject> optional = elementList.stream().filter(e -> e.equals(element)).findFirst();
if (optional.isPresent()) {
// update the existing element
optional.get().updateElement(element);
} else {
// add the element to the element list
log.debug("add the {}", element);
elementList.add(element);
}
} else {
log.warn("the class {} is not supported ", element, element.getClass().getSimpleName());
}
}
}
/**
* remove the elements of the list to the elementList <br>
* check if the element class is accepted <br>
* remove the list element if it exists <br>
*
* @param elements
*/
public <T extends SportsObject> void removeElement(@NonNull List<T> elements) {
for (T element : elements) {
if (acceptedElementType.contains(element.getClass())) {
// check if the element exists already
Optional<SportsObject> optional = elementList.stream().filter(e -> e.equals(element)).findFirst();
if (optional.isPresent()) {
// remove the existing element
log.debug("remove the {}", element);
elementList.remove(optional.get());
} else {
log.debug("the element {} was not found", element);
}
} else {
log.warn("the class {} is not supported ", element, element.getClass().getSimpleName());
}
}
}
/**
* @param elementType
* @return a list with elements of the appropriate type <br>
*/
@SuppressWarnings("unchecked")
protected <T extends SportsObject> List<T> getElementOf(@NonNull Class<T> elementType) {
return (List<T>) elementList.stream().filter(e -> e.getClass().equals(elementType))
.collect(Collectors.toList());
}
}[/code]