blob: 903972fc7584cc93f249dc5d22eb9ac74ae3b236 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.sun.star.wiki;
import com.sun.star.beans.XPropertySet;
import com.sun.star.container.XNameAccess;
import com.sun.star.container.XNameContainer;
import com.sun.star.container.XNameReplace;
import com.sun.star.lang.XSingleServiceFactory;
import com.sun.star.uno.AnyConverter;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
import com.sun.star.util.XChangesBatch;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;
public class Settings
{
private XComponentContext m_xContext;
private int lastUsedWikiServer = 0;
/* Singelton */
private static Settings m_instance;
private Vector m_WikiConnections = new Vector();
private Vector m_aWikiDocs = new Vector();
private Settings( XComponentContext ctx )
{
m_xContext=ctx;
loadConfiguration();
}
public static synchronized Settings getSettings( XComponentContext ctx )
{
if ( m_instance == null )
m_instance = new Settings( ctx );
// m_instance.loadSettings();
return m_instance;
}
public void addWikiCon ( Hashtable wikiCon )
{
m_WikiConnections.add( wikiCon );
}
public Vector getWikiCons()
{
return m_WikiConnections;
}
public String getWikiConUrlByNumber( int num )
{
String url = "";
if ( num >=0 && num < m_WikiConnections.size() )
{
Hashtable ht = ( Hashtable ) m_WikiConnections.get( num );
url = ( String ) ht.get( "Url" );
}
return url;
}
public void addWikiDoc ( Hashtable aWikiDoc )
{
String sURL = ( String ) aWikiDoc.get( "CompleteUrl" );
Hashtable aEntry = getDocByCompleteUrl( sURL );
if ( aEntry != null )
{
// add doc to the end, even if it has been added before
m_aWikiDocs.remove( aEntry );
}
else if ( m_aWikiDocs.size() > 10 )
{
// if the number of elements has reached maximum the oldest element should be removed
m_aWikiDocs.remove( 0 );
}
m_aWikiDocs.add( aWikiDoc );
}
public Vector getWikiDocs()
{
return m_aWikiDocs;
}
public Object[] getWikiDocList( int serverid, int num )
{
String wikiserverurl = getWikiConUrlByNumber( serverid );
Vector theDocs = new Vector();
String [] docs = new String[0];
for ( int i=0; i<m_aWikiDocs.size(); i++ )
{
Hashtable ht = ( Hashtable ) m_aWikiDocs.get( i );
String docurl = ( String ) ht.get( "Url" );
if ( docurl.equals( wikiserverurl ) )
{
theDocs.add( (String ) ht.get( "Doc" ) );
}
}
return theDocs.toArray( docs );
}
public int getLastUsedWikiServer()
{
return lastUsedWikiServer;
}
public void setLastUsedWikiServer( int l )
{
lastUsedWikiServer = l;
}
public String[] getWikiURLs()
{
String [] WikiList = new String [m_WikiConnections.size()];
for ( int i=0; i<m_WikiConnections.size(); i++ )
{
Hashtable ht = ( Hashtable ) m_WikiConnections.get( i );
WikiList[i] = ( String ) ht.get( "Url" );
}
return WikiList;
}
public Hashtable getSettingByUrl( String sUrl )
{
Hashtable ht = null;
for( int i=0;i<m_WikiConnections.size();i++ )
{
Hashtable h1 = ( Hashtable ) m_WikiConnections.get( i );
String u1 = ( String ) h1.get( "Url" );
if ( u1.equals( sUrl ) )
{
ht = h1;
try
{
String sUserName = (String)ht.get( "Username" );
String aPassword = (String)ht.get( "Password" );
if ( sUserName != null && sUserName.length() > 0 && ( aPassword == null || aPassword.length() == 0 ) )
{
String[] pPasswords = Helper.GetPasswordsForURLAndUser( m_xContext, sUrl, sUserName );
if ( pPasswords != null && pPasswords.length > 0 )
ht.put( "Password", pPasswords[0] );
}
}
catch( Exception e )
{
e.printStackTrace();
}
break;
}
}
return ht;
}
public Hashtable getDocByCompleteUrl( String curl )
{
Hashtable ht = null;
for( int i=0;i<m_aWikiDocs.size();i++ )
{
Hashtable h1 = ( Hashtable ) m_aWikiDocs.get( i );
String u1 = ( String ) h1.get( "CompleteUrl" );
if ( u1.equals( curl ) )
{
ht = h1;
}
}
return ht;
}
public void removeSettingByUrl( String sUrl )
{
Hashtable ht = null;
for( int i=0;i<m_WikiConnections.size();i++ )
{
Hashtable h1 = ( Hashtable ) m_WikiConnections.get( i );
String u1 = ( String ) h1.get( "Url" );
if ( u1.equals( sUrl ) )
{
m_WikiConnections.remove( i );
}
}
}
public void storeConfiguration()
{
try
{
// remove stored connection information
XNameContainer xContainer = Helper.GetConfigNameContainer( m_xContext, "org.openoffice.Office.Custom.WikiExtension/ConnectionList" );
String[] pNames = xContainer.getElementNames();
for( int i=0; i<pNames.length; i++ )
{
xContainer.removeByName( pNames[i] );
}
// store all connections
XSingleServiceFactory xConnectionFactory = ( XSingleServiceFactory ) UnoRuntime.queryInterface( XSingleServiceFactory.class, xContainer );
for ( int i=0; i< m_WikiConnections.size(); i++ )
{
Object oNewConnection = xConnectionFactory.createInstance();
Hashtable ht = ( Hashtable ) m_WikiConnections.get( i );
XNameReplace xNewConn = ( XNameReplace ) UnoRuntime.queryInterface( XNameReplace.class, oNewConnection );
if ( xNewConn != null )
xNewConn.replaceByName( "UserName", ht.get( "Username" ) );
xContainer.insertByName( (String)ht.get( "Url" ), xNewConn );
}
// commit changes
XChangesBatch xBatch = ( XChangesBatch ) UnoRuntime.queryInterface( XChangesBatch.class, xContainer );
xBatch.commitChanges();
// remove stored connection information
XNameContainer xContainer2 = Helper.GetConfigNameContainer( m_xContext, "org.openoffice.Office.Custom.WikiExtension/RecentDocs" );
String[] pNames2 = xContainer2.getElementNames();
for( int i=0; i<pNames2.length; i++ )
{
xContainer2.removeByName( pNames2[i] );
}
// store all Docs
XSingleServiceFactory xDocListFactory = ( XSingleServiceFactory ) UnoRuntime.queryInterface( XSingleServiceFactory.class, xContainer2 );
for ( int i=0; i< m_aWikiDocs.size(); i++ )
{
Hashtable ht = ( Hashtable ) m_aWikiDocs.get( i );
Object oNewDoc = xDocListFactory.createInstance();
XNameReplace xNewDoc = ( XNameReplace ) UnoRuntime.queryInterface( XNameReplace.class, oNewDoc );
Enumeration e = ht.keys();
while ( e.hasMoreElements() )
{
String key = ( String ) e.nextElement();
xNewDoc.replaceByName( key, ht.get( key ) );
}
xContainer2.insertByName( "d" + i, xNewDoc );
}
// commit changes
XChangesBatch xBatch2 = ( XChangesBatch ) UnoRuntime.queryInterface( XChangesBatch.class, xContainer2 );
xBatch2.commitChanges();
}
catch ( Exception ex )
{
ex.printStackTrace();
}
}
public void loadConfiguration()
{
m_WikiConnections.clear();
try
{
// get configuration service
// connect to configmanager
XNameAccess xAccess = Helper.GetConfigNameAccess( m_xContext, "org.openoffice.Office.Custom.WikiExtension" );
if ( xAccess != null )
{
Object oList = xAccess.getByName( "ConnectionList" );
XNameAccess xConnectionList = ( XNameAccess ) UnoRuntime.queryInterface( XNameAccess.class, oList );
String [] allCons = xConnectionList.getElementNames();
for ( int i=0; i<allCons.length; i++ )
{
Hashtable ht = new Hashtable();
ht.put( "Url", allCons[i] );
ht.put( "Username", "" );
ht.put( "Password", "" );
try
{
XPropertySet xProps = (XPropertySet)UnoRuntime.queryInterface( XPropertySet.class, xConnectionList.getByName( allCons[i] ) );
if ( xProps != null )
{
String aUsername = AnyConverter.toString( xProps.getPropertyValue( "UserName" ) );
if ( aUsername != null && aUsername.length() > 0 )
ht.put( "Username", aUsername );
}
}
catch( Exception e )
{
e.printStackTrace();
}
addWikiCon( ht );
}
Object oDocs = xAccess.getByName( "RecentDocs" );
XNameAccess xRecentDocs = ( XNameAccess ) UnoRuntime.queryInterface( XNameAccess.class, oDocs );
String [] allDocs = xRecentDocs.getElementNames();
for ( int i=0; i<allDocs.length; i++ )
{
Object oDoc = xRecentDocs.getByName( allDocs[i] );
XNameAccess xDoc = ( XNameAccess ) UnoRuntime.queryInterface( XNameAccess.class, oDoc );
Hashtable ht = new Hashtable();
ht.put( "Url", xDoc.getByName( "Url" ) );
ht.put( "CompleteUrl", xDoc.getByName( "CompleteUrl" ) );
ht.put( "Doc", xDoc.getByName( "Doc" ) );
addWikiDoc( ht );
}
}
}
catch ( Exception ex )
{
ex.printStackTrace();
}
}
}