This is an automated email from the ASF dual-hosted git repository. yuanbo pushed a commit to branch TUBEMQ-421 in repository https://gitbox.apache.org/repos/asf/incubator-tubemq.git
commit 20c4602477b096eb14058fa067bfc6e1e8f6ca5f Author: gosonzhang <[email protected]> AuthorDate: Mon Jan 11 10:17:54 2021 +0800 [TUBEMQ-500] Add setting operate API (#389) Co-authored-by: gosonzhang <[email protected]> --- .../tubemq/client/producer/AllowedSetting.java | 61 ++++++++ .../org/apache/tubemq/corebase/TBaseConstants.java | 1 + .../apache/tubemq/corebase/utils/MixedUtils.java | 9 -- .../tubemq/corebase/utils/SettingValidUtils.java | 39 +++++ .../tubemq/server/common/fielddef/WebFieldDef.java | 14 +- .../server/common/utils/WebParameterUtils.java | 165 ++++++++++++++------- .../bdbentitys/BdbClusterSettingEntity.java | 17 +-- .../nodemanage/nodebroker/BrokerConfManager.java | 62 ++------ .../master/web/handler/WebMasterInfoHandler.java | 119 ++++++++++++++- 9 files changed, 353 insertions(+), 134 deletions(-) diff --git a/tubemq-client/src/main/java/org/apache/tubemq/client/producer/AllowedSetting.java b/tubemq-client/src/main/java/org/apache/tubemq/client/producer/AllowedSetting.java new file mode 100644 index 0000000..cabf928 --- /dev/null +++ b/tubemq-client/src/main/java/org/apache/tubemq/client/producer/AllowedSetting.java @@ -0,0 +1,61 @@ +/** + * 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 + * <p> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p> + * 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.tubemq.client.producer; + +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; +import org.apache.tubemq.corebase.TBaseConstants; +import org.apache.tubemq.corebase.protobuf.generated.ClientMaster; +import org.apache.tubemq.corebase.utils.SettingValidUtils; + +/** + * The class class caches the dynamic settings + * returned from the server. + */ +public class AllowedSetting { + private AtomicLong configId = + new AtomicLong(TBaseConstants.META_VALUE_UNDEFINED); + private AtomicInteger maxMsgSize = + new AtomicInteger(TBaseConstants.META_MAX_MESSAGE_DATA_SIZE); + + public AllowedSetting() { + + } + + // set master returned configure + public void updAllowedSetting(ClientMaster.ApprovedClientConfig allowedConfig) { + if (allowedConfig != null) { + if (configId.get() != allowedConfig.getConfigId()) { + configId.set(allowedConfig.getConfigId()); + } + if (allowedConfig.hasMaxMsgSize() + && allowedConfig.getMaxMsgSize() != maxMsgSize.get()) { + maxMsgSize.set( + SettingValidUtils.validAndGetMaxMsgSize(allowedConfig.getMaxMsgSize())); + } + } + } + + public long getConfigId() { + return configId.get(); + } + + public int getMaxMsgSize() { + return maxMsgSize.get(); + } +} diff --git a/tubemq-core/src/main/java/org/apache/tubemq/corebase/TBaseConstants.java b/tubemq-core/src/main/java/org/apache/tubemq/corebase/TBaseConstants.java index 2f1be7a..d91b083 100644 --- a/tubemq-core/src/main/java/org/apache/tubemq/corebase/TBaseConstants.java +++ b/tubemq-core/src/main/java/org/apache/tubemq/corebase/TBaseConstants.java @@ -31,6 +31,7 @@ public class TBaseConstants { public static final int META_MAX_MSGTYPE_LENGTH = 255; public static final int META_MAX_MESSAGE_HEADER_SIZE = 1024; public static final int META_MAX_MESSAGE_DATA_SIZE = 1024 * 1024; + public static final int META_MAX_MESSAGE_DATA_SIZE_UPPER_LIMIT = 20 * 1024 * 1024; public static final int META_MAX_PARTITION_COUNT = 100; public static final int META_MAX_BROKER_IP_LENGTH = 32; public static final int META_MAX_USERNAME_LENGTH = 64; diff --git a/tubemq-core/src/main/java/org/apache/tubemq/corebase/utils/MixedUtils.java b/tubemq-core/src/main/java/org/apache/tubemq/corebase/utils/MixedUtils.java index bcd0738..bfbedad 100644 --- a/tubemq-core/src/main/java/org/apache/tubemq/corebase/utils/MixedUtils.java +++ b/tubemq-core/src/main/java/org/apache/tubemq/corebase/utils/MixedUtils.java @@ -92,13 +92,4 @@ public class MixedUtils { dataBuffer.flip(); return dataBuffer.array(); } - - // get the middle data between min, max, and data - public static int mid(int data, int min, int max) { - return Math.max(min, Math.min(max, data)); - } - - public static long mid(long data, long min, long max) { - return Math.max(min, Math.min(max, data)); - } } diff --git a/tubemq-core/src/main/java/org/apache/tubemq/corebase/utils/SettingValidUtils.java b/tubemq-core/src/main/java/org/apache/tubemq/corebase/utils/SettingValidUtils.java new file mode 100644 index 0000000..4a206ef --- /dev/null +++ b/tubemq-core/src/main/java/org/apache/tubemq/corebase/utils/SettingValidUtils.java @@ -0,0 +1,39 @@ +/** + * 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 + * <p> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p> + * 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.tubemq.corebase.utils; + +import org.apache.tubemq.corebase.TBaseConstants; + + +public class SettingValidUtils { + + // get the middle data between min, max, and data + public static int mid(int data, int min, int max) { + return Math.max(min, Math.min(max, data)); + } + + public static long mid(long data, long min, long max) { + return Math.max(min, Math.min(max, data)); + } + + public static int validAndGetMaxMsgSize(int inMaxMsgSize) { + return mid(inMaxMsgSize, + TBaseConstants.META_MAX_MESSAGE_DATA_SIZE, + TBaseConstants.META_MAX_MESSAGE_DATA_SIZE_UPPER_LIMIT); + } +} diff --git a/tubemq-server/src/main/java/org/apache/tubemq/server/common/fielddef/WebFieldDef.java b/tubemq-server/src/main/java/org/apache/tubemq/server/common/fielddef/WebFieldDef.java index a65a223..05688a7 100644 --- a/tubemq-server/src/main/java/org/apache/tubemq/server/common/fielddef/WebFieldDef.java +++ b/tubemq-server/src/main/java/org/apache/tubemq/server/common/fielddef/WebFieldDef.java @@ -84,7 +84,19 @@ public enum WebFieldDef { OFFSETJSON(21, "offsetJsonInfo", "offsetInfo", WebFieldType.JSONTYPE, "The offset info that needs to be added or modified"), ONLYMEM(22, "onlyMemory", "onlyMem", WebFieldType.BOOLEAN, - "Only clear the offset data in the memory cache, default is false"); + "Only clear the offset data in the memory cache, default is false"), + ADMINAUTHTOKEN(23, "confModAuthToken", "authToken", WebFieldType.STRING, + "Admin api operation authorization code", + TServerConstants.CFG_MODAUTHTOKEN_MAX_LENGTH), + MAXMSGSIZE(24, "maxMsgSize", "maxMsgSize", WebFieldType.INT, + "Max allowed message size", RegexDef.TMP_NUMBER), + CREATEDATE(25, "createDate", "cDate", WebFieldType.STRING, + "Record creation date", TBaseConstants.META_MAX_DATEVALUE_LENGTH), + MODIFYDATE(26, "modifyDate", "mDate", WebFieldType.STRING, + "Record modification date", TBaseConstants.META_MAX_DATEVALUE_LENGTH); + + + diff --git a/tubemq-server/src/main/java/org/apache/tubemq/server/common/utils/WebParameterUtils.java b/tubemq-server/src/main/java/org/apache/tubemq/server/common/utils/WebParameterUtils.java index f309ab7..385fe22 100644 --- a/tubemq-server/src/main/java/org/apache/tubemq/server/common/utils/WebParameterUtils.java +++ b/tubemq-server/src/main/java/org/apache/tubemq/server/common/utils/WebParameterUtils.java @@ -246,6 +246,10 @@ public class WebParameterUtils { return strBuffer.append("{\"result\":true,\"errCode\":0,\"errMsg\":\"OK\"}"); } + public static StringBuilder buildSuccessResult(StringBuilder strBuffer, String appendInfo) { + return strBuffer.append("{\"result\":true,\"errCode\":0,\"errMsg\":\""). + append(appendInfo).append("\"}"); + } /** * Parse the parameter value from an object value to a long value * @@ -273,10 +277,9 @@ public class WebParameterUtils { long paramIntVal = Long.parseLong(paramValue); result.setSuccResult(paramIntVal); } catch (Throwable e) { - result.setFailResult(400, - new StringBuilder(512).append("Parameter ") - .append(fieldDef.name).append(" parse error: ") - .append(e.getMessage()).toString()); + result.setFailResult(new StringBuilder(512) + .append("Parameter ").append(fieldDef.name) + .append(" parse error: ").append(e.getMessage()).toString()); } return result.success; } @@ -429,10 +432,9 @@ public class WebParameterUtils { // Check if the parameter exists if (TStringUtils.isBlank(paramValue)) { if (required) { - result.setFailResult(fieldDef.id, - new StringBuilder(512).append("Parameter ") - .append(fieldDef.name) - .append(" is missing or value is null or blank!").toString()); + result.setFailResult(new StringBuilder(512) + .append("Parameter ").append(fieldDef.name) + .append(" is missing or value is null or blank!").toString()); } else { procStringDefValue(fieldDef.isCompFieldType(), defValue, result); } @@ -455,10 +457,9 @@ public class WebParameterUtils { // check if is empty result if (valItemSet.isEmpty()) { if (required) { - result.setFailResult(fieldDef.id, - new StringBuilder(512).append("Parameter ") - .append(fieldDef.name) - .append(" is missing or value is null or blank!").toString()); + result.setFailResult(new StringBuilder(512) + .append("Parameter ").append(fieldDef.name) + .append(" is missing or value is null or blank!").toString()); } else { procStringDefValue(fieldDef.isCompFieldType(), defValue, result); } @@ -467,11 +468,10 @@ public class WebParameterUtils { // check max item count if (fieldDef.itemMaxCnt != TBaseConstants.META_VALUE_UNDEFINED) { if (valItemSet.size() > fieldDef.itemMaxCnt) { - result.setFailResult(fieldDef.id, - new StringBuilder(512).append("Parameter ") - .append(fieldDef.name) - .append("'s item count over max allowed count (") - .append(fieldDef.itemMaxCnt).append(")!").toString()); + result.setFailResult(new StringBuilder(512) + .append("Parameter ").append(fieldDef.name) + .append("'s item count over max allowed count (") + .append(fieldDef.itemMaxCnt).append(")!").toString()); } } result.setSuccResult(valItemSet); @@ -511,10 +511,9 @@ public class WebParameterUtils { // Check if the parameter exists if (TStringUtils.isBlank(paramValue)) { if (required) { - result.setFailResult(fieldDef.id, - new StringBuilder(512).append("Parameter ") - .append(fieldDef.name) - .append(" is missing or value is null or blank!").toString()); + result.setFailResult(new StringBuilder(512) + .append("Parameter ").append(fieldDef.name) + .append(" is missing or value is null or blank!").toString()); } else { result.setSuccResult(defValue); } @@ -524,18 +523,15 @@ public class WebParameterUtils { paramValue = URLDecoder.decode(paramValue, TBaseConstants.META_DEFAULT_CHARSET_NAME); } catch (UnsupportedEncodingException e) { - result.setFailResult(fieldDef.id, - new StringBuilder(512).append("Parameter ") - .append(fieldDef.name) - .append(" decode error, exception is ") - .append(e.toString()).toString()); + result.setFailResult(new StringBuilder(512) + .append("Parameter ").append(fieldDef.name) + .append(" decode error, exception is ") + .append(e.toString()).toString()); } if (TStringUtils.isBlank(paramValue)) { if (required) { - result.setFailResult(fieldDef.id, - new StringBuilder(512).append("Parameter ") - .append(fieldDef.name) - .append("'s value is blank!").toString()); + result.setFailResult(new StringBuilder(512).append("Parameter ") + .append(fieldDef.name).append("'s value is blank!").toString()); } else { result.setSuccResult(defValue); } @@ -543,11 +539,10 @@ public class WebParameterUtils { } if (fieldDef.valMaxLen != TBaseConstants.META_VALUE_UNDEFINED) { if (paramValue.length() > fieldDef.valMaxLen) { - result.setFailResult(fieldDef.id, - new StringBuilder(512).append("Parameter ") - .append(fieldDef.name) - .append("'s length over max allowed length (") - .append(fieldDef.valMaxLen).append(")!").toString()); + result.setFailResult(new StringBuilder(512) + .append("Parameter ").append(fieldDef.name) + .append("'s length over max allowed length (") + .append(fieldDef.valMaxLen).append(")!").toString()); return result.success; } } @@ -557,11 +552,71 @@ public class WebParameterUtils { new TypeToken<Map<String, Long>>(){}.getType()); result.setSuccResult(manOffsets); } catch (Throwable e) { - result.setFailResult(fieldDef.id, - new StringBuilder(512).append("Parameter ") - .append(fieldDef.name) - .append(" value parse failure, error is ") - .append(e.getMessage()).append("!").toString()); + result.setFailResult(new StringBuilder(512) + .append("Parameter ").append(fieldDef.name) + .append(" value parse failure, error is ") + .append(e.getMessage()).append("!").toString()); + } + return result.success; + } + + /** + * Parse the parameter value from an string value to Date value + * + * @param req Http Servlet Request + * @param fieldDef the parameter field definition + * @param required a boolean value represent whether the parameter is must required + * @param defValue a default value returned if failed to parse value from the given object + * @param result process result + * @return valid result for the parameter value + */ + public static boolean getDateParameter(HttpServletRequest req, + WebFieldDef fieldDef, + boolean required, + Date defValue, + ProcessResult result) { + if (!getStringParamValue(req, fieldDef, required, null, result)) { + return result.success; + } + String paramValue = (String) result.retData1; + if (paramValue == null) { + result.setSuccResult(defValue); + return result.success; + } + try { + DateFormat sdf = new SimpleDateFormat(TBaseConstants.META_TMP_DATE_VALUE); + Date date = sdf.parse(paramValue); + result.setSuccResult(date); + } catch (Throwable e) { + result.setFailResult(new StringBuilder(512) + .append("Parameter ").append(fieldDef.name) + .append(" parse error: ").append(e.getMessage()).toString()); + } + return result.success; + } + + /** + * Valid execution authorization info + * @param req Http Servlet Request + * @param fieldDef the parameter field definition + * @param required a boolean value represent whether the parameter is must required + * @param master current master object + * @param result process result + * @return valid result for the parameter value + */ + public static boolean validReqAuthorizeInfo(HttpServletRequest req, + WebFieldDef fieldDef, + boolean required, + TMaster master, + ProcessResult result) { + if (!getStringParamValue(req, fieldDef, required, null, result)) { + return result.success; + } + String paramValue = (String) result.retData1; + if (paramValue != null) { + if (!paramValue.equals(master.getMasterConfig().getConfModAuthToken())) { + result.setFailResult("Illegal access, unauthorized request!"); + } } return result.success; } @@ -608,20 +663,20 @@ public class WebParameterUtils { // check value's max length if (fieldDef.valMaxLen != TBaseConstants.META_VALUE_UNDEFINED) { if (paramVal.length() > fieldDef.valMaxLen) { - result.setFailResult(fieldDef.id, - new StringBuilder(512).append("over max length for ") - .append(fieldDef.name).append(", only allow ") - .append(fieldDef.valMaxLen).append(" length").toString()); + result.setFailResult(new StringBuilder(512) + .append("over max length for ").append(fieldDef.name) + .append(", only allow ").append(fieldDef.valMaxLen) + .append(" length").toString()); return false; } } // check value's pattern if (fieldDef.regexCheck) { if (!paramVal.matches(fieldDef.regexDef.getPattern())) { - result.setFailResult(fieldDef.id, - new StringBuilder(512).append("illegal value for ") - .append(fieldDef.name).append(", value ") - .append(fieldDef.regexDef.getErrMsgTemp()).toString()); + result.setFailResult(new StringBuilder(512) + .append("illegal value for ").append(fieldDef.name) + .append(", value ").append(fieldDef.regexDef.getErrMsgTemp()) + .toString()); return false; } } @@ -647,18 +702,16 @@ public class WebParameterUtils { try { int paramIntVal = Integer.parseInt(paramValue); if (hasMinVal && paramIntVal < minValue) { - result.setFailResult(400, - new StringBuilder(512).append("Parameter ") - .append(fieldDef.name).append(" value must >= ") - .append(minValue).toString()); + result.setFailResult(new StringBuilder(512) + .append("Parameter ").append(fieldDef.name) + .append(" value must >= ").append(minValue).toString()); return false; } result.setSuccResult(paramIntVal); } catch (Throwable e) { - result.setFailResult(400, - new StringBuilder(512).append("Parameter ") - .append(fieldDef.name).append(" parse error: ") - .append(e.getMessage()).toString()); + result.setFailResult(new StringBuilder(512) + .append("Parameter ").append(fieldDef.name) + .append(" parse error: ").append(e.getMessage()).toString()); return false; } return true; diff --git a/tubemq-server/src/main/java/org/apache/tubemq/server/master/bdbstore/bdbentitys/BdbClusterSettingEntity.java b/tubemq-server/src/main/java/org/apache/tubemq/server/master/bdbstore/bdbentitys/BdbClusterSettingEntity.java index ca6e1b4..588fd87 100644 --- a/tubemq-server/src/main/java/org/apache/tubemq/server/master/bdbstore/bdbentitys/BdbClusterSettingEntity.java +++ b/tubemq-server/src/main/java/org/apache/tubemq/server/master/bdbstore/bdbentitys/BdbClusterSettingEntity.java @@ -33,7 +33,7 @@ import org.apache.tubemq.server.common.utils.WebParameterUtils; @Entity public class BdbClusterSettingEntity implements Serializable { - private static final long serialVersionUID = -3259439355290322115L; + private static final long serialVersionUID = 3259439355290322115L; @PrimaryKey private String recordKey = ""; @@ -62,7 +62,7 @@ public class BdbClusterSettingEntity implements Serializable { private String deleteWhen = ""; //delete policy execute time private int qryPriorityId = TBaseConstants.META_VALUE_UNDEFINED; private int maxMsgSize = TBaseConstants.META_VALUE_UNDEFINED; - private String attributes; //extra attribute + private String attributes = ""; //extra attribute private String modifyUser; //modify user private Date modifyDate; //modify date @@ -235,22 +235,19 @@ public class BdbClusterSettingEntity implements Serializable { this.attributes = attributes; } - public String getModifyUser() { - return modifyUser; + public void setModifyInfo(String modifyUser, Date modifyDate) { + this.modifyUser = modifyUser; + this.modifyDate = modifyDate; } - public void setModifyUser(String modifyUser) { - this.modifyUser = modifyUser; + public String getModifyUser() { + return modifyUser; } public Date getModifyDate() { return modifyDate; } - public void setModifyDate(Date modifyDate) { - this.modifyDate = modifyDate; - } - /** * Serialize field to json format * diff --git a/tubemq-server/src/main/java/org/apache/tubemq/server/master/nodemanage/nodebroker/BrokerConfManager.java b/tubemq-server/src/main/java/org/apache/tubemq/server/master/nodemanage/nodebroker/BrokerConfManager.java index 86a6bc4..3eae7dc 100644 --- a/tubemq-server/src/main/java/org/apache/tubemq/server/master/nodemanage/nodebroker/BrokerConfManager.java +++ b/tubemq-server/src/main/java/org/apache/tubemq/server/master/nodemanage/nodebroker/BrokerConfManager.java @@ -2020,64 +2020,27 @@ public class BrokerConfManager implements Server { // ///////////////////////////////////////////////////////////////////////////////////////////////////////////// /** - * Add cluster default setting + * Add or update cluster default setting * * @param bdbEntity the cluster default setting entity will be add * @return true if success otherwise false * @throws Exception */ - public boolean confAddBdbClusterDefSetting(BdbClusterSettingEntity bdbEntity) + public boolean confSetBdbClusterDefSetting(BdbClusterSettingEntity bdbEntity) throws Exception { validMasterStatus(); - BdbClusterSettingEntity curEntity = - clusterSettingMap.get(bdbEntity.getRecordKey()); - if (curEntity != null) { - throw new Exception(new StringBuilder(512) - .append("Duplicate add ClusterSetting info, exist record is: ") - .append(curEntity).toString()); - } - boolean putResult = + bdbEntity.setRecordKey(TServerConstants.TOKEN_DEFAULT_CLUSTER_SETTING); + boolean result = mBdbStoreManagerService.putBdbClusterConfEntity(bdbEntity, true); - if (putResult) { - clusterSettingMap.put(bdbEntity.getRecordKey(), bdbEntity); - logger.info(new StringBuilder(512) - .append("[ClusterSetting Success] ") - .append(bdbEntity).toString()); - return true; - } - return false; - } - - /** - * update cluster default setting - * - * @param bdbEntity the cluster setting entity will be set - * @return true if success otherwise false - * @throws Exception - */ - public boolean confUpdBdbClusterSetting(BdbClusterSettingEntity bdbEntity) - throws Exception { - validMasterStatus(); + clusterSettingMap.put(TServerConstants.TOKEN_DEFAULT_CLUSTER_SETTING, bdbEntity); StringBuilder strBuffer = new StringBuilder(512); - BdbClusterSettingEntity curDefSettingEntity = - clusterSettingMap.get(bdbEntity.getRecordKey()); - if (curDefSettingEntity == null) { - throw new Exception(strBuffer - .append("Update ClusterSetting failure, not exist record for record: ") - .append(bdbEntity.getRecordKey()).toString()); - } - boolean putResult = - mBdbStoreManagerService.putBdbClusterConfEntity(bdbEntity, false); - if (putResult) { - clusterSettingMap.put(bdbEntity.getRecordKey(), bdbEntity); - strBuffer.append("[confUpdBdbClusterSetting Success] record from : "); - strBuffer = curDefSettingEntity.toJsonString(strBuffer); - strBuffer.append(" to : "); - strBuffer = bdbEntity.toJsonString(strBuffer); - logger.info(strBuffer.toString()); - return true; + if (result) { + strBuffer.append("[confSetBdbClusterDefSetting Success], add new record :"); + } else { + strBuffer.append("[confSetBdbClusterDefSetting Success], update old record :"); } - return false; + logger.info(bdbEntity.toJsonString(strBuffer).toString()); + return true; } /** @@ -2107,12 +2070,9 @@ public class BrokerConfManager implements Server { return this.clusterSettingMap.get(TServerConstants.TOKEN_DEFAULT_CLUSTER_SETTING); } - private void validMasterStatus() throws Exception { if (!isSelfMaster()) { throw new StandbyException("Please send your request to the master Node."); } } - - } diff --git a/tubemq-server/src/main/java/org/apache/tubemq/server/master/web/handler/WebMasterInfoHandler.java b/tubemq-server/src/main/java/org/apache/tubemq/server/master/web/handler/WebMasterInfoHandler.java index 98cd36c..9afe1aa 100644 --- a/tubemq-server/src/main/java/org/apache/tubemq/server/master/web/handler/WebMasterInfoHandler.java +++ b/tubemq-server/src/main/java/org/apache/tubemq/server/master/web/handler/WebMasterInfoHandler.java @@ -17,10 +17,16 @@ package org.apache.tubemq.server.master.web.handler; +import java.util.Date; import java.util.List; import javax.servlet.http.HttpServletRequest; +import org.apache.tubemq.corebase.TBaseConstants; +import org.apache.tubemq.corebase.utils.SettingValidUtils; +import org.apache.tubemq.server.common.fielddef.WebFieldDef; +import org.apache.tubemq.server.common.utils.ProcessResult; import org.apache.tubemq.server.common.utils.WebParameterUtils; import org.apache.tubemq.server.master.TMaster; +import org.apache.tubemq.server.master.bdbstore.bdbentitys.BdbClusterSettingEntity; import org.apache.tubemq.server.master.web.model.ClusterGroupVO; import org.apache.tubemq.server.master.web.model.ClusterNodeVO; @@ -43,9 +49,14 @@ public class WebMasterInfoHandler extends AbstractWebHandler { // register query method registerQueryWebMethod("admin_query_master_group_info", "getGroupAddressStrInfo"); + registerQueryWebMethod("admin_query_cluster_default_setting", + "adminQueryClusterDefSetting"); // register modify method registerModifyWebMethod("admin_transfer_current_master", "transferCurrentMaster"); + // register modify method + registerModifyWebMethod("admin_set_cluster_default_setting", + "adminSetClusterDefSetting"); } /** @@ -94,17 +105,111 @@ public class WebMasterInfoHandler extends AbstractWebHandler { * @return */ public StringBuilder transferCurrentMaster(HttpServletRequest req) { - StringBuilder strBuffer = new StringBuilder(512); + ProcessResult result = new ProcessResult(); + StringBuilder sBuilder = new StringBuilder(512); + // valid operation authorize info + if (!WebParameterUtils.validReqAuthorizeInfo(req, + WebFieldDef.ADMINAUTHTOKEN, true, master, result)) { + WebParameterUtils.buildFailResult(sBuilder, result.errInfo); + return sBuilder; + } try { - WebParameterUtils.reqAuthorizeCheck(master, brokerConfManager, req.getParameter("confModAuthToken")); brokerConfManager.transferMaster(); - strBuffer.append("{\"result\":true,\"errCode\":0," + - "\"errMsg\":\"TransferMaster method called, please wait 20 seconds!\"}"); + WebParameterUtils.buildSuccessResult(sBuilder, + "TransferMaster method called, please wait 20 seconds!"); } catch (Exception e2) { - strBuffer.append("{\"result\":false,\"errCode\":400,\"errMsg\":\"") - .append(e2.getMessage()).append("\"}"); + WebParameterUtils.buildFailResult(sBuilder, e2.getMessage()); } - return strBuffer; + return sBuilder; + } + + /** + * Query cluster default setting + * + * @param req + * @return + * @throws Exception + */ + public StringBuilder adminQueryClusterDefSetting(HttpServletRequest req) { + StringBuilder sBuilder = new StringBuilder(512); + BdbClusterSettingEntity defClusterSetting = + brokerConfManager.getBdbClusterSetting(); + sBuilder.append("{\"result\":true,\"errCode\":0,\"errMsg\":\"Ok\",\"data\":["); + if (defClusterSetting != null) { + defClusterSetting.toJsonString(sBuilder); + } + sBuilder.append("]}"); + return sBuilder; + } + + /** + * Add or modify cluster default setting + * + * @param req + * @return + */ + public StringBuilder adminSetClusterDefSetting(HttpServletRequest req) { + boolean dataChanged = false; + ProcessResult result = new ProcessResult(); + StringBuilder sBuilder = new StringBuilder(512); + // valid operation authorize info + if (!WebParameterUtils.validReqAuthorizeInfo(req, + WebFieldDef.ADMINAUTHTOKEN, true, master, result)) { + WebParameterUtils.buildFailResult(sBuilder, result.errInfo); + return sBuilder; + } + // check modify user field + if (!WebParameterUtils.getStringParamValue(req, + WebFieldDef.MODIFYUSER, true, null, result)) { + WebParameterUtils.buildFailResult(sBuilder, result.errInfo); + return sBuilder; + } + String modifyUser = (String) result.retData1; + // check max message size + if (!WebParameterUtils.getIntParamValue(req, + WebFieldDef.MAXMSGSIZE, false, + TBaseConstants.META_VALUE_UNDEFINED, + TBaseConstants.META_MAX_MESSAGE_DATA_SIZE, + result)) { + WebParameterUtils.buildFailResult(sBuilder, result.errInfo); + return sBuilder; + } + int maxMsgSize = (int) result.retData1; + if (maxMsgSize != TBaseConstants.META_VALUE_UNDEFINED) { + dataChanged = true; + } + // check and get modify date + if (!WebParameterUtils.getDateParameter(req, + WebFieldDef.MODIFYDATE, false, new Date(), result)) { + WebParameterUtils.buildFailResult(sBuilder, result.errInfo); + return sBuilder; + } + Date modifyDate = (Date) result.retData1; + if (!dataChanged) { + WebParameterUtils.buildSuccessResult(sBuilder, "No data is changed!"); + return sBuilder; + } + // add or modify cluster setting info + BdbClusterSettingEntity defClusterSetting = + brokerConfManager.getBdbClusterSetting(); + if (defClusterSetting == null) { + defClusterSetting = new BdbClusterSettingEntity(); + } + defClusterSetting.setModifyInfo(modifyUser, modifyDate); + if (maxMsgSize != TBaseConstants.META_VALUE_UNDEFINED) { + defClusterSetting.setMaxMsgSize( + SettingValidUtils.validAndGetMaxMsgSize(maxMsgSize)); + } + try { + brokerConfManager.confSetBdbClusterDefSetting(defClusterSetting); + WebParameterUtils.buildSuccessResult(sBuilder); + } catch (Exception e) { + WebParameterUtils.buildFailResult(sBuilder, e.getMessage()); + } + return sBuilder; } + + + }
