com.google.security.zynamics.binnavi.Database.MockClasses.MockSqlProvider.java Source code

Java tutorial

Introduction

Here is the source code for com.google.security.zynamics.binnavi.Database.MockClasses.MockSqlProvider.java

Source

/*
Copyright 2014 Google Inc. All Rights Reserved.
    
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
    
http://www.apache.org/licenses/LICENSE-2.0
    
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package com.google.security.zynamics.binnavi.Database.MockClasses;

import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.base.Predicate;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ImmutableBiMap;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.security.zynamics.binnavi.Database.CConnection;
import com.google.security.zynamics.binnavi.Database.DatabaseVersion;
import com.google.security.zynamics.binnavi.Database.Exceptions.CouldntDeleteException;
import com.google.security.zynamics.binnavi.Database.Exceptions.CouldntLoadDataException;
import com.google.security.zynamics.binnavi.Database.Exceptions.CouldntSaveDataException;
import com.google.security.zynamics.binnavi.Database.Interfaces.SQLProvider;
import com.google.security.zynamics.binnavi.Database.Interfaces.SQLProviderListener;
import com.google.security.zynamics.binnavi.Gui.GraphWindows.CommentDialogs.CComment;
import com.google.security.zynamics.binnavi.Gui.GraphWindows.CommentDialogs.Interfaces.IComment;
import com.google.security.zynamics.binnavi.Gui.Users.CUser;
import com.google.security.zynamics.binnavi.Gui.Users.Interfaces.IUser;
import com.google.security.zynamics.binnavi.Tagging.CTag;
import com.google.security.zynamics.binnavi.Tagging.CTagManager;
import com.google.security.zynamics.binnavi.Tagging.TagType;
import com.google.security.zynamics.binnavi.debug.debugger.DebuggerTemplate;
import com.google.security.zynamics.binnavi.debug.debugger.DebuggerTemplateManager;
import com.google.security.zynamics.binnavi.debug.models.trace.TraceList;
import com.google.security.zynamics.binnavi.disassembly.CCallgraph;
import com.google.security.zynamics.binnavi.disassembly.CFunction;
import com.google.security.zynamics.binnavi.disassembly.COperandTreeNode;
import com.google.security.zynamics.binnavi.disassembly.CProject;
import com.google.security.zynamics.binnavi.disassembly.UnrelocatedAddress;
import com.google.security.zynamics.binnavi.disassembly.CommentManager;
import com.google.security.zynamics.binnavi.disassembly.CommentManager.CommentScope;
import com.google.security.zynamics.binnavi.disassembly.ICallgraphEdge;
import com.google.security.zynamics.binnavi.disassembly.ICallgraphNode;
import com.google.security.zynamics.binnavi.disassembly.ICallgraphView;
import com.google.security.zynamics.binnavi.disassembly.IFlowgraphView;
import com.google.security.zynamics.binnavi.disassembly.INaviAddressSpace;
import com.google.security.zynamics.binnavi.disassembly.INaviCodeNode;
import com.google.security.zynamics.binnavi.disassembly.INaviEdge;
import com.google.security.zynamics.binnavi.disassembly.INaviFunction;
import com.google.security.zynamics.binnavi.disassembly.INaviFunctionNode;
import com.google.security.zynamics.binnavi.disassembly.INaviGroupNode;
import com.google.security.zynamics.binnavi.disassembly.INaviInstruction;
import com.google.security.zynamics.binnavi.disassembly.INaviModule;
import com.google.security.zynamics.binnavi.disassembly.INaviOperandTreeNode;
import com.google.security.zynamics.binnavi.disassembly.INaviProject;
import com.google.security.zynamics.binnavi.disassembly.INaviRawModule;
import com.google.security.zynamics.binnavi.disassembly.INaviTextNode;
import com.google.security.zynamics.binnavi.disassembly.INaviViewNode;
import com.google.security.zynamics.binnavi.disassembly.MockCreator;
import com.google.security.zynamics.binnavi.disassembly.MockFunction;
import com.google.security.zynamics.binnavi.disassembly.MockProject;
import com.google.security.zynamics.binnavi.disassembly.MockView;
import com.google.security.zynamics.binnavi.disassembly.AddressSpaces.CAddressSpace;
import com.google.security.zynamics.binnavi.disassembly.Modules.CModule;
import com.google.security.zynamics.binnavi.disassembly.Modules.CModuleInitializeReporter;
import com.google.security.zynamics.binnavi.disassembly.types.BaseType;
import com.google.security.zynamics.binnavi.disassembly.types.BaseTypeCategory;
import com.google.security.zynamics.binnavi.disassembly.types.RawBaseType;
import com.google.security.zynamics.binnavi.disassembly.types.RawTypeInstance;
import com.google.security.zynamics.binnavi.disassembly.types.RawTypeInstanceReference;
import com.google.security.zynamics.binnavi.disassembly.types.RawTypeMember;
import com.google.security.zynamics.binnavi.disassembly.types.RawTypeSubstitution;
import com.google.security.zynamics.binnavi.disassembly.types.Section;
import com.google.security.zynamics.binnavi.disassembly.types.SectionPermission;
import com.google.security.zynamics.binnavi.disassembly.types.TypeMember;
import com.google.security.zynamics.binnavi.disassembly.types.TypeSubstitution;
import com.google.security.zynamics.binnavi.disassembly.views.CView;
import com.google.security.zynamics.binnavi.disassembly.views.INaviView;
import com.google.security.zynamics.binnavi.disassembly.views.ImmutableNaviViewConfiguration;
import com.google.security.zynamics.zylib.disassembly.CAddress;
import com.google.security.zynamics.zylib.disassembly.FunctionType;
import com.google.security.zynamics.zylib.disassembly.GraphType;
import com.google.security.zynamics.zylib.disassembly.IAddress;
import com.google.security.zynamics.zylib.disassembly.ReferenceType;
import com.google.security.zynamics.zylib.disassembly.ViewType;
import com.google.security.zynamics.zylib.general.Pair;
import com.google.security.zynamics.zylib.types.graphs.MutableDirectedGraph;
import com.google.security.zynamics.zylib.types.trees.ITreeNode;

import java.math.BigInteger;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Random;

/**
 * Mock class for the {@link SQLProvider SQL provider}. Used when tests need a fake connection to an
 * SQL server.
 */
