Skip to content

Commit c89d275

Browse files
authored
fix: update version resolution logic to be more resilient (#2169)
Update StorageOptions to resolve their version from maven metadata rather than manifest version. A jar can only have on MANIFEST.mf thereby leading to storage thinking it is a version it is not. In particular, if a program is shaded, this change will now allow for the actual version of storage to be carried through. Related googleapis/google-api-java-client#1419
1 parent 665b714 commit c89d275

File tree

3 files changed

+42
-7
lines changed

3 files changed

+42
-7
lines changed

google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageOptions.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import com.google.api.core.InternalApi;
2424
import com.google.api.gax.core.CredentialsProvider;
2525
import com.google.api.gax.core.FixedCredentialsProvider;
26-
import com.google.api.gax.core.GaxProperties;
2726
import com.google.api.gax.core.NoCredentialsProvider;
2827
import com.google.api.gax.grpc.GrpcInterceptorProvider;
2928
import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider;
@@ -210,9 +209,7 @@ private Tuple<StorageSettings, Opts<UserProject>> resolveSettingsAndOpts() throw
210209

211210
HeaderProvider internalHeaderProvider =
212211
StorageSettings.defaultApiClientHeaderProviderBuilder()
213-
.setClientLibToken(
214-
ServiceOptions.getGoogApiClientLibName(),
215-
GaxProperties.getLibraryVersion(this.getClass()))
212+
.setClientLibToken(ServiceOptions.getGoogApiClientLibName(), getLibraryVersion())
216213
.build();
217214

218215
StorageSettings.Builder builder =

google-cloud-storage/src/main/java/com/google/cloud/storage/StorageOptions.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.google.cloud.storage;
1818

1919
import com.google.api.core.BetaApi;
20+
import com.google.api.core.InternalApi;
2021
import com.google.cloud.NoCredentials;
2122
import com.google.cloud.ServiceDefaults;
2223
import com.google.cloud.ServiceOptions;
@@ -26,10 +27,38 @@
2627
import com.google.cloud.storage.HttpStorageOptions.HttpStorageRpcFactory;
2728
import com.google.cloud.storage.TransportCompatibility.Transport;
2829
import com.google.cloud.storage.spi.StorageRpcFactory;
30+
import java.io.IOException;
31+
import java.io.InputStream;
32+
import java.util.Properties;
2933

3034
public abstract class StorageOptions extends ServiceOptions<Storage, StorageOptions> {
3135

3236
private static final long serialVersionUID = -7295846567928013233L;
37+
private static final String VERSION;
38+
39+
static {
40+
String tmp = "unresolved";
41+
final Properties props = new Properties();
42+
try {
43+
String resourcePath =
44+
String.format(
45+
"/META-INF/maven/%s/%s/pom.properties", "com.google.cloud", "google-cloud-storage");
46+
InputStream resourceAsStream = StorageOptions.class.getResourceAsStream(resourcePath);
47+
if (resourceAsStream == null) {
48+
// some classloaders don't like a leading slash
49+
resourceAsStream = StorageOptions.class.getResourceAsStream(resourcePath.substring(1));
50+
}
51+
if (resourceAsStream != null) {
52+
props.load(resourceAsStream);
53+
resourceAsStream.close();
54+
55+
tmp = props.getProperty("version", "unknown-version");
56+
}
57+
} catch (IOException ignore) {
58+
// ignored
59+
}
60+
VERSION = tmp;
61+
}
3362

3463
/** @deprecated Use {@link HttpStorageFactory} */
3564
@Deprecated
@@ -86,6 +115,17 @@ protected boolean projectIdRequired() {
86115
return false;
87116
}
88117

118+
@Override
119+
public String getLibraryVersion() {
120+
return VERSION;
121+
}
122+
123+
/* This can break at any time, the value produce is intended to be informative not authoritative */
124+
@InternalApi
125+
public static String version() {
126+
return VERSION;
127+
}
128+
89129
@SuppressWarnings("unchecked")
90130
@Override
91131
public abstract StorageOptions.Builder toBuilder();

google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManagerImpl.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import com.google.api.core.ApiFutures;
2121
import com.google.api.core.BetaApi;
2222
import com.google.api.core.ListenableFutureToApiFuture;
23-
import com.google.api.gax.core.GaxProperties;
2423
import com.google.api.gax.rpc.FixedHeaderProvider;
2524
import com.google.cloud.storage.BlobId;
2625
import com.google.cloud.storage.BlobInfo;
@@ -45,8 +44,7 @@
4544
final class TransferManagerImpl implements TransferManager {
4645

4746
private static final String USER_AGENT_ENTRY = "gcloud-tm/";
48-
private static final String LIBRARY_VERSION =
49-
GaxProperties.getLibraryVersion(TransferManagerConfig.class);
47+
private static final String LIBRARY_VERSION = StorageOptions.version();
5048
private final TransferManagerConfig transferManagerConfig;
5149
private final ListeningExecutorService executor;
5250
private final Qos qos;

0 commit comments

Comments
 (0)