final Class<? extends Writable> getOutgoingMessage() { if (newMessage != null) { return newMessage; } if (newComputationClass == null) { return originalMessage; } Class[] computationTypes = ReflectionUtils.getTypeArguments( TypesHolder.class, newComputationClass); return computationTypes[4]; }
/** * Infer types from Computation class * * @param klass Computation class */ public void inferFrom(Class<? extends TypesHolder> klass) { Class<?>[] classList = getTypeArguments(TypesHolder.class, klass); Preconditions.checkArgument(classList.length == 5); vertexIdClass = (Class<I>) classList[0]; vertexValueClass = (Class<V>) classList[1]; edgeValueClass = (Class<E>) classList[2]; outgoingMessageValueClass = (Class<? extends Writable>) classList[4]; }
/** * Get mappingTarget class * * @return mappingTarget class */ public Class<? extends Writable> getMappingTargetClass() { if (mappingTargetClass == null) { Class<?>[] classList = ReflectionUtils.getTypeArguments( MappingStore.class, getMappingStoreClass()); Preconditions.checkArgument(classList.length == 2); mappingTargetClass = (Class<? extends Writable>) classList[1]; } return mappingTargetClass; }
/** * Set computation class * @param computationClass computation class */ public void setComputationClass( Class<? extends Computation> computationClass) { this.computationClass = computationClass; if (computationClass != null) { Class[] computationTypes = ReflectionUtils.getTypeArguments( TypesHolder.class, computationClass); if (computationTypes[4] != null && outgoingMessageClasses instanceof DefaultMessageClasses) { ((DefaultMessageClasses) outgoingMessageClasses) .setIfNotModifiedMessageClass(computationTypes[4]); } } }
@Override public void verifyConsistent( ImmutableClassesGiraphConfiguration conf) { Class<?>[] factoryTypes = ReflectionUtils.getTypeArguments( MessageValueFactory.class, messageValueFactoryClass); ReflectionUtils.verifyTypes(messageClass, factoryTypes[0], "Message factory", messageValueFactoryClass); if (messageCombinerClass != null) { Class<?>[] combinerTypes = ReflectionUtils.getTypeArguments( MessageCombiner.class, messageCombinerClass); ReflectionUtils.verifyTypes(conf.getVertexIdClass(), combinerTypes[0], "Vertex id", messageCombinerClass); ReflectionUtils.verifyTypes(messageClass, combinerTypes[1], "Outgoing message", messageCombinerClass); } }
/** Verify that the vertex value factory's type matches the job */ private void verifyVertexValueFactoryGenericTypes() { Class<? extends VertexValueFactory<V>> vvfClass = conf.getVertexValueFactoryClass(); if (DefaultVertexValueFactory.class.equals(vvfClass)) { return; } Class<?>[] classList = getTypeArguments(VertexValueFactory.class, vvfClass); checkEquals(classList, VALUE_PARAM_VERTEX_VALUE_FACTORY_INDEX, vertexValueType(), VertexValueFactory.class, "vertex value"); }
@Override public void verifyConsistent(ImmutableClassesGiraphConfiguration conf) { MessageValueFactory<M> messageValueFactory = messageValueFactorySupplier.apply(conf); Preconditions.checkState( messageValueFactory.newInstance().getClass().equals(messageClass)); if (messageCombinerSupplier != null) { MessageCombiner<? super I, M> messageCombiner = messageCombinerSupplier.apply(conf); Preconditions.checkState(messageCombiner.createInitialMessage() .getClass().equals(messageClass)); Class<?>[] combinerTypes = ReflectionUtils.getTypeArguments( MessageCombiner.class, messageCombiner.getClass()); ReflectionUtils.verifyTypes(conf.getVertexIdClass(), combinerTypes[0], "Vertex id", messageCombiner.getClass()); ReflectionUtils.verifyTypes(messageClass, combinerTypes[1], "Outgoing message", messageCombiner.getClass()); } } }
/** * If there is a vertex value combiner type, verify its * generic params match the job. */ private void verifyVertexValueCombinerGenericTypes() { Class<? extends VertexValueCombiner<V>> vertexValueCombiner = conf.getVertexValueCombinerClass(); if (vertexValueCombiner != null) { Class<?>[] classList = getTypeArguments(VertexValueCombiner.class, vertexValueCombiner); checkAssignable(classList, VALUE_PARAM_VERTEX_VALUE_COMBINER_INDEX, vertexValueType(), VertexValueCombiner.class, "vertex value"); } }
@Override public void apply(AbstractPiece piece) { if (!piece.getClass().equals(Piece.class)) { Class<?>[] classList = getTypeArguments( AbstractPiece.class, piece.getClass()); Preconditions.checkArgument(classList.length == 7); ReflectionUtils.verifyTypes( vertexIdClass, classList[0], "vertexId", piece.getClass()); ReflectionUtils.verifyTypes( vertexValueClass, classList[1], "vertexValue", piece.getClass()); ReflectionUtils.verifyTypes( edgeValueClass, classList[2], "edgeValue", piece.getClass()); MessageClasses classes = piece.getMessageClasses(conf); Class<?> messageType = classes.getMessageClass(); if (messageType == null) { messageType = NoMessage.class; } ReflectionUtils.verifyTypes( messageType, classList[3], "message", piece.getClass()); ReflectionUtils.verifyTypes( workerContextValueClass, classList[4], "workerContextValue", piece.getClass()); // No need to check worker context message class at all ReflectionUtils.verifyTypes( executionStageClass, classList[6], "executionStage", piece.getClass()); } } });
/** * Verify matching generic types for a specific OutEdges class. * * @param outEdgesClass {@link org.apache.giraph.edge.OutEdges} class to check */ private void verifyOutEdgesGenericTypesClass( Class<? extends OutEdges<I, E>> outEdgesClass) { Class<?>[] classList = getTypeArguments(OutEdges.class, outEdgesClass); checkAssignable(classList, ID_PARAM_INDEX, vertexIndexType(), OutEdges.class, "vertex index"); checkAssignable(classList, EDGE_PARAM_OUT_EDGES_INDEX, edgeValueType(), OutEdges.class, "edge value"); }
/** * If there is a message combiner type, verify its * generic params match the job. */ private void verifyMessageCombinerGenericTypes() { MessageCombiner<I, M2> messageCombiner = conf.createOutgoingMessageCombiner(); if (messageCombiner != null) { Class<?>[] classList = getTypeArguments(MessageCombiner.class, messageCombiner.getClass()); checkEquals(classList, ID_PARAM_INDEX, vertexIndexType(), MessageCombiner.class, "vertex index"); checkEquals(classList, MSG_COMBINER_PARAM_INDEX, outgoingMessageValueType(), MessageCombiner.class, "message value"); } }
/** Verify matching generic types in EdgeInputFormat. */ private void verifyEdgeInputFormatGenericTypes() { Class<? extends EdgeInputFormat<I, E>> edgeInputFormatClass = conf.getEdgeInputFormatClass(); if (edgeInputFormatClass != null) { Class<?>[] classList = getTypeArguments(EdgeInputFormat.class, edgeInputFormatClass); checkAssignable(classList, ID_PARAM_INDEX, vertexIndexType(), EdgeInputFormat.class, "vertex index"); checkAssignable(classList, EDGE_PARAM_EDGE_INPUT_FORMAT_INDEX, edgeValueType(), EdgeInputFormat.class, "edge value"); } }
/** * If there is a vertex resolver, * validate the generic parameter types. * */ private void verifyVertexResolverGenericTypes() { Class<? extends VertexResolver<I, V, E>> vrClass = conf.getVertexResolverClass(); if (DefaultVertexResolver.class.equals(vrClass)) { return; } Class<?>[] classList = getTypeArguments(VertexResolver.class, vrClass); checkEquals(classList, ID_PARAM_INDEX, vertexIndexType(), VertexResolver.class, "vertex index"); checkEquals(classList, VALUE_PARAM_INDEX, vertexValueType(), VertexResolver.class, "vertex value"); checkEquals(classList, EDGE_PARAM_INDEX, edgeValueType(), VertexResolver.class, "edge value"); }
/** Verify matching generic types in VertexInputFormat. */ private void verifyVertexInputFormatGenericTypes() { Class<? extends VertexInputFormat<I, V, E>> vertexInputFormatClass = conf.getVertexInputFormatClass(); if (vertexInputFormatClass != null) { Class<?>[] classList = getTypeArguments(VertexInputFormat.class, vertexInputFormatClass); checkAssignable(classList, ID_PARAM_INDEX, vertexIndexType(), VertexInputFormat.class, "vertex index"); checkAssignable(classList, VALUE_PARAM_INDEX, vertexValueType(), VertexInputFormat.class, "vertex value"); checkAssignable(classList, EDGE_PARAM_INDEX, edgeValueType(), VertexInputFormat.class, "edge value"); } }
void sanityTypeChecks( GiraphConfiguration conf, Class<?> previousMessageClass) { if (computationClass != null) { final Class<?> vertexIdClass = GiraphConstants.VERTEX_ID_CLASS.get(conf); final Class<?> vertexValueClass = GiraphConstants.VERTEX_VALUE_CLASS.get(conf); final Class<?> edgeValueClass = GiraphConstants.EDGE_VALUE_CLASS.get(conf); Class<?>[] classList = getTypeArguments( TypesHolder.class, computationClass); Preconditions.checkArgument(classList.length == 5); ReflectionUtils.verifyTypes( vertexIdClass, classList[0], "vertexId", computationClass); ReflectionUtils.verifyTypes( vertexValueClass, classList[1], "vertexValue", computationClass); ReflectionUtils.verifyTypes( edgeValueClass, classList[2], "edgeValue", computationClass); if (previousMessageClass != null) { ReflectionUtils.verifyTypes( previousMessageClass, classList[3], "recvMessage", computationClass); } ReflectionUtils.verifyTypes( messageClass, classList[4], "sendMessage", computationClass); } }
/** Verify that the edge output format's generic params match the job. */ private void verifyEdgeOutputFormatGenericTypes() { Class<? extends VertexOutputFormat<I, V, E>> vertexOutputFormatClass = conf.getVertexOutputFormatClass(); if (conf.hasVertexOutputFormat()) { Class<?>[] classList = getTypeArguments(VertexOutputFormat.class, vertexOutputFormatClass); checkAssignable(classList, ID_PARAM_INDEX, vertexIndexType(), VertexOutputFormat.class, "vertex index"); checkAssignable(classList, VALUE_PARAM_INDEX, vertexValueType(), VertexOutputFormat.class, "vertex value"); checkAssignable(classList, EDGE_PARAM_INDEX, edgeValueType(), VertexOutputFormat.class, "edge value"); } }
/** Verify that the vertex output format's generic params match the job. */ private void verifyVertexOutputFormatGenericTypes() { Class<? extends EdgeOutputFormat<I, V, E>> edgeOutputFormatClass = conf.getEdgeOutputFormatClass(); if (conf.hasEdgeOutputFormat()) { Class<?>[] classList = getTypeArguments(EdgeOutputFormat.class, edgeOutputFormatClass); checkAssignable(classList, ID_PARAM_INDEX, vertexIndexType(), VertexOutputFormat.class, "vertex index"); checkAssignable(classList, VALUE_PARAM_INDEX, vertexValueType(), VertexOutputFormat.class, "vertex value"); checkAssignable(classList, EDGE_PARAM_INDEX, edgeValueType(), VertexOutputFormat.class, "edge value"); } }
Class<?>[] computationTypes = ReflectionUtils.getTypeArguments( TypesHolder.class, computationClass); ReflectionUtils.verifyTypes(conf.getVertexIdClass(), computationTypes[0],