public final class MockSqlProvider implements SQLProvider {
    private int tagIdCounter = 1;
    private int viewCounter = 1;
    private int traceListCounter = 1;
    private int typeInstanceCounter = 1;
    private int typeId;
    private final HashMap<Commentable, ArrayList<IComment>> comments = new HashMap<Commentable, ArrayList<IComment>>();

    private final List<IFlowgraphView> flowGraphViews = new ArrayList<IFlowgraphView>();
    private final List<INaviFunction> functions = new ArrayList<INaviFunction>();
    private final HashMap<IAddress, ReferenceType> references = new HashMap<IAddress, ReferenceType>();
    private final List<INaviModule> modules = Lists.<INaviModule>newArrayList();
    private final ArrayList<IUser> users = new ArrayList<IUser>();
    private final ArrayListMultimap<INaviModule, RawTypeMember> members = ArrayListMultimap.create();
    private final ArrayListMultimap<Integer, RawBaseType> types = ArrayListMultimap.create();
    private final ArrayListMultimap<Integer, RawTypeInstance> typeInstances = ArrayListMultimap.create();
    private final ArrayListMultimap<INaviModule, RawTypeSubstitution> substitutions = ArrayListMultimap.create();
    private final ArrayListMultimap<Integer, Section> sections = ArrayListMultimap.create();
    private int sectionId;

    private int appendComment(final Commentable commentable, final Integer userId, final String commentText) {

        Preconditions.checkNotNull(commentable, "Error: commentable argument can not be null");
        Preconditions.checkNotNull(userId, "Error: userId argument can not be null");
        Preconditions.checkNotNull(commentText, "Error: commentText argument can not be null");

        final IUser currentUser = getCurrentUser(userId);
        final int commentId = getRandom();

        final ArrayList<IComment> currentComments = comments.containsKey(commentable) ? comments.get(commentable)
                : new ArrayList<IComment>();
        currentComments.add(new CComment(commentId, currentUser, null, commentText));
        comments.put(commentable, currentComments);

        return commentId;
    }

    private final void deleteComment(final Commentable commentable, final Integer commentId, final Integer userId) {
        Preconditions.checkNotNull(commentable, "Error: commentable argument can not be null");
        Preconditions.checkNotNull(commentId, "Error: commentId argument can not be null");
        Preconditions.checkNotNull(userId, "Error: userId argument can not be null");

        final ArrayList<IComment> currentComments = comments.containsKey(commentable) ? comments.get(commentable)
                : new ArrayList<IComment>();

        int index = -1;
        for (final IComment comment : currentComments) {
            if (Objects.equals(comment.getId(), commentId)) {
                if (comment.getUser().getUserId() == userId) {
                    index = currentComments.indexOf(comment);
                } else {
                    throw new IllegalStateException("Error: the supplied user id is not the owner of the comment");
                }
            }
        }
        if (index == -1) {
            throw new IllegalArgumentException("Error: comment with this id not known to the storage system");
        }

        currentComments.remove(index);
        comments.put(commentable, currentComments);
    }

    private RawTypeMember findMember(final TypeMember member, final INaviModule module) {
        for (final RawTypeMember rawMember : members.get(module)) {
            if (rawMember.getId() == member.getId()) {
                return rawMember;
            }
        }
        return null;
    }

    private RawTypeSubstitution findSubstitution(final BigInteger address, final int position,
            final int expressionId, final INaviModule module) {
        for (final RawTypeSubstitution rawSubstitution : substitutions.get(module)) {
            if (rawSubstitution.getAddress().toBigInteger().equals(address)
                    && rawSubstitution.getPosition() == position
                    && rawSubstitution.getExpressionId() == expressionId) {
                return rawSubstitution;
            }
        }
        return null;
    }

    private RawBaseType findType(final BaseType baseType, final INaviModule module) {
        for (final RawBaseType rawType : types.get(module.getConfiguration().getId())) {
            if (rawType.getId() == baseType.getId()) {
                return rawType;
            }
        }
        return null;
    }

    private ArrayList<IComment> getCommentInternally(final Integer commentId) {
        for (final ArrayList<IComment> commentList : comments.values()) {
            if (!commentList.isEmpty() && Iterables.getLast(commentList).getId().equals(commentId)) {
                return commentList;
            }
        }
        return null;
    }

    private IUser getCurrentUser(final Integer userId) {
        IUser currentUser = null;
        for (final IUser storedUser : users) {
            if (storedUser.getUserId() == userId) {
                currentUser = storedUser;
            }
        }
        if (currentUser == null) {
            throw new IllegalStateException("Error: The user id is not known to the storage system");
        }
        return currentUser;
    }

    private int getRandom() {
        final Random generator = new Random();
        return generator.nextInt(Integer.MAX_VALUE) == 0 ? generator.nextInt(Integer.MAX_VALUE)
                : generator.nextInt(Integer.MAX_VALUE);
    }

    @Override
    public void addDebugger(final INaviProject project, final DebuggerTemplate debugger) {
    }

    @Override
    public void addModule(final INaviAddressSpace addressSpace, final INaviModule module) {
    }

    @Override
    public void addReference(final INaviOperandTreeNode node, final IAddress address, final ReferenceType type) {
        references.put(address, type);
    }

    @Override
    public IUser addUser(final String userName) {
        final Random generator = new Random();
        final int userId = generator.nextInt(Integer.MAX_VALUE) == 0 ? generator.nextInt(Integer.MAX_VALUE)
                : generator.nextInt(Integer.MAX_VALUE);

        final CUser user = new CUser(userId, userName);

        users.add(user);

        return user;
    }

    @Override
    public Integer appendFunctionComment(final INaviFunction function, final String commentText,
            final Integer userId) {
        Preconditions.checkNotNull(function, "Error: function argument can not be null");
        return appendComment(new Commentable(function, CommentScope.GLOBAL), userId, commentText);
    }

    @Override
    public Integer appendFunctionNodeComment(final INaviFunctionNode node, final String commentText,
            final Integer userId) {
        Preconditions.checkNotNull(node, "Error: functionNode argument can not be null");
        return appendComment(new Commentable(node, CommentScope.LOCAL), userId, commentText);
    }

