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