Search in sources :

Example 1 with FilterEntry

use of org.redkale.boot.ClassFilter.FilterEntry in project redkale by redkale.

the class NodeHttpServer method loadHttpServlet.

@SuppressWarnings("unchecked")
protected void loadHttpServlet(final ClassFilter<? extends Servlet> servletFilter, ClassFilter<? extends WebSocket> webSocketFilter) throws Exception {
    RedkaleClassLoader.putReflectionPublicClasses(HttpServlet.class.getName());
    RedkaleClassLoader.putReflectionPublicClasses(HttpPrepareServlet.class.getName());
    RedkaleClassLoader.putReflectionDeclaredConstructors(HttpResourceServlet.class, HttpResourceServlet.class.getName());
    final AnyValue servletsConf = this.serverConf.getAnyValue("servlets");
    final StringBuilder sb = logger.isLoggable(Level.INFO) ? new StringBuilder() : null;
    String prefix0 = servletsConf == null ? "" : servletsConf.getValue("path", "");
    if (!prefix0.isEmpty() && prefix0.charAt(prefix0.length() - 1) == '/')
        prefix0 = prefix0.substring(0, prefix0.length() - 1);
    if (!prefix0.isEmpty() && prefix0.charAt(0) != '/')
        prefix0 = '/' + prefix0;
    final String prefix = prefix0;
    final String localThreadName = "[" + Thread.currentThread().getName() + "] ";
    List<FilterEntry<? extends Servlet>> list = new ArrayList(servletFilter.getFilterEntrys());
    list.sort((FilterEntry<? extends Servlet> o1, FilterEntry<? extends Servlet> o2) -> {
        // 必须保证WebSocketServlet优先加载, 因为要确保其他的HttpServlet可以注入本地模式的WebSocketNode
        boolean ws1 = WebSocketServlet.class.isAssignableFrom(o1.getType());
        boolean ws2 = WebSocketServlet.class.isAssignableFrom(o2.getType());
        if (ws1 == ws2) {
            Priority p1 = o1.getType().getAnnotation(Priority.class);
            Priority p2 = o2.getType().getAnnotation(Priority.class);
            int v = (p2 == null ? 0 : p2.value()) - (p1 == null ? 0 : p1.value());
            return v == 0 ? o1.getType().getName().compareTo(o2.getType().getName()) : 0;
        }
        return ws1 ? -1 : 1;
    });
    final long starts = System.currentTimeMillis();
    final List<AbstractMap.SimpleEntry<String, String[]>> ss = sb == null ? null : new ArrayList<>();
    for (FilterEntry<? extends Servlet> en : list) {
        Class<HttpServlet> clazz = (Class<HttpServlet>) en.getType();
        if (Modifier.isAbstract(clazz.getModifiers()))
            continue;
        // 动态生成的跳过
        if (clazz.getAnnotation(Rest.RestDyn.class) != null)
            continue;
        WebServlet ws = clazz.getAnnotation(WebServlet.class);
        if (ws == null)
            continue;
        if (ws.value().length == 0) {
            logger.log(Level.INFO, "not found @WebServlet.value in " + clazz.getName());
            continue;
        }
        RedkaleClassLoader.putReflectionDeclaredConstructors(clazz, clazz.getName());
        final HttpServlet servlet = clazz.getDeclaredConstructor().newInstance();
        resourceFactory.inject(servlet, this);
        final String[] mappings = ws.value();
        String pref = ws.repair() ? prefix : "";
        DefaultAnyValue servletConf = (DefaultAnyValue) en.getProperty();
        this.httpServer.addHttpServlet(servlet, pref, servletConf, mappings);
        if (ss != null) {
            for (int i = 0; i < mappings.length; i++) {
                mappings[i] = pref + mappings[i];
            }
            ss.add(new AbstractMap.SimpleEntry<>("HttpServlet    (type=" + clazz.getName() + ")", mappings));
        }
    }
    final List<AbstractMap.SimpleEntry<String, String[]>> rests = sb == null ? null : new ArrayList<>();
    final List<AbstractMap.SimpleEntry<String, String[]>> webss = sb == null ? null : new ArrayList<>();
    if (rest && serverConf != null) {
        final List<Object> restedObjects = new ArrayList<>();
        for (AnyValue restConf : serverConf.getAnyValues("rest")) {
            loadRestServlet(webSocketFilter, restConf, restedObjects, sb, rests, webss);
        }
    }
    int max = 0;
    if (ss != null && sb != null) {
        int maxTypeLength = 0;
        int maxNameLength = 0;
        if (rests != null) {
            for (AbstractMap.SimpleEntry<String, String[]> en : rests) {
                int pos = en.getKey().indexOf('#');
                if (pos > maxTypeLength)
                    maxTypeLength = pos;
                int len = en.getKey().length() - pos - 1;
                if (len > maxNameLength)
                    maxNameLength = len;
            }
        }
        if (webss != null) {
            for (AbstractMap.SimpleEntry<String, String[]> en : webss) {
                int pos = en.getKey().indexOf('#');
                if (pos > maxTypeLength)
                    maxTypeLength = pos;
                int len = en.getKey().length() - pos - 1;
                if (len > maxNameLength)
                    maxNameLength = len;
            }
        }
        if (rests != null) {
            for (AbstractMap.SimpleEntry<String, String[]> en : rests) {
                StringBuilder sub = new StringBuilder();
                int pos = en.getKey().indexOf('#');
                sub.append("RestDynServlet (type=").append(en.getKey().substring(0, pos));
                for (int i = 0; i < maxTypeLength - pos; i++) {
                    sub.append(' ');
                }
                sub.append(", name='").append(en.getKey().substring(pos + 1));
                for (int i = 0; i < maxNameLength - pos; i++) {
                    sub.append(' ');
                }
                sub.append("')");
                ss.add(new AbstractMap.SimpleEntry<>(sub.toString(), en.getValue()));
            }
        }
        if (webss != null) {
            for (AbstractMap.SimpleEntry<String, String[]> en : webss) {
                StringBuilder sub = new StringBuilder();
                int pos = en.getKey().indexOf('#');
                sub.append("RestWebSocket  (type=").append(en.getKey().substring(0, pos));
                for (int i = 0; i < maxTypeLength - pos; i++) {
                    sub.append(' ');
                }
                sub.append(", name='").append(en.getKey().substring(pos + 1));
                for (int i = 0; i < maxNameLength - pos; i++) {
                    sub.append(' ');
                }
                sub.append("')");
                ss.add(new AbstractMap.SimpleEntry<>(sub.toString(), en.getValue()));
            }
        }
        ss.sort((AbstractMap.SimpleEntry<String, String[]> o1, AbstractMap.SimpleEntry<String, String[]> o2) -> o1.getKey().compareTo(o2.getKey()));
        for (AbstractMap.SimpleEntry<String, String[]> as : ss) {
            if (as.getKey().length() > max)
                max = as.getKey().length();
        }
        for (AbstractMap.SimpleEntry<String, String[]> as : ss) {
            sb.append(localThreadName).append("Load ").append(as.getKey());
            for (int i = 0; i < max - as.getKey().length(); i++) {
                sb.append(' ');
            }
            sb.append("  mapping to  ").append(Arrays.toString(as.getValue())).append(LINE_SEPARATOR);
        }
        sb.append(localThreadName).append("All HttpServlets load cost ").append(System.currentTimeMillis() - starts).append(" ms").append(LINE_SEPARATOR);
    }
    if (sb != null && sb.length() > 0)
        logger.log(Level.INFO, sb.toString().trim());
}
Also used : FilterEntry(org.redkale.boot.ClassFilter.FilterEntry) DefaultAnyValue(org.redkale.util.AnyValue.DefaultAnyValue) DefaultAnyValue(org.redkale.util.AnyValue.DefaultAnyValue)

