blob: 7bf83941b73fd484126e8e32122c89f0e2e0910e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010-2014 SAP AG and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* SAP AG - initial API and implementation
*******************************************************************************/
package org.eclipse.skalli.testutil;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import org.eclipse.skalli.model.EntityBase;
import org.eclipse.skalli.model.EntityFilter;
import org.eclipse.skalli.services.persistence.PersistenceService;
/**
* A simple implementation of <code>PersistenceService</code> based on {@link HashMap}.
* Note that this implementation stores only entities of a certain type specified
* in the constructor. All methods will throw {@link IllegalArgumentException}
* if an entity of the wrong type is supplied.
*/
public class HashMapPersistenceService implements PersistenceService {
private final Class<? extends EntityBase> expectedEntityClass;
private final Map<UUID, EntityBase> entities = new HashMap<UUID, EntityBase>();
private final Map<UUID, EntityBase> deletedEntities = new HashMap<UUID, EntityBase>();
public HashMapPersistenceService(Class<? extends EntityBase> expectedEntityClass) {
this.expectedEntityClass = expectedEntityClass;
}
private <T extends EntityBase> void assertIsAssignable(Class<T> entityClass) {
if (!expectedEntityClass.isAssignableFrom(entityClass)) {
throw new IllegalArgumentException("Expected entity class: " + expectedEntityClass.getName());
}
}
@Override
public <T extends EntityBase> void persist(Class<T> entityClass, EntityBase entity, String userId) {
assertIsAssignable(entityClass);
if (entity.isDeleted()) {
entities.remove(entity.getUuid());
deletedEntities.put(entity.getUuid(), entity);
} else {
entities.put(entity.getUuid(), entity);
deletedEntities.remove(entity.getUuid());
}
}
@Override
public <T extends EntityBase> T loadEntity(Class<T> entityClass, UUID uuid) {
assertIsAssignable(entityClass);
return entityClass.cast(entities.get(uuid));
}
@Override
public <T extends EntityBase> T getEntity(Class<T> entityClass, UUID uuid) {
assertIsAssignable(entityClass);
return entityClass.cast(entities.get(uuid));
}
@Override
public <T extends EntityBase> List<T> getEntities(Class<T> entityClass) {
return getEntities(entityClass, null);
}
@Override
public <T extends EntityBase> List<T> getEntities(Class<T> entityClass, EntityFilter<T> filter) {
assertIsAssignable(entityClass);
ArrayList<T> list = new ArrayList<T>(entities.size());
for (EntityBase entity: entities.values()) {
if (filter == null || filter.accept(entityClass, entityClass.cast(entity))) {
list.add(entityClass.cast(entity));
}
}
return list;
}
@Override
public <T extends EntityBase> int size(Class<T> entityClass) {
assertIsAssignable(entityClass);
return entities.size();
}
@Override
public <T extends EntityBase> Set<UUID> keySet(Class<T> entityClass) {
assertIsAssignable(entityClass);
return entities.keySet();
}
@Override
public <T extends EntityBase> T getEntity(Class<T> entityClass, EntityFilter<T> filter) {
assertIsAssignable(entityClass);
for (EntityBase entity: entities.values()) {
if (filter.accept(entityClass, entityClass.cast(entity))) {
return entityClass.cast(entity);
}
}
return null;
}
@Override
public <T extends EntityBase> T getDeletedEntity(Class<T> entityClass, UUID uuid) {
assertIsAssignable(entityClass);
return entityClass.cast(deletedEntities.get(uuid));
}
@Override
public <T extends EntityBase> List<T> getDeletedEntities(Class<T> entityClass) {
assertIsAssignable(entityClass);
ArrayList<T> list = new ArrayList<T>(deletedEntities.size());
for (EntityBase entity: deletedEntities.values()) {
list.add(entityClass.cast(entity));
}
return list;
}
@Override
public <T extends EntityBase> Set<UUID> deletedSet(Class<T> entityClass) {
assertIsAssignable(entityClass);
return deletedEntities.keySet();
}
@Override
public <T extends EntityBase> void refresh(Class<T> entityClass) {
// nothing to do
}
@Override
public void refreshAll() {
// nothing to do
}
}