diff --git a/cat-broker/src/main/java/com/dianping/cat/broker/api/page/MonitorManager.java b/cat-broker/src/main/java/com/dianping/cat/broker/api/page/MonitorManager.java index f350b3808e7eb3b18fc4ae06a73d3c4020790439..d9f56d801c6d9fd1b089618e27cdc0f296f02b44 100644 --- a/cat-broker/src/main/java/com/dianping/cat/broker/api/page/MonitorManager.java +++ b/cat-broker/src/main/java/com/dianping/cat/broker/api/page/MonitorManager.java @@ -74,87 +74,88 @@ public class MonitorManager implements Initializable, LogEnabled { } public boolean offer(MonitorEntity entity) { - m_total++; + if (!StringUtils.isEmpty(entity.getTargetUrl())) { + m_total++; - int index = (int) (m_total % m_threadCounts); - int retryTime = 0; + int index = (int) (m_total % m_threadCounts); + int retryTime = 0; - while (retryTime < m_threadCounts) { - BlockingQueue queue = m_queues.get((index + retryTime) % m_threadCounts); - boolean result = queue.offer(entity); + while (retryTime < m_threadCounts) { + BlockingQueue queue = m_queues.get((index + retryTime) % m_threadCounts); + boolean result = queue.offer(entity); - if (result) { - return true; + if (result) { + return true; + } + retryTime++; } - retryTime++; - } - m_errorCount++; - if (m_errorCount % CatConstants.ERROR_COUNT == 0) { - m_logger.error("Error when offer entity to queues, size:" + m_errorCount); + m_errorCount++; + if (m_errorCount % CatConstants.ERROR_COUNT == 0) { + m_logger.error("Error when offer entity to queues, size:" + m_errorCount); + } } return false; } private void processOneEntity(MonitorEntity entity) { String targetUrl = entity.getTargetUrl(); - - if (targetUrl != null) { - String url = getFormatUrl(targetUrl); - - if (url != null) { - Transaction t = Cat.newTransaction("Monitor", url); - - try { - String ip = entity.getIp(); - IpInfo ipInfo = m_ipService.findIpInfoByString(ip); - - if (ipInfo != null) { - String city = ipInfo.getProvince() + "-" + ipInfo.getCity(); - String channel = ipInfo.getChannel(); - String httpCode = entity.getHttpStatus(); - String errorCode = entity.getErrorCode(); - long timestamp = entity.getTimestamp(); - double duration = entity.getDuration(); - String group = url; - - if (duration > 0) { - logMetric(timestamp, duration, group, city + ":" + channel + ":" + Monitor.HIT); - } - if (!"200".equals(httpCode) || !StringUtils.isEmpty(errorCode)) { - logMetric(timestamp, duration, group, city + ":" + channel + ":" + Monitor.ERROR); - } - if (!StringUtils.isEmpty(httpCode)) { - String key = city + ":" + channel + ":" + Monitor.HTTP_STATUS + "|" + httpCode; - Metric metric = Cat.getProducer().newMetric(group, key); - DefaultMetric defaultMetric = (DefaultMetric) metric; - - defaultMetric.setTimestamp(timestamp); - defaultMetric.setStatus("C"); - defaultMetric.addData(String.valueOf(1)); - } - if (!StringUtils.isEmpty(errorCode)) { - String key = city + ":" + channel + ":" + Monitor.ERROR_CODE + "|" + errorCode; - Metric metric = Cat.getProducer().newMetric(group, key); - DefaultMetric defaultMetric = (DefaultMetric) metric; - - defaultMetric.setTimestamp(timestamp); - defaultMetric.setStatus("C"); - defaultMetric.addData(String.valueOf(1)); - } - } else { - Cat.logEvent("IpService", "NotFound", Event.SUCCESS, ip); - - m_logger.error(String.format("ip service can't resolve ip: ", ip)); + String url = getFormatUrl(targetUrl); + + if (url != null) { + Transaction t = Cat.newTransaction("Monitor", url); + + try { + String ip = entity.getIp(); + IpInfo ipInfo = m_ipService.findIpInfoByString(ip); + + if (ipInfo != null) { + String city = ipInfo.getProvince() + "-" + ipInfo.getCity(); + String channel = ipInfo.getChannel(); + String httpCode = entity.getHttpStatus(); + String errorCode = entity.getErrorCode(); + long timestamp = entity.getTimestamp(); + double duration = entity.getDuration(); + String group = url; + + if (duration > 0) { + logMetric(timestamp, duration, group, city + ":" + channel + ":" + Monitor.HIT); + } + if (!"200".equals(httpCode) || !StringUtils.isEmpty(errorCode)) { + logMetric(timestamp, duration, group, city + ":" + channel + ":" + Monitor.ERROR); } - t.setStatus(Transaction.SUCCESS); - } catch (Exception e) { - Cat.logError(e); - t.setStatus(e); - } finally { - t.complete(); + if (!StringUtils.isEmpty(httpCode)) { + String key = city + ":" + channel + ":" + Monitor.HTTP_STATUS + "|" + httpCode; + Metric metric = Cat.getProducer().newMetric(group, key); + DefaultMetric defaultMetric = (DefaultMetric) metric; + + defaultMetric.setTimestamp(timestamp); + defaultMetric.setStatus("C"); + defaultMetric.addData(String.valueOf(1)); + } + if (!StringUtils.isEmpty(errorCode)) { + String key = city + ":" + channel + ":" + Monitor.ERROR_CODE + "|" + errorCode; + Metric metric = Cat.getProducer().newMetric(group, key); + DefaultMetric defaultMetric = (DefaultMetric) metric; + + defaultMetric.setTimestamp(timestamp); + defaultMetric.setStatus("C"); + defaultMetric.addData(String.valueOf(1)); + } + } else { + Cat.logEvent("IpService", "NotFound", Event.SUCCESS, ip); + + m_logger.error(String.format("ip service can't resolve ip: ", ip)); } + t.setStatus(Transaction.SUCCESS); + } catch (Exception e) { + Cat.logError(e); + t.setStatus(e); + } finally { + t.complete(); } + } else { + m_logger.info(String.format("no pattern for url", targetUrl)); } } diff --git a/cat-broker/src/main/java/com/dianping/cat/broker/api/page/RequestUtils.java b/cat-broker/src/main/java/com/dianping/cat/broker/api/page/RequestUtils.java index d67371942890bc8cb1b07681de2eab6e2dd3e25c..718b2fe445a0e4b3da853c75fc396906b9ff48bb 100644 --- a/cat-broker/src/main/java/com/dianping/cat/broker/api/page/RequestUtils.java +++ b/cat-broker/src/main/java/com/dianping/cat/broker/api/page/RequestUtils.java @@ -4,7 +4,7 @@ import javax.servlet.http.HttpServletRequest; public class RequestUtils { - private String filterXForwardedForIP(String ip) { + public String filterXForwardedForIP(String ip) { if (ip == null || ip.trim().length() == 0) { return null; } else { @@ -19,9 +19,17 @@ public class RequestUtils { continue; } else { subIp = subIp.trim(); - if (subIp.startsWith("192.168.") || subIp.startsWith("10.1") || subIp.startsWith("10.2") - || "127.0.0.1".equals(subIp)) { + if (subIp.startsWith("192.168.") || subIp.startsWith("10.") || "127.0.0.1".equals(subIp)) { continue; + } else if (subIp.startsWith("172.")) { + String[] iptabs = subIp.split("\\."); + int tab2 = Integer.parseInt(iptabs[1]); + + if (tab2 >= 16 && tab2 <= 31) { + continue; + } else { + return subIp; + } } else { return subIp; } diff --git a/cat-broker/src/test/java/com/dianping/cat/broker/IpServiceTest.java b/cat-broker/src/test/java/com/dianping/cat/broker/IpServiceTest.java index e9eda23918a635eeaf733ab2330dd32af05ab36c..487e8a27453e08c99cbd10762d5ceb2dc23ad516 100644 --- a/cat-broker/src/test/java/com/dianping/cat/broker/IpServiceTest.java +++ b/cat-broker/src/test/java/com/dianping/cat/broker/IpServiceTest.java @@ -10,6 +10,9 @@ public class IpServiceTest extends ComponentTestCase { @Test public void test() throws Exception { IpService service = (IpService) lookup(IpService.class); + + System.err.println(service.findIpInfoByString("10.10.253.20")); + for (int i = 0; i < 1000; i++) { String ip = i % 255 + "." + i % 255 + "." + i % 255 + "." + i % 255; diff --git a/cat-broker/src/test/java/com/dianping/cat/broker/RequestUtilsTest.java b/cat-broker/src/test/java/com/dianping/cat/broker/RequestUtilsTest.java new file mode 100644 index 0000000000000000000000000000000000000000..6273d16d559054e8ba2e019012da2d8dcd76cab7 --- /dev/null +++ b/cat-broker/src/test/java/com/dianping/cat/broker/RequestUtilsTest.java @@ -0,0 +1,22 @@ +package com.dianping.cat.broker; + +import junit.framework.Assert; + +import org.junit.Test; + +import com.dianping.cat.broker.api.page.RequestUtils; + +public class RequestUtilsTest { + + @Test + public void test(){ + RequestUtils utils = new RequestUtils(); + + Assert.assertEquals(null, utils.filterXForwardedForIP("10.1.6.128,10.1.6.128")); + Assert.assertEquals(null, utils.filterXForwardedForIP("172.16.6.128,172.16.6.128")); + Assert.assertEquals(null, utils.filterXForwardedForIP("172.31.6.128,172.31.6.128")); + Assert.assertEquals(null, utils.filterXForwardedForIP("192.168.0.1,192.168.0.1")); + Assert.assertEquals("172.32.6.128", utils.filterXForwardedForIP("172.32.6.128,172.32.6.128")); + } + +} diff --git a/cat-core/src/main/java/com/dianping/cat/config/DefaultUrlPatternHandler.java b/cat-core/src/main/java/com/dianping/cat/config/DefaultUrlPatternHandler.java index f99c2614c07d92c4f3ae574035d579b129beaba9..5510de233491301852a039f262f053a1f1028b40 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/DefaultUrlPatternHandler.java +++ b/cat-core/src/main/java/com/dianping/cat/config/DefaultUrlPatternHandler.java @@ -1,6 +1,7 @@ package com.dianping.cat.config; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -8,9 +9,12 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import org.codehaus.plexus.logging.LogEnabled; +import org.codehaus.plexus.logging.Logger; + import com.dianping.cat.configuration.url.pattern.entity.PatternItem; -public class DefaultUrlPatternHandler implements UrlPatternHandler { +public class DefaultUrlPatternHandler implements UrlPatternHandler, LogEnabled { private TrieTreeNode m_formats = new TrieTreeNode(); @@ -18,6 +22,8 @@ public class DefaultUrlPatternHandler implements UrlPatternHandler { private Map m_urlToId = new HashMap(); + private Logger m_logger; + /** * build a format tree use prefix as trieTree index and suffix as map key or conversely * @@ -156,11 +162,15 @@ public class DefaultUrlPatternHandler implements UrlPatternHandler { } @Override - public void register(List rules) { + public void register(Collection rules) { + m_logger.info("register url pattern start"); + TrieTreeNode formats = new TrieTreeNode(); for (PatternItem item : rules) { String format = item.getPattern(); + + m_logger.info(String.format("url pattern id : %s ,pattern : %s", item.getName(), item.getPattern())); if (format == null || format.isEmpty()) { continue; } @@ -188,5 +198,12 @@ public class DefaultUrlPatternHandler implements UrlPatternHandler { buildFormatTree(formats, key1.toCharArray(), key2.toCharArray(), value); } m_formats = formats; + + m_logger.info("register url pattern end"); + } + + @Override + public void enableLogging(Logger logger) { + m_logger = logger; } } diff --git a/cat-core/src/main/java/com/dianping/cat/config/UrlPatternConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/UrlPatternConfigManager.java index 9fa5019196f41517a78ecc415c2f1d1039b4fe4f..4587b708da16340d8c4eb6750d0abb351507d71f 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/UrlPatternConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/UrlPatternConfigManager.java @@ -2,7 +2,7 @@ package com.dianping.cat.config; import java.io.IOException; import java.util.ArrayList; -import java.util.List; +import java.util.Collection; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.unidal.dal.jdbc.DalException; @@ -90,10 +90,8 @@ public class UrlPatternConfigManager implements Initializable { return m_UrlPattern.findPatternItem(key); } - public List queryUrlPatternRules() { - ArrayList patterns = new ArrayList(m_UrlPattern.getPatternItems().values()); - - return patterns; + public Collection queryUrlPatternRules() { + return m_UrlPattern.getPatternItems().values(); } public void refreshUrlPatternConfig() throws DalException, SAXException, IOException { diff --git a/cat-core/src/main/java/com/dianping/cat/config/UrlPatternHandler.java b/cat-core/src/main/java/com/dianping/cat/config/UrlPatternHandler.java index a84491dc1ac502baf2c1113ca97c7384a69c3fe8..e6e561b309fb2f16400d8386cb42af9e1c25e415 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/UrlPatternHandler.java +++ b/cat-core/src/main/java/com/dianping/cat/config/UrlPatternHandler.java @@ -1,18 +1,15 @@ package com.dianping.cat.config; -import java.util.List; +import java.util.Collection; import com.dianping.cat.configuration.url.pattern.entity.PatternItem; public interface UrlPatternHandler { /** - * register aggregation rule to handler - * - * @param formats - * page type and domain to rule List Map + * register url rule to handler */ - public void register(List rules); + public void register(Collection rules); /** * parse input to output use aggregation rule diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/userMonitor/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/userMonitor/Handler.java index 162558476a803bf7fe10099bfbe3cf8251fc1e15..30580e6f1d6f51b28332335f93b097f8cea8bbdb 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/userMonitor/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/userMonitor/Handler.java @@ -1,9 +1,10 @@ package com.dianping.cat.report.page.userMonitor; import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; import java.util.Date; import java.util.LinkedHashMap; -import java.util.List; import java.util.Map; import javax.servlet.ServletException; @@ -55,7 +56,7 @@ public class Handler implements PageHandler { Payload payload = ctx.getPayload(); normalize(model, payload); - List rules = m_patternManager.queryUrlPatternRules(); + Collection rules = m_patternManager.queryUrlPatternRules(); long start = payload.getHistoryStartDate().getTime(); long end = payload.getHistoryEndDate().getTime(); @@ -72,7 +73,7 @@ public class Handler implements PageHandler { String url = payload.getUrl(); if (url == null && rules.size() > 0) { - url = rules.get(0).getName(); + url = new ArrayList(rules).get(0).getName(); } pars.put("type", type); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/userMonitor/Model.java b/cat-home/src/main/java/com/dianping/cat/report/page/userMonitor/Model.java index 5559d4356ae3157f3fbef0760e03bde3ae2c76fc..25c43d583ba3c2c13e7c7f6847596ea349cae024 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/userMonitor/Model.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/userMonitor/Model.java @@ -13,7 +13,7 @@ import com.dianping.cat.report.page.PieChart; public class Model extends AbstractReportModel { - private List m_pattermItems; + private Collection m_pattermItems; private List m_cities; @@ -72,7 +72,7 @@ public class Model extends AbstractReportModel { } } - public List getPattermItems() { + public Collection getPattermItems() { return m_pattermItems; } @@ -104,7 +104,7 @@ public class Model extends AbstractReportModel { m_lineCharts = lineCharts; } - public void setPattermItems(List pattermItems) { + public void setPattermItems(Collection pattermItems) { m_pattermItems = pattermItems; } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/metric/BaseAlertConfig.java b/cat-home/src/main/java/com/dianping/cat/report/task/metric/BaseAlertConfig.java index 67928f7e93be150211cf61c1326fe5aaff80ea1c..fb2aa3f9e9c81cd7fa8e0938912fbf27507eeaa7 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/metric/BaseAlertConfig.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/metric/BaseAlertConfig.java @@ -21,14 +21,23 @@ public abstract class BaseAlertConfig { public abstract List buildExceptionSMSReceivers(ProductLine productLine); - public abstract List buildMailReceivers(ProductLine productLine); + protected double[] buildLastMinutes(double[] doubleList, int remainCount) { + if (doubleList.length <= remainCount) { + return doubleList; + } - public abstract List buildMailReceivers(Project project); + double[] result = new double[remainCount]; + int startIndex = doubleList.length - remainCount; - public abstract List buildSMSReceivers(ProductLine productLine); + for (int i = 0; i < remainCount; i++) { + result[i] = doubleList[startIndex + i]; + } + return result; + } - public abstract Pair checkData(double[] value, double[] baseline, MetricType type, - List configs); + public abstract List buildMailReceivers(ProductLine productLine); + + public abstract List buildMailReceivers(Project project); public String buildMailTitle(ProductLine productLine, MetricItemConfig config) { StringBuilder sb = new StringBuilder(); @@ -38,7 +47,12 @@ public abstract class BaseAlertConfig { return sb.toString(); } - protected Pair checkDataByConfig(double[] value, double[] baseline, MetricType type, Config con) { + public abstract List buildSMSReceivers(ProductLine productLine); + + public abstract Pair checkData(double[] value, double[] baseline, MetricType type, + List configs); + + protected Pair checkDataByCondition(double[] value, double[] baseline, Condition condition) { int length = value.length; StringBuilder baselines = new StringBuilder(); StringBuilder values = new StringBuilder(); @@ -53,14 +67,13 @@ public abstract class BaseAlertConfig { if (baseline[i] <= 0) { baseline[i] = 100; - return new Pair(false, ""); } - if (type == MetricType.COUNT || type == MetricType.SUM) { - if (!judgeByRule(con, value[i], baseline[i], i, length)) { - return new Pair(false, ""); - } + + if (!checkDataByMinute(condition, value[i], baseline[i])) { + return new Pair(false, ""); } } + double percent = (1 - valueSum / baselineSum) * 100; StringBuilder sb = new StringBuilder(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @@ -72,69 +85,62 @@ public abstract class BaseAlertConfig { return new Pair(true, sb.toString()); } - protected Long getMillsByString(String time) throws Exception { - String[] times = time.split(":"); - int hour = Integer.parseInt(times[0]); - int minute = Integer.parseInt(times[1]); - long result = hour * 60 * 60 * 1000 + minute * 60 * 1000; - - return result; - } - - private boolean judgeByRule(Config ruleConfig, double value, double baseline, int index, int length) { - boolean isRuleTriggered = false; - + protected Pair checkDataByConfig(double[] value, double[] baseline, MetricType type, Config config) { long ruleStartTime; long ruleEndTime; long nowTime = (System.currentTimeMillis() + 8 * 60 * 60 * 1000) % (24 * 60 * 60 * 1000); try { - ruleStartTime = getMillsByString(ruleConfig.getStarttime()); - ruleEndTime = getMillsByString(ruleConfig.getEndtime()) + ONE_MINUTE_MILLSEC; + ruleStartTime = getMillsByString(config.getStarttime()); + ruleEndTime = getMillsByString(config.getEndtime()) + ONE_MINUTE_MILLSEC; } catch (Exception ex) { ruleStartTime = 0L; ruleEndTime = 86400000L; } if (nowTime < ruleStartTime || nowTime > ruleEndTime) { - return false; + return new Pair(false, ""); } - for (Condition condition : ruleConfig.getConditions()) { - if (isRuleTriggered) { - break; - } + for (Condition condition : config.getConditions()) { + int conditionMinute = condition.getMinute(); + double[] valueValid = buildLastMinutes(value, conditionMinute); + double[] baselineValid = buildLastMinutes(baseline, conditionMinute); - int minute = condition.getMinute(); + Pair condResult = checkDataByCondition(valueValid, baselineValid, condition); - if (index < length - minute) { - continue; + if (condResult.getKey() == true) { + return condResult; } + } - boolean isSubRuleTriggered = true; + return new Pair(false, ""); + } - for (Subcondition subCondition : condition.getSubconditions()) { - if (!isSubRuleTriggered) { - break; - } + private boolean checkDataByMinute(Condition condition, double value, double baseline) { + for (Subcondition subCondition : condition.getSubconditions()) { + String ruleType = subCondition.getType(); + double ruleValue = Double.parseDouble(subCondition.getText()); + RuleType rule = RuleType.getByTypeId(ruleType); - String ruleType = subCondition.getType(); - double ruleValue = Double.parseDouble(subCondition.getText()); - RuleType rule = RuleType.getByTypeId(ruleType); + if (rule != null) { + boolean isSubRuleTriggered = rule.executeRule(value, baseline, ruleValue); - if (rule == null) { - continue; - } else { - isSubRuleTriggered = rule.executeRule(value, baseline, ruleValue); + if (!isSubRuleTriggered) { + return false; } } - - if (isSubRuleTriggered) { - isRuleTriggered = true; - } } + return true; + } + + protected Long getMillsByString(String time) throws Exception { + String[] times = time.split(":"); + int hour = Integer.parseInt(times[0]); + int minute = Integer.parseInt(times[1]); + long result = hour * 60 * 60 * 1000 + minute * 60 * 1000; - return isRuleTriggered; + return result; } } diff --git a/cat-home/src/main/java/com/dianping/cat/report/task/metric/SwitchAlertConfig.java b/cat-home/src/main/java/com/dianping/cat/report/task/metric/SwitchAlertConfig.java index 2db04a390214dcef64bfbd083097a00fc66e8b4d..c4940e4419f72bb3ee7a4246c376bdcfdfc6100b 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/task/metric/SwitchAlertConfig.java +++ b/cat-home/src/main/java/com/dianping/cat/report/task/metric/SwitchAlertConfig.java @@ -15,7 +15,7 @@ public class SwitchAlertConfig extends BaseAlertConfig { public List buildExceptionSMSReceivers(ProductLine productLine) { List phones = new ArrayList(); - phones.add("18662513308"); + //phones.add("18662513308"); return phones; } @@ -41,7 +41,7 @@ public class SwitchAlertConfig extends BaseAlertConfig { List phones = new ArrayList(); // String phonesList = productLine.getPhone(); - phones.add("18662513308"); + //phones.add("18662513308"); // phones.addAll(Splitters.by(",").noEmptyItem().split(phonesList)); return phones; } @@ -50,8 +50,8 @@ public class SwitchAlertConfig extends BaseAlertConfig { for (Config con : configs) { int dataLength = queryMaxMinute(con); - double[] validVal = getLastMinutes(value, dataLength); - double[] validBase = getLastMinutes(baseline, dataLength); + double[] validVal = buildLastMinutes(value, dataLength); + double[] validBase = buildLastMinutes(baseline, dataLength); Pair result = checkDataByConfig(validVal, validBase, type, con); if (result.getKey() == true) { @@ -61,15 +61,6 @@ public class SwitchAlertConfig extends BaseAlertConfig { return new Pair(false, ""); } - private double[] getLastMinutes(double[] doubleList, int remainCount) { - double[] result = new double[remainCount]; - int startIndex = doubleList.length - remainCount; - - for (int i = 0; i < remainCount; i++) { - result[i] = doubleList[startIndex + i]; - } - return result; - } private int queryMaxMinute(Config con) { int maxMinute = 0; diff --git a/cat-home/src/main/java/com/dianping/cat/system/page/config/Model.java b/cat-home/src/main/java/com/dianping/cat/system/page/config/Model.java index 44238de61f78388874348609f5e70474a409b1e4..2146028a68f82471c1867ec00862abc575b8084b 100644 --- a/cat-home/src/main/java/com/dianping/cat/system/page/config/Model.java +++ b/cat-home/src/main/java/com/dianping/cat/system/page/config/Model.java @@ -1,6 +1,7 @@ package com.dianping.cat.system.page.config; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -33,7 +34,7 @@ public class Model extends ViewModel { private PatternItem m_patternItem; - private List m_patternItems; + private Collection m_patternItems; private ExceptionLimit m_exceptionLimit; @@ -298,11 +299,11 @@ public class Model extends ViewModel { m_patternItem = patternItem; } - public List getPatternItems() { + public Collection getPatternItems() { return m_patternItems; } - public void setPatternItems(List patternItems) { + public void setPatternItems(Collection patternItems) { m_patternItems = patternItems; } diff --git a/cat-home/src/main/webapp/jsp/system/urlPattern/urlPatternUpdate.jsp b/cat-home/src/main/webapp/jsp/system/urlPattern/urlPatternUpdate.jsp index 509378b740a0818d82bc014a084fb994f342e917..b1af432a2f00384e0b4573c055fb8f5be4a88360 100644 --- a/cat-home/src/main/webapp/jsp/system/urlPattern/urlPatternUpdate.jsp +++ b/cat-home/src/main/webapp/jsp/system/urlPattern/urlPatternUpdate.jsp @@ -22,17 +22,20 @@ 唯一ID + 不能有特殊字符,仅限于英文字母和- 所属组 + 暂时不起作用,仅仅用作url的分组,用于展示目的 pattern + 支付完全匹配方式,和部分匹配,比如 http://www.dianping.com/{City}/food,{City}可以匹配任何字符串 - +