summaryrefslogtreecommitdiff
path: root/swext/mediawiki/src/com/sun/star/wiki/WikiEditorImpl.java
diff options
context:
space:
mode:
Diffstat (limited to 'swext/mediawiki/src/com/sun/star/wiki/WikiEditorImpl.java')
-rw-r--r--swext/mediawiki/src/com/sun/star/wiki/WikiEditorImpl.java476
1 files changed, 476 insertions, 0 deletions
diff --git a/swext/mediawiki/src/com/sun/star/wiki/WikiEditorImpl.java b/swext/mediawiki/src/com/sun/star/wiki/WikiEditorImpl.java
new file mode 100644
index 000000000000..0350e07fe8b6
--- /dev/null
+++ b/swext/mediawiki/src/com/sun/star/wiki/WikiEditorImpl.java
@@ -0,0 +1,476 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package com.sun.star.wiki;
+
+import com.sun.star.awt.XDialog;
+import com.sun.star.awt.XWindowPeer;
+import com.sun.star.beans.PropertyValue;
+import com.sun.star.frame.DispatchDescriptor;
+import com.sun.star.frame.XComponentLoader;
+import com.sun.star.frame.XController;
+import com.sun.star.frame.XDesktop;
+import com.sun.star.frame.XDispatch;
+import com.sun.star.frame.XDispatchProvider;
+import com.sun.star.frame.XFrame;
+import com.sun.star.frame.XModel;
+import com.sun.star.frame.XStatusListener;
+import com.sun.star.frame.XStorable;
+import com.sun.star.io.XInputStream;
+import com.sun.star.lang.XComponent;
+import com.sun.star.lang.XInitialization;
+import com.sun.star.uno.UnoRuntime;
+import com.sun.star.uno.XComponentContext;
+import com.sun.star.lib.uno.helper.Factory;
+import com.sun.star.lang.XSingleComponentFactory;
+import com.sun.star.registry.XRegistryKey;
+import com.sun.star.lib.uno.helper.WeakBase;
+import com.sun.star.util.XCloseBroadcaster;
+import com.sun.star.view.XSelectionSupplier;
+import java.io.File;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import javax.net.ssl.SSLException;
+
+
+public final class WikiEditorImpl extends WeakBase
+ implements com.sun.star.lang.XServiceInfo, XDispatchProvider, XDispatch, XInitialization
+{
+
+ private final XComponentContext m_xContext;
+ private static final String m_implementationName = WikiEditorImpl.class.getName();
+ private static final String[] m_serviceNames = {"com.sun.star.wiki.WikiEditor" };
+
+ // information needed for component registration
+ public static final String[] supportedServiceNames = {"com.sun.star.frame.ProtocolHandler"};
+ public static final Class implementationClass = WikiEditorImpl.class;
+ // protocol name that this protocol handler handles
+ public static final String protocolName = "vnd.com.sun.star.wiki:";
+
+ private Map m_statusListeners = new HashMap();
+
+
+ private XComponent xComp;
+ private String sTempUrl;
+
+ private XFrame m_xFrame;
+ private XModel m_xModel;
+ private Settings m_aSettings;
+
+ private String m_aFilterName;
+
+ public WikiEditorImpl( XComponentContext xContext )
+ {
+ // Helper.trustAllSSL();
+ m_xContext = xContext;
+ m_aSettings = Settings.getSettings( m_xContext );
+ };
+
+ public static XSingleComponentFactory __getComponentFactory( String sImplementationName )
+ {
+ XSingleComponentFactory xFactory = null;
+
+ if ( sImplementationName.equals( m_implementationName ) )
+ xFactory = Factory.createComponentFactory( WikiEditorImpl.class, m_serviceNames );
+ else if ( sImplementationName.equals( WikiOptionsEventHandlerImpl.m_sImplementationName ) )
+ xFactory = Factory.createComponentFactory( WikiOptionsEventHandlerImpl.class,
+ WikiOptionsEventHandlerImpl.m_pServiceNames );
+
+ return xFactory;
+ }
+
+ public static boolean __writeRegistryServiceInfo( XRegistryKey xRegistryKey )
+ {
+ boolean bResult = Factory.writeRegistryServiceInfo( m_implementationName,
+ m_serviceNames,
+ xRegistryKey );
+ return ( bResult && Factory.writeRegistryServiceInfo( WikiOptionsEventHandlerImpl.m_sImplementationName,
+ WikiOptionsEventHandlerImpl.m_pServiceNames,
+ xRegistryKey ) );
+ }
+
+ // com.sun.star.lang.XServiceInfo:
+ public String getImplementationName()
+ {
+ return m_implementationName;
+ }
+
+ public boolean supportsService( String sService )
+ {
+ int len = m_serviceNames.length;
+
+ for( int i=0; i < len; i++ )
+ {
+ if ( sService.equals( m_serviceNames[i] ))
+ return true;
+ }
+ return false;
+ }
+
+ public String[] getSupportedServiceNames()
+ {
+ return m_serviceNames;
+ }
+
+
+ private XSelectionSupplier m_sel;
+ private XController m_ctrl;
+ private boolean m_bInitialized;
+ public synchronized void initialize( Object[] args ) throws com.sun.star.uno.Exception
+ {
+ if ( m_bInitialized )
+ {
+ //logger.log( Level.SEVERE, "Extension instance was initialized again" );
+ }
+ if ( args.length > 0 )
+ {
+ m_bInitialized = true;
+ m_xFrame = ( XFrame )UnoRuntime.queryInterface( XFrame.class, args[0] );
+ // become close listener
+ XCloseBroadcaster cb = ( XCloseBroadcaster )UnoRuntime.queryInterface(
+ XCloseBroadcaster.class, m_xFrame );
+ }
+ }
+
+
+
+ public void dispatch(
+ final com.sun.star.util.URL aURL,
+ com.sun.star.beans.PropertyValue[] propertyValue )
+ {
+ final com.sun.star.util.URL myURL = aURL;
+ //logger.log( Level.INFO, "received dispatch request for: "+aURL.Complete );
+ if ( aURL.Protocol.compareTo( protocolName ) == 0 )
+ {
+ /*
+ synchronized( this )
+ {
+ if( m_bClosing ) return;
+ else m_bActive = true;
+ }
+ **/
+
+ try
+ {
+ if ( myURL.Path.compareTo( "send" ) == 0 )
+ {
+ sendArticle();
+ }
+ } catch( java.lang.Throwable t )
+ {
+ //logger.log( Level.WARNING, "exception while handeling dispatch", t );
+ }
+
+ /*
+ synchronized( this )
+ {
+ m_bActive = false;
+ // if we became owner while we were active
+ // we are responsible for closing the m_xFrame now
+ if ( m_bOwner && m_xFrame != null )
+ {
+ try
+ {
+ XCloseable xclose = ( XCloseable )UnoRuntime.queryInterface(
+ XCloseable.class, m_xFrame );
+ xclose.close( true );
+ } catch ( CloseVetoException cve )
+ {
+ logger.log( Level.SEVERE, "cannot close owned frame" );
+ }
+ // relase reference to the m_xFrame;
+ m_xFrame = null;
+ }
+ }
+ */
+ }
+ }
+
+
+ public com.sun.star.frame.XDispatch queryDispatch(
+ com.sun.star.util.URL aURL,
+ String str,
+ int param )
+ {
+ if ( aURL.Protocol.equals( protocolName ))
+ {
+
+ // by default, we are responsible
+ return this;
+ } else
+ {
+ return null;
+ }
+ }
+
+ public XDispatch[] queryDispatches( DispatchDescriptor[] seqDescripts )
+ {
+ int nCount = seqDescripts.length;
+ XDispatch[] lDispatcher = new XDispatch[nCount];
+
+ for( int i=0; i<nCount; ++i )
+ lDispatcher[i] = queryDispatch(
+ seqDescripts[i].FeatureURL,
+ seqDescripts[i].FrameName,
+ seqDescripts[i].SearchFlags );
+ return lDispatcher;
+ }
+
+
+ public void removeStatusListener(
+ com.sun.star.frame.XStatusListener xStatusListener,
+ com.sun.star.util.URL aURL )
+ {
+ }
+
+
+ public void addStatusListener(
+ com.sun.star.frame.XStatusListener listener,
+ com.sun.star.util.URL url )
+ {
+ String urlstring = url.Complete;
+ m_statusListeners.put( urlstring, listener );
+ // synchroneous callback required!!!
+ callStatusListener( urlstring, listener );
+ }
+
+ public void callStatusListeners()
+ {
+ Set entries = m_statusListeners.entrySet();
+ Iterator iter = entries.iterator();
+ while ( iter.hasNext() )
+ {
+ Map.Entry entry = ( Map.Entry ) iter.next();
+ String uristring = ( String ) entry.getKey();
+ XStatusListener listener = ( XStatusListener ) entry.getValue();
+ callStatusListener( uristring, listener );
+ }
+ }
+
+ public void callStatusListener( String uristring, XStatusListener listener )
+ {
+ try
+ {
+
+ URI uri = new URI( uristring );
+
+ // check whether any blogs are live...
+ setListenerState( listener, "command", false );
+ } catch ( URISyntaxException ex )
+ {
+ ex.printStackTrace();
+ }
+ }
+
+
+ private void setListenerState( XStatusListener listener, String urlstring, boolean state )
+ {
+ com.sun.star.util.URL url = new com.sun.star.util.URL();
+ url.Complete = urlstring;
+ //listener.statusChanged( new FeatureStateEvent( this, url, "", state, false, null ));
+
+ }
+
+ public void sendArticle()
+ {
+ if ( m_xFrame != null )
+ {
+ WikiPropDialog aSendDialog = null;
+ try
+ {
+ if ( m_xModel == null )
+ {
+ XController xController = m_xFrame.getController();
+ if ( xController != null )
+ m_xModel = xController.getModel();
+ }
+
+ if ( m_xModel != null )
+ {
+ // The related Wiki filter must be detected from the typename
+ String aServiceName = Helper.GetDocServiceName( m_xContext, m_xModel );
+ m_aFilterName = Helper.GetFilterName( m_xContext, "MediaWiki", aServiceName );
+
+ if ( m_aFilterName == null || m_aFilterName.length() == 0 )
+ {
+ Helper.ShowError( m_xContext,
+ (XWindowPeer)UnoRuntime.queryInterface( XWindowPeer.class, m_xFrame.getContainerWindow() ),
+ Helper.DLG_SENDTITLE,
+ Helper.NOWIKIFILTER_ERROR,
+ null,
+ false );
+ throw new com.sun.star.uno.RuntimeException();
+ }
+
+ m_aSettings.loadConfiguration(); // throw away all the noncommited changes
+ // show the send dialog
+ aSendDialog = new WikiPropDialog( m_xContext, "vnd.sun.star.script:WikiEditor.SendToMediaWiki?location=application", this );
+ aSendDialog.fillWikiList();
+ aSendDialog.SetWikiTitle( Helper.GetDocTitle( m_xModel ) );
+ aSendDialog.show(); // triggers the sending
+ }
+ }
+ catch ( Exception e )
+ {
+ // TODO: Error handling here
+ e.printStackTrace();
+ }
+ finally
+ {
+ if ( aSendDialog != null )
+ aSendDialog.DisposeDialog();
+ }
+ }
+ }
+
+ public boolean SendArticleImpl( WikiPropDialog aSendDialog, Hashtable aWikiSetting )
+ {
+ boolean bResult = false;
+
+ if ( aSendDialog != null )
+ {
+ String sTemp2Url = null;
+
+ try
+ {
+ // TODO: stop progress spinning
+ WikiArticle aArticle = new WikiArticle( m_xContext, aSendDialog.GetWikiTitle(), aWikiSetting, true, aSendDialog );
+
+ boolean bAllowSending = true;
+ if ( !aArticle.NotExist() )
+ {
+ // ask whether creation of a new page is allowed
+ aSendDialog.SetThrobberActive( false );
+ bAllowSending = Helper.ShowError(
+ m_xContext,
+ (XWindowPeer)UnoRuntime.queryInterface( XWindowPeer.class, m_xFrame.getContainerWindow() ),
+ Helper.DLG_SENDTITLE,
+ Helper.DLG_WIKIPAGEEXISTS_LABEL1,
+ aSendDialog.GetWikiTitle(),
+ true );
+ aSendDialog.SetThrobberActive( true );
+ }
+
+ if ( bAllowSending )
+ {
+ PropertyValue[] lProperties = new PropertyValue[2];
+ lProperties[0] = new PropertyValue();
+ lProperties[0].Name = "FilterName";
+ lProperties[0].Value = m_aFilterName;
+ lProperties[1] = new PropertyValue();
+ lProperties[1].Name = "Overwrite";
+ lProperties[1].Value = new Boolean( true );
+
+ sTemp2Url = Helper.CreateTempFile( m_xContext );
+
+ XStorable xStore = ( com.sun.star.frame.XStorable )UnoRuntime.queryInterface ( XStorable.class, m_xModel );
+ if ( xStore == null )
+ throw new com.sun.star.uno.RuntimeException();
+
+ xStore.storeToURL( sTemp2Url, lProperties );
+ String sWikiCode = Helper.EachLine( sTemp2Url );
+
+ if ( aArticle.setArticle( sWikiCode, aSendDialog.m_sWikiComment, aSendDialog.m_bWikiMinorEdit ) )
+ {
+ bResult = true;
+ Object desktop = m_xContext.getServiceManager().createInstanceWithContext( "com.sun.star.frame.Desktop", m_xContext );
+ XDesktop xDesktop = ( XDesktop ) UnoRuntime.queryInterface( com.sun.star.frame.XDesktop.class, desktop );
+ Helper.SetDocTitle( m_xModel, aArticle.GetTitle() );
+ Hashtable aDocInfo = new Hashtable();
+ aDocInfo.put( "Doc", aArticle.GetTitle() );
+ aDocInfo.put( "Url", aArticle.GetMainURL() );
+ aDocInfo.put( "CompleteUrl", aArticle.GetMainURL() + aArticle.GetTitle() );
+ m_aSettings.addWikiDoc( aDocInfo );
+ m_aSettings.storeConfiguration();
+ }
+ else
+ {
+ Helper.ShowError( m_xContext,
+ (XWindowPeer)UnoRuntime.queryInterface( XWindowPeer.class, m_xFrame.getContainerWindow() ),
+ Helper.DLG_SENDTITLE,
+ Helper.GENERALSEND_ERROR,
+ null,
+ false );
+ }
+ }
+ }
+ catch( WikiCancelException ec )
+ {
+ // nothing to do, the sending was cancelled
+ }
+ catch( SSLException essl )
+ {
+ if ( Helper.IsConnectionAllowed() )
+ {
+ // report the error only if sending was not cancelled
+ Helper.ShowError( m_xContext,
+ (XWindowPeer)UnoRuntime.queryInterface( XWindowPeer.class, m_xFrame.getContainerWindow() ),
+ Helper.DLG_SENDTITLE,
+ Helper.UNKNOWNCERT_ERROR,
+ null,
+ false );
+ }
+ }
+ catch( Exception e )
+ {
+ if ( Helper.IsConnectionAllowed() )
+ {
+ // report the error only if sending was not cancelled
+ Helper.ShowError( m_xContext,
+ (XWindowPeer)UnoRuntime.queryInterface( XWindowPeer.class, m_xFrame.getContainerWindow() ),
+ Helper.DLG_SENDTITLE,
+ Helper.GENERALSEND_ERROR,
+ null,
+ false );
+ }
+ e.printStackTrace();
+ }
+
+ if ( sTemp2Url != null )
+ {
+ try
+ {
+ // remove the temporary file
+ File aFile = new File( new URI( sTemp2Url ) );
+ aFile.delete();
+ }
+ catch ( java.lang.Exception e )
+ {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ return bResult;
+ }
+
+}