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