blob: 0cc8b203d4dcbf1e263d0adfaa42c46a99bbcd9c [file] [log] [blame]
/*
* 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.dubbo.common;
import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.common.utils.StringUtils;
import java.util.Objects;
public class ProtocolServiceKey extends ServiceKey {
private final String protocol;
public ProtocolServiceKey(String interfaceName, String version, String group, String protocol) {
super(interfaceName, version, group);
this.protocol = protocol;
}
public String getProtocol() {
return protocol;
}
public String getServiceKeyString() {
return super.toString();
}
public boolean isSameWith(ProtocolServiceKey protocolServiceKey) {
// interface version group should be the same
if (!super.equals(protocolServiceKey)) {
return false;
}
// origin protocol is *, can not match any protocol
if (CommonConstants.ANY_VALUE.equals(protocol)) {
return false;
}
// origin protocol is null, can match any protocol
if (StringUtils.isEmpty(protocol) || StringUtils.isEmpty(protocolServiceKey.getProtocol())) {
return true;
}
// origin protocol is not *, match itself
return Objects.equals(protocol, protocolServiceKey.getProtocol());
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
if (!super.equals(o)) {
return false;
}
ProtocolServiceKey that = (ProtocolServiceKey) o;
return Objects.equals(protocol, that.protocol);
}
@Override
public int hashCode() {
return Objects.hash(super.hashCode(), protocol);
}
@Override
public String toString() {
return super.toString() + CommonConstants.GROUP_CHAR_SEPARATOR + protocol;
}
public static class Matcher {
public static boolean isMatch(ProtocolServiceKey rule, ProtocolServiceKey target) {
// 1. 2. 3. match interface / version / group
if (!ServiceKey.Matcher.isMatch(rule, target)) {
return false;
}
// 4.match protocol
// 4.1. if rule group is *, match all
if (!CommonConstants.ANY_VALUE.equals(rule.getProtocol())) {
// 4.2. if rule protocol is null, match all
if (StringUtils.isNotEmpty(rule.getProtocol())) {
// 4.3. if rule protocol contains ',', split and match each
if (rule.getProtocol().contains(CommonConstants.COMMA_SEPARATOR)) {
String[] protocols = rule.getProtocol().split("\\" +CommonConstants.COMMA_SEPARATOR, -1);
boolean match = false;
for (String protocol : protocols) {
protocol = protocol.trim();
if (StringUtils.isEmpty(protocol) && StringUtils.isEmpty(target.getProtocol())) {
match = true;
break;
} else if (protocol.equals(target.getProtocol())) {
match = true;
break;
}
}
if (!match) {
return false;
}
}
// 4.3. if rule protocol is not contains ',', match directly
else if (!Objects.equals(rule.getProtocol(), target.getProtocol())) {
return false;
}
}
}
return true;
}
}
}