package act.controller.meta; /*- * #%L * ACT Framework * %% * Copyright (C) 2014 - 2017 ActFramework * %% * 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. * #L% */ import act.Constants; import act.handler.builtin.controller.Handler; import org.osgl.util.C; import org.osgl.util.S; import java.util.Set; import static act.app.App.logger; /** * Stores all method level information needed to generate * {@link Handler interceptors} */ public class InterceptorMethodMetaInfo extends HandlerMethodMetaInfo<InterceptorMethodMetaInfo> implements Comparable<InterceptorMethodMetaInfo> { private Set<String> whiteList = C.newSet(); private Set<String> blackList = C.newSet(); private int priority; protected InterceptorMethodMetaInfo(InterceptorMethodMetaInfo copy, ControllerClassMetaInfo clsInfo) { super(copy, clsInfo); this.whiteList = copy.whiteList; this.blackList = copy.blackList; this.priority = copy.priority; } public InterceptorMethodMetaInfo(ControllerClassMetaInfo clsInfo) { super(clsInfo); } @Override protected void releaseResources() { whiteList.clear(); blackList.clear(); super.releaseResources(); } public InterceptorMethodMetaInfo addOnly(String... only) { if (!blackList.isEmpty()) { logger.warn("Both [only] and [except] list are used for interceptor method[%s]. You should use only one", name()); } return addTo(whiteList, only); } public InterceptorMethodMetaInfo addExcept(String... except) { if (!whiteList.isEmpty()) { logger.warn("Both [only] and [except] list are used for interceptor method[%s]. You should use only one", name()); // when white list is used, black list is ignored return this; } return addTo(blackList, except); } public InterceptorMethodMetaInfo priority(int priority) { this.priority = priority; return this; } public int priority() { return priority; } public Set<String> whiteList() { return C.set(whiteList); } public Set<String> blackList() { return C.set(blackList); } void mergeInto(C.List<InterceptorMethodMetaInfo> list, String targetName) { if (whiteList.contains(targetName) || !blackList.contains(targetName)) { if (!list.contains(this)) { list.add(this); } } } private InterceptorMethodMetaInfo addTo(Set<String> set, String... strings) { int len = strings.length; if (len == 0) { return this; } for (int i = 0; i < len; ++i) { String[] sa = strings[i].split(Constants.LIST_SEPARATOR); int saLen = sa.length; for (int j = 0; j < saLen; ++j) { set.add(sa[j]); } } return this; } @Override public String toString() { return toStrBuffer(S.newBuffer()).toString(); } @Override protected S.Buffer toStrBuffer(S.Buffer sb) { S.Buffer prependix = S.newBuffer(); if (0 != priority) { prependix.append("p[") .append(priority).append("] "); } if (!whiteList.isEmpty()) { prependix.append("+").append(whiteList).append(" "); } if (!blackList.isEmpty()) { prependix.append("-").append(blackList).append(" "); } return super.toStrBuffer(sb).prepend(prependix); } @Override public int compareTo(InterceptorMethodMetaInfo o) { return o.priority - priority; } public final InterceptorMethodMetaInfo extended(ControllerClassMetaInfo clsInfo) { if (clsInfo.isMyAncestor(this.classInfo()) && !this.isStatic()) { return doExtend(clsInfo); } else { return this; } } protected InterceptorMethodMetaInfo doExtend(ControllerClassMetaInfo clsInfo) { return new InterceptorMethodMetaInfo(this, clsInfo); } }