Yingyi Bu has submitted this change and it was merged. Change subject: Use a file to store the map from error codes to error messages. ......................................................................
Use a file to store the map from error codes to error messages. Change-Id: I344903a9961469b62a951a9095514bf671ff11ee Reviewed-on: https://asterix-gerrit.ics.uci.edu/1410 Tested-by: Jenkins <[email protected]> BAD: Jenkins <[email protected]> Integration-Tests: Jenkins <[email protected]> Reviewed-by: Till Westmann <[email protected]> --- M asterixdb/asterix-common/pom.xml M asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/LSMInsertDeleteOperatorNodePushable.java M asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java A asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties M asterixdb/asterix-om/src/main/java/org/apache/asterix/om/exceptions/InvalidExpressionException.java M asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/exceptions/UnderflowException.java M hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/std/AssignRuntimeFactory.java M hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ErrorCode.java M hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/HyracksDataException.java A hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ProcessTupleException.java M hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/ErrorMessageUtil.java A hyracks-fullstack/hyracks/hyracks-api/src/main/resources/errormsg/en.properties 12 files changed, 207 insertions(+), 77 deletions(-) Approvals: Till Westmann: Looks good to me, approved Jenkins: Verified; No violations found; Verified Objections: Jenkins: Violations found diff --git a/asterixdb/asterix-common/pom.xml b/asterixdb/asterix-common/pom.xml index 82cb575..d4a4517 100644 --- a/asterixdb/asterix-common/pom.xml +++ b/asterixdb/asterix-common/pom.xml @@ -156,6 +156,7 @@ <configuration> <includes> <include>**/*.class</include> + <include>**/*.properties</include> <include>**/README*</include> <include>**/NOTICE*</include> <include>**/LICENSE*</include> diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/LSMInsertDeleteOperatorNodePushable.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/LSMInsertDeleteOperatorNodePushable.java index f17fcaf..2cae9de 100644 --- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/LSMInsertDeleteOperatorNodePushable.java +++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/LSMInsertDeleteOperatorNodePushable.java @@ -21,14 +21,15 @@ import java.nio.ByteBuffer; import org.apache.asterix.common.api.IAppRuntimeContext; +import org.apache.hyracks.api.exceptions.ErrorCode; import org.apache.asterix.common.transactions.ILogMarkerCallback; import org.apache.asterix.common.transactions.PrimaryIndexLogMarkerCallback; import org.apache.hyracks.api.comm.VSizeFrame; import org.apache.hyracks.api.context.IHyracksTaskContext; import org.apache.hyracks.api.dataflow.value.IRecordDescriptorProvider; import org.apache.hyracks.api.dataflow.value.RecordDescriptor; -import org.apache.hyracks.api.exceptions.ErrorCode; import org.apache.hyracks.api.exceptions.HyracksDataException; +import org.apache.hyracks.api.exceptions.ProcessTupleException; import org.apache.hyracks.dataflow.common.comm.io.FrameTupleAccessor; import org.apache.hyracks.dataflow.common.comm.io.FrameTupleAppender; import org.apache.hyracks.dataflow.common.comm.util.FrameUtils; @@ -135,8 +136,7 @@ } break; default: { - throw new HyracksDataException("Unsupported operation %1$s in %2$s operator", - ErrorCode.INVALID_OPERATOR_OPERATION, op.toString(), + throw HyracksDataException.create(ErrorCode.INVALID_OPERATOR_OPERATION, op.toString(), LSMInsertDeleteOperatorNodePushable.class.getSimpleName()); } } @@ -145,10 +145,10 @@ if (e.getErrorCode() == ErrorCode.INVALID_OPERATOR_OPERATION) { throw e; } else { - throw new HyracksDataException(e, ErrorCode.ERROR_PROCESSING_TUPLE, i); + throw new ProcessTupleException(e, i); } } catch (Exception e) { - throw new HyracksDataException(e, ErrorCode.ERROR_PROCESSING_TUPLE, i); + throw new ProcessTupleException(e, i); } writeBuffer.ensureFrameSize(buffer.capacity()); diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java index d5dfd87..2e7c69b 100644 --- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java +++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java @@ -18,8 +18,11 @@ */ package org.apache.asterix.common.exceptions; -import java.util.HashMap; +import java.io.File; +import java.io.InputStream; import java.util.Map; + +import org.apache.hyracks.api.util.ErrorMessageUtil; // Error code: // 0 --- 999: runtime errors @@ -28,6 +31,7 @@ // 3000 ---- 3999: feed errors // 4000 ---- 4999: lifecycle management errors public class ErrorCode { + private static final String RESOURCE_PATH = "asx_errormsg" + File.separator + "en.properties"; public static final String ASTERIX = "ASX"; // Extension errors @@ -55,74 +59,25 @@ public static final int ERROR_COMPILATION_TYPE_INCOMPATIBLE = 1003; public static final int ERROR_COMPILATION_TYPE_UNSUPPORTED = 1004; public static final int ERROR_COMPILATION_TYPE_ITEM = 1005; - public static final int ERROR_COMPILATION_INVALID_EXPRESSION = 1006; - public static final int ERROR_COMPILATION_INVALID_PARAMETER_NUMBER = 1007; - public static final int ERROR_COMPILATION_DUPLICATE_FIELD_NAME = 1008; + public static final int ERROR_COMPILATION_DUPLICATE_FIELD_NAME = 1006; + public static final int ERROR_COMPILATION_INVALID_EXPRESSION = 1007; + public static final int ERROR_COMPILATION_INVALID_PARAMETER_NUMBER = 1008; public static final int ERROR_COMPILATION_INVALID_RETURNING_EXPRESSION = 1009; - private static final String ERROR_MESSAGE_ID_CONFLICT = "Two Extensions share the same Id: %1$s"; - private static final String ERROR_MESSAGE_COMPONENT_CONFLICT = "Extension Conflict between %1$s and %2$s both " - + "extensions extend %3$s"; - private static final String ERROR_MESSAGE_TYPE_MISMATCH = "Type mismatch: function %1$s expects" - + " its %2$s input parameter to be type %3$s, but the actual input type is %4$s"; - private static final String ERROR_MESSAGE_TYPE_INCOMPATIBLE = "Type incompatibility: function %1$s gets" - + " incompatible input values: %2$s and %3$s"; - private static final String ERROR_MESSAGE_TYPE_UNSUPPORTED = "Unsupported type: %1$s" - + " cannot process input type %2$s"; - private static final String ERROR_MESSAGE_TYPE_ITEM = "Invalid item type: function %1$s" - + " cannot process item type %2$s in an input array (or multiset)"; - private static final String ERROR_MESSAGE_INVALID_FORMAT = "Invalid format for %1$s in %2$s"; - private static final String ERROR_MESSAGE_OVERFLOW = "Overflow happend in %1$s"; - private static final String ERROR_MESSAGE_UNDERFLOW = "Underflow happend in %1$s"; - private static final String ERROR_MESSAGE_INJECTED_FAILURE = "Injected failure in %1$s"; - private static final String ERROR_MESSAGE_NEGATIVE_VALUE = "Invalid value: function %1$s expects" - + " its %2$s input parameter to be a non-negative value, but gets %3$s"; - private static final String ERROR_MESSAGE_OUT_OF_BOUND = "Index out of bound in %1$s: %2$s"; - private static final String ERROR_MESSAGE_COERCION = "Invalid implicit scalar to collection coercion in %1$s"; - private static final String ERROR_MESSAGE_DUPLICATE_FIELD = "Duplicate field name \"%1$s\""; - private static final String ERROR_MESSAGE_INVALID_EXPRESSION = "Invalid expression: function %1$s expects" - + " its %2$s input parameter to be a %3$s expression, but the actual expression is %4$s"; - private static final String ERROR_MESSAGE_INVALID_PARAMETER_NUMBER = "Invalid parameter number: function %1$s " - + "cannot take %2$s parameters"; - private static final String ERROR_MESSAGE_INVALID_RETURNING_EXPRESSION = "A returning expression cannot" - + " contain dataset access"; - - private static Map<Integer, String> errorMessageMap = new HashMap<>(); - - static { - // runtime errors - errorMessageMap.put(ERROR_TYPE_MISMATCH, ERROR_MESSAGE_TYPE_MISMATCH); - errorMessageMap.put(ERROR_TYPE_INCOMPATIBLE, ERROR_MESSAGE_TYPE_INCOMPATIBLE); - errorMessageMap.put(ERROR_TYPE_ITEM, ERROR_MESSAGE_TYPE_ITEM); - errorMessageMap.put(ERROR_TYPE_UNSUPPORTED, ERROR_MESSAGE_TYPE_UNSUPPORTED); - errorMessageMap.put(ERROR_INVALID_FORMAT, ERROR_MESSAGE_INVALID_FORMAT); - errorMessageMap.put(ERROR_OVERFLOW, ERROR_MESSAGE_OVERFLOW); - errorMessageMap.put(ERROR_UNDERFLOW, ERROR_MESSAGE_UNDERFLOW); - errorMessageMap.put(ERROR_INJECTED_FAILURE, ERROR_MESSAGE_INJECTED_FAILURE); - errorMessageMap.put(ERROR_NEGATIVE_VALUE, ERROR_MESSAGE_NEGATIVE_VALUE); - errorMessageMap.put(ERROR_OUT_OF_BOUND, ERROR_MESSAGE_OUT_OF_BOUND); - errorMessageMap.put(ERROR_COERCION, ERROR_MESSAGE_COERCION); - errorMessageMap.put(ERROR_DUPLICATE_FIELD_NAME, ERROR_MESSAGE_DUPLICATE_FIELD); - - // compilation errors - errorMessageMap.put(ERROR_COMPILATION_TYPE_MISMATCH, ERROR_MESSAGE_TYPE_MISMATCH); - errorMessageMap.put(ERROR_COMPILATION_TYPE_INCOMPATIBLE, ERROR_MESSAGE_TYPE_INCOMPATIBLE); - errorMessageMap.put(ERROR_COMPILATION_TYPE_ITEM, ERROR_MESSAGE_TYPE_ITEM); - errorMessageMap.put(ERROR_COMPILATION_TYPE_UNSUPPORTED, ERROR_MESSAGE_TYPE_UNSUPPORTED); - errorMessageMap.put(ERROR_COMPILATION_INVALID_EXPRESSION, ERROR_MESSAGE_INVALID_EXPRESSION); - errorMessageMap.put(ERROR_COMPILATION_INVALID_PARAMETER_NUMBER, ERROR_MESSAGE_INVALID_PARAMETER_NUMBER); - errorMessageMap.put(ERROR_COMPILATION_DUPLICATE_FIELD_NAME, ERROR_MESSAGE_DUPLICATE_FIELD); - errorMessageMap.put(ERROR_COMPILATION_INVALID_RETURNING_EXPRESSION, ERROR_MESSAGE_INVALID_RETURNING_EXPRESSION); - - // lifecycle management errors - errorMessageMap.put(ERROR_EXTENSION_ID_CONFLICT, ERROR_MESSAGE_ID_CONFLICT); - errorMessageMap.put(ERROR_EXTENSION_COMPONENT_CONFLICT, ERROR_MESSAGE_COMPONENT_CONFLICT); - } + // Loads the map that maps error codes to error message templates. + private static Map<Integer, String> errorMessageMap = null; private ErrorCode() { } public static String getErrorMessage(int errorCode) { + if (errorMessageMap == null) { + try (InputStream resourceStream = ErrorCode.class.getClassLoader().getResourceAsStream(RESOURCE_PATH)) { + errorMessageMap = ErrorMessageUtil.loadErrorMap(resourceStream); + } catch (Exception e) { + throw new IllegalStateException(e); + } + } String msg = errorMessageMap.get(errorCode); if (msg == null) { throw new IllegalStateException("Undefined error code: " + errorCode); diff --git a/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties b/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties new file mode 100644 index 0000000..85fa1d1 --- /dev/null +++ b/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties @@ -0,0 +1,50 @@ +# +# 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. +# + +# Error code: +# 0 --- 999: runtime errors +# 1000 ---- 1999: compilation errors +# 2000 ---- 2999: storage errors +# 3000 ---- 3999: feed errors +# 4000 ---- 4999: lifecycle management errors + +# For the extension lifecycle +4001 = Two Extensions share the same Id: %1$s +4002 = Extension Conflict between %1$s and %2$s both extensions extend %3$s + +# Type errors +2,1002 = Type mismatch: function %1$s expects its %2$s input parameter to be type %3$s, but the actual input type is %4$s +3,1003 = Type incompatibility: function %1$s gets incompatible input values: %2$s and %3$s +4,1004 = Unsupported type: %1$s cannot process input type %2$s +5,1005 = Invalid item type: function %1$s cannot process item type %2$s in an input array (or multiset) +13,1006=Duplicate field name \"%1$s\" +1009=A returning expression cannot contain dataset access + +# Data errors +6 = Invalid format for %1$s in %2$s +7 = Overflow happend in %1$s +8=Underflow happend in %1$s +9=Injected failure in %1$s +10=Invalid value: function %1$s expects its %2$s input parameter to be a non-negative value, but gets %3$s +11=Index out of bound in %1$s: %2$s +12=Invalid implicit scalar to collection coercion in %1$s + +# Compile-time check errors +1007=Invalid expression: function %1$s expects its %2$s input parameter to be a %3$s expression, but the actual expression is %4$s +1008=Invalid parameter number: function %1$s cannot take %2$s parameters diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/exceptions/InvalidExpressionException.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/exceptions/InvalidExpressionException.java index a4b3a32..c381b7b 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/exceptions/InvalidExpressionException.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/exceptions/InvalidExpressionException.java @@ -34,14 +34,14 @@ public InvalidExpressionException(FunctionIdentifier fid, int index, ILogicalExpression actualExpr, LogicalExpressionTag... exprKinds) { - super(ErrorCode.ERROR_COMPILATION_TYPE_INCOMPATIBLE, fid.getName(), indexToPosition(index), + super(ErrorCode.ERROR_COMPILATION_INVALID_EXPRESSION, fid.getName(), indexToPosition(index), actualExpr.toString(), toExpectedTypeString(exprKinds)); } public InvalidExpressionException(String functionName, int index, ILogicalExpression actualExpr, LogicalExpressionTag... exprKinds) { - super(ErrorCode.ERROR_COMPILATION_TYPE_INCOMPATIBLE, functionName, indexToPosition(index), + super(ErrorCode.ERROR_COMPILATION_INVALID_EXPRESSION, functionName, indexToPosition(index), actualExpr.toString(), toExpectedTypeString(exprKinds)); } diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/exceptions/UnderflowException.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/exceptions/UnderflowException.java index fede04f..cb39ab2 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/exceptions/UnderflowException.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/exceptions/UnderflowException.java @@ -27,12 +27,12 @@ // Underflow. public UnderflowException(FunctionIdentifier fid) { - super(ErrorCode.ERROR_OVERFLOW, fid.getName()); + super(ErrorCode.ERROR_UNDERFLOW, fid.getName()); } // Underflow. public UnderflowException(String functionName) { - super(ErrorCode.ERROR_OVERFLOW, functionName); + super(ErrorCode.ERROR_UNDERFLOW, functionName); } } diff --git a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/std/AssignRuntimeFactory.java b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/std/AssignRuntimeFactory.java index 520465a..0e33a7a 100644 --- a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/std/AssignRuntimeFactory.java +++ b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/std/AssignRuntimeFactory.java @@ -30,6 +30,7 @@ import org.apache.hyracks.api.context.IHyracksTaskContext; import org.apache.hyracks.api.exceptions.ErrorCode; import org.apache.hyracks.api.exceptions.HyracksDataException; +import org.apache.hyracks.api.exceptions.ProcessTupleException; import org.apache.hyracks.data.std.api.IPointable; import org.apache.hyracks.data.std.primitive.VoidPointable; import org.apache.hyracks.dataflow.common.comm.io.ArrayTupleBuilder; @@ -173,9 +174,7 @@ } } } catch (HyracksDataException e) { - throw new HyracksDataException(ErrorCode.HYRACKS, ErrorCode.ERROR_PROCESSING_TUPLE, - "Error evaluating tuple %1$s in AssignRuntime", (Throwable) e, - new Serializable[] { tupleIndex }); + throw new ProcessTupleException(e, tupleIndex); } } diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ErrorCode.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ErrorCode.java index c95c31c..95f2e8e 100644 --- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ErrorCode.java +++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ErrorCode.java @@ -18,16 +18,41 @@ */ package org.apache.hyracks.api.exceptions; +import java.io.File; +import java.io.InputStream; +import java.util.Map; + +import org.apache.hyracks.api.util.ErrorMessageUtil; + /** * A registry of runtime error codes */ public class ErrorCode { + private static final String RESOURCE_PATH = "errormsg" + File.separator + "en.properties"; public static final String HYRACKS = "HYR"; - public static final int ERROR_PROCESSING_TUPLE = 0; + public static final int INVALID_OPERATOR_OPERATION = 1; - public static final int FAILURE_ON_NODE = 2; - public static final int ILLEGAL_ARGUMENT = 3; + public static final int ERROR_PROCESSING_TUPLE = 2; + public static final int FAILURE_ON_NODE = 3; + + // Loads the map that maps error codes to error message templates. + private static Map<Integer, String> errorMessageMap = null; private ErrorCode() { } + + public static String getErrorMessage(int errorCode) { + if (errorMessageMap == null) { + try (InputStream resourceStream = ErrorCode.class.getClassLoader().getResourceAsStream(RESOURCE_PATH)) { + errorMessageMap = ErrorMessageUtil.loadErrorMap(resourceStream); + } catch (Exception e) { + throw new IllegalStateException(e); + } + } + String msg = errorMessageMap.get(errorCode); + if (msg == null) { + throw new IllegalStateException("Undefined error code: " + errorCode); + } + return msg; + } } diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/HyracksDataException.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/HyracksDataException.java index 8a0e94b..d3e4f2e 100644 --- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/HyracksDataException.java +++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/HyracksDataException.java @@ -36,6 +36,10 @@ private final String nodeId; private transient volatile String msgCache; + public static HyracksDataException create(int code, Serializable... params) { + return new HyracksDataException(ErrorCode.HYRACKS, code, ErrorCode.getErrorMessage(code), params); + } + public HyracksDataException(String component, int errorCode, String message, Throwable cause, String nodeId, Serializable... params) { super(message, cause); diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ProcessTupleException.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ProcessTupleException.java new file mode 100644 index 0000000..67c03e3 --- /dev/null +++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ProcessTupleException.java @@ -0,0 +1,34 @@ +/* + * 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.apache.hyracks.api.exceptions; + +import java.io.Serializable; + +public class ProcessTupleException extends HyracksDataException { + + public ProcessTupleException(Serializable... params) { + super(ErrorCode.HYRACKS, ErrorCode.ERROR_PROCESSING_TUPLE, + ErrorCode.getErrorMessage(ErrorCode.ERROR_PROCESSING_TUPLE), params); + } + + public ProcessTupleException(Throwable cause, Serializable... params) { + super(ErrorCode.HYRACKS, ErrorCode.ERROR_PROCESSING_TUPLE, cause, params); + } +} diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/ErrorMessageUtil.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/ErrorMessageUtil.java index fd1e850..c2f5141 100644 --- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/ErrorMessageUtil.java +++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/ErrorMessageUtil.java @@ -21,21 +21,62 @@ package org.apache.hyracks.api.util; +import java.io.IOError; +import java.io.IOException; +import java.io.InputStream; import java.io.Serializable; import java.util.Formatter; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; + +import org.apache.hyracks.api.exceptions.ErrorCode; public class ErrorMessageUtil { private static final Logger LOGGER = Logger.getLogger(ErrorMessageUtil.class.getName()); public static final String NONE = ""; + private static final String COMMA = ","; private ErrorMessageUtil() { } /** + * Loads the mapping from error codes to error messages from a properties file. + * The key of properties is in the form of comma-separated error codes and the value is the corresponding + * error message template. + * + * Example entries in the properties file: + * 4002=Extension Conflict between %1$s and %2$s both extensions extend %3$s + * 2,1002 = Type mismatch: function %1$s expects its %2$s input parameter to be type %3$s + * + * @param resourceStream, + * the input stream of the properties file + * @return the map that maps error codes (integers) to error message templates (strings). + */ + public static Map<Integer, String> loadErrorMap(InputStream resourceStream) throws IOException { + Properties prop = new Properties(); + Map<Integer, String> errorMessageMap = new HashMap<>(); + prop.load(resourceStream); + for (Map.Entry<Object, Object> entry : prop.entrySet()) { + String key = (String) entry.getKey(); + String msg = (String) entry.getValue(); + if (key.contains(COMMA)) { + String[] codes = key.split(COMMA); + for (String code : codes) { + errorMessageMap.put(Integer.parseInt(code), msg); + } + } else { + errorMessageMap.put(Integer.parseInt(key), msg); + } + } + return errorMessageMap; + } + + /** * formats a error message * Example: * formatMessage(HYRACKS, ErrorCode.UNKNOWN, "%1$s -- %2$s", "one", "two") returns "HYR0000: one -- two" diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/resources/errormsg/en.properties b/hyracks-fullstack/hyracks/hyracks-api/src/main/resources/errormsg/en.properties new file mode 100644 index 0000000..890021b --- /dev/null +++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/resources/errormsg/en.properties @@ -0,0 +1,21 @@ +# +# 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. +# + +1=Unsupported operation %1$s in %2$s operator +2=Error in processing tuple %1$s in a frame -- To view, visit https://asterix-gerrit.ics.uci.edu/1410 To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings Gerrit-MessageType: merged Gerrit-Change-Id: I344903a9961469b62a951a9095514bf671ff11ee Gerrit-PatchSet: 9 Gerrit-Project: asterixdb Gerrit-Branch: master Gerrit-Owner: Yingyi Bu <[email protected]> Gerrit-Reviewer: Jenkins <[email protected]> Gerrit-Reviewer: Michael Blow <[email protected]> Gerrit-Reviewer: Till Westmann <[email protected]> Gerrit-Reviewer: Yingyi Bu <[email protected]>