    @Override
    public Integer appendGlobalCodeNodeComment(final INaviCodeNode node, final String commentText,
            final Integer userId) {
        Preconditions.checkNotNull(node, "Error: codeNode argument can not be null");
        return appendComment(new Commentable(node, CommentScope.GLOBAL), userId, commentText);
    }

    @Override
    public Integer appendGlobalEdgeComment(final INaviEdge edge, final String commentText, final Integer userId) {
        Preconditions.checkNotNull(edge, "Error: edge argument can not be null");
        return appendComment(new Commentable(edge, CommentScope.GLOBAL), userId, commentText);
    }

    @Override
    public Integer appendGlobalInstructionComment(final INaviInstruction instruction, final String commentText,
            final Integer userId) {
        Preconditions.checkNotNull(instruction, "Error: instruction argument can not be null");
        return appendComment(new Commentable(instruction, CommentScope.GLOBAL), userId, commentText);
    }

    @Override
    public Integer appendGroupNodeComment(final INaviGroupNode node, final String commentText,
            final Integer userId) {
        Preconditions.checkNotNull(node, "Error: groupNode argument can not be null");
        return appendComment(new Commentable(node, CommentScope.GLOBAL), userId, commentText);
    }

    @Override
    public Integer appendLocalCodeNodeComment(final INaviCodeNode node, final String commentText,
            final Integer userId) {
        Preconditions.checkNotNull(node, "Error: codeNode argument can not be null");
        return appendComment(new Commentable(node, CommentScope.LOCAL), userId, commentText);
    }

    @Override
    public Integer appendLocalEdgeComment(final INaviEdge edge, final String commentText, final Integer userId) {
        Preconditions.checkNotNull(edge, "Error: edge argument can not be null");
        return appendComment(new Commentable(edge, CommentScope.LOCAL), userId, commentText);
    }

    @Override
    public Integer appendLocalInstructionComment(final INaviCodeNode codeNode, final INaviInstruction instruction,
            final String commentText, final Integer userId) {
        Preconditions.checkNotNull(codeNode, "Error: codeNode argument can not be null");
        Preconditions.checkNotNull(instruction, "Error: instruction argument can not be null");
        return appendComment(new Commentable(instruction, CommentScope.LOCAL), userId, commentText);
    }

    @Override
    public Integer appendSectionComment(final int moduleId, final int sectionId, final String commentText,
            final Integer userId) throws CouldntSaveDataException {
        return appendComment(new Commentable(sectionId, CommentScope.LOCAL), userId, commentText);
    }

    @Override
    public Integer appendTextNodeComment(final INaviTextNode node, final String commentText, final Integer userId) {
        Preconditions.checkNotNull(node, "Error: groupNode argument can not be null");
        return appendComment(new Commentable(node, CommentScope.GLOBAL), userId, commentText);
    }

    @Override
    public Integer appendTypeInstanceComment(final int moduleId, final int instanceId, final String commentText,
            final Integer userId) throws CouldntSaveDataException {
        return appendComment(new Commentable(instanceId, CommentScope.LOCAL), userId, commentText);
    }

    @Override
    public void assignDebugger(final CAddressSpace addressSpace, final DebuggerTemplate debugger) {
    }

    @Override
    public void assignDebugger(final INaviModule module, final DebuggerTemplate debugger) {
    }

    @Override
    public CAddressSpace createAddressSpace(final INaviProject project, final String name) {
        return new CAddressSpace(1, name, "", new Date(), new Date(), new HashMap<INaviModule, IAddress>(), null,
                this, new MockProject());
    }

    @Override
    public DebuggerTemplate createDebuggerTemplate(final String name, final String host, final int port) {
        return new DebuggerTemplate(1, name, host, port, this);
    }

    @Override
    public CModule createModule(final INaviRawModule rawModule) {
        throw new IllegalStateException("Not yet implemented");
    }

    @Override
    public CProject createProject(final String name) {
        return new CProject(1, name, "", new Date(), new Date(), 0, new ArrayList<DebuggerTemplate>(), this);
    }

    @Override
    public int createSection(final int moduleId, final String name, final Integer commentId,
            final BigInteger startAddress, final BigInteger endAddress, final SectionPermission permission,
            final byte[] data) throws CouldntSaveDataException {

        INaviModule sectionModule = null;
        for (final INaviModule module : modules) {
            if (module.getConfiguration().getId() == moduleId) {
                sectionModule = module;
            }
        }

        final Section section = new Section(sectionId++, name, CommentManager.get(this), sectionModule,
                new CAddress(startAddress), new CAddress(endAddress), permission, data);
        sections.put(moduleId, section);
        return section.getId();
    }

    @Override
    public CTag createTag(final CTag parent, final String name, final String description, final TagType type) {
        final CTag newTag = new CTag(tagIdCounter, name, description, type, this);

        tagIdCounter++;

        return newTag;
    }

    @Override
    public TraceList createTrace(final INaviModule module, final String name, final String description) {
        return new TraceList(traceListCounter++, name, description, this);
    }

    @Override
    public TraceList createTrace(final INaviProject project, final String name, final String description) {
        return new TraceList(1, name, description, this);
    }

    @Override
    public int createType(final int moduleId, final String name, final int size,
            final Integer previousPointerTypeId, final boolean signed, final BaseTypeCategory category) {
        final RawBaseType rawBaseType = new RawBaseType(++typeId, name, size, previousPointerTypeId, signed,
                category);
        types.put(moduleId, rawBaseType);
        return rawBaseType.getId();
    }

    @Override
    public int createTypeInstance(final int moduleId, final String name, final Integer commentId, final int typeId,
            final int sectionId, final long sectionOffset) throws CouldntSaveDataException {
        final RawTypeInstance rawTypeInstance = new RawTypeInstance(moduleId, typeInstanceCounter++, name,
                commentId, typeId, sectionId, sectionOffset);
        typeInstances.put(moduleId, rawTypeInstance);
        return rawTypeInstance.getId();
    }

