/** Return the names of required parameters of a method. */ public List<String> getRequiredFields(Method method) { MessageType inputMessage = method.getInputMessage(); return inputMessage .getFields() .stream() .filter(this::isFieldRequired) .map(Field::getSimpleName) .collect(Collectors.toList()); }
/** * Returns the field for the key of a map type. Error if type is not a map. */ public Field getMapKeyField() { Preconditions.checkArgument(isMap()); return messageType.getFields().get(0); }
/** * Returns the field for a value of a map type. Error if type is not a map. */ public Field getMapValueField() { Preconditions.checkArgument(isMap()); return messageType.getFields().get(1); }
/** * Returns the field for the key of a map type. Error if type is not a map. */ public Field getMapKeyField() { Preconditions.checkArgument(isMap()); return messageType.getFields().get(0); }
/** * Returns the field for a value of a map type. Error if type is not a map. */ public Field getMapValueField() { Preconditions.checkArgument(isMap()); return messageType.getFields().get(1); }
@Override public List<ProtoField> getOutputFields() { if (outputFields != null) { return outputFields; } ImmutableList.Builder<ProtoField> fieldsBuilder = ImmutableList.builder(); for (Field field : method.getOutputType().getMessageType().getFields()) { fieldsBuilder.add(new ProtoField(field)); } outputFields = fieldsBuilder.build(); return outputFields; }
@Override public List<ProtoField> getInputFields() { if (inputFields != null) { return inputFields; } ImmutableList.Builder<ProtoField> fieldsBuilder = ImmutableList.builder(); for (Field field : method.getInputType().getMessageType().getFields()) { fieldsBuilder.add(new ProtoField(field)); } inputFields = fieldsBuilder.build(); return inputFields; }
@Override @Memoized public List<? extends FieldModel> getFields() { return getProtoType() .getMessageType() .getFields() .stream() .map(ProtoField::new) .collect(ImmutableList.toImmutableList()); }
@Accepts public void accept(MessageType message) { acceptContainer(message); acceptElems(message.getFields()); }
@Accepts public void accept(MessageType message) { acceptContainer(message); acceptElems(message.getFields()); }
private static Set<ProtoFile> getFilesForMessage(MessageType messageType, boolean messageOnly) { Set<ProtoFile> files = newFileSet(); files.add(messageType.getFile()); if (messageOnly) { return files; } for (Field field : messageType.getFields()) { TypeRef type = field.getType(); if (type.isMessage()) { files.addAll(getFilesForMessage(type.getMessageType(), type.isCyclic())); } } return files; }
@Test public void testGetResourcePath() { Field shelfNameField = shelf.getFields().stream().filter(f -> f.getSimpleName().equals("name")).findFirst().get(); assertThat(protoParser.getResource(shelfNameField).getPath()).isEqualTo("shelves/{shelf_id}"); }
@Test public void testGetEmptyResource() { MessageType book = libraryProtoFile .getMessages() .stream() .filter(m -> m.getSimpleName().equals("Book")) .findFirst() .get(); Field authorBookField = book.getFields().stream().filter(f -> f.getSimpleName().equals("author")).findFirst().get(); assertThat(protoParser.getResource(authorBookField)).isNull(); }
@Visits void reach(MessageType message) { markAsReachable(message); visitInScope(message.getFields()); // Check whether required fields are hidden, and whether the message has unreachable // descendants. for (Field field : message.getFields()) { if (!isReachable(field)) { hasUnreachableDescendants.add(message); if (field.isRequired()) { error(field, "A required field cannot be hidden. %s.", reasonForUnreachable(field)); } } else { TypeRef type = field.getType(); if (type.isMessage() && hasUnreachableDescendants(type.getMessageType()) || type.isEnum() && hasUnreachableDescendants(type.getEnumType())) { hasUnreachableDescendants.add(message); } } } }
@Visits void reach(MessageType message) { markAsReachable(message); visitInScope(message.getFields()); // Check whether required fields are hidden, and whether the message has unreachable // descendants. for (Field field : message.getFields()) { if (!isReachable(field)) { hasUnreachableDescendants.add(message); if (field.isRequired()) { error(field, "A required field cannot be hidden. %s.", reasonForUnreachable(field)); } } else { TypeRef type = field.getType(); if (type.isMessage() && hasUnreachableDescendants(type.getMessageType()) || type.isEnum() && hasUnreachableDescendants(type.getEnumType())) { hasUnreachableDescendants.add(message); } } } }
@Test public void testGetResourceType() { MessageType getShelfRequest = libraryProtoFile .getMessages() .stream() .filter(m -> m.getSimpleName().equals("GetShelfRequest")) .findFirst() .get(); Field shelves = getShelfRequest .getFields() .stream() .filter(f -> f.getSimpleName().equals("name")) .findFirst() .get(); String shelfType = protoParser.getResourceReference(shelves); assertThat(shelfType).isEqualTo("Shelf"); }
@Test public void smokeTestApiConstruction() { Assert.assertEquals(1, testModel.getFiles().size()); ProtoFile file = testModel.getFiles().get(0); Assert.assertEquals(2, file.getMessages().size()); Assert.assertEquals(1, file.getEnums().size()); Assert.assertEquals(3, file.getMessages().get(0).getFields().size()); Assert.assertEquals(1, file.getMessages().get(1).getMessages().size()); Assert.assertEquals(1, file.getInterfaces().size()); }
@Test public void testGetResourceSet() { Field bookNameField = book.getFields().stream().filter(f -> f.getSimpleName().equals("name")).findFirst().get(); ResourceSet bookResourceSet = protoParser.getResourceSet(bookNameField); assertThat(bookResourceSet).isNotNull(); assertThat(bookResourceSet.getName()).isEqualTo("BookOneOf"); assertThat(bookResourceSet.getResourcesCount()).isEqualTo(1); assertThat(bookResourceSet.getResources(0)) .isEqualTo(Resource.newBuilder().setName("DeletedBook").setPath("_deleted-book_").build()); assertThat(bookResourceSet.getResourceReferencesList()).containsExactly("ArchivedBook", "Book"); }
@Test public void testGetDocumentation() { String blockDocument = getIdlDocumentation(getOuterMessage()); String leadingDocument = getIdlDocumentation(getInnerMessage()); String trailingDocument = getIdlDocumentation(getOuterMessage().getFields().get(0)); String fileDocument = getIdlDocumentation(proto); assertEquals(" Outer Message.\n Contains inner Message. ", blockDocument); assertEquals(" Inner Message.\n", leadingDocument); assertEquals(" Field.\n", trailingDocument); assertEquals("", fileDocument); }