IdeaAwareXmlRpc/IdeaAwareWebServer are part of idea module and exposed via PeerFactory

This commit is contained in:
Maxim Mossienko
2006-12-14 21:13:16 +03:00
parent c5b0b59ab6
commit f8e20b1292
6 changed files with 148 additions and 0 deletions
Binary file not shown.
Binary file not shown.
@@ -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);
}
@@ -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);
}
}
@@ -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 <code>runner</code> 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 <code>socket</code>.
*
* @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 <code>con.run()</code>.
*/
public void run()
{
try {
con.run();
} finally {
Thread.interrupted(); // reset interrupted status
}
}
}
}
@@ -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 <code>null</code>).
* @throws RuntimeException If the server exceeds its maximum
* number of allowed requests.
*/
protected XmlRpcWorker getWorker()
{
return new XmlRpcWorker(getHandlerMapping());
}
}