diff --git a/google-cloud-storage/clirr-ignored-differences.xml b/google-cloud-storage/clirr-ignored-differences.xml index 85c4887d6..1fe6a791f 100644 --- a/google-cloud-storage/clirr-ignored-differences.xml +++ b/google-cloud-storage/clirr-ignored-differences.xml @@ -36,4 +36,9 @@ com.google.api.services.storage.model.StorageObject queryCompletedResumableUpload(java.lang.String, long) 7012 + + com/google/cloud/storage/BucketInfo$LifecycleRule$LifecycleAction + BucketInfo$LifecycleRule$LifecycleAction() + 7004 + diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/BucketInfo.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/BucketInfo.java index c13395238..099b50ee0 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/BucketInfo.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/BucketInfo.java @@ -462,8 +462,13 @@ static LifecycleRule fromPb(Rule rule) { StorageClass.valueOf(action.getStorageClass())); break; default: - throw new UnsupportedOperationException( - "The specified lifecycle action " + action.getType() + " is not currently supported"); + log.warning( + "The lifecycle action " + + action.getType() + + " is not supported by this version of the library. " + + "Attempting to update with this rule may cause errors. Please " + + "update to the latest version of google-cloud-storage."); + lifecycleAction = LifecycleAction.newLifecycleAction("Unknown action"); } Rule.Condition condition = rule.getCondition(); @@ -713,13 +718,21 @@ public LifecycleCondition build() { } /** - * Base class for the Action to take when a Lifecycle Condition is met. Specific Actions are + * Base class for the Action to take when a Lifecycle Condition is met. Supported Actions are * expressed as subclasses of this class, accessed by static factory methods. */ - public abstract static class LifecycleAction implements Serializable { + public static class LifecycleAction implements Serializable { private static final long serialVersionUID = 5801228724709173284L; - public abstract String getActionType(); + private final String actionType; + + public LifecycleAction(String actionType) { + this.actionType = actionType; + } + + public String getActionType() { + return actionType; + } @Override public String toString() { @@ -744,17 +757,24 @@ public static SetStorageClassLifecycleAction newSetStorageClassAction( StorageClass storageClass) { return new SetStorageClassLifecycleAction(storageClass); } + + /** + * Creates a new {@code LifecycleAction , with no specific supported action associated with it. This + * is only intended as a "backup" for when the library doesn't recognize the type, and should + * generally not be used, instead use the supported actions, and upgrade the library if necessary + * to get new supported actions. + */ + public static LifecycleAction newLifecycleAction(String actionType) { + return new LifecycleAction(actionType); + } } public static class DeleteLifecycleAction extends LifecycleAction { public static final String TYPE = "Delete"; private static final long serialVersionUID = -2050986302222644873L; - private DeleteLifecycleAction() {} - - @Override - public String getActionType() { - return TYPE; + private DeleteLifecycleAction() { + super(TYPE); } } @@ -765,14 +785,10 @@ public static class SetStorageClassLifecycleAction extends LifecycleAction { private final StorageClass storageClass; private SetStorageClassLifecycleAction(StorageClass storageClass) { + super(TYPE); this.storageClass = storageClass; } - @Override - public String getActionType() { - return TYPE; - } - @Override public String toString() { return MoreObjects.toStringHelper(this) @@ -921,7 +937,11 @@ static class RawDeleteRule extends DeleteRule { @Override void populateCondition(Rule.Condition condition) { - throw new UnsupportedOperationException(); + log.warning( + "The lifecycle condition " + + condition + + " is not currently supported. Please update to the latest version of google-cloud-java." + + " Also, use LifecycleRule rather than the deprecated DeleteRule."); } private void writeObject(ObjectOutputStream out) throws IOException { diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/BucketInfoTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/BucketInfoTest.java index d72901c17..9c66533f5 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/BucketInfoTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/BucketInfoTest.java @@ -306,6 +306,10 @@ public void testDeleteRules() { for (DeleteRule delRule : rules) { assertEquals(delRule, DeleteRule.fromPb(delRule.toPb())); } + Rule unsupportedRule = + new Rule().setAction(new Rule.Action().setType("This action doesn't exist")); + DeleteRule.fromPb( + unsupportedRule); // if this doesn't throw an exception, unsupported rules work } @Test @@ -355,6 +359,17 @@ public void testLifecycleRules() { assertEquals(StorageClass.COLDLINE.toString(), lifecycleRule.getAction().getStorageClass()); assertEquals(30, lifecycleRule.getCondition().getDaysSinceCustomTime().intValue()); assertNotNull(lifecycleRule.getCondition().getCustomTimeBefore()); + + Rule unsupportedRule = + new LifecycleRule( + LifecycleAction.newLifecycleAction("This action type doesn't exist"), + LifecycleCondition.newBuilder().setAge(10).build()) + .toPb(); + unsupportedRule.setAction( + unsupportedRule.getAction().setType("This action type also doesn't exist")); + + LifecycleRule.fromPb( + unsupportedRule); // If this doesn't throw an exception, unsupported rules are working } @Test