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.app.App; import act.asm.Type; import act.util.ClassInfoRepository; import act.util.ClassNode; import org.osgl.util.C; import org.osgl.util.S; import java.util.List; public class ActionMethodMetaInfo extends HandlerMethodMetaInfo<ActionMethodMetaInfo> { private GroupInterceptorMetaInfo interceptors = new GroupInterceptorMetaInfo(); private C.Set<String> withList = C.newSet(); public ActionMethodMetaInfo(ControllerClassMetaInfo classMetaInfo) { super(classMetaInfo); } public ActionMethodMetaInfo(ActionMethodMetaInfo parentAction, ControllerClassMetaInfo thisClass) { super(parentAction, thisClass); } public ActionMethodMetaInfo addWith(String... classes) { int len = classes.length; if (len > 0) { for (int i = 0; i < len; ++i) { _addWith(classes[i]); } } return this; } @Override protected void releaseResources() { withList.clear(); interceptors.destroy(); super.releaseResources(); } public HandlerMethodMetaInfo merge(ControllerClassMetaInfoManager infoBase, App app) { mergeFromWithList(infoBase, app); return this; } public ActionMethodMetaInfo mergeFromClassInterceptors(GroupInterceptorMetaInfo info) { interceptors.mergeFrom(info, name()); return this; } public GroupInterceptorMetaInfo interceptors() { return interceptors; } public List<InterceptorMethodMetaInfo> beforeInterceptors() { return interceptors.beforeList(); } public List<InterceptorMethodMetaInfo> afterInterceptors() { return interceptors.afterList(); } public List<CatchMethodMetaInfo> exceptionInterceptors() { return interceptors.catchList(); } public List<InterceptorMethodMetaInfo> finallyInterceptors() { return interceptors.finallyList(); } @Override public String toString() { return toStrBuffer(S.newBuffer()).toString(); } @Override protected S.Buffer toStrBuffer(S.Buffer buffer) { return super.toStrBuffer(buffer).append("\n").append(interceptors); } private void _addWith(String clsName) { withList.add(Type.getType(clsName).getClassName()); } private void mergeFromWithList(final ControllerClassMetaInfoManager infoBase, final App app) { C.Set<String> withClasses = this.withList; if (withClasses.isEmpty()) { return; } ClassInfoRepository repo = app.classLoader().classInfoRepository(); for (final String withClass : withClasses) { String curWithClass = withClass; ControllerClassMetaInfo withClassInfo = infoBase.controllerMetaInfo(curWithClass); while (null == withClassInfo && !"java.lang.Object".equals(curWithClass)) { ClassNode node = repo.node(curWithClass); if (null != node) { node = node.parent(); } if (null == node) { break; } curWithClass = node.name(); withClassInfo = infoBase.controllerMetaInfo(curWithClass); } if (null != withClassInfo) { withClassInfo.merge(infoBase, app); interceptors.mergeFrom(withClassInfo.interceptors); } } } }