/**
* Copyright (C) 2010-2013 Alibaba Group Holding Limited
*
* Licensed 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 com.alibaba.rocketmq.common.filter;
import java.net.URL;
import com.alibaba.rocketmq.common.protocol.heartbeat.SubscriptionData;
/**
* @author shijia.wxr<vintage.wang@gmail.com>
* @since 2013-6-15
*/
public class FilterAPI {
public static String simpleClassName(final String className) {
String simple = className;
int index = className.lastIndexOf(".");
if (index >= 0) {
simple = className.substring(index + 1);
}
return simple;
}
public static URL classFile(final String className) {
final String javaSource = simpleClassName(className) + ".java";
URL url = FilterAPI.class.getClassLoader().getResource(javaSource);
return url;
}
public static boolean isFilterClassMode(final String subString) {
try {
if (subString.contains(".")) {
Class<?> loadClass = FilterAPI.class.getClassLoader().loadClass(subString);
Class<?>[] interfaces = loadClass.getInterfaces();
for (int i = 0; i < interfaces.length; i++) {
if (interfaces[i].getCanonicalName().equals(MessageFilter.class.getCanonicalName())) {
return true;
}
}
}
}
catch (ClassNotFoundException e) {
}
return false;
}
public static SubscriptionData buildSubscriptionData(final String consumerGroup, String topic,
String subString) throws Exception {
SubscriptionData subscriptionData = new SubscriptionData();
subscriptionData.setTopic(topic);
subscriptionData.setSubString(subString);
if (null == subString || subString.equals(SubscriptionData.SUB_ALL) || subString.length() == 0) {
subscriptionData.setSubString(SubscriptionData.SUB_ALL);
}
// eg: com.taobao.abc.FilterClassName
else if (isFilterClassMode(subString)) {
// if (null == classFile(subString)) {
// throw new
// Exception(String.format("The Filter Java Class Source[%s] not exist in class path",
// subString + ".java"));
// }
subscriptionData.setClassFilterMode(true);
}
else {
String[] tags = subString.split("\\|\\|");
if (tags != null && tags.length > 0) {
for (String tag : tags) {
if (tag.length() > 0) {
String trimString = tag.trim();
if (trimString.length() > 0) {
subscriptionData.getTagsSet().add(trimString);
subscriptionData.getCodeSet().add(trimString.hashCode());
}
}
}
}
else {
throw new Exception("subString split error");
}
}
return subscriptionData;
}
}