1 /*
   2  * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 package org.graalvm.graphio;
  24 
  25 import java.io.IOException;
  26 import java.nio.channels.WritableByteChannel;
  27 import java.util.Collection;
  28 import java.util.Map;
  29 
  30 final class ProtocolImpl<Graph, Node, NodeClass, Port, Block, ResolvedJavaMethod, ResolvedJavaField, Signature, NodeSourcePosition>
  31                 extends GraphProtocol<Graph, Node, NodeClass, Port, Block, ResolvedJavaMethod, ResolvedJavaField, Signature, NodeSourcePosition> {
  32     private final GraphStructure<Graph, Node, NodeClass, Port> structure;
  33     private final GraphTypes types;
  34     private final GraphBlocks<Graph, Block, Node> blocks;
  35     private final GraphElements<ResolvedJavaMethod, ResolvedJavaField, Signature, NodeSourcePosition> elements;
  36 
  37     ProtocolImpl(GraphStructure<Graph, Node, NodeClass, Port> structure, GraphTypes enums, GraphBlocks<Graph, Block, Node> blocks,
  38                     GraphElements<ResolvedJavaMethod, ResolvedJavaField, Signature, NodeSourcePosition> elements, WritableByteChannel channel) throws IOException {
  39         super(channel);
  40         this.structure = structure;
  41         this.types = enums;
  42         this.blocks = blocks;
  43         this.elements = elements;
  44     }
  45 
  46     @Override
  47     protected Graph findGraph(Graph current, Object obj) {
  48         return structure.graph(current, obj);
  49     }
  50 
  51     @Override
  52     protected NodeClass findNodeClass(Object obj) {
  53         return structure.nodeClass(obj);
  54     }
  55 
  56     @Override
  57     protected String findNameTemplate(NodeClass clazz) {
  58         return structure.nameTemplate(clazz);
  59     }
  60 
  61     @Override
  62     protected int findNodeId(Node n) {
  63         return structure.nodeId(n);
  64     }
  65 
  66     @Override
  67     protected boolean hasPredecessor(Node node) {
  68         return structure.nodeHasPredecessor(node);
  69     }
  70 
  71     @Override
  72     protected int findNodesCount(Graph info) {
  73         return structure.nodesCount(info);
  74     }
  75 
  76     @Override
  77     protected Iterable<? extends Node> findNodes(Graph info) {
  78         return structure.nodes(info);
  79     }
  80 
  81     @Override
  82     protected void findNodeProperties(Node node, Map<String, Object> props, Graph info) {
  83         structure.nodeProperties(info, node, props);
  84     }
  85 
  86     @Override
  87     protected Port findClassEdges(NodeClass nodeClass, boolean dumpInputs) {
  88         if (dumpInputs) {
  89             return structure.portInputs(nodeClass);
  90         } else {
  91             return structure.portOutputs(nodeClass);
  92         }
  93     }
  94 
  95     @Override
  96     protected int findSize(Port edges) {
  97         return structure.portSize(edges);
  98     }
  99 
 100     @Override
 101     protected boolean isDirect(Port edges, int i) {
 102         return structure.edgeDirect(edges, i);
 103     }
 104 
 105     @Override
 106     protected String findName(Port edges, int i) {
 107         return structure.edgeName(edges, i);
 108     }
 109 
 110     @Override
 111     protected Object findType(Port edges, int i) {
 112         return structure.edgeType(edges, i);
 113     }
 114 
 115     @Override
 116     protected Collection<? extends Node> findNodes(Graph graph, Node node, Port port, int i) {
 117         return structure.edgeNodes(graph, node, port, i);
 118     }
 119 
 120     @Override
 121     protected Object findJavaClass(NodeClass clazz) {
 122         return structure.nodeClassType(clazz);
 123     }
 124 
 125     @Override
 126     protected Object findEnumClass(Object enumValue) {
 127         return types.enumClass(enumValue);
 128     }
 129 
 130     @Override
 131     protected int findEnumOrdinal(Object obj) {
 132         return types.enumOrdinal(obj);
 133     }
 134 
 135     @Override
 136     protected String[] findEnumTypeValues(Object clazz) {
 137         return types.enumTypeValues(clazz);
 138     }
 139 
 140     @Override
 141     protected String findJavaTypeName(Object obj) {
 142         return types.typeName(obj);
 143     }
 144 
 145     @Override
 146     protected Collection<? extends Node> findBlockNodes(Graph info, Block block) {
 147         return blocks.blockNodes(info, block);
 148     }
 149 
 150     @Override
 151     protected int findBlockId(Block block) {
 152         return blocks.blockId(block);
 153     }
 154 
 155     @Override
 156     protected Collection<? extends Block> findBlocks(Graph graph) {
 157         return blocks.blocks(graph);
 158     }
 159 
 160     @Override
 161     protected Collection<? extends Block> findBlockSuccessors(Block block) {
 162         return blocks.blockSuccessors(block);
 163     }
 164 
 165     @Override
 166     protected ResolvedJavaMethod findMethod(Object obj) {
 167         return elements == null ? null : elements.method(obj);
 168     }
 169 
 170     @Override
 171     protected byte[] findMethodCode(ResolvedJavaMethod method) {
 172         return elements.methodCode(method);
 173     }
 174 
 175     @Override
 176     protected int findMethodModifiers(ResolvedJavaMethod method) {
 177         return elements.methodModifiers(method);
 178     }
 179 
 180     @Override
 181     protected Signature findMethodSignature(ResolvedJavaMethod method) {
 182         return elements.methodSignature(method);
 183     }
 184 
 185     @Override
 186     protected String findMethodName(ResolvedJavaMethod method) {
 187         return elements.methodName(method);
 188     }
 189 
 190     @Override
 191     protected Object findMethodDeclaringClass(ResolvedJavaMethod method) {
 192         return elements.methodDeclaringClass(method);
 193     }
 194 
 195     @Override
 196     protected int findFieldModifiers(ResolvedJavaField field) {
 197         return elements.fieldModifiers(field);
 198     }
 199 
 200     @Override
 201     protected String findFieldTypeName(ResolvedJavaField field) {
 202         return elements.fieldTypeName(field);
 203     }
 204 
 205     @Override
 206     protected String findFieldName(ResolvedJavaField field) {
 207         return elements.fieldName(field);
 208     }
 209 
 210     @Override
 211     protected Object findFieldDeclaringClass(ResolvedJavaField field) {
 212         return elements.fieldDeclaringClass(field);
 213     }
 214 
 215     @Override
 216     protected ResolvedJavaField findJavaField(Object object) {
 217         return elements == null ? null : elements.field(object);
 218     }
 219 
 220     @Override
 221     protected Signature findSignature(Object object) {
 222         return elements == null ? null : elements.signature(object);
 223     }
 224 
 225     @Override
 226     protected int findSignatureParameterCount(Signature signature) {
 227         return elements.signatureParameterCount(signature);
 228     }
 229 
 230     @Override
 231     protected String findSignatureParameterTypeName(Signature signature, int index) {
 232         return elements.signatureParameterTypeName(signature, index);
 233     }
 234 
 235     @Override
 236     protected String findSignatureReturnTypeName(Signature signature) {
 237         return elements.signatureReturnTypeName(signature);
 238     }
 239 
 240     @Override
 241     protected NodeSourcePosition findNodeSourcePosition(Object object) {
 242         return elements == null ? null : elements.nodeSourcePosition(object);
 243     }
 244 
 245     @Override
 246     protected ResolvedJavaMethod findNodeSourcePositionMethod(NodeSourcePosition pos) {
 247         return elements.nodeSourcePositionMethod(pos);
 248     }
 249 
 250     @Override
 251     protected NodeSourcePosition findNodeSourcePositionCaller(NodeSourcePosition pos) {
 252         return elements.nodeSourcePositionCaller(pos);
 253     }
 254 
 255     @Override
 256     protected int findNodeSourcePositionBCI(NodeSourcePosition pos) {
 257         return elements.nodeSourcePositionBCI(pos);
 258     }
 259 
 260     @Override
 261     protected StackTraceElement findMethodStackTraceElement(ResolvedJavaMethod method, int bci, NodeSourcePosition pos) {
 262         return elements.methodStackTraceElement(method, bci, pos);
 263     }
 264 
 265     @Override
 266     protected void findExtraNodes(Node node, Collection<? super Node> extraNodes) {
 267     }
 268 
 269     @Override
 270     protected String formatTitle(Graph graph, int id, String format, Object... args) {
 271         return String.format(format, args) + " [" + id + "]";
 272     }
 273 }