protobuf/javanano
Paul Yang 7f3e237071 Merge 3.2.x branch into master (#2648)
* Down-integrate internal changes to github.

* Update conformance test failure list.

* Explicitly import used class in nano test to avoid random test fail.

* Update _GNUC_VER to use the correct implementation of atomic operation
on Mac.

* maps_test.js: check whether Symbol is defined before using it (#2524)

Symbol is not yet available on older versions of Node.js and so this
test fails with them. This change just directly checks whether Symbol is
available before we try to use it.

* Added well_known_types_embed.cc to CLEANFILES so that it gets cleaned up

* Updated Makefile.am to fix out-of-tree builds

* Added Bazel genrule for generating well_known_types_embed.cc

In pull request #2517 I made this change for the CMake and autotools
builds but forgot to do it for the Bazel build.

* Update _GNUC_VER to use the correct implementation of atomic operation on Mac.

* Add new js file in extra dist.

* Bump version number to 3.2.0

* Fixed issue with autoloading - Invalid paths (#2538)

* PHP fix int64 decoding (#2516)

* fix int64 decoding

* fix int64 decoding + tests

* Fix int64 decoding on 32-bit machines.

* Fix warning in compiler/js/embed.cc

embed.cc: In function ‘std::string CEscape(const string&)’:
embed.cc:51:32: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i = 0; i < str.size(); ++i) {
                                ^

* Fix include in auto-generated well_known_types_embed.cc

Restore include style fix (e3da722) that has been trampled by
auto-generation of well_known_types_embed.cc

* Fixed cross compilations with the Autotools build

Pull request #2517 caused cross compilations to start failing, because
the js_embed binary was being built to run on the target platform
instead of on the build machine. This change updates the Autotools build
to use the AX_PROG_CXX_FOR_BUILD macro to find a suitable compiler for
the build machine and always use that when building js_embed.

* Minor fix for autocreated object repeated fields and maps.

- If setting/clearing a repeated field/map that was objects, check the class
  before checking the autocreator.
- Just to be paranoid, don’t mutate within copy/mutableCopy for the autocreated
  classes to ensure there is less chance of issues if someone does something
  really crazy threading wise.
- Some more tests for the internal AutocreatedArray/AutocreatedDictionary
  classes to ensure things are working as expected.
- Add Xcode 8.2 to the full_mac_build.sh supported list.

* Fix generation of extending nested messages in JavaScript (#2439)

* Fix generation of extending nested messages in JavaScript

* Added missing test8.proto to build

* Fix generated code when there is no namespace but there is enum definition.

* Decoding unknown field should succeed.

* Add embed.cc in src/Makefile.am to fix dist check.

* Fixed "make distcheck" for the Autotools build

To make the test pass I needed to fix out-of-tree builds and update
EXTRA_DIST and CLEANFILES.

* Remove redundent embed.cc from src/Makefile.am

* Update version number to 3.2.0-rc.1 (#2578)

* Change protoc-artifacts version to 3.2.0-rc.1

* Update version number to 3.2.0rc2

* Update change logs for 3.2.0 release.

* Update php README

* Update upb, fixes some bugs (including a hash table problem). (#2611)

* Update upb, fixes some bugs (including a hash table problem).

* Ruby: added a test for the previous hash table corruption.

Verified that this triggers the bug in the currently released
version.

* Ruby: bugfix for SEGV.

* Ruby: removed old code for dup'ing defs.

* Reverting deployment target to 7.0 (#2618)

The Protobuf library doesn’t require the 7.1 deployment target so
reverting it back to 7.0

* Fix typo that breaks builds on big-endian (#2632)

* Bump version number to 3.2.0
2017-01-31 09:17:32 -08:00
..
src Merge 3.2.x branch into master (#2648) 2017-01-31 09:17:32 -08:00
pom.xml Merge 3.2.x branch into master (#2648) 2017-01-31 09:17:32 -08:00
README.md Generate @IntDef annotations for nanoproto enums. 2015-04-28 13:01:12 -07:00

Protocol Buffers - Google's data interchange format

Build Status

Copyright 2008 Google Inc.

This directory contains the Java Protocol Buffers Nano runtime library.

Installation - With Maven

The Protocol Buffers build is managed using Maven. If you would rather build without Maven, see below.

  1. Install Apache Maven if you don't have it:

    http://maven.apache.org/

  2. Build the C++ code, or obtain a binary distribution of protoc. If you install a binary distribution, make sure that it is the same version as this package. If in doubt, run:

    $ protoc --version

    You will need to place the protoc executable in ../src. (If you built it yourself, it should already be there.)

  3. Run the tests:

    $ mvn test

    If some tests fail, this library may not work correctly on your system. Continue at your own risk.

  4. Install the library into your Maven repository:

    $ mvn install

  5. If you do not use Maven to manage your own build, you can build a .jar file to use:

    $ mvn package

    The .jar will be placed in the "target" directory.

Installation - Without Maven

If you would rather not install Maven to build the library, you may follow these instructions instead. Note that these instructions skip running unit tests.

  1. Build the C++ code, or obtain a binary distribution of protoc. If you install a binary distribution, make sure that it is the same version as this package. If in doubt, run:

    $ protoc --version

    If you built the C++ code without installing, the compiler binary should be located in ../src.

  2. Invoke protoc to build DescriptorProtos.java:

    $ protoc --java_out=src/main/java -I../src
    ../src/google/protobuf/descriptor.proto

  3. Compile the code in src/main/java using whatever means you prefer.

  4. Install the classes wherever you prefer.

Nano version

JavaNano is a special code generator and runtime library designed specially for resource-restricted systems, like Android. It is very resource-friendly in both the amount of code and the runtime overhead. Here is an overview of JavaNano features compared with the official Java protobuf:

  • No descriptors or message builders.
  • All messages are mutable; fields are public Java fields.
  • For optional fields only, encapsulation behind setter/getter/hazzer/ clearer functions is opt-in, which provide proper 'has' state support.
  • For proto2, if not opted in, has state (field presence) is not available. Serialization outputs all fields not equal to their defaults (see important implications below). The behavior is consistent with proto3 semantics.
  • Required fields (proto2 only) are always serialized.
  • Enum constants are integers; protection against invalid values only when parsing from the wire.
  • Enum constants can be generated into container interfaces bearing the enum's name (so the referencing code is in Java style).
  • CodedInputByteBufferNano can only take byte[] (not InputStream).
  • Similarly CodedOutputByteBufferNano can only write to byte[].
  • Repeated fields are in arrays, not ArrayList or Vector. Null array elements are allowed and silently ignored.
  • Full support for serializing/deserializing repeated packed fields.
  • Support extensions (in proto2).
  • Unset messages/groups are null, not an immutable empty default instance.
  • toByteArray(...) and mergeFrom(...) are now static functions of MessageNano.
  • The 'bytes' type translates to the Java type byte[].

The generated messages are not thread-safe for writes, but may be used simultaneously from multiple threads in a read-only manner. In other words, an appropriate synchronization mechanism (such as a ReadWriteLock) must be used to ensure that a message, its ancestors, and descendants are not accessed by any other threads while the message is being modified. Field reads, getter methods (but not getExtension(...)), toByteArray(...), writeTo(...), getCachedSize(), and getSerializedSize() are all considered read-only operations.

IMPORTANT: If you have fields with defaults and opt out of accessors

How fields with defaults are serialized has changed. Because we don't keep "has" state, any field equal to its default is assumed to be not set and therefore is not serialized. Consider the situation where we change the default value of a field. Senders compiled against an older version of the proto continue to match against the old default, and don't send values to the receiver even though the receiver assumes the new default value. Therefore, think carefully about the implications of changing the default value. Alternatively, turn on accessors and enjoy the benefit of the explicit has() checks.

IMPORTANT: If you have "bytes" fields with non-empty defaults

Because the byte buffer is now of mutable type byte[], the default static final cannot be exposed through a public field. Each time a message's constructor or clear() function is called, the default value (kept in a private byte[]) is cloned. This causes a small memory penalty. This is not a problem if the field has no default or is an empty default.

Nano Generator options

java_package           -> <file-name>|<package-name>
java_outer_classname   -> <file-name>|<package-name>
java_multiple_files    -> true or false
java_nano_generate_has -> true or false [DEPRECATED]
optional_field_style   -> default or accessors
enum_style             -> c or java
ignore_services        -> true or false
parcelable_messages    -> true or false
generate_intdefs       -> true or false

java_package=<file-name>|<package-name> (no default)

This allows overriding the 'java_package' option value for the given file from the command line. Use multiple java_package options to override the option for multiple files. The final Java package for each file is the value of this command line option if present, or the value of the same option defined in the file if present, or the proto package if present, or the default Java package.

java_outer_classname=<file-name>|<outer-classname> (no default)

This allows overriding the 'java_outer_classname' option for the given file from the command line. Use multiple java_outer_classname options to override the option for multiple files. The final Java outer class name for each file is the value of this command line option if present, or the value of the same option defined in the file if present, or the file name converted to CamelCase. This outer class will nest all classes and integer constants generated from file-scope messages and enums.

java_multiple_files={true,false} (no default)

This allows overriding the 'java_multiple_files' option in all source files and their imported files from the command line. The final value of this option for each file is the value defined in this command line option, or the value of the same option defined in the file if present, or false. This specifies whether to generate package-level classes for the file-scope messages in the same Java package as the outer class (instead of nested classes in the outer class). File-scope enum constants are still generated as integer constants in the outer class. This affects the fully qualified references in the Java code. NOTE: because the command line option overrides the value for all files and their imported files, using this option inconsistently may result in incorrect references to the imported messages and enum constants.

java_nano_generate_has={true,false} (default: false)

DEPRECATED. Use optional_field_style=accessors.

If true, generates a public boolean variable has<fieldname> accompanying each optional or required field (not present for repeated fields, groups or messages). It is set to false initially and upon clear(). If parseFrom(...) reads the field from the wire, it is set to true. This is a way for clients to inspect the "has" value upon parse. If it is set to true, writeTo(...) will ALWAYS output that field (even if field value is equal to its default).

IMPORTANT: This option costs an extra 4 bytes per primitive field in the message. Think carefully about whether you really need this. In many cases reading the default works and determining whether the field was received over the wire is irrelevant.

optional_field_style={default,accessors,reftypes} (default: default)

Defines the style of the generated code for fields.

  • default

In the default style, optional fields translate into public mutable Java fields, and the serialization process is as discussed in the "IMPORTANT" section above.

  • accessors

When set to 'accessors', each optional field is encapsulated behind 4 accessors, namely get<fieldname>(), set<fieldname>(), has<fieldname>() and clear<fieldname>() methods, with the standard semantics. The hazzer's return value determines whether a field is serialized, so this style is useful when you need to serialize a field with the default value, or check if a field has been explicitly set to its default value from the wire.

In the 'accessors' style, required and nested message fields are still translated to one public mutable Java field each, repeated fields are still translated to arrays. No accessors are generated for them.

IMPORTANT: When using the 'accessors' style, ProGuard should always be enabled with optimization (don't use -dontoptimize) and allowing access modification (use -allowaccessmodification). This removes the unused accessors and maybe inline the rest at the call sites, reducing the final code size. TODO(maxtroy): find ProGuard config that would work the best.

  • reftypes

When set to 'reftypes', each proto field is generated as a public Java field. For primitive types, these fields use the Java reference types such as java.lang.Integer instead of primitive types such as int.

In the 'reftypes' style, fields are initialized to null (or empty arrays for repeated fields), and their default values are not available. They are serialized over the wire based on equality to null.

The 'reftypes' mode has some additional cost due to autoboxing and usage of reference types. In practice, many boxed types are cached, and so don't result in object creation. However, references do take slightly more memory than primitives.

The 'reftypes' mode is useful when you want to be able to serialize fields with default values, or check if a field has been explicitly set to the default over the wire without paying the extra method cost of the 'accessors' mode.

Note that if you attempt to write null to a required field in the reftypes mode, serialization of the proto will cause a NullPointerException. This is an intentional indicator that you must set required fields.

NOTE optional_field_style=accessors or reftypes cannot be used together with java_nano_generate_has=true. If you need the 'has' flag for any required field (you have no reason to), you can only use java_nano_generate_has=true.

enum_style={c,java} (default: c)

Defines where to put the int constants generated from enum members.

  • c

Use C-style, so the enum constants are available at the scope where the enum is defined. A file-scope enum's members are referenced like 'FileOuterClass.ENUM_VALUE'; a message-scope enum's members are referenced as 'Message.ENUM_VALUE'. The enum name is unavailable. This complies with the Micro code generator's behavior.

  • java

Use Java-style, so the enum constants are available under the enum name and referenced like 'EnumName.ENUM_VALUE' (they are still int constants). The enum name becomes the name of a public interface, at the scope where the enum is defined. If the enum is file-scope and the java_multiple_files option is on, the interface will be defined in its own file. To reduce code size, this interface should not be implemented and ProGuard shrinking should be used, so after the Java compiler inlines all referenced enum constants into the call sites, the interface remains unused and can be removed by ProGuard.

ignore_services={true,false} (default: false)

Skips services definitions.

Nano doesn't support services. By default, if a service is defined it will generate a compilation error. If this flag is set to true, services will be silently ignored, instead.

parcelable_messages={true,false} (default: false)

Android-specific option to generate Parcelable messages.

generate_intdefs={true,false} (default: false) Android-specific option to generate @IntDef annotations for enums.

If turned on, an '@IntDef' annotation (a public @interface) will be generated for each enum, and every integer parameter and return value in the generated code meant for this enum will be annotated with it. This interface is generated with the same name and at the same place as the enum members' container interfaces described above under 'enum_style=java', regardless of the enum_style option used. When this is combined with enum_style=java, the interface will be both the '@IntDef' annotation and the container of the enum members; otherwise the interface has an empty body.

Your app must declare a compile-time dependency on the android-support-annotations library.

For more information on how these @IntDef annotations help with compile-time type safety, see: https://sites.google.com/a/android.com/tools/tech-docs/support-annotations and https://developer.android.com/reference/android/support/annotation/IntDef.html

To use nano protobufs within the Android repo:

  • Set 'LOCAL_PROTOC_OPTIMIZE_TYPE := nano' in your local .mk file. When building a Java library or an app (package) target, the build system will add the Java nano runtime library to the LOCAL_STATIC_JAVA_LIBRARIES variable, so you don't need to.
  • Set 'LOCAL_PROTO_JAVA_OUTPUT_PARAMS := ...' in your local .mk file for any command-line options you need. Use commas to join multiple options. In the nano flavor only, whitespace surrounding the option names and values are ignored, so you can use backslash-newline or '+=' to structure your make files nicely.
  • The options will be applied to all proto files in LOCAL_SRC_FILES when you build a Java library or package. In case different options are needed for different proto files, build separate Java libraries and reference them in your main target. Note: you should make sure that, for each separate target, all proto files imported from any proto file in LOCAL_SRC_FILES are included in LOCAL_SRC_FILES. This is because the generator has to assume that the imported files are built using the same options, and will generate code that reference the fields and enums from the imported files using the same code style.
  • Hint: 'include $(CLEAR_VARS)' resets all LOCAL_ variables, including the two above.

To use nano protobufs outside of Android repo:

  • Link with the generated jar file <protobuf-root>java/target/protobuf-java-2.3.0-nano.jar.
  • Invoke with --javanano_out, e.g.:
./protoc '--javanano_out=\
    java_package=src/proto/simple-data.proto|my_package,\
    java_outer_classname=src/proto/simple-data.proto|OuterName\
  :.' src/proto/simple-data.proto

Contributing to nano:

Please add/edit tests in NanoTest.java.

Please run the following steps to test:

  • cd external/protobuf
  • ./configure
  • Run "make -j12 check" and verify all tests pass.
  • cd java
  • Run "mvn test" and verify all tests pass.
  • cd ../../..
  • . build/envsetup.sh
  • lunch 1
  • "make -j12 aprotoc libprotobuf-java-2.3.0-nano aprotoc-test-nano-params NanoAndroidTest" and check for build errors.
  • Plug in an Android device or start an emulator.
  • adb install -r out/target/product/generic/data/app/NanoAndroidTest.apk
  • Run: "adb shell am instrument -w com.google.protobuf.nano.test/android.test.InstrumentationTestRunner" and verify all tests pass.
  • repo sync -c -j256
  • "make -j12" and check for build errors

Usage

The complete documentation for Protocol Buffers is available via the web at:

https://developers.google.com/protocol-buffers/