Search in sources :

Example 6 with DefaultAnyValue

use of org.redkale.util.AnyValue.DefaultAnyValue 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 7 with DefaultAnyValue

use of org.redkale.util.AnyValue.DefaultAnyValue 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 8 with DefaultAnyValue

use of org.redkale.util.AnyValue.DefaultAnyValue 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 9 with DefaultAnyValue

use of org.redkale.util.AnyValue.DefaultAnyValue in project redkale by redkale.

the class XmlReader method readStartTag.

protected void readStartTag(DefaultAnyValue root) {
    final int start = this.position;
    boolean hasattr = false;
    boolean endtag = false;
    char ch = nextGoodChar();
    for (; ; ) {
        if (ch == '>') {
            break;
        } else if (ch == '/') {
            endtag = true;
            break;
        } else if (ch <= ' ') {
            hasattr = true;
            break;
        }
        ch = nextChar();
    }
    final String tag = new String(this.text, start, this.position - start).trim();
    DefaultAnyValue config = DefaultAnyValue.create();
    TagNode tagNode = new TagNode(tag, config);
    if (tags.isEmpty()) {
        root.addValue(tag, tagNode.config);
    } else {
        tags.getFirst().config.addValue(tag, tagNode.config);
    }
    if (hasattr)
        endtag = readTagAttribute(tag, config);
    if (endtag) {
        if (nextChar() != '>')
            throw newException("expected /> for tag end");
        return;
    }
    tags.addFirst(tagNode);
}
Also used : DefaultAnyValue(org.redkale.util.AnyValue.DefaultAnyValue)

Example 10 with DefaultAnyValue

use of org.redkale.util.AnyValue.DefaultAnyValue in project redkale by redkale.

the class TransportTest method main.

public static void main(String[] args) throws Throwable {
    System.setProperty("net.transport.checkinterval", "2");
    List<InetSocketAddress> addrs = new ArrayList<>();
    addrs.add(new InetSocketAddress("127.0.0.1", 22001));
    addrs.add(new InetSocketAddress("127.0.0.1", 22002));
    addrs.add(new InetSocketAddress("127.0.0.1", 22003));
    addrs.add(new InetSocketAddress("127.0.0.1", 22004));
    for (InetSocketAddress servaddr : addrs) {
        // if (servaddr.getPort() % 100 == 4) continue;
        HttpServer server = new HttpServer();
        DefaultAnyValue servconf = DefaultAnyValue.create("port", servaddr.getPort());
        server.init(servconf);
        server.start();
    }
    addrs.add(new InetSocketAddress("127.0.0.1", 22005));
    final AsyncIOGroup asyncGroup = new AsyncIOGroup(8192, 16);
    asyncGroup.start();
    Thread.sleep(1000);
    TransportFactory factory = TransportFactory.create(asyncGroup, 0, 0);
    DefaultAnyValue conf = DefaultAnyValue.create(TransportFactory.NAME_PINGINTERVAL, 5);
    factory.init(conf, Sncp.PING_BUFFER, Sncp.PONG_BUFFER.remaining());
    Transport transport = factory.createTransportTCP("", null, addrs);
    System.out.println(String.format(format, System.currentTimeMillis()));
    try {
        CountDownLatch cdl = new CountDownLatch(20);
        for (int i = 0; i < 20; i++) {
            transport.pollConnection(null).whenComplete((r, t) -> {
                cdl.countDown();
                System.out.println("连接: " + r.getRemoteAddress());
            });
        }
        cdl.await();
        HttpServer server = new HttpServer();
        DefaultAnyValue servconf = DefaultAnyValue.create("port", 22005);
        server.init(servconf);
        server.start();
        Thread.sleep(4000);
        CountDownLatch cdl2 = new CountDownLatch(20);
        for (int i = 0; i < 20; i++) {
            transport.pollConnection(null).whenComplete((r, t) -> {
                cdl2.countDown();
                System.out.println("连接: " + r.getRemoteAddress());
            });
        }
        cdl2.await();
    } finally {
        System.out.println(String.format(format, System.currentTimeMillis()));
    }
}
Also used : InetSocketAddress(java.net.InetSocketAddress) HttpServer(org.redkale.net.http.HttpServer) DefaultAnyValue(org.redkale.util.AnyValue.DefaultAnyValue) CountDownLatch(java.util.concurrent.CountDownLatch)

Aggregations

DefaultAnyValue (org.redkale.util.AnyValue.DefaultAnyValue)18 FilterEntry (org.redkale.boot.ClassFilter.FilterEntry)6 java.io (java.io)1 IOException (java.io.IOException)1 java.lang.reflect (java.lang.reflect)1 java.net (java.net)1 InetSocketAddress (java.net.InetSocketAddress)1 HttpClient (java.net.http.HttpClient)1 ByteBuffer (java.nio.ByteBuffer)1 java.nio.channels (java.nio.channels)1 AsynchronousSocketChannel (java.nio.channels.AsynchronousSocketChannel)1 StandardCharsets (java.nio.charset.StandardCharsets)1 Path (java.nio.file.Path)1 java.util (java.util)1 java.util.concurrent (java.util.concurrent)1 CountDownLatch (java.util.concurrent.CountDownLatch)1 java.util.concurrent.atomic (java.util.concurrent.atomic)1 java.util.logging (java.util.logging)1 javax.annotation (javax.annotation)1 SSLContext (javax.net.ssl.SSLContext)1