/******************************************************************************* * 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 } }