    @Override
    public void createTypeInstanceReference(final int moduleId, final long address, final int position,
            final int expressionId, final int typeInstanceId) throws CouldntSaveDataException {
        // TODO(jannewger): implement this method and change test implementations in
        // TypeInstanceContainerBackendTest accordingly.
    }

    @Override
    public int createTypeMember(final INaviModule module, final int containingTypeId, final int baseTypeId,
            final String name, final Optional<Integer> position, final Optional<Integer> numberelements,
            Optional<Integer> argumentIndex) {
        final int id = ++typeId;
        members.put(module, new RawTypeMember(id, name, baseTypeId, containingTypeId, position.orNull(), null,
                numberelements.orNull()));
        return id;
    }

    @Override
    public void createTypeSubstitution(final int treeNodeId, final int baseTypeId, final List<Integer> memberPath,
            final int position, final int offset, final IAddress address, final INaviModule module) {
        substitutions.put(module, new RawTypeSubstitution(address, position, treeNodeId, baseTypeId,
                memberPath.toArray(new Integer[0]), offset));
    }

    @Override
    public CView createView(final INaviModule module, final INaviView view, final String name,
            final String description) {
        int counter = 100;
        for (INaviEdge edge : view.getGraph().getEdges()) {
            edge.setId(counter++);
        }
        for (INaviViewNode node : view.getGraph().getNodes()) {
            node.setId(counter++);
        }
        return new CView(viewCounter++, module, name, description, view.getType(), view.getGraphType(), new Date(),
                new Date(), view.getNodeCount(), view.getEdgeCount(), new HashSet<CTag>(), new HashSet<CTag>(),
                false, this);
    }

    @Override
    public CView createView(final INaviProject project, final INaviView view, final String name,
            final String description) {
        return new CView(1, project, name, description, ViewType.NonNative, GraphType.MIXED_GRAPH, new Date(),
                new Date(), 0, 0, new HashSet<CTag>(), new HashSet<CTag>(), false, this);
    }

    @Override
    public void deleteAddressSpace(final INaviAddressSpace addressSpace) {
    }

    @Override
    public void deleteDebugger(final DebuggerTemplate debugger) {
    }

    @Override
    public void deleteFunctionComment(final INaviFunction function, final Integer commentId, final Integer userId) {
        Preconditions.checkNotNull(function, "Error: codeNode argument can not be null");
        deleteComment(new Commentable(function, CommentScope.GLOBAL), commentId, userId);
    }

    @Override
    public void deleteFunctionNodeComment(final INaviFunctionNode function, final Integer commentId,
            final Integer userId) {
        Preconditions.checkNotNull(function, "Error: function argument can not be null");
        deleteComment(new Commentable(function, CommentScope.LOCAL), commentId, userId);
    }

    @Override
    public void deleteGlobalCodeNodeComment(final INaviCodeNode node, final Integer commentId,
            final Integer userId) {
        Preconditions.checkNotNull(node, "Error: codeNode argument can not be null");
        deleteComment(new Commentable(node, CommentScope.GLOBAL), commentId, userId);
    }

    @Override
    public void deleteGlobalEdgeComment(final INaviEdge edge, final Integer commentId, final Integer userId) {
        Preconditions.checkNotNull(edge, "Error: codeNode argument can not be null");
        deleteComment(new Commentable(edge, CommentScope.GLOBAL), commentId, userId);
    }

    @Override
    public void deleteGlobalInstructionComment(final INaviInstruction instruction, final Integer commentId,
            final Integer userId) {
        Preconditions.checkNotNull(instruction, "Error: instruction argument can not be null");
        deleteComment(new Commentable(instruction, CommentScope.GLOBAL), commentId, userId);
    }

    @Override
    public void deleteGroupNodeComment(final INaviGroupNode node, final Integer commentId, final Integer userId) {
        Preconditions.checkNotNull(node, "Error: grouNode argument can not be null");
        deleteComment(new Commentable(node, CommentScope.GLOBAL), commentId, userId);
    }

    @Override
    public void deleteLocalCodeNodeComment(final INaviCodeNode node, final Integer commentId,
            final Integer userId) {
        Preconditions.checkNotNull(node, "Error: node argument can not be null");
        deleteComment(new Commentable(node, CommentScope.LOCAL), commentId, userId);
    }

    @Override
    public void deleteLocalEdgeComment(final INaviEdge edge, final Integer commentId, final Integer userId) {
        Preconditions.checkNotNull(edge, "Error: edge argument can not be null");
        deleteComment(new Commentable(edge, CommentScope.LOCAL), commentId, userId);
    }

    @Override
    public void deleteLocalInstructionComment(final INaviCodeNode codeNode, final INaviInstruction instruction,
            final Integer commentId, final Integer userId) {
        Preconditions.checkNotNull(instruction, "Error: instruction argument can not be null");
        deleteComment(new Commentable(instruction, CommentScope.LOCAL), commentId, userId);
    }

    @Override
    public void deleteMember(final TypeMember member, final INaviModule module) {
        final RawTypeMember rawMember = findMember(member, module);
        if (rawMember != null) {
            members.remove(module, rawMember);
        }
    }

    @Override
    public void deleteModule(final INaviModule module) {
        throw new RuntimeException("Not yet implemented");
    }

    @Override
    public void deleteProject(final INaviProject project) {
    }

    @Override
    public void deleteRawModule(final INaviRawModule module) {
        throw new RuntimeException("Not yet implemented");
    }

    @Override
    public void deleteReference(final COperandTreeNode operandTreeNode, final IAddress target,
            final ReferenceType type) {
        if (references.containsKey(target)) {
            references.remove(target);
        }
    }

    @Override
    public void deleteSection(final Section section) {
        final Section currentSection = Iterables.find(sections.get(section.getModule().getConfiguration().getId()),
                new Predicate<Section>() {
                    @Override
                    public boolean apply(final Section currentSection) {
                        return section.getId() == currentSection.getId();
                    }
                });
        sections.remove(section.getModule().getConfiguration().getId(), currentSection);
    }

    @Override
    public void deleteSectionComment(final int moduleId, final int sectionId, final Integer commentId,
            final Integer userId) throws CouldntDeleteException {
    }

