From f8e20b1292daec7dfd72b33c5d0065935ca7459c Mon Sep 17 00:00:00 2001 From: Maxim Mossienko Date: Thu, 14 Dec 2006 21:13:16 +0300 Subject: [PATCH] IdeaAwareXmlRpc/IdeaAwareWebServer are part of idea module and exposed via PeerFactory --- lib/src/xmlrpc2.src.zip | Bin 124659 -> 122896 bytes lib/xmlrpc-2.0.jar | Bin 118518 -> 116065 bytes .../src/com/intellij/peer/PeerFactory.java | 8 ++ .../intellij/peer/impl/PeerFactoryImpl.java | 13 +++ .../org/apache/xmlrpc/IdeaAwareWebServer.java | 87 ++++++++++++++++++ .../apache/xmlrpc/IdeaAwareXmlRpcServer.java | 40 ++++++++ 6 files changed, 148 insertions(+) create mode 100644 source/org/apache/xmlrpc/IdeaAwareWebServer.java create mode 100644 source/org/apache/xmlrpc/IdeaAwareXmlRpcServer.java diff --git a/lib/src/xmlrpc2.src.zip b/lib/src/xmlrpc2.src.zip index ac027859925022e6717e708b04611f18dc8db547..e43d6c7209d2a6cc43bdf45087e6b926eaa5e7f7 100644 GIT binary patch delta 981 zcmX|9Ye-XZ6u;*`Z9dlRLY7T!i72RKnx$rGt)zTJB|U@!sTA>9Glz^y+J`bwdda0u zMMg_1Lc>sE1evD!AxM+?+MH82H=!?*`9%t{bMM7{y65*e|MUBw|6LwZKj>4x&n**O zUBb<#YHL$9Xv*=zFa%)1C`4el4Z_72)uDKM6cSlMjd-ynOzf!Jf-@2>Gf5bAW3Y#n zG{|+$80=-KW^t)C5(mb}Q>oO^6A*|S#vzkA8f8%?s>UIU^){~&L1Ib^kB)I_tGK^L z?qg+0bqty(h;NhXY}DI8z?BJzV2#h^x$%>rXQno}zA;IsI^W9m$Ry>lbjWqIo$9tu zap^-On(PqI?44+_Lm|7@O`H}r4#;5Ft&&%C_3)@02Mrn>pkx1Rc#zRL-Z>zdd45VD zS}gn(hz*iOUf0Gc3iEPBk%Uzqi>D~=@?VKakk%()zhp@Tw7BS~LMN=pKqsBIr1CR| znJw54g7Bjg_OoWe&#Xi3G^DZS%?eXB4e89HRluiddW6S11qd!uAVvm{;y{hH@szV+ zghDjZaP}islFqQ=1jWzqB9C^4!o1$@XEx!GbM1CbGt_0>sc5}3wCl7?gjqPjn)K2) z8tZ0hWKoXd_?!>C^ot1SnWaWeuAdGT51i8|&zC(%lHsT#8RzI?ai=5@j?HHw6u-|w zV!%QPaJcG&Sk$?JXPQ#n;ih}0mtut*3IcXlk=*x<#z(m*s>cmF)shiVe+{B=n+FnA z!d1ZYW-``}(i=WdUOOBCd$DM{r!sAaES_AEqmHQ~&?~ delta 2617 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 Ang9R* delta 3566 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 diff --git a/openapi/src/com/intellij/peer/PeerFactory.java b/openapi/src/com/intellij/peer/PeerFactory.java index 3bbf7207436f..3e7425a62608 100644 --- a/openapi/src/com/intellij/peer/PeerFactory.java +++ b/openapi/src/com/intellij/peer/PeerFactory.java @@ -31,6 +31,10 @@ import com.intellij.psi.search.scope.packageSet.PackageSetFactory; import com.intellij.ui.UIHelper; import com.intellij.ui.content.ContentFactory; import com.intellij.ui.errorView.ErrorViewFactory; +import org.apache.xmlrpc.XmlRpcServer; +import org.apache.xmlrpc.WebServer; + +import java.net.InetAddress; public abstract class PeerFactory { public static PeerFactory getInstance() { @@ -59,4 +63,8 @@ public abstract class PeerFactory { public abstract StructureViewFactory getStructureViewFactory(); public abstract PsiBuilder createBuilder(ASTNode tree, Language lang, CharSequence seq, final Project project); + + public abstract XmlRpcServer createRpcServer(); + + public abstract WebServer createWebServer(int port, InetAddress addr, XmlRpcServer xmlrpc); } \ No newline at end of file diff --git a/source/com/intellij/peer/impl/PeerFactoryImpl.java b/source/com/intellij/peer/impl/PeerFactoryImpl.java index d634b1873dd4..c4b456ebd8b4 100644 --- a/source/com/intellij/peer/impl/PeerFactoryImpl.java +++ b/source/com/intellij/peer/impl/PeerFactoryImpl.java @@ -57,12 +57,17 @@ import com.intellij.util.ui.Table; import com.intellij.util.ui.UIUtil; import com.intellij.util.ui.treetable.TreeTable; import org.jetbrains.annotations.NotNull; +import org.apache.xmlrpc.XmlRpcServer; +import org.apache.xmlrpc.IdeaAwareXmlRpcServer; +import org.apache.xmlrpc.WebServer; +import org.apache.xmlrpc.IdeaAwareWebServer; import javax.swing.*; import javax.swing.table.TableCellRenderer; import javax.swing.tree.TreeCellRenderer; import java.awt.*; import java.io.File; +import java.net.InetAddress; public class PeerFactoryImpl extends PeerFactory implements ApplicationComponent { private ProcessProxyFactory myProxyFactory = null; @@ -310,4 +315,12 @@ public class PeerFactoryImpl extends PeerFactory implements ApplicationComponent public PsiBuilder createBuilder(ASTNode tree, Language lang, CharSequence seq, final Project project) { return new PsiBuilderImpl(lang, project, SharedImplUtil.findCharTableByTree(tree), seq); } + + public XmlRpcServer createRpcServer() { + return new IdeaAwareXmlRpcServer(); + } + + public WebServer createWebServer(final int port, final InetAddress addr, final XmlRpcServer xmlrpc) { + return new IdeaAwareWebServer(port, addr, xmlrpc); + } } \ No newline at end of file diff --git a/source/org/apache/xmlrpc/IdeaAwareWebServer.java b/source/org/apache/xmlrpc/IdeaAwareWebServer.java new file mode 100644 index 000000000000..c0bc5af9594a --- /dev/null +++ b/source/org/apache/xmlrpc/IdeaAwareWebServer.java @@ -0,0 +1,87 @@ +package org.apache.xmlrpc; + +import org.apache.commons.codec.binary.Base64; + +import java.net.*; +import java.util.Vector; +import java.util.Stack; +import java.util.EmptyStackException; +import java.util.StringTokenizer; +import java.io.*; +import java.lang.reflect.Method; + +/** + * A minimal web server that uses IDEA built-in pool + * + * @author Maxim.Mossienko + */ +public class IdeaAwareWebServer extends WebServer +{ + /** + * Creates a web server at the specified port number and IP + * address. + */ + public IdeaAwareWebServer(int port, InetAddress addr, XmlRpcServer xmlrpc) + { + super(port, addr, xmlrpc); + } + + /** + * + * @return + */ + protected Runner getRunner() + { + return new MyRunner(); + } + + /** + * Put runner back into {@link #threadpool}. + * + * @param runner The instance to reclaim. + */ + void repoolRunner(Runner runner) + { + } + + /** + * Responsible for handling client connections. + */ + class MyRunner extends Runner + { + /** + * Handles the client connection on socket. + * + * @param socket The source to read the client's request from. + */ + public synchronized void handle(Socket socket) throws IOException + { + con = new Connection(socket); + count = 0; + + try { + // Attempt to execute on pooled thread + final Class aClass = Class.forName("com.intellij.openapi.application.ApplicationManager"); + final Method getApplicationMethod = aClass.getMethod("getApplication"); + final Object application = getApplicationMethod.invoke(null); + final Method executeOnPooledThreadMethod = application.getClass().getMethod("executeOnPooledThread", Runnable.class); + executeOnPooledThreadMethod.invoke(application, this); + } + catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * Delegates to con.run(). + */ + public void run() + { + try { + con.run(); + } finally { + Thread.interrupted(); // reset interrupted status + } + } + } +} diff --git a/source/org/apache/xmlrpc/IdeaAwareXmlRpcServer.java b/source/org/apache/xmlrpc/IdeaAwareXmlRpcServer.java new file mode 100644 index 000000000000..3c310b61c67e --- /dev/null +++ b/source/org/apache/xmlrpc/IdeaAwareXmlRpcServer.java @@ -0,0 +1,40 @@ +package org.apache.xmlrpc; + +import java.io.InputStream; + +/** + * XmlRpcServer that does not pool processors + * + * @author Maxim.Mossienko + */ +public class IdeaAwareXmlRpcServer extends XmlRpcServer { + + public IdeaAwareXmlRpcServer() + { + + } + + /** + * Parse the request and execute the handler method, if one is + * found. If the invoked handler is AuthenticatedXmlRpcHandler, + * use the credentials to authenticate the user. Context information + * is passed to the worker, and may be passed to the request handler. + */ + public byte[] execute(InputStream is, XmlRpcContext context) + { + XmlRpcWorker worker = getWorker(); + return worker.execute(is, context); + } + + /** + * Hands out pooled workers. + * + * @return A worker (never null). + * @throws RuntimeException If the server exceeds its maximum + * number of allowed requests. + */ + protected XmlRpcWorker getWorker() + { + return new XmlRpcWorker(getHandlerMapping()); + } +}