introduce an spi to plug alternate effective pom tab content
diff --git a/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/EffectivePomEditorProvider.java b/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/EffectivePomEditorProvider.java
new file mode 100644
index 0000000..617f558
--- /dev/null
+++ b/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/EffectivePomEditorProvider.java
@@ -0,0 +1,65 @@
+package org.eclipse.m2e.editor.pom;
+
+import org.apache.maven.project.MavenProject;
+import org.eclipse.m2e.editor.MavenEditorPlugin;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+public final class EffectivePomEditorProvider {
+  
+  private EffectivePomEditorProvider() {
+  }
+  
+  public static IEditorInput createEditorInput(MavenProject project, String name) {
+    BundleContext context = MavenEditorPlugin.getDefault().getBundle().getBundleContext();
+    if (context == null) {
+      return null;
+    }
+    ServiceReference ref = context.getServiceReference(Implementation.class.getName());
+    if (ref == null) {
+      return null;
+    }
+    Implementation service = (Implementation)context.getService(ref);
+    if (service != null) {
+      try {
+        return service.createEditorInput(project, name);
+      } finally {
+        context.ungetService(ref);
+      }
+    }
+    return null;
+  }
+  
+  public static StructuredTextEditor createTextEditor() {
+    BundleContext context = MavenEditorPlugin.getDefault().getBundle().getBundleContext();
+    if (context == null) {
+      return null;
+    }
+    ServiceReference ref = context.getServiceReference(Implementation.class.getName());
+    if (ref == null) {
+      return null;
+    }
+    Implementation service = (Implementation)context.getService(ref);
+    if (service != null) {
+      try {
+        return service.createTextEditor();
+      } finally {
+        context.ungetService(ref);
+      }
+    }
+    return null;
+  }  
+  
+
+  
+  public interface Implementation {
+    
+    IEditorInput createEditorInput(MavenProject project, String name);
+    
+    StructuredTextEditor createTextEditor();
+    
+  }
+  
+}
diff --git a/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/MavenPomEditor.java b/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/MavenPomEditor.java
index 5ce8a4f..a4120e0 100644
--- a/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/MavenPomEditor.java
+++ b/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/MavenPomEditor.java
@@ -528,32 +528,34 @@
     @Override
     protected IStatus run(IProgressMonitor monitor) {
       try{
-        StringWriter sw = new StringWriter();
         final String name = getPartName() + Messages.MavenPomEditor_effective;
         MavenProject mavenProject = SelectionUtil.getMavenProject(getEditorInput(), monitor);
         if(mavenProject == null){
           showEffectivePomError(name);
           return Status.CANCEL_STATUS;
         }
-        new MavenXpp3Writer().write(sw, mavenProject.getModel());
-        final String content = sw.toString();
-
+        IEditorInput editorInput = EffectivePomEditorProvider.createEditorInput(mavenProject, name);
+        if (editorInput == null) {
+          try{
+            StringWriter sw = new StringWriter();
+            new MavenXpp3Writer().write(sw, mavenProject.getModel());
+            final String content = sw.toString();
+            editorInput = new MavenStorageEditorInput(name, name, null, content.getBytes("UTF-8")); //$NON-NLS-1$
+          }catch(IOException ie){
+            MavenLogger.log(new Status(IStatus.ERROR, MavenEditorPlugin.PLUGIN_ID, -1, Messages.MavenPomEditor_error_failed_effective, ie));
+          }
+        }
+        final IEditorInput fEditorInput = editorInput;
         Display.getDefault().asyncExec(new Runnable(){
           public void run() {
-            try{
-              IEditorInput editorInput = new MavenStorageEditorInput(name, name, null, content.getBytes("UTF-8")); //$NON-NLS-1$
-              effectivePomSourcePage.setInput(editorInput);
+              effectivePomSourcePage.setInput(fEditorInput);
               effectivePomSourcePage.update();
-            }catch(IOException ie){
-              MavenLogger.log(new Status(IStatus.ERROR, MavenEditorPlugin.PLUGIN_ID, -1, Messages.MavenPomEditor_error_failed_effective, ie));
-            }
           }
         });
+
         return Status.OK_STATUS;
       } catch(CoreException ce){
         return new Status(IStatus.ERROR, MavenEditorPlugin.PLUGIN_ID, -1, Messages.MavenPomEditor_error_failed_effective, ce);
-      } catch(IOException ie){
-        return new Status(IStatus.ERROR, MavenEditorPlugin.PLUGIN_ID, -1, Messages.MavenPomEditor_error_failed_effective, ie);
       } 
     }
   }
@@ -677,7 +679,10 @@
     sourcePage = new StructuredSourceTextEditor();
     sourcePage.setEditorPart(this);
     //the page for showing the effective POM
-    effectivePomSourcePage = new StructuredTextEditor();
+    effectivePomSourcePage = EffectivePomEditorProvider.createTextEditor();
+    if (effectivePomSourcePage == null) {
+      effectivePomSourcePage = new StructuredTextEditor();
+    }
     effectivePomSourcePage.setEditorPart(this);
     try {
       int dex = addPage(effectivePomSourcePage, getEditorInput());