    @Override
    public void deleteTag(final ITreeNode<CTag> tag) {
        // deletion can not be modeled.
    }

    @Override
    public void deleteTagSubtree(final ITreeNode<CTag> tag) {
        // deletion can not be modeled.
    }

    @Override
    public void deleteTextNodeComment(final INaviTextNode textNode, final Integer commentId, final Integer userId) {
        throw new IllegalStateException("Not yet implemented");
    }

    @Override
    public void deleteTrace(final TraceList trace) {
        // deletion of traces can not be modeled in the database.
    }

    @Override
    public void deleteType(final BaseType baseType, final INaviModule module) {

        final RawBaseType rawBaseType = new RawBaseType(baseType.getId(), baseType.getName(), baseType.getBitSize(),
                baseType.pointsTo() != null ? baseType.pointsTo().getId() : null, baseType.isSigned(),
                baseType.getCategory());

        types.remove(module.getConfiguration().getId(), rawBaseType);
    }

    @Override
    public void deleteTypeInstance(final int moduleId, final int typeInstanceId) throws CouldntDeleteException {
    }

    @Override
    public void deleteTypeInstanceComment(final int moduleId, final int instanceId, final Integer commentId,
            final Integer userId) throws CouldntDeleteException {
        throw new IllegalStateException("Not implemented");
    }

    @Override
    public void deleteTypeInstanceReference(final int moduleId, final BigInteger address, final int position,
            final int expressionid) throws CouldntDeleteException {
        // TODO(jannewger): implement this method and change test implementations in
        // TypeInstanceContainerBackendTest accordingly.
    }

    @Override
    public void deleteTypeSubstitution(final INaviModule module, final TypeSubstitution typeSubstitution) {
        final RawTypeSubstitution rawSubstitution = findSubstitution(typeSubstitution.getAddress().toBigInteger(),
                typeSubstitution.getPosition(), typeSubstitution.getOperandTreeNode().getId(), module);
        if (rawSubstitution != null) {
            substitutions.remove(module, rawSubstitution);
        }
    }

    @Override
    public void deleteUser(final IUser user) {
        users.remove(user);
    }

    @Override
    public void deleteView(final INaviView view) {
        // deletion in the database can not be modeled.
    }

    @Override
    public void editFunctionComment(final INaviFunction function, final Integer commentId, final Integer userId,
            final String newCommentText) {
        throw new IllegalStateException("Not yet implemented");
    }

    @Override
    public void editFunctionNodeComment(final INaviFunctionNode functionNode, final Integer commentId,
            final Integer userId, final String newCommentText) {
        throw new IllegalStateException("Not yet implemented");
    }

    @Override
    public void editGlobalCodeNodeComment(final INaviCodeNode codeNode, final Integer commentId,
            final Integer userId, final String newCommentText) {
        throw new IllegalStateException("Not yet implemented");
    }

    @Override
    public void editGlobalEdgeComment(final INaviEdge edge, final Integer commentId, final Integer userId,
            final String newCommentText) {
        throw new IllegalStateException("Not yet implemented");
    }

    @Override
    public void editGlobalInstructionComment(final INaviInstruction instruction, final Integer commentId,
            final Integer userId, final String newCommentText) {
        throw new IllegalStateException("Not yet implemented");
    }

    @Override
    public void editGroupNodeComment(final INaviGroupNode groupNode, final Integer id, final Integer userId,
            final String newComment) {
    }

    @Override
    public void editLocalCodeNodeComment(final INaviCodeNode codeNode, final Integer commentId,
            final Integer userId, final String newCommentText) {
        throw new IllegalStateException("Not yet implemented");
    }

    @Override
    public void editLocalEdgeComment(final INaviEdge edge, final Integer commentId, final Integer userId,
            final String newCommentText) {
        throw new IllegalStateException("Not yet implemented");
    }

    @Override
    public void editLocalInstructionComment(final INaviCodeNode codeNode, final INaviInstruction instruction,
            final Integer commentId, final Integer userId, final String newCommentText) {
        throw new IllegalStateException("Not yet implemented");
    }

    @Override
    public void editSectionComment(final int moduleId, final int sectionId, final Integer commentId,
            final Integer userId, final String commentText) throws CouldntSaveDataException {
    }

    @Override
    public void editTextNodeComment(final INaviTextNode textNode, final Integer commentId, final Integer userId,
            final String newComment) {
        throw new IllegalStateException("Not yet implemented");
    }

    @Override
    public void editTypeInstanceComment(final int moduleId, final Integer commentId, final Integer userId,
            final String commentText) throws CouldntSaveDataException {
    }

    @Override
    public IUser editUserName(final IUser user, final String userName) {

        Preconditions.checkNotNull(user, "Error: user argument can not be null");
        Preconditions.checkNotNull(userName, "Error: userName argument can not be null");

        users.remove(user);
        final CUser newUser = new CUser(user.getUserId(), userName);
        users.add(newUser);
        return newUser;
    }

    @Override
    public ResultSet executeQuery(final String query) {
        throw new IllegalStateException("Not yet implemented");
    }

    @Override
    public INaviModule findModule(final int moduleId) {
        for (final INaviModule module : modules) {
            if (module.getConfiguration().getId() == moduleId) {
                return module;
            }
        }
        return null;
    }

    @Override
    public INaviProject findProject(final int projectId) {
        return null;
    }

    @Override
    public CConnection getConnection() {
        // TODO(timkornau)
        return null;
    }

    @Override
    public DatabaseVersion getDatabaseVersion() {
        throw new IllegalStateException("Not yet implemented");
    }

    @Override
    public List<INaviView> getDerivedViews(final INaviView view) {
        return new ArrayList<INaviView>();
    }

    @Override
    public Date getModificationDate(final CAddressSpace addressSpace) {
        return new Date();
    }

    @Override
    public Date getModificationDate(final INaviModule module) {
        return new Date();
    }

    @Override
    public Date getModificationDate(final INaviProject project) {
        return new Date();
    }

    @Override
    public Date getModificationDate(final INaviView view) {
        return new Date();
    }

    @Override
    public List<INaviModule> getModules() {
        return modules;
    }

    @Override
    public CTagManager getNodeTagManager() {
        return null;
    }

