1 /* 2 * This file is part of the LibreOffice project. 3 * 4 * This Source Code Form is subject to the terms of the Mozilla Public 5 * License, v. 2.0. If a copy of the MPL was not distributed with this 6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. 7 * 8 * This file incorporates work covered by the following license notice: 9 * 10 * Licensed to the Apache Software Foundation (ASF) under one or more 11 * contributor license agreements. See the NOTICE file distributed 12 * with this work for additional information regarding copyright 13 * ownership. The ASF licenses this file to you under the Apache 14 * License, Version 2.0 (the "License"); you may not use this file 15 * except in compliance with the License. You may obtain a copy of 16 * the License at http://www.apache.org/licenses/LICENSE-2.0 . 17 */ 18 19 package com.sun.star.wiki; 20 21 import java.util.ArrayList; 22 import java.util.HashMap; 23 import java.util.List; 24 import java.util.Map; 25 26 import com.sun.star.beans.XPropertySet; 27 import com.sun.star.container.XNameAccess; 28 import com.sun.star.container.XNameContainer; 29 import com.sun.star.container.XNameReplace; 30 import com.sun.star.lang.XSingleServiceFactory; 31 import com.sun.star.uno.AnyConverter; 32 import com.sun.star.uno.UnoRuntime; 33 import com.sun.star.uno.XComponentContext; 34 import com.sun.star.util.XChangesBatch; 35 36 public class Settings 37 { 38 39 /* Singleton */ 40 private static Settings m_instance; 41 42 43 private final XComponentContext m_xContext; 44 private final List<Map<String, String>> m_WikiConnections = new ArrayList<Map<String, String>>(); 45 private final List<Map<String, Object>> m_aWikiDocs = new ArrayList<Map<String, Object>>(); 46 Settings( XComponentContext ctx )47 private Settings( XComponentContext ctx ) 48 { 49 m_xContext=ctx; 50 loadConfiguration(); 51 } 52 53 getSettings( XComponentContext ctx )54 public static synchronized Settings getSettings( XComponentContext ctx ) 55 { 56 if ( m_instance == null ) 57 m_instance = new Settings( ctx ); 58 return m_instance; 59 } 60 61 addWikiCon( Map<String, String> wikiCon )62 public void addWikiCon ( Map<String, String> wikiCon ) 63 { 64 m_WikiConnections.add( wikiCon ); 65 } 66 67 getWikiConUrlByNumber( int num )68 private String getWikiConUrlByNumber( int num ) 69 { 70 String url = ""; 71 if ( num >=0 && num < m_WikiConnections.size() ) 72 { 73 Map<String,String> ht = m_WikiConnections.get( num ); 74 url = ht.get( "Url" ); 75 } 76 return url; 77 } 78 79 addWikiDoc( Map<String, Object> aWikiDoc )80 public void addWikiDoc ( Map<String, Object> aWikiDoc ) 81 { 82 String sURL = ( String ) aWikiDoc.get( "CompleteUrl" ); 83 Map<String,Object> aEntry = getDocByCompleteUrl( sURL ); 84 85 if ( aEntry != null ) 86 { 87 // add doc to the end, even if it has been added before 88 m_aWikiDocs.remove( aEntry ); 89 } 90 else if ( m_aWikiDocs.size() > 10 ) 91 { 92 // if the number of elements has reached maximum the oldest element should be removed 93 m_aWikiDocs.remove( 0 ); 94 } 95 96 m_aWikiDocs.add( aWikiDoc ); 97 } 98 99 getWikiDocList( int serverid )100 public Object[] getWikiDocList( int serverid ) 101 { 102 String wikiserverurl = getWikiConUrlByNumber( serverid ); 103 List<String> theDocs = new ArrayList<String>(); 104 String [] docs = new String[0]; 105 for ( int i=0; i<m_aWikiDocs.size(); i++ ) 106 { 107 Map<String,Object> ht = m_aWikiDocs.get( i ); 108 String docurl = ( String ) ht.get( "Url" ); 109 if ( docurl.equals( wikiserverurl ) ) 110 { 111 theDocs.add( (String ) ht.get( "Doc" ) ); 112 } 113 } 114 return theDocs.toArray( docs ); 115 } 116 getWikiURLs()117 public String[] getWikiURLs() 118 { 119 String [] WikiList = new String [m_WikiConnections.size()]; 120 for ( int i=0; i<m_WikiConnections.size(); i++ ) 121 { 122 Map<String,String> ht = m_WikiConnections.get( i ); 123 WikiList[i] = ht.get( "Url" ); 124 } 125 return WikiList; 126 } 127 128 getSettingByUrl( String sUrl )129 public Map<String, String> getSettingByUrl( String sUrl ) 130 { 131 Map<String, String> ht = null; 132 for( int i=0;i<m_WikiConnections.size();i++ ) 133 { 134 Map<String, String> h1 = m_WikiConnections.get( i ); 135 String u1 = h1.get( "Url" ); 136 if ( u1.equals( sUrl ) ) 137 { 138 ht = h1; 139 try 140 { 141 String sUserName = ht.get( "Username" ); 142 String aPassword = ht.get( "Password" ); 143 if ( sUserName != null && sUserName.length() > 0 && ( aPassword == null || aPassword.length() == 0 ) ) 144 { 145 String[] pPasswords = Helper.GetPasswordsForURLAndUser( m_xContext, sUrl, sUserName ); 146 if ( pPasswords != null && pPasswords.length > 0 ) 147 ht.put( "Password", pPasswords[0] ); 148 } 149 } 150 catch( Exception e ) 151 { 152 e.printStackTrace(); 153 } 154 155 break; 156 } 157 } 158 return ht; 159 } 160 getDocByCompleteUrl( String curl )161 private Map<String,Object> getDocByCompleteUrl( String curl ) 162 { 163 Map<String,Object> ht = null; 164 for( int i=0;i<m_aWikiDocs.size();i++ ) 165 { 166 Map<String,Object> h1 = m_aWikiDocs.get( i ); 167 String u1 = ( String ) h1.get( "CompleteUrl" ); 168 if ( u1.equals( curl ) ) 169 { 170 ht = h1; 171 } 172 } 173 return ht; 174 } 175 176 removeSettingByUrl( String sUrl )177 public void removeSettingByUrl( String sUrl ) 178 { 179 for( int i=0;i<m_WikiConnections.size();i++ ) 180 { 181 Map<String,String> h1 = m_WikiConnections.get( i ); 182 String u1 = h1.get( "Url" ); 183 if ( u1.equals( sUrl ) ) 184 { 185 m_WikiConnections.remove( i ); 186 } 187 } 188 } 189 190 storeConfiguration()191 public void storeConfiguration() 192 { 193 try 194 { 195 { 196 // remove stored connection information 197 XNameContainer xContainer = Helper.GetConfigNameContainer(m_xContext, "org.openoffice.Office.Custom.WikiExtension/ConnectionList"); 198 String[] pNames = xContainer.getElementNames(); 199 for (String pName : pNames) 200 { 201 xContainer.removeByName(pName); 202 } 203 // store all connections 204 XSingleServiceFactory xConnectionFactory = UnoRuntime.queryInterface(XSingleServiceFactory.class, xContainer); 205 for (Map<String, String> ht : m_WikiConnections) 206 { 207 Object oNewConnection = xConnectionFactory.createInstance(); 208 XNameReplace xNewConn = UnoRuntime.queryInterface(XNameReplace.class, oNewConnection); 209 if (xNewConn != null) 210 { 211 xNewConn.replaceByName("UserName", ht.get("Username")); 212 } 213 xContainer.insertByName(ht.get("Url"), xNewConn); 214 } 215 // commit changes 216 XChangesBatch xBatch = UnoRuntime.queryInterface(XChangesBatch.class, xContainer); 217 xBatch.commitChanges(); 218 } 219 220 { 221 // remove stored connection information 222 XNameContainer xContainer = Helper.GetConfigNameContainer(m_xContext, "org.openoffice.Office.Custom.WikiExtension/RecentDocs"); 223 String[] pNames = xContainer.getElementNames(); 224 for (String pName : pNames) 225 { 226 xContainer.removeByName(pName); 227 } 228 // store all Docs 229 XSingleServiceFactory xDocListFactory = UnoRuntime.queryInterface(XSingleServiceFactory.class, xContainer); 230 int i = 0; 231 for (Map<String, Object> ht : m_aWikiDocs) 232 { 233 Object oNewDoc = xDocListFactory.createInstance(); 234 XNameReplace xNewDoc = UnoRuntime.queryInterface(XNameReplace.class, oNewDoc); 235 for (Map.Entry<String, Object> entry : ht.entrySet()) 236 { 237 xNewDoc.replaceByName(entry.getKey(), entry.getValue()); 238 } 239 xContainer.insertByName("d" + i++, xNewDoc); 240 } 241 // commit changes 242 XChangesBatch xBatch = UnoRuntime.queryInterface(XChangesBatch.class, xContainer); 243 xBatch.commitChanges(); 244 } 245 246 } 247 catch ( Exception ex ) 248 { 249 ex.printStackTrace(); 250 } 251 } 252 loadConfiguration()253 public void loadConfiguration() 254 { 255 m_WikiConnections.clear(); 256 try 257 { 258 // get configuration service 259 // connect to configmanager 260 XNameAccess xAccess = Helper.GetConfigNameAccess( m_xContext, "org.openoffice.Office.Custom.WikiExtension" ); 261 262 if ( xAccess != null ) 263 { 264 Object oList = xAccess.getByName( "ConnectionList" ); 265 XNameAccess xConnectionList = UnoRuntime.queryInterface( XNameAccess.class, oList ); 266 String [] allCons = xConnectionList.getElementNames(); 267 for (String aConnection : allCons) 268 { 269 Map<String, String> ht = new HashMap<String, String>(); 270 ht.put("Url", aConnection); 271 ht.put( "Username", "" ); 272 ht.put( "Password", "" ); 273 try 274 { 275 XPropertySet xProps = UnoRuntime.queryInterface(XPropertySet.class, xConnectionList.getByName(aConnection)); 276 if ( xProps != null ) 277 { 278 String aUsername = AnyConverter.toString( xProps.getPropertyValue( "UserName" ) ); 279 if ( aUsername != null && aUsername.length() > 0 ) 280 ht.put( "Username", aUsername ); 281 } 282 } 283 catch( Exception e ) 284 { 285 e.printStackTrace(); 286 } 287 addWikiCon( ht ); 288 } 289 290 Object oDocs = xAccess.getByName( "RecentDocs" ); 291 XNameAccess xRecentDocs = UnoRuntime.queryInterface( XNameAccess.class, oDocs ); 292 String [] allDocs = xRecentDocs.getElementNames(); 293 for (String aDocument : allDocs) 294 { 295 Object oDoc = xRecentDocs.getByName(aDocument); 296 XNameAccess xDoc = UnoRuntime.queryInterface( XNameAccess.class, oDoc ); 297 Map<String, Object> ht = new HashMap<String, Object>(); 298 ht.put( "Url", xDoc.getByName( "Url" ) ); 299 ht.put( "CompleteUrl", xDoc.getByName( "CompleteUrl" ) ); 300 ht.put( "Doc", xDoc.getByName( "Doc" ) ); 301 addWikiDoc( ht ); 302 } 303 } 304 } 305 catch ( Exception ex ) 306 { 307 ex.printStackTrace(); 308 } 309 } 310 } 311