extension point for registering XML-RPC handlers

This commit is contained in:
Dmitry Jemerov
2010-10-27 14:11:12 +04:00
parent a30af5ba73
commit ad8fc86fce
7 changed files with 85 additions and 55 deletions
@@ -17,7 +17,6 @@ package com.intellij.ide;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.ApplicationComponent;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.fileEditor.OpenFileDescriptor;
import com.intellij.openapi.fileEditor.ex.FileEditorProviderManager;
@@ -25,63 +24,40 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NonNls;
import java.io.File;
/**
* @author mike
*/
public class OpenFileXmlRpcHandler implements ApplicationComponent {
private static final String HANDLER_NAME = "fileOpener";
private final XmlRpcServer myXmlRpcServer;
public class OpenFileXmlRpcHandler {
@SuppressWarnings({"MethodMayBeStatic"})
public boolean open(final String absolutePath) {
final Application application = ApplicationManager.getApplication();
public OpenFileXmlRpcHandler(final XmlRpcServer xmlRpcServer) {
myXmlRpcServer = xmlRpcServer;
}
application.invokeLater(new Runnable() {
public void run() {
final Project[] openProjects = ProjectManager.getInstance().getOpenProjects();
if (openProjects.length == 0) return;
Project project = openProjects[0];
@NonNls
public String getComponentName() {
return "OpenFileXmlRpcHandler";
}
String correctPath = absolutePath.replace(File.separatorChar, '/');
final VirtualFile[] virtualFiles = new VirtualFile[1];
final String correctPath1 = correctPath;
application.runWriteAction(new Runnable() {
public void run() {
virtualFiles[0] = LocalFileSystem.getInstance().refreshAndFindFileByPath(correctPath1);
}
});
if (virtualFiles[0] == null) return;
public void initComponent() {
myXmlRpcServer.addHandler(HANDLER_NAME, new OpenFileHandler());
}
FileEditorProviderManager editorProviderManager = FileEditorProviderManager.getInstance();
if (editorProviderManager.getProviders(project, virtualFiles[0]).length == 0) return;
OpenFileDescriptor descriptor = new OpenFileDescriptor(project, virtualFiles[0]);
FileEditorManager.getInstance(project).openTextEditor(descriptor, true);
}
});
public void disposeComponent() {
myXmlRpcServer.removeHandler(HANDLER_NAME);
}
public static class OpenFileHandler {
@SuppressWarnings({"MethodMayBeStatic"})
public boolean open(final String absolutePath) {
final Application application = ApplicationManager.getApplication();
application.invokeLater(new Runnable() {
public void run() {
final Project[] openProjects = ProjectManager.getInstance().getOpenProjects();
if (openProjects.length == 0) return;
Project project = openProjects[0];
String correctPath = absolutePath.replace(File.separatorChar, '/');
final VirtualFile[] virtualFiles = new VirtualFile[1];
final String correctPath1 = correctPath;
application.runWriteAction(new Runnable() {
public void run() {
virtualFiles[0] = LocalFileSystem.getInstance().refreshAndFindFileByPath(correctPath1);
}
});
if (virtualFiles[0] == null) return;
FileEditorProviderManager editorProviderManager = FileEditorProviderManager.getInstance();
if (editorProviderManager.getProviders(project, virtualFiles[0]).length == 0) return;
OpenFileDescriptor descriptor = new OpenFileDescriptor(project, virtualFiles[0]);
FileEditorManager.getInstance(project).openTextEditor(descriptor, true);
}
});
return true;
}
return true;
}
}
@@ -0,0 +1,38 @@
/*
* Copyright 2000-2010 JetBrains s.r.o.
*
* 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.
*/
package com.intellij.ide;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.extensions.AbstractExtensionPointBean;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.util.xmlb.annotations.Attribute;
/**
* @author yole
*/
public class XmlRpcHandlerBean extends AbstractExtensionPointBean {
public static final ExtensionPointName<XmlRpcHandlerBean> EP_NAME = ExtensionPointName.create("com.intellij.xmlRpcHandler");
@Attribute("name")
public String name;
@Attribute("implementation")
public String implementation;
public Object instantiate() throws ClassNotFoundException {
return instantiate(implementation, ApplicationManager.getApplication().getPicoContainer());
}
}
@@ -19,7 +19,10 @@ package com.intellij.ide;
* @author mike
*/
public interface XmlRpcServer {
void addHandler(String name, Object handler);
void removeHandler(String name);
int getPortNumber();
/**
* @deprecated use xmlRpcHandler extension point instead
*/
void addHandler(String name, Object handler);
void removeHandler(String name);
int getPortNumber();
}
@@ -18,6 +18,7 @@ package com.intellij.ide;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.ApplicationComponent;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.extensions.Extensions;
import org.apache.xmlrpc.IdeaAwareWebServer;
import org.apache.xmlrpc.IdeaAwareXmlRpcServer;
import org.apache.xmlrpc.WebServer;
@@ -61,6 +62,17 @@ public class XmlRpcServerImpl implements XmlRpcServer, ApplicationComponent {
finally {
thread.setPriority(currentPriority);
}
for(XmlRpcHandlerBean handlerBean: Extensions.getExtensions(XmlRpcHandlerBean.EP_NAME)) {
final Object handler;
try {
handler = handlerBean.instantiate();
}
catch (ClassNotFoundException e) {
LOG.error(e);
continue;
}
addHandler(handlerBean.name, handler);
}
}
public int getPortNumber() {
@@ -110,4 +110,6 @@
<extensionPoint name="editorCustomization" area="IDEA_PROJECT" interface="com.intellij.ui.EditorCustomization"/>
<extensionPoint name="statistics.usagesCollector" interface="com.intellij.statistic.UsagesCollector"/>
<extensionPoint name="xmlRpcHandler" beanClass="com.intellij.ide.XmlRpcHandlerBean"/>
</extensionPoints>
@@ -205,4 +205,6 @@
<!-- <checkinHandlerFactory implementation="com.intellij.openapi.vcs.CheckRemoteStatusCheckinHandlerFactory"/> -->
<statistics.usagesCollector implementation="com.intellij.featureStatistics.FeaturesUsageCollector"/>
<xmlRpcHandler name="fileOpener" implementation="com.intellij.ide.OpenFileXmlRpcHandler"/>
</extensions>
-3
View File
@@ -1,8 +1,5 @@
<components>
<application-components>
<component>
<implementation-class>com.intellij.ide.OpenFileXmlRpcHandler</implementation-class>
</component>
<component>
<interface-class>com.intellij.ide.RecentProjectsManagerBase</interface-class>
<implementation-class>com.intellij.ide.RecentProjectsManager</implementation-class>