    @Override
    public List<INaviProject> getProjects() {
        return null;
    }

    @Override
    public List<INaviView> getViewsWithAddress(final INaviProject project, final List<UnrelocatedAddress> address,
            final boolean all) {
        return null;
    }

    @Override
    public List<INaviView> getViewsWithAddresses(final INaviModule module, final List<UnrelocatedAddress> address,
            final boolean all) {
        return new ArrayList<INaviView>();
    }

    @Override
    public CTagManager getViewTagManager() {
        return null;
    }

    @Override
    public void initializeDatabase() {
        throw new RuntimeException("Not yet implemented");
    }

    @Override
    public void initializeModule(final CModule module, final CModuleInitializeReporter reporter) {
        throw new IllegalStateException("Not yet implemented");
    }

    @Override
    public CTag insertTag(final ITreeNode<CTag> parent, final String name, final String description,
            final TagType type) {
        final CTag newTag = new CTag(tagIdCounter, name, description, type, this);

        tagIdCounter++;

        return newTag;
    }

    @Override
    public boolean isExporterDatabaseFormatValid() {
        throw new RuntimeException("Not yet implemented");
    }

    @Override
    public boolean isInitialized() {
        throw new RuntimeException("Not yet implemented");
    }

    @Override
    public List<CAddressSpace> loadAddressSpaces(final INaviProject iNaviProject) {
        return Lists.newArrayList(new CAddressSpace(1, "", "", new Date(), new Date(),
                new HashMap<INaviModule, IAddress>(), null, this, new MockProject()));
    }

    @Override
    public CCallgraph loadCallgraph(final CModule module, final int id, final List<INaviFunction> functions) {
        return new CCallgraph(new ArrayList<ICallgraphNode>(), new ArrayList<ICallgraphEdge>());
    }

    @Override
    public List<ICallgraphView> loadCallgraphViews(final CModule module) {
        return new ArrayList<ICallgraphView>();
    }

    @Override
    public List<ICallgraphView> loadCallgraphViews(final CProject project) {
        return new ArrayList<ICallgraphView>();
    }

    @Override
    public ArrayList<IComment> loadCommentById(final Integer commentId) {
        return getCommentInternally(commentId);
    }

    @Override
    public byte[] loadData(final CModule module) {
        final byte[] bytes = { (byte) 0x90 };
        return bytes;
    }

    @Override
    public DebuggerTemplateManager loadDebuggers() {
        throw new RuntimeException("Not yet implemented");
    }

    @Override
    public ImmutableNaviViewConfiguration loadFlowGraphInformation(final INaviModule module, final Integer viewId) {
        return new ImmutableNaviViewConfiguration(viewId, "DB MODULE VIEW NAME", "DB MODULE VIEW DESCRIPTION",
                ViewType.NonNative, new Date(), new Date(), false, 1, 1);
    }

    @Override
    public ImmutableNaviViewConfiguration loadFlowGraphInformation(final INaviProject project,
            final Integer viewId) {
        return new ImmutableNaviViewConfiguration(viewId, "DB PROJECT VIEW NAME", "DB PROJECT VIEW DESCRIPTION",
                ViewType.NonNative, new Date(), new Date(), false, 1, 1);
    }

    @Override
    public ImmutableList<IFlowgraphView> loadFlowgraphs(final CModule module) {
        return new ImmutableList.Builder<IFlowgraphView>().build();
    }

    @Override
    public List<IFlowgraphView> loadFlowgraphs(final CProject project) {
        return new ArrayList<IFlowgraphView>();
    }

    @Override
    public INaviFunction loadFunction(final INaviModule module, final IAddress functionAddress) {
        return new MockFunction(this, functionAddress, module);
    }

    @Override
    public List<INaviFunction> loadFunctions(final INaviModule module, final List<IFlowgraphView> views) {
        final INaviFunction function = new CFunction(module, new MockView(), new CAddress(0x123), "", "", "", 0, 0,
                0, 0, FunctionType.NORMAL, "", 0, null, null, null, this);

        functions.add(function);

        return Lists.newArrayList(function);
    }

    @Override
    public List<INaviView> loadMixedgraphs(final CModule module) {
        return new ArrayList<INaviView>();
    }

    @Override
    public List<INaviView> loadMixedgraphs(final CProject project) {
        return new ArrayList<INaviView>();
    }

    @Override
    public List<INaviModule> loadModules() {
        throw new RuntimeException("Not yet implemented");
    }

    @Override
    public List<Pair<IAddress, INaviModule>> loadModules(final CAddressSpace addressSpace) {
        return new ArrayList<Pair<IAddress, INaviModule>>();
    }

    @Override
    public HashMap<Integer, ArrayList<IComment>> loadMultipleCommentsById(final Collection<Integer> commentIds) {
        return new HashMap<Integer, ArrayList<IComment>>();
    }

    @Override
    public ICallgraphView loadNativeCallgraph(final CModule module) {
        return MockCreator.createView(this, module);
    }

    @Override
    public ImmutableList<IFlowgraphView> loadNativeFlowgraphs(final CModule module) {
        final IFlowgraphView view = MockCreator.createView(this, module, ViewType.Native);

        flowGraphViews.add(view);

        return new ImmutableList.Builder<IFlowgraphView>().add(view).build();
    }

    @Override
    public List<INaviProject> loadProjects() {
        throw new RuntimeException("Not yet implemented");
    }

    @Override
    public List<INaviRawModule> loadRawModules() {
        throw new RuntimeException("Not yet implemented");
    }

    @Override
    public Map<Section, Integer> loadSections(final INaviModule module) {
        final HashMap<Section, Integer> sectionsMap = Maps.newHashMap();
        for (final Section section : sections.get(module.getConfiguration().getId())) {
            sectionsMap.put(section, null);
        }
        return sectionsMap;
    }

    @Override
    public HashMap<String, String> loadSettings(final CView view) {
        throw new RuntimeException("Not yet implemented");
    }

    @Override
    public CTagManager loadTagManager(final TagType type) {
        throw new RuntimeException("Not yet implemented");
    }

    @Override
    public List<TraceList> loadTraces(final CModule module) {
        return new ArrayList<TraceList>();
    }

    @Override
    public List<TraceList> loadTraces(final CProject project) {
        return new ArrayList<TraceList>();
    }

    @Override
    public RawBaseType loadType(final INaviModule module, final int baseTypeId) throws CouldntLoadDataException {
        final List<RawBaseType> rawTypes = types.get(module.getConfiguration().getId());
        if (rawTypes != null) {
            for (final RawBaseType rawType : rawTypes) {
                if (rawType.getId() == baseTypeId) {
                    return rawType;
                }
            }
        }
        return null;
    }

    @Override
    public RawTypeInstance loadTypeInstance(final INaviModule module, final Integer typeInstanceId)
            throws CouldntLoadDataException {
        final RawTypeInstance instance = new RawTypeInstance(module.getConfiguration().getId(), typeInstanceId,
                "TEST_INSTANCE", null, module.getTypeManager().getTypes().get(0).getId(), 0, 11143);
        typeInstances.put(typeInstanceId, instance);
        return instance;
    }

    @Override
    public RawTypeInstanceReference loadTypeInstanceReference(final INaviModule module,
            final Integer typeInstanceId, final BigInteger address, final Integer position,
            final Integer expressionId) {
        throw new IllegalStateException("Error: Not yet implemented.");
    }

    @Override
    public List<RawTypeInstanceReference> loadTypeInstanceReferences(final INaviModule module)
            throws CouldntLoadDataException {
        return Lists.<RawTypeInstanceReference>newArrayList();
    }

    @Override
    public List<RawTypeInstance> loadTypeInstances(final INaviModule module) throws CouldntLoadDataException {
        return typeInstances.get(module.getConfiguration().getId());
    }

    @Override
    public RawTypeMember loadTypeMember(final INaviModule module, final int memberId)
            throws CouldntLoadDataException {
        final List<RawTypeMember> rawMembers = members.get(module);
        if (rawMembers != null) {
            for (final RawTypeMember rawMember : rawMembers) {
                if (rawMember.getId() == memberId) {
                    return rawMember;
                }
            }
        }
        return null;
    }

    @Override
    public List<RawTypeMember> loadTypeMembers(final INaviModule module) {
        return Lists.newArrayList();
    }

    @Override
    public List<RawBaseType> loadTypes(final INaviModule module) {
        return types.get(module.getConfiguration().getId());
    }

    @Override
    public RawTypeSubstitution loadTypeSubstitution(final INaviModule module, final BigInteger address,
            final int position, final int expressionId) throws CouldntLoadDataException {
        return findSubstitution(address, position, expressionId, module);
    }

    @Override
    public List<RawTypeSubstitution> loadTypeSubstitutions(final INaviModule module) {
        return Lists.newArrayList();
    }

    @Override
    public List<IUser> loadUsers() {
        return users;
    }

    @Override
    public MutableDirectedGraph<INaviViewNode, INaviEdge> loadView(final INaviView view) {
        if (view.isLoaded()) {
            return (MutableDirectedGraph<INaviViewNode, INaviEdge>) view.getGraph();
        }

        return new MutableDirectedGraph<INaviViewNode, INaviEdge>(new ArrayList<INaviViewNode>(),
                new ArrayList<INaviEdge>());
    }

    @Override
    public ImmutableBiMap<INaviView, INaviFunction> loadViewFunctionMapping(final List<IFlowgraphView> flowgraphs,
            final List<INaviFunction> functions, final CModule module) {

        return new ImmutableBiMap.Builder<INaviView, INaviFunction>().put(flowGraphViews.get(0), functions.get(0))
                .build();
    }

    @Override
    public void moveTag(final ITreeNode<CTag> parent, final ITreeNode<CTag> child, final TagType type) {
        throw new IllegalStateException("Not yet implemented");
    }

    @Override
    public String readSetting(final CModule module, final String key) {
        return "result_read_setting";
    }

    @Override
    public String readSetting(final CProject project, final String key) {
        return "result_read_setting";
    }

    @Override
    public void removeDebugger(final INaviProject project, final DebuggerTemplate debugger) {
        // deletion of project debuggers can not be modeled.
    }

    @Override
    public void removeModule(final INaviAddressSpace addressSpace, final INaviModule module) {
        // deletion can not be modeled.
    }

    @Override
    public void removeTag(final INaviView view, final CTag tag) {
        // deletion of view tags can not modeled.
    }

    @Override
    public void removeTagFromNode(final INaviViewNode node, final int tagId) {
        throw new IllegalStateException("Not yet implemented");
    }

    @Override
    public void forwardFunction(final INaviFunction source, final INaviFunction target) {
        return;
    }

    @Override
    public void save(final TraceList list) {
        // saving can not be modeled.
    }

    @Override
    public void save(final CView view) {
        // database saving can not be modeled.
    }

    @Override
    public void saveData(final INaviModule module, final byte[] data) {
        Preconditions.checkNotNull(module, "Module argument can not be null");
        Preconditions.checkNotNull(data, "Data argument can not be null");
        return;
    }

    @Override
    public void saveSettings(final CView view, final Map<String, String> settings) {
    }

    @Override
    public void saveTagToNode(final INaviViewNode node, final int tagId) {
        throw new IllegalStateException("Not yet implemented");
    }

    @Override
    public void setDescription(final CAddressSpace addressSpace, final String description) {
    }

    @Override
    public void setDescription(final CTag tag, final String description) {
    }

    @Override
    public void setDescription(final TraceList traceList, final String comment) {
    }

    @Override
    public void setDescription(final INaviFunction function, final String comment) {
    }

    @Override
    public void setDescription(final INaviModule module, final String value) {
    }

    @Override
    public void setDescription(final INaviProject project, final String description) {
    }

    @Override
    public void setDescription(final INaviView view, final String description) {
    }

    @Override
    public void setFileBase(final INaviModule module, final IAddress addr) {
    }

    @Override
    public void setGlobalReplacement(final INaviOperandTreeNode operandTreeNode, final String replacement) {
        throw new IllegalStateException("Not yet implemented");
    }

    @Override
    public void setHost(final DebuggerTemplate debugger, final String host) {
    }

    @Override
    public void setImageBase(final INaviAddressSpace addressSpace, final INaviModule module,
            final IAddress address) {
    }

    @Override
    public void setImageBase(final INaviModule module, final IAddress addr) {
    }

    @Override
    public void setModules(final List<INaviModule> modules2) {
        modules.addAll(modules2);
    }

    @Override
    public void setName(final CAddressSpace addressSpace, final String name) {
    }

    @Override
    public void setName(final DebuggerTemplate debugger, final String name) {
    }

    @Override
    public void setName(final CTag tag, final String name) {
    }

    @Override
    public void setName(final TraceList traceList, final String name) {
    }

    @Override
    public void setName(final INaviFunction address, final String name) {
    }

    @Override
    public void setName(final INaviModule module, final String name) {
    }

    @Override
    public void setName(final INaviProject project, final String name) {
    }

    @Override
    public void setName(final INaviView view, final String name) {
    }

    @Override
    public void setPort(final DebuggerTemplate debugger, final int port) {
    }

    @Override
    public void setReplacement(final COperandTreeNode operandTreeNode, final String string) {
        throw new IllegalStateException("Not yet implemented");
    }

    @Override
    public void setSectionName(final int moduleId, final int sectionId, final String name)
            throws CouldntSaveDataException {

        Section oldSection = null;

        for (final Section section : sections.get(moduleId)) {
            if (section.getId() == sectionId) {
                oldSection = section;
                break;
            }
        }
        if (oldSection != null) {
            final Section newSection = new Section(oldSection.getId(), name, CommentManager.get(this),
                    oldSection.getModule(), oldSection.getStartAddress(), oldSection.getEndAddress(),
                    oldSection.getSectionPermission(), oldSection.getData());
            sections.remove(moduleId, oldSection);
            sections.put(moduleId, newSection);
        }
    }

    @Override
    public void setStared(final INaviModule module, final boolean isStared) {
        throw new IllegalStateException("Not yet implemented");
    }

    @Override
    public void setStared(final INaviView view, final boolean isStared) {
        throw new IllegalStateException("Not yet implemented");
    }

    @Override
    public void setTypeInstanceName(final int moduleId, final int id, final String name)
            throws CouldntSaveDataException {
        final List<RawTypeInstance> rawInstances = typeInstances.get(moduleId);
        final RawTypeInstance rawInstance = Iterables.find(rawInstances, new Predicate<RawTypeInstance>() {
            @Override
            public boolean apply(final RawTypeInstance instance) {
                return instance.getId() == id;
            }
        });
        final RawTypeInstance newRawInstance = new RawTypeInstance(moduleId, id, name, rawInstance.getCommentId(),
                rawInstance.getTypeId(), rawInstance.getSectionId(), rawInstance.getSectionOffset());
        typeInstances.remove(moduleId, rawInstance);
        typeInstances.put(moduleId, newRawInstance);
    }

    @Override
    public void tagView(final INaviView view, final CTag tag) {
        // view tagging in the database can not be modeled.
    }

    @Override
    public void updateDatabase() {
        throw new IllegalStateException("Not yet implemented");
    }

    @Override
    public void updateMember(final TypeMember member, final String newName, final BaseType newBaseType,
            final Optional<Integer> newOffset, final Optional<Integer> newNumberOfElements,
            final Optional<Integer> newArgumentIndex, final INaviModule module) {
        final RawTypeMember rawMember = findMember(member, module);
        if (rawMember != null) {
            members.remove(module, rawMember);
            members.put(module,
                    new RawTypeMember(rawMember.getId(), newName, newBaseType.getId(), rawMember.getParentId(),
                            newOffset.orNull(), newArgumentIndex.orNull(), newNumberOfElements.orNull()));
        } else {
            throw new IllegalStateException("Trying to update non-existing member.");
        }
    }

    @Override
    public void updateMemberOffsets(final List<Integer> updatedMembers, final int delta,
            final List<Integer> implicitlyUpdatedMembers, final int implicitDelta, final INaviModule module) {
        throw new IllegalStateException("Not yet implemented");
    }

    @Override
    public void updateType(final BaseType baseType, final String name, final int size, final boolean isSigned,
            final INaviModule module) {
        final RawBaseType rawType = findType(baseType, module);
        if (rawType != null) {
            types.remove(module.getConfiguration().getId(), rawType);
            types.put(module.getConfiguration().getId(), new RawBaseType(rawType.getId(), name, size,
                    rawType.getPointerId(), isSigned, rawType.getCategory()));
        } else {
            throw new IllegalStateException("Trying to update non-existing type.");
        }
    }

    @Override
    public void updateTypeSubstitution(final TypeSubstitution substitution, final BaseType baseType,
            final List<Integer> memberPath, final int offset, final INaviModule module) {
        final RawTypeSubstitution rawSubstitution = findSubstitution(substitution.getAddress().toBigInteger(),
                substitution.getPosition(), substitution.getOperandTreeNode().getId(), module);
        if (rawSubstitution != null) {
            substitutions.remove(module, rawSubstitution);
            substitutions.put(module,
                    new RawTypeSubstitution(substitution.getAddress(), substitution.getPosition(),
                            substitution.getOperandTreeNode().getId(), baseType.getId(),
                            Arrays.copyOf(memberPath.toArray(), memberPath.size(), Integer[].class), offset));
        } else {
            throw new IllegalStateException("Trying to update non-existing type substitution.");
        }
    }

    @Override
    public void writeSetting(final CModule module, final String key, final String value) {
        Preconditions.checkNotNull(module, "Module argument can not be null");
        Preconditions.checkNotNull(key, "Key argument can not be null");
        Preconditions.checkNotNull(value, "Value argument can not be null");
    }

    @Override
    public void writeSetting(final CProject project, final String key, final String value) {
        throw new RuntimeException("Not yet implemented");
    }

    private class Commentable {
        public Commentable(final Object commentable, final CommentScope scope) {
            Preconditions.checkNotNull(commentable, "Error: commentable argument can not be null");
            Preconditions.checkNotNull(scope, "Error: scope argument can not be null");
        }
    }

    @Override
    public void close() {
    }

    @Override
    public void addListener(SQLProviderListener listener) {
    }

    @Override
    public void removeListener(SQLProviderListener listener) {
    }
}