private static String[] getFullyQualifiedClassName(Descriptors.Descriptor container, final FileOptions fileOpts, String name) { if (fileOpts.getJavaMultipleFiles()) { LinkedList<String> fqnSegments = new LinkedList<>(); fqnSegments.push(name); while (container != null) { fqnSegments.push(container.getName()); container = container.getContainingType(); } fqnSegments.push(fileOpts.getJavaPackage()); return fqnSegments.toArray(new String[] {}); } return new String[] {fileOpts.getJavaPackage(), fileOpts.getJavaOuterClassname(), name}; }
private Schema getSchema(Descriptor descriptor) { Map<Descriptor,Schema> seen = SEEN.get(); if (seen.containsKey(descriptor)) // stop recursion return seen.get(descriptor); boolean first = seen.isEmpty(); try { Schema result = Schema.createRecord(descriptor.getName(), null, getNamespace(descriptor.getFile(), descriptor.getContainingType()), false); seen.put(descriptor, result); List<Field> fields = new ArrayList<>(); for (FieldDescriptor f : descriptor.getFields()) fields.add(Accessor.createField(f.getName(), getSchema(f), null, getDefault(f))); result.setFields(fields); return result; } finally { if (first) seen.clear(); } }
private String getNamespace(FileDescriptor fd, Descriptor containing) { FileOptions o = fd.getOptions(); String p = o.hasJavaPackage() ? o.getJavaPackage() : fd.getPackage(); String outer; if (o.hasJavaOuterClassname()) { outer = o.getJavaOuterClassname(); } else { outer = new File(fd.getName()).getName(); outer = outer.substring(0, outer.lastIndexOf('.')); outer = toCamelCase(outer); } String inner = ""; while (containing != null) { inner = containing.getName() + "$" + inner; containing = containing.getContainingType(); } return p + "." + outer + "$" + inner; }
private static Class<?> getJavaClassIgnoreRepeated(final Descriptors.FieldDescriptor descriptor, BeanContainer beanContainer) { switch (descriptor.getJavaType()) { case INT: return Integer.class; case LONG: return Long.class; case FLOAT: return Float.class; case DOUBLE: return Double.class; case BOOLEAN: return Boolean.class; case STRING: return String.class; case BYTE_STRING: return ByteString.class; //code duplicate, but GenericDescriptor interface is private in protobuf case ENUM: return getEnumClassByEnumDescriptor(descriptor.getEnumType(), beanContainer); case MESSAGE: return MappingUtils.loadClass(StringUtils.join( getFullyQualifiedClassName(descriptor.getMessageType().getContainingType(), descriptor.getMessageType().getFile().getOptions(), descriptor.getMessageType().getName()), '.'), beanContainer); default: throw new MappingException("Unable to find " + descriptor.getJavaType()); } }
private Schema getSchema(Descriptor descriptor) { Map<Descriptor,Schema> seen = SEEN.get(); if (seen.containsKey(descriptor)) // stop recursion return seen.get(descriptor); boolean first = seen.isEmpty(); try { Schema result = Schema.createRecord(descriptor.getName(), null, getNamespace(descriptor.getFile(), descriptor.getContainingType()), false); seen.put(descriptor, result); List<Field> fields = new ArrayList<Field>(); for (FieldDescriptor f : descriptor.getFields()) fields.add(new Field(f.getName(), getSchema(f), null, getDefault(f))); result.setFields(fields); return result; } finally { if (first) seen.clear(); } }
private String getNamespace(FileDescriptor fd, Descriptor containing) { FileOptions o = fd.getOptions(); String p = o.hasJavaPackage() ? o.getJavaPackage() : fd.getPackage(); String outer; if (o.hasJavaOuterClassname()) { outer = o.getJavaOuterClassname(); } else { outer = new File(fd.getName()).getName(); outer = outer.substring(0, outer.lastIndexOf('.')); outer = toCamelCase(outer); } String inner = ""; while (containing != null) { inner = containing.getName() + "$" + inner; containing = containing.getContainingType(); } return p + "." + outer + "$" + inner; }
public TableMetadataPersistence.ColumnValueDescription.Builder persistToProto() { Builder builder = TableMetadataPersistence.ColumnValueDescription.newBuilder(); builder.setType(type.persistToProto()); builder.setCompression(compression.persistToProto()); if (className != null) { builder.setClassName(className); } if (canonicalClassName != null) { builder.setCanonicalClassName(canonicalClassName); } builder.setFormat(format.persistToProto()); if (protoDescriptor != null) { builder.setProtoMessageName(protoDescriptor.getName()); builder.setProtoFileDescriptorTree(persistFileDescriptorTree(protoDescriptor.getFile())); if (protoDescriptor.getContainingType() != null) { log.error("proto descriptors should be top level types: {}", protoDescriptor.getName()); } } return builder; }
/** * Returns the qualified type of the protobuf message, for example: * <ul> * <li>org.waveprotocol.pst.examples.Example1.Person = * "org.waveprotocol.pst.examples.Example1.Person"</li> * </ul> * * @return the full type of the protocol buffer message */ public String getProtoType() { Deque<String> scopes = Lists.newLinkedList(); for (Descriptor message = descriptor; message != null; message = message.getContainingType()) { scopes.push(message.getName()); } scopes.push(descriptor.getFile().getOptions().getJavaOuterClassname()); scopes.push(getPackageBase()); return Joiner.on('.').join(scopes); }
@Override Object protoFromSoy(SoyValue field) { SoyMap map = (SoyMap) field; // Proto map fields use a non-standard API. A protobuf map is actually a repeated list of // MapEntry quasi-messages, which one cannot mutate in-place inside a map. ImmutableList.Builder<Message> mapEntries = ImmutableList.builder(); Message.Builder defaultInstance = DynamicMessage.newBuilder(messageDescriptor.getContainingType()); for (Map.Entry<? extends SoyValue, ? extends SoyValueProvider> entry : map.asJavaMap().entrySet()) { Message.Builder entryBuilder = defaultInstance.newBuilderForField(mapField); entryBuilder.setField(keyDescriptor, keyField.protoFromSoy(entry.getKey())); entryBuilder.setField( valueDescriptor, valueField.protoFromSoy(entry.getValue().resolve())); mapEntries.add(entryBuilder.build()); } return mapEntries.build(); } };
@Override Object protoFromSoy(SoyValue field) { SoyMap map = (SoyMap) field; // Proto map fields use a non-standard API. A protobuf map is actually a repeated list of // MapEntry quasi-messages, which one cannot mutate in-place inside a map. ImmutableList.Builder<Message> mapEntries = ImmutableList.builder(); Message.Builder defaultInstance = DynamicMessage.newBuilder(messageDescriptor.getContainingType()); for (Map.Entry<? extends SoyValue, ? extends SoyValueProvider> entry : map.asJavaMap().entrySet()) { Message.Builder entryBuilder = defaultInstance.newBuilderForField(mapField); entryBuilder.setField(keyDescriptor, keyField.protoFromSoy(entry.getKey())); entryBuilder.setField( valueDescriptor, valueField.protoFromSoy(entry.getValue().resolve())); mapEntries.add(entryBuilder.build()); } return mapEntries.build(); } };
/** * Gets the fully-qualified name of this message. * * @param covariant if true, the name refers to the Java type being generated * for this message. Otherwise, the name refers to a * template-independent Java type, which may or may not exist. This is * intended to be used so that the generated Java type for this message * can refer to other Java types derived from this message. * @return the fully-qualified name of this message. */ private String getFullName(boolean covariant) { String prefix; if (descriptor.getContainingType() != null) { prefix = adapt(descriptor.getContainingType()).getFullName(covariant); } else { prefix = covariant ? getPackage() : getPackageBase(); } return prefix + "." + (covariant ? getJavaType() : getName()); }
/** * For ParseInfo generation, return a string that represents the Java source expression for the * static descriptor constant. * * @return The Java source expression for this type's descriptor. */ public String getDescriptorExpression() { // We only need to import the outermost descriptor. Descriptor descriptor = typeDescriptor; while (descriptor.getContainingType() != null) { descriptor = descriptor.getContainingType(); } return JavaQualifiedNames.getQualifiedName(descriptor) + ".getDescriptor()"; }
private static String[] getFullyQualifiedClassName(Descriptors.Descriptor container, final FileOptions fileOpts, String name) { if (fileOpts.getJavaMultipleFiles()) { LinkedList<String> fqnSegments = new LinkedList<>(); fqnSegments.push(name); while (container != null) { fqnSegments.push(container.getName()); container = container.getContainingType(); } fqnSegments.push(fileOpts.getJavaPackage()); return fqnSegments.toArray(new String[] {}); } return new String[] {fileOpts.getJavaPackage(), fileOpts.getJavaOuterClassname(), name}; }
/** * For ParseInfo generation, return a string that represents the Java source expression for the * static descriptor constant. * * @return The Java source expression for this type's descriptor. */ public String getDescriptorExpression() { // We only need to import the outermost descriptor. Descriptor descriptor = typeDescriptor; while (descriptor.getContainingType() != null) { descriptor = descriptor.getContainingType(); } return JavaQualifiedNames.getQualifiedName(descriptor) + ".getDescriptor()"; }
/** * @return whether this is an inner class */ public boolean isInner() { return descriptor.getContainingType() != null; }
/** Returns the JS name of the import for the given extension, suitable for goog.require. */ public static String getJsExtensionImport(FieldDescriptor desc) { Descriptor scope = desc.getExtensionScope(); if (scope != null) { while (scope.getContainingType() != null) { scope = scope.getContainingType(); } return calculateQualifiedJsName(scope); } return getJsPackage(desc.getFile()) + "." + computeJsExtensionName(desc); }
/** Returns the JS name of the import for the given extension, suitable for goog.require. */ public static String getJsExtensionImport(FieldDescriptor desc) { Descriptor scope = desc.getExtensionScope(); if (scope != null) { while (scope.getContainingType() != null) { scope = scope.getContainingType(); } return calculateQualifiedJsName(scope); } return getJsPackage(desc.getFile()) + "." + computeJsExtensionName(desc); }
public TableMetadataPersistence.ColumnValueDescription.Builder persistToProto() { Builder builder = TableMetadataPersistence.ColumnValueDescription.newBuilder(); builder.setType(type.persistToProto()); builder.setCompression(compression.persistToProto()); if (className != null) { builder.setClassName(className); } if (canonicalClassName != null) { builder.setCanonicalClassName(canonicalClassName); } builder.setFormat(format.persistToProto()); if (protoDescriptor != null) { builder.setProtoMessageName(protoDescriptor.getName()); builder.setProtoFileDescriptorTree(persistFileDescriptorTree(protoDescriptor.getFile())); if (protoDescriptor.getContainingType() != null) { log.error("proto descriptors should be top level types: {}", protoDescriptor.getName()); } } return builder; }
private static Class<?> getJavaClassIgnoreRepeated(final Descriptors.FieldDescriptor descriptor, BeanContainer beanContainer) { switch (descriptor.getJavaType()) { case INT: return Integer.class; case LONG: return Long.class; case FLOAT: return Float.class; case DOUBLE: return Double.class; case BOOLEAN: return Boolean.class; case STRING: return String.class; case BYTE_STRING: return ByteString.class; //code duplicate, but GenericDescriptor interface is private in protobuf case ENUM: return getEnumClassByEnumDescriptor(descriptor.getEnumType(), beanContainer); case MESSAGE: return MappingUtils.loadClass(StringUtils.join( getFullyQualifiedClassName(descriptor.getMessageType().getContainingType(), descriptor.getMessageType().getFile().getOptions(), descriptor.getMessageType().getName()), '.'), beanContainer); default: throw new MappingException("Unable to find " + descriptor.getJavaType()); } }