Example 2 with FilterEntry

use of org.redkale.boot.ClassFilter.FilterEntry in project redkale by redkale.

the class NodeHttpServer method loadHttpFilter.

@SuppressWarnings("unchecked")
protected void loadHttpFilter(final AnyValue filtersConf, final ClassFilter<? extends Filter> classFilter) throws Exception {
    final StringBuilder sb = logger.isLoggable(Level.INFO) ? new StringBuilder() : null;
    final String localThreadName = "[" + Thread.currentThread().getName() + "] ";
    List<FilterEntry<? extends Filter>> list = new ArrayList(classFilter.getFilterEntrys());
    for (FilterEntry<? extends Filter> en : list) {
        Class<HttpFilter> clazz = (Class<HttpFilter>) en.getType();
        if (Modifier.isAbstract(clazz.getModifiers()))
            continue;
        RedkaleClassLoader.putReflectionDeclaredConstructors(clazz, clazz.getName());
        final HttpFilter filter = clazz.getDeclaredConstructor().newInstance();
        resourceFactory.inject(filter, this);
        DefaultAnyValue filterConf = (DefaultAnyValue) en.getProperty();
        this.httpServer.addHttpFilter(filter, filterConf);
        if (sb != null)
            sb.append(localThreadName).append(" Load ").append(clazz.getName()).append(LINE_SEPARATOR);
    }
    if (sb != null && sb.length() > 0)
        logger.log(Level.INFO, sb.toString());
}
Also used : FilterEntry(org.redkale.boot.ClassFilter.FilterEntry) DefaultAnyValue(org.redkale.util.AnyValue.DefaultAnyValue)

Example 3 with FilterEntry

use of org.redkale.boot.ClassFilter.FilterEntry in project redkale by redkale.

the class NodeHttpServer method loadRestServlet.

@SuppressWarnings("unchecked")
protected void loadRestServlet(final ClassFilter<? extends WebSocket> webSocketFilter, final AnyValue restConf, final List<Object> restedObjects, final StringBuilder sb, final List<AbstractMap.SimpleEntry<String, String[]>> rests, final List<AbstractMap.SimpleEntry<String, String[]>> webss) throws Exception {
    if (!rest)
        return;
    // 不存在REST服务
    if (restConf == null)
        return;
    String prefix0 = restConf.getValue("path", "");
    if (!prefix0.isEmpty() && prefix0.charAt(prefix0.length() - 1) == '/')
        prefix0 = prefix0.substring(0, prefix0.length() - 1);
    if (!prefix0.isEmpty() && prefix0.charAt(0) != '/')
        prefix0 = '/' + prefix0;
    final String localThreadName = "[" + Thread.currentThread().getName() + "] ";
    String mqname = restConf.getValue("mq");
    MessageAgent agent0 = null;
    if (mqname != null) {
        agent0 = application.getMessageAgent(mqname);
        if (agent0 == null)
            throw new RuntimeException("not found " + MessageAgent.class.getSimpleName() + " config for (name=" + mqname + ")");
    }
    final MessageAgent messageAgent = agent0;
    // 开启MQ时,prefix字段失效
    if (messageAgent != null)
        prefix0 = "";
    final String prefix = prefix0;
    final boolean autoload = restConf.getBoolValue("autoload", true);
    {
        // 加载RestService
        String userTypeStr = restConf.getValue("usertype");
        final Class userType = userTypeStr == null ? null : this.serverClassLoader.loadClass(userTypeStr);
        final Class baseServletType = this.serverClassLoader.loadClass(restConf.getValue("base", HttpServlet.class.getName()));
        final Set<String> includeValues = new HashSet<>();
        final Set<String> excludeValues = new HashSet<>();
        for (AnyValue item : restConf.getAnyValues("service")) {
            if (item.getBoolValue("ignore", false)) {
                excludeValues.add(item.getValue("value", ""));
            } else {
                includeValues.add(item.getValue("value", ""));
            }
        }
        final ClassFilter restFilter = ClassFilter.create(serverClassLoader, null, application.isCompileMode() ? "" : restConf.getValue("includes", ""), application.isCompileMode() ? "" : restConf.getValue("excludes", ""), includeValues, excludeValues);
        final CountDownLatch scdl = new CountDownLatch(super.interceptorServices.size());
        Stream<Service> stream = super.interceptorServices.stream();
        // 不能并行,否则在maven plugin运行环境下ClassLoader不对
        if (!application.isCompileMode())
            stream = stream.parallel();
        stream.forEach((service) -> {
            try {
                final Class stype = Sncp.getServiceType(service);
                final String name = Sncp.getResourceName(service);
                RestService rs = (RestService) stype.getAnnotation(RestService.class);
                if (rs == null || rs.ignore())
                    return;
                final String stypename = stype.getName();
                if (!autoload && !includeValues.contains(stypename))
                    return;
                if (!restFilter.accept(stypename))
                    return;
                synchronized (restedObjects) {
                    if (restedObjects.contains(service)) {
                        logger.log(Level.WARNING, stype.getName() + " repeat create rest servlet, so ignore");
                        return;
                    }
                    // 避免重复创建Rest对象
                    restedObjects.add(service);
                }
                HttpServlet servlet = httpServer.addRestServlet(serverClassLoader, service, userType, baseServletType, prefix);
                // 没有HttpMapping方法的HttpServlet调用Rest.createRestServlet就会返回null
                if (servlet == null)
                    return;
                String prefix2 = prefix;
                WebServlet ws = servlet.getClass().getAnnotation(WebServlet.class);
                if (ws != null && !ws.repair())
                    prefix2 = "";
                resourceFactory.inject(servlet, NodeHttpServer.this);
                dynServletMap.put(service, servlet);
                if (messageAgent != null)
                    messageAgent.putService(this, service, servlet);
                // if (finest) logger.finest(localThreadName + " Create RestServlet(resource.name='" + name + "') = " + servlet);
                if (rests != null) {
                    String[] mappings = servlet.getClass().getAnnotation(WebServlet.class).value();
                    for (int i = 0; i < mappings.length; i++) {
                        mappings[i] = prefix2 + mappings[i];
                    }
                    synchronized (rests) {
                        rests.add(new AbstractMap.SimpleEntry<>(Sncp.getServiceType(service).getName() + "#" + name, mappings));
                    }
                }
            } finally {
                scdl.countDown();
            }
        });
        scdl.await();
    }
    if (webSocketFilter != null) {
        // 加载RestWebSocket
        final Set<String> includeValues = new HashSet<>();
        final Set<String> excludeValues = new HashSet<>();
        for (AnyValue item : restConf.getAnyValues("websocket")) {
            if (item.getBoolValue("ignore", false)) {
                excludeValues.add(item.getValue("value", ""));
            } else {
                includeValues.add(item.getValue("value", ""));
            }
        }
        final ClassFilter restFilter = ClassFilter.create(serverClassLoader, null, application.isCompileMode() ? "" : restConf.getValue("includes", ""), application.isCompileMode() ? "" : restConf.getValue("excludes", ""), includeValues, excludeValues);
        final boolean finest = logger.isLoggable(Level.FINEST);
        List<FilterEntry<? extends WebSocket>> list = new ArrayList(webSocketFilter.getFilterEntrys());
        for (FilterEntry<? extends WebSocket> en : list) {
            Class<WebSocket> clazz = (Class<WebSocket>) en.getType();
            if (Modifier.isAbstract(clazz.getModifiers())) {
                logger.log(Level.FINE, clazz.getName() + " cannot abstract on rest websocket, so ignore");
                continue;
            }
            if (Modifier.isFinal(clazz.getModifiers())) {
                logger.log(Level.FINE, clazz.getName() + " cannot final on rest websocket, so ignore");
                continue;
            }
            final Class<? extends WebSocket> stype = en.getType();
            if (stype.getAnnotation(Rest.RestDyn.class) != null)
                continue;
            RestWebSocket rs = stype.getAnnotation(RestWebSocket.class);
            if (rs == null || rs.ignore())
                continue;
            final String stypename = stype.getName();
            if (!autoload && !includeValues.contains(stypename))
                continue;
            if (!restFilter.accept(stypename))
                continue;
            if (restedObjects.contains(stype)) {
                logger.log(Level.WARNING, stype.getName() + " repeat create rest websocket, so ignore");
                continue;
            }
            // 避免重复创建Rest对象
            restedObjects.add(stype);
            WebSocketServlet servlet = httpServer.addRestWebSocketServlet(serverClassLoader, stype, messageAgent, prefix, en.getProperty());
            // 没有RestOnMessage方法的HttpServlet调用Rest.createRestWebSocketServlet就会返回null
            if (servlet == null)
                continue;
            String prefix2 = prefix;
            WebServlet ws = servlet.getClass().getAnnotation(WebServlet.class);
            if (ws != null && !ws.repair())
                prefix2 = "";
            resourceFactory.inject(servlet, NodeHttpServer.this);
            if (finest)
                logger.finest(localThreadName + " " + stype.getName() + " create a RestWebSocketServlet");
            if (webss != null) {
                String[] mappings = servlet.getClass().getAnnotation(WebServlet.class).value();
                for (int i = 0; i < mappings.length; i++) {
                    mappings[i] = prefix2 + mappings[i];
                }
                synchronized (webss) {
                    webss.add(new AbstractMap.SimpleEntry<>(stype.getName() + "#" + rs.name(), mappings));
                }
            }
        }
    }
    if (messageAgent != null)
        this.messageAgents.put(messageAgent.getName(), messageAgent);
}
Also used : java.lang.reflect(java.lang.reflect) java.util(java.util) org.redkale.watch(org.redkale.watch) org.redkale.net(org.redkale.net) Level(java.util.logging.Level) javax.annotation(javax.annotation) CountDownLatch(java.util.concurrent.CountDownLatch) org.redkale.util(org.redkale.util) java.net(java.net) Stream(java.util.stream.Stream) RESNAME_SNCP_ADDR(org.redkale.boot.Application.RESNAME_SNCP_ADDR) org.redkale.net.http(org.redkale.net.http) DefaultAnyValue(org.redkale.util.AnyValue.DefaultAnyValue) Annotation(java.lang.annotation.Annotation) ClusterAgent(org.redkale.cluster.ClusterAgent) Sncp(org.redkale.net.sncp.Sncp) MessageAgent(org.redkale.mq.MessageAgent) org.redkale.service(org.redkale.service) FilterEntry(org.redkale.boot.ClassFilter.FilterEntry) FilterEntry(org.redkale.boot.ClassFilter.FilterEntry) Stream(java.util.stream.Stream) MessageAgent(org.redkale.mq.MessageAgent) CountDownLatch(java.util.concurrent.CountDownLatch) DefaultAnyValue(org.redkale.util.AnyValue.DefaultAnyValue)

Example 4 with FilterEntry

use of org.redkale.boot.ClassFilter.FilterEntry in project redkale by redkale.

the class NodeSncpServer method loadSncpFilter.

@SuppressWarnings("unchecked")
protected void loadSncpFilter(final AnyValue servletsConf, final ClassFilter<? extends Filter> classFilter) throws Exception {
    final StringBuilder sb = logger.isLoggable(Level.INFO) ? new StringBuilder() : null;
    final String localThreadName = "[" + Thread.currentThread().getName() + "] ";
    List<FilterEntry<? extends Filter>> list = new ArrayList(classFilter.getFilterEntrys());
    for (FilterEntry<? extends Filter> en : list) {
        Class<SncpFilter> clazz = (Class<SncpFilter>) en.getType();
        if (Modifier.isAbstract(clazz.getModifiers()))
            continue;
        RedkaleClassLoader.putReflectionDeclaredConstructors(clazz, clazz.getName());
        final SncpFilter filter = clazz.getDeclaredConstructor().newInstance();
        resourceFactory.inject(filter, this);
        DefaultAnyValue filterConf = (DefaultAnyValue) en.getProperty();
        this.sncpServer.addSncpFilter(filter, filterConf);
        if (sb != null)
            sb.append(localThreadName).append(" Load ").append(clazz.getName()).append(LINE_SEPARATOR);
    }
    if (sb != null && sb.length() > 0)
        logger.log(Level.INFO, sb.toString());
}
Also used : FilterEntry(org.redkale.boot.ClassFilter.FilterEntry) DefaultAnyValue(org.redkale.util.AnyValue.DefaultAnyValue)

Example 5 with FilterEntry

use of org.redkale.boot.ClassFilter.FilterEntry in project redkale by redkale.

the class NodeHttpServer method loadRestServlet.

@SuppressWarnings("unchecked")
protected void loadRestServlet(final ClassFilter<? extends WebSocket> webSocketFilter, final AnyValue restConf, final List<Object> restedObjects, final StringBuilder sb) throws Exception {
    if (!rest)
        return;
    // 不存在REST服务
    if (restConf == null)
        return;
    String prefix0 = restConf.getValue("path", "");
    if (!prefix0.isEmpty() && prefix0.charAt(prefix0.length() - 1) == '/')
        prefix0 = prefix0.substring(0, prefix0.length() - 1);
    if (!prefix0.isEmpty() && prefix0.charAt(0) != '/')
        prefix0 = '/' + prefix0;
    final String prefix = prefix0;
    final String threadName = "[" + Thread.currentThread().getName() + "] ";
    final List<AbstractMap.SimpleEntry<String, String[]>> ss = sb == null ? null : new ArrayList<>();
    final boolean autoload = restConf.getBoolValue("autoload", true);
    {
        // 加载RestService
        String userTypeStr = restConf.getValue("usertype");
        final Class userType = userTypeStr == null ? null : this.serverClassLoader.loadClass(userTypeStr);
        final Class baseServletType = this.serverClassLoader.loadClass(restConf.getValue("base", HttpServlet.class.getName()));
        final Set<String> includeValues = new HashSet<>();
        final Set<String> excludeValues = new HashSet<>();
        for (AnyValue item : restConf.getAnyValues("service")) {
            if (item.getBoolValue("ignore", false)) {
                excludeValues.add(item.getValue("value", ""));
            } else {
                includeValues.add(item.getValue("value", ""));
            }
        }
        final ClassFilter restFilter = ClassFilter.create(null, restConf.getValue("includes", ""), restConf.getValue("excludes", ""), includeValues, excludeValues);
        final boolean finest = logger.isLoggable(Level.FINEST);
        super.interceptorServices.forEach((service) -> {
            final Class stype = Sncp.getServiceType(service);
            final String name = Sncp.getResourceName(service);
            RestService rs = (RestService) stype.getAnnotation(RestService.class);
            if (rs == null || rs.ignore())
                return;
            final String stypename = stype.getName();
            if (!autoload && !includeValues.contains(stypename))
                return;
            if (!restFilter.accept(stypename))
                return;
            if (restedObjects.contains(service)) {
                logger.log(Level.WARNING, stype.getName() + " repeat create rest servlet, so ignore");
                return;
            }
            // 避免重复创建Rest对象
            restedObjects.add(service);
            HttpServlet servlet = httpServer.addRestServlet(serverClassLoader, service, userType, baseServletType, prefix);
            // 没有HttpMapping方法的HttpServlet调用Rest.createRestServlet就会返回null
            if (servlet == null)
                return;
            String prefix2 = prefix;
            WebServlet ws = servlet.getClass().getAnnotation(WebServlet.class);
            if (ws != null && !ws.repair())
                prefix2 = "";
            resourceFactory.inject(servlet, NodeHttpServer.this);
            if (finest)
                logger.finest(threadName + " Create RestServlet(resource.name='" + name + "') = " + servlet);
            if (ss != null) {
                String[] mappings = servlet.getClass().getAnnotation(WebServlet.class).value();
                for (int i = 0; i < mappings.length; i++) {
                    mappings[i] = prefix2 + mappings[i];
                }
                ss.add(new AbstractMap.SimpleEntry<>(servlet.getClass().getName(), mappings));
            }
        });
    }
    if (webSocketFilter != null) {
        // 加载RestWebSocket
        final Set<String> includeValues = new HashSet<>();
        final Set<String> excludeValues = new HashSet<>();
        for (AnyValue item : restConf.getAnyValues("websocket")) {
            if (item.getBoolValue("ignore", false)) {
                excludeValues.add(item.getValue("value", ""));
            } else {
                includeValues.add(item.getValue("value", ""));
            }
        }
        final ClassFilter restFilter = ClassFilter.create(null, restConf.getValue("includes", ""), restConf.getValue("excludes", ""), includeValues, excludeValues);
        final boolean finest = logger.isLoggable(Level.FINEST);
        List<FilterEntry<? extends WebSocket>> list = new ArrayList(webSocketFilter.getFilterEntrys());
        for (FilterEntry<? extends WebSocket> en : list) {
            Class<WebSocket> clazz = (Class<WebSocket>) en.getType();
            if (Modifier.isAbstract(clazz.getModifiers())) {
                logger.log(Level.FINE, clazz.getName() + " cannot abstract on rest websocket, so ignore");
                continue;
            }
            if (Modifier.isFinal(clazz.getModifiers())) {
                logger.log(Level.FINE, clazz.getName() + " cannot final on rest websocket, so ignore");
                continue;
            }
            final Class<? extends WebSocket> stype = en.getType();
            RestWebSocket rs = stype.getAnnotation(RestWebSocket.class);
            if (rs == null || rs.ignore())
                return;
            final String stypename = stype.getName();
            if (!autoload && !includeValues.contains(stypename))
                return;
            if (!restFilter.accept(stypename))
                return;
            if (restedObjects.contains(stype)) {
                logger.log(Level.WARNING, stype.getName() + " repeat create rest websocket, so ignore");
                return;
            }
            // 避免重复创建Rest对象
            restedObjects.add(stype);
            HttpServlet servlet = httpServer.addRestWebSocketServlet(serverClassLoader, stype, prefix, en.getProperty());
            // 没有RestOnMessage方法的HttpServlet调用Rest.createRestWebSocketServlet就会返回null
            if (servlet == null)
                return;
            String prefix2 = prefix;
            WebServlet ws = servlet.getClass().getAnnotation(WebServlet.class);
            if (ws != null && !ws.repair())
                prefix2 = "";
            resourceFactory.inject(servlet, NodeHttpServer.this);
            if (finest)
                logger.finest(threadName + " " + stype.getName() + " create RestWebSocketServlet " + servlet);
            if (ss != null) {
                String[] mappings = servlet.getClass().getAnnotation(WebServlet.class).value();
                for (int i = 0; i < mappings.length; i++) {
                    mappings[i] = prefix2 + mappings[i];
                }
                ss.add(new AbstractMap.SimpleEntry<>(servlet.getClass().getName(), mappings));
            }
        }
    }
    // 输出信息
    if (ss != null && !ss.isEmpty() && sb != null) {
        Collections.sort(ss, (AbstractMap.SimpleEntry<String, String[]> o1, AbstractMap.SimpleEntry<String, String[]> o2) -> o1.getKey().compareTo(o2.getKey()));
        int max = 0;
        for (AbstractMap.SimpleEntry<String, String[]> as : ss) {
            if (as.getKey().length() > max)
                max = as.getKey().length();
        }
        for (AbstractMap.SimpleEntry<String, String[]> as : ss) {
            sb.append(threadName).append(" Load ").append(as.getKey());
            for (int i = 0; i < max - as.getKey().length(); i++) {
                sb.append(' ');
            }
            sb.append("  mapping to  ").append(Arrays.toString(as.getValue())).append(LINE_SEPARATOR);
        }
    }
}
Also used : java.lang.reflect(java.lang.reflect) java.util(java.util) org.redkale.watch(org.redkale.watch) org.redkale.net(org.redkale.net) Level(java.util.logging.Level) javax.annotation(javax.annotation) org.redkale.util(org.redkale.util) java.net(java.net) RESNAME_SNCP_ADDR(org.redkale.boot.Application.RESNAME_SNCP_ADDR) org.redkale.net.http(org.redkale.net.http) DefaultAnyValue(org.redkale.util.AnyValue.DefaultAnyValue) Annotation(java.lang.annotation.Annotation) Sncp(org.redkale.net.sncp.Sncp) org.redkale.service(org.redkale.service) FilterEntry(org.redkale.boot.ClassFilter.FilterEntry) FilterEntry(org.redkale.boot.ClassFilter.FilterEntry) DefaultAnyValue(org.redkale.util.AnyValue.DefaultAnyValue)

Aggregations

FilterEntry (org.redkale.boot.ClassFilter.FilterEntry)7 DefaultAnyValue (org.redkale.util.AnyValue.DefaultAnyValue)6 Annotation (java.lang.annotation.Annotation)2 java.lang.reflect (java.lang.reflect)2 java.net (java.net)2 java.util (java.util)2 Level (java.util.logging.Level)2 javax.annotation (javax.annotation)2 RESNAME_SNCP_ADDR (org.redkale.boot.Application.RESNAME_SNCP_ADDR)2 org.redkale.net (org.redkale.net)2 org.redkale.net.http (org.redkale.net.http)2 Sncp (org.redkale.net.sncp.Sncp)2 org.redkale.service (org.redkale.service)2 org.redkale.util (org.redkale.util)2 org.redkale.watch (org.redkale.watch)2 CountDownLatch (java.util.concurrent.CountDownLatch)1 Stream (java.util.stream.Stream)1 ClusterAgent (org.redkale.cluster.ClusterAgent)1 Decodeable (org.redkale.convert.Decodeable)1 MessageAgent (org.redkale.mq.MessageAgent)1