package org.arquillian.cube.impl.model;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.arquillian.cube.spi.Cube;
import org.arquillian.cube.spi.CubeRegistry;
import org.arquillian.cube.spi.metadata.CubeMetadata;
public class LocalCubeRegistry implements CubeRegistry {
private Map<CubeId, Cube<?>> cubes;
public LocalCubeRegistry() {
this.cubes = new HashMap<>();
}
@Override
public void addCube(Cube<?> cube) {
CubeId cubeId = CubeIdFactory.get().create(cube.getId());
if (cubeId instanceof StarredCubeId) {
throw new IllegalArgumentException("Starred cube id cannot be added.");
}
this.cubes.put(cubeId, cube);
}
@Override
public void removeCube(String id) {
CubeId cubeId = CubeIdFactory.get().create(id);
if (cubeId instanceof StarredCubeId) {
throw new IllegalArgumentException("Starred cube id cannot be removed.");
}
cubes.remove(cubeId);
}
@Override
public List<Cube<?>> getByMetadata(Class<? extends CubeMetadata> metadata) {
List<Cube<?>> cubes = new ArrayList<>();
for (Cube<?> cube : this.cubes.values()) {
if (cube.hasMetadata(metadata)) {
cubes.add(cube);
}
}
return cubes;
}
@Override
public Cube<?> getCube(String id) {
CubeId cubeId = CubeIdFactory.get().create(id);
for (Map.Entry<CubeId, Cube<?>> cubeEntry : this.cubes.entrySet()) {
CubeId internalCubeId = cubeEntry.getKey();
if (internalCubeId.isMatching(cubeId)) {
return cubeEntry.getValue();
}
}
return null;
}
@Override
public <T extends Cube<?>> T getCube(String id, Class<T> type) {
return type.cast(getCube(id));
}
@Override
public List<Cube<?>> getCubes() {
List<Cube<?>> cubeList = new ArrayList<>(this.cubes.values());
return Collections.unmodifiableList(cubeList);
}
}