Cleanup output-only Error object.
Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs/commit/caf57cc7 Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs/tree/caf57cc7 Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs/diff/caf57cc7 Branch: refs/heads/master Commit: caf57cc754c5f35cbc264a93467ff9dd40816e05 Parents: 96ebc7f Author: Adrian Cole <[email protected]> Authored: Thu Oct 16 19:59:06 2014 -0700 Committer: Adrian Cole <[email protected]> Committed: Mon Oct 20 13:26:53 2014 -0400 ---------------------------------------------------------------------- .../org/jclouds/azurecompute/domain/Error.java | 202 +++---------------- .../jclouds/azurecompute/xml/ErrorHandler.java | 41 ++-- .../jclouds/azurecompute/parse/ErrorTest.java | 50 ----- .../azurecompute/parse/GetOperationTest.java | 14 +- .../azurecompute/xml/ErrorHandlerTest.java | 42 ++++ 5 files changed, 96 insertions(+), 253 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/caf57cc7/azurecompute/src/main/java/org/jclouds/azurecompute/domain/Error.java ---------------------------------------------------------------------- diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/domain/Error.java b/azurecompute/src/main/java/org/jclouds/azurecompute/domain/Error.java index e8947ab..1b529d0 100644 --- a/azurecompute/src/main/java/org/jclouds/azurecompute/domain/Error.java +++ b/azurecompute/src/main/java/org/jclouds/azurecompute/domain/Error.java @@ -16,225 +16,77 @@ */ package org.jclouds.azurecompute.domain; -import com.google.common.base.CaseFormat; -import com.google.common.base.MoreObjects; -import com.google.common.base.Objects; - +import static com.google.common.base.Objects.equal; +import static com.google.common.base.Objects.toStringHelper; import static com.google.common.base.Preconditions.checkNotNull; +import com.google.common.base.Objects; + /** - * additional error information that is defined by the management service. Th - * * @see <a href="http://msdn.microsoft.com/en-us/library/ee460801" >api</a> */ -public class Error { - +public final class Error { public static enum Code { - - /** - * Bad Request (400) - * - * The versioning header is not specified or was specified incorrectly. - */ MISSING_OR_INCORRECT_VERSION_HEADER, - - /** - * Bad Request (400) - * - * The request bodyâs XML was invalid or not correctly specified. - */ INVALID_XML_REQUEST, - - /** - * Bad Request (400) - * - * A required query parameter was not specified for this request or was specified incorrectly. - */ MISSING_OR_INVALID_REQUIRED_QUERY_PARAMETER, - - /** - * Bad Request (400) - * - * The HTTP verb specified was not recognized by the server or isnât valid for this resource. - */ INVALID_HTTP_VERB, - - /** - * Forbidden (403) - * - * The server failed to authenticate the request. Verify that the certificate is valid and is - * associated with this subscription. - */ AUTHENTICATION_FAILED, - - /** - * Not Found (404) - * - * The specified resource does not exist. - */ RESOURCE_NOT_FOUND, - - /** - * Internal Server Error (500) - * - * The server encountered an internal error. Please retry the request. - */ INTERNAL_ERROR, - - /** - * Internal Server Error (500) - * - * The operation could not be completed within the permitted time. - */ OPERATION_TIMED_OUT, - - /** - * Service Unavailable (503) - * - * The server (or an internal component) is currently unavailable to receive requests. Please - * retry your request - */ SERVER_BUSY, - - /** - * Forbidden (403) - * - * The subscription is in a disabled state. - */ SUBSCRIPTION_DISABLED, - - /** - * Bad Request (400) - * - * A parameter was incorrect. - */ BAD_REQUEST, - - /** - * Conflict (409) - * - * A conflict occurred to prevent the operation from completing. - */ CONFLICT_ERROR, - UNRECOGNIZED; - - public String value() { - return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, name()); - } - - @Override - public String toString() { - return value(); - } - - public static Code fromValue(String code) { - try { - return valueOf(CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, checkNotNull(code, "code"))); - } catch (IllegalArgumentException e) { - return UNRECOGNIZED; - } - } } - public static Builder builder() { - return new Builder(); + /** Error code */ + public Code getCode() { + return code; } - public Builder toBuilder() { - return builder().fromError(this); + /** User message */ + public String message() { + return message; } - public static class Builder { - - private String rawCode; - private Code code; - private String message; - - /** - * @see Error#getRawCode() - */ - public Builder rawCode(String rawCode) { - this.rawCode = rawCode; - return this; - } - - /** - * @see Error#getCode() - */ - public Builder code(Code code) { - this.code = code; - return this; - } - - /** - * @see Error#getMessage() - */ - public Builder message(String message) { - this.message = message; - return this; - } - - public Error build() { - return new Error(rawCode, code, message); - } - - public Builder fromError(Error in) { - return this.rawCode(in.rawCode).code(in.code).message(in.message); - } + public static Error create(Code code, String message) { + return new Error(code, message); } - private final String rawCode; - private final Code code; - private final String message; - - protected Error(String rawCode, Code code, String message) { - this.rawCode = checkNotNull(rawCode, "rawCode for %s", message); - this.code = checkNotNull(code, "code for %s", message); + // TODO: Remove from here down with @AutoValue. + private Error(Code code, String message) { + this.code = checkNotNull(code, "code"); this.message = checkNotNull(message, "message"); } - /** - * Error code - */ - public Code getCode() { - return code; - } - - /** - * Error code, unparsed - */ - public String getRawCode() { - return rawCode; - } - - /** - * User message - */ - public String getMessage() { - return message; - } + private final Code code; + private final String message; @Override public int hashCode() { - return Objects.hashCode(rawCode, code, message); + return Objects.hashCode(code, message); } @Override public boolean equals(Object obj) { - if (this == obj) + if (this == obj) { return true; - if (obj == null) + } + if (obj == null) { return false; - if (getClass() != obj.getClass()) + } + if (getClass() != obj.getClass()) { return false; + } Error other = (Error) obj; - return Objects.equal(this.rawCode, other.rawCode) && Objects.equal(this.code, other.code) - && Objects.equal(this.message, other.message); + return equal(this.code, other.code) && equal(this.message, other.message); } @Override public String toString() { - return MoreObjects.toStringHelper(this).omitNullValues().add("code", rawCode).add("message", message).toString(); + return toStringHelper(this).add("code", code).add("message", message).toString(); } } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/caf57cc7/azurecompute/src/main/java/org/jclouds/azurecompute/xml/ErrorHandler.java ---------------------------------------------------------------------- diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/xml/ErrorHandler.java b/azurecompute/src/main/java/org/jclouds/azurecompute/xml/ErrorHandler.java index 3d7f2f4..001e856 100644 --- a/azurecompute/src/main/java/org/jclouds/azurecompute/xml/ErrorHandler.java +++ b/azurecompute/src/main/java/org/jclouds/azurecompute/xml/ErrorHandler.java @@ -16,43 +16,46 @@ */ package org.jclouds.azurecompute.xml; +import static com.google.common.base.CaseFormat.UPPER_CAMEL; +import static com.google.common.base.CaseFormat.UPPER_UNDERSCORE; +import static org.jclouds.util.SaxUtils.currentOrNull; + import org.jclouds.azurecompute.domain.Error; import org.jclouds.azurecompute.domain.Error.Code; import org.jclouds.http.functions.ParseSax; -import org.jclouds.util.SaxUtils; -import org.xml.sax.SAXException; /** * @see <a href="http://msdn.microsoft.com/en-us/library/ee460801" >api</a> */ -public class ErrorHandler extends ParseSax.HandlerForGeneratedRequestWithResult<Error> { +public final class ErrorHandler extends ParseSax.HandlerForGeneratedRequestWithResult<Error> { + private Code code; + private String message; private StringBuilder currentText = new StringBuilder(); - private Error.Builder builder = Error.builder(); - @Override - public Error getResult() { - try { - return builder.build(); - } finally { - builder = Error.builder(); - } + @Override public Error getResult() { + return Error.create(code, message); } - @Override - public void endElement(String uri, String name, String qName) throws SAXException { + @Override public void endElement(String ignoredUri, String ignoredName, String qName) { if (qName.equals("Code")) { - String rawCode = SaxUtils.currentOrNull(currentText); - builder.rawCode(rawCode); - builder.code(Code.fromValue(rawCode)); + String codeText = currentOrNull(currentText); + code = parseCode(codeText); } else if (qName.equals("Message")) { - builder.message(SaxUtils.currentOrNull(currentText)); + message = currentOrNull(currentText); } currentText.setLength(0); } - @Override - public void characters(char ch[], int start, int length) { + @Override public void characters(char ch[], int start, int length) { currentText.append(ch, start, length); } + + private static Code parseCode(String code) { + try { + return Code.valueOf(UPPER_CAMEL.to(UPPER_UNDERSCORE, code)); + } catch (IllegalArgumentException e) { + return Code.UNRECOGNIZED; + } + } } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/caf57cc7/azurecompute/src/test/java/org/jclouds/azurecompute/parse/ErrorTest.java ---------------------------------------------------------------------- diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/parse/ErrorTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/parse/ErrorTest.java deleted file mode 100644 index 12d38c6..0000000 --- a/azurecompute/src/test/java/org/jclouds/azurecompute/parse/ErrorTest.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jclouds.azurecompute.parse; - -import java.io.InputStream; -import org.jclouds.azurecompute.domain.Error; -import org.jclouds.azurecompute.domain.Error.Code; -import org.jclouds.azurecompute.xml.ErrorHandler; -import org.jclouds.http.functions.BaseHandlerTest; -import org.testng.annotations.Test; - -import static org.testng.Assert.assertEquals; - -@Test(groups = "unit", testName = "ErrorTest") -public class ErrorTest extends BaseHandlerTest { - - public void test() { - InputStream is = getClass().getResourceAsStream("/error.xml"); - - Error expected = expected(); - - ErrorHandler handler = injector.getInstance(ErrorHandler.class); - Error result = factory.create(handler).parse(is); - - assertEquals(result.toString(), expected.toString()); - - } - - public Error expected() { - return Error.builder() - .rawCode("MissingOrInvalidRequiredQueryParameter") - .code(Code.MISSING_OR_INVALID_REQUIRED_QUERY_PARAMETER) - .message("A required query parameter was not specified for this request or was specified incorrectly.") - .build(); - } -} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/caf57cc7/azurecompute/src/test/java/org/jclouds/azurecompute/parse/GetOperationTest.java ---------------------------------------------------------------------- diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/parse/GetOperationTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/parse/GetOperationTest.java index ecf7083..8e41f81 100644 --- a/azurecompute/src/test/java/org/jclouds/azurecompute/parse/GetOperationTest.java +++ b/azurecompute/src/test/java/org/jclouds/azurecompute/parse/GetOperationTest.java @@ -16,17 +16,17 @@ */ package org.jclouds.azurecompute.parse; +import static org.testng.Assert.assertEquals; + import java.io.InputStream; -import org.jclouds.azurecompute.domain.Error; -import org.jclouds.azurecompute.domain.Error.Code; + import org.jclouds.azurecompute.domain.Operation; import org.jclouds.azurecompute.domain.Operation.Status; +import org.jclouds.azurecompute.xml.ErrorHandlerTest; import org.jclouds.azurecompute.xml.OperationHandler; import org.jclouds.http.functions.BaseHandlerTest; import org.testng.annotations.Test; -import static org.testng.Assert.assertEquals; - @Test(groups = "unit", testName = "GetOperationTest") public class GetOperationTest extends BaseHandlerTest { @@ -47,11 +47,7 @@ public class GetOperationTest extends BaseHandlerTest { .rawStatus("Failed") .status(Status.FAILED) .httpStatusCode(400) - .error(Error.builder() - .rawCode("MissingOrInvalidRequiredQueryParameter") - .code(Code.MISSING_OR_INVALID_REQUIRED_QUERY_PARAMETER) - .message("A required query parameter was not specified for this request or was specified incorrectly.") - .build()) + .error(ErrorHandlerTest.expected()) .build(); } } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/caf57cc7/azurecompute/src/test/java/org/jclouds/azurecompute/xml/ErrorHandlerTest.java ---------------------------------------------------------------------- diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/xml/ErrorHandlerTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/xml/ErrorHandlerTest.java new file mode 100644 index 0000000..3c9a74b --- /dev/null +++ b/azurecompute/src/test/java/org/jclouds/azurecompute/xml/ErrorHandlerTest.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.azurecompute.xml; + +import static org.testng.Assert.assertEquals; + +import java.io.InputStream; + +import org.jclouds.azurecompute.domain.Error; +import org.jclouds.azurecompute.domain.Error.Code; +import org.jclouds.http.functions.BaseHandlerTest; +import org.testng.annotations.Test; + +@Test(groups = "unit", testName = "ErrorHandlerTest") +public class ErrorHandlerTest extends BaseHandlerTest { + + public void test() { + InputStream is = getClass().getResourceAsStream("/error.xml"); + Error result = factory.create(new ErrorHandler()).parse(is); + + assertEquals(result, expected()); + } + + public static Error expected() { + return Error.create(Code.MISSING_OR_INVALID_REQUIRED_QUERY_PARAMETER, + "A required query parameter was not specified for this request or was specified incorrectly."); + } +}
