| /******************************************************************************** |
| * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation |
| * |
| * See the NOTICE file(s) distributed with this work for additional |
| * information regarding copyright ownership. |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0 which is available at |
| * http://www.eclipse.org/legal/epl-2.0. |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| ********************************************************************************/ |
| |
| package org.eclipse.mdm.api.base.adapter; |
| |
| import java.util.Collection; |
| import java.util.Collections; |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| import org.eclipse.mdm.api.base.model.ContextType; |
| import org.eclipse.mdm.api.base.model.Entity; |
| |
| /** |
| * Holds related entities of any kind and keeps track of modifications. |
| */ |
| public final class EntityStore { |
| |
| private final Map<String, Entity> current = new HashMap<>(0); |
| private final Map<String, Entity> removed = new HashMap<>(0); |
| |
| /** |
| * Returns current set of related entities. |
| * |
| * @return Returned {@code Collection} is unmodifiable. |
| */ |
| public Collection<Entity> getCurrent() { |
| return Collections.unmodifiableCollection(current.values()); |
| } |
| |
| /** |
| * Returns current set of removed related entities. |
| * |
| * @return Returned {@code Collection} is unmodifiable. |
| */ |
| public Collection<Entity> getRemoved() { |
| return Collections.unmodifiableCollection(removed.values()); |
| } |
| |
| /** |
| * Returns related entity identified by given entity class. |
| * |
| * @param <T> The desired entity type. |
| * @param entityClass Used as identifier. |
| * @return The related entity is returned or null of not defined. |
| */ |
| public <T extends Entity> T get(Class<T> entityClass) { |
| return get(entityClass.getSimpleName(), entityClass); |
| } |
| |
| /** |
| * Returns related entity identified by given entity class. |
| * |
| * @param <T> The desired entity type. |
| * @param relationName The relation name the entity is referenced by. |
| * @param entityClass Used as identifier. |
| * @return The related entity is returned or null of not defined. |
| */ |
| public <T extends Entity> T get(String relationName, Class<T> entityClass) { |
| return entityClass.cast(current.get(relationName)); |
| } |
| |
| /** |
| * Replaces a related entity with the given one. |
| * |
| * @param entity The new related entity. |
| */ |
| public void set(Entity entity) { |
| set(entity.getClass().getSimpleName(), entity); |
| } |
| |
| /** |
| * Replaces a related entity with the given one. |
| * |
| * @param name The name of the relation the entity is referenced by. |
| * @param entity The new related entity. |
| */ |
| public void set(String name, Entity entity) { |
| Entity old = current.put(name, entity); |
| if (old != null) { |
| removed.put(name, old); |
| } |
| } |
| |
| /** |
| * Removes a related entity for given entity class. |
| * |
| * @param entityClass Used as identifier. |
| */ |
| public void remove(Class<? extends Entity> entityClass) { |
| String key = entityClass.getSimpleName(); |
| remove(key, entityClass); |
| } |
| |
| /** |
| * Removes a related entity for given relation name and entity class. |
| * |
| * @param name The name of the relation the entity is referenced by. |
| * @param entityClass Used as identifier. |
| */ |
| public void remove(String name, Class<? extends Entity> entityClass) { |
| Entity old = current.remove(name); |
| if (old != null) { |
| removed.put(name, old); |
| } |
| } |
| |
| /** |
| * Returns related entity identified by given entity class and |
| * {@link ContextType}. |
| * |
| * @param <T> The desired entity type. |
| * @param entityClass Used as identifier. |
| * @param contextType Used as identifier. |
| * @return The related entity is returned or null of not defined. |
| */ |
| public <T extends Entity> T get(Class<T> entityClass, ContextType contextType) { |
| return entityClass.cast(current.get(createContextTypeKey(entityClass, contextType))); |
| } |
| |
| /** |
| * Replaces a related entity with the given one. |
| * |
| * @param entity The new related entity. |
| * @param contextType Used as identifier. |
| */ |
| public void set(Entity entity, ContextType contextType) { |
| String key = createContextTypeKey(entity.getClass(), contextType); |
| Entity old = current.put(key, entity); |
| if (old != null) { |
| removed.put(key, old); |
| } |
| } |
| |
| /** |
| * Removes a related entity for given entity class and {@link ContextType}. |
| * |
| * @param entityClass Used as identifier. |
| * @param contextType Used as identifier. |
| */ |
| public void remove(Class<? extends Entity> entityClass, ContextType contextType) { |
| String key = createContextTypeKey(entityClass, contextType); |
| Entity old = current.remove(key); |
| if (old != null) { |
| removed.put(key, old); |
| } |
| } |
| |
| /** |
| * Clean up list of removed entities. |
| */ |
| void apply() { |
| removed.clear(); |
| } |
| |
| /** |
| * Generates a key from given entity class and {@link ContextType}. |
| * |
| * @param entityClass Identifier part 1. |
| * @param contextType Identifier part 2. |
| * @return A context type dependent key is returned. |
| */ |
| private static String createContextTypeKey(Class<? extends Entity> entityClass, ContextType contextType) { |
| return entityClass.getSimpleName() + '_' + contextType; |
| } |
| |
| } |