summaryrefslogtreecommitdiff
path: root/dbaccess/source/ext/macromigration/migrationlog.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'dbaccess/source/ext/macromigration/migrationlog.cxx')
-rw-r--r--dbaccess/source/ext/macromigration/migrationlog.cxx508
1 files changed, 508 insertions, 0 deletions
diff --git a/dbaccess/source/ext/macromigration/migrationlog.cxx b/dbaccess/source/ext/macromigration/migrationlog.cxx
new file mode 100644
index 000000000000..1b22367857aa
--- /dev/null
+++ b/dbaccess/source/ext/macromigration/migrationlog.cxx
@@ -0,0 +1,508 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: migrationlog.cxx,v $
+ * $Revision: 1.4.2.8 $
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_dbaccess.hxx"
+
+#include "dbmm_module.hxx"
+#include "dbmm_global.hrc"
+#include "migrationerror.hxx"
+#include "migrationlog.hxx"
+
+/** === begin UNO includes === **/
+/** === end UNO includes === **/
+
+#include <comphelper/anytostring.hxx>
+#include <comphelper/string.hxx>
+#include <tools/string.hxx>
+#include <rtl/ustrbuf.hxx>
+
+#include <vector>
+#include <map>
+#include <list>
+
+//........................................................................
+namespace dbmm
+{
+//........................................................................
+
+ /** === begin UNO using === **/
+ /** === end UNO using === **/
+
+ //====================================================================
+ //= LibraryEntry
+ //====================================================================
+ struct LibraryEntry
+ {
+ ScriptType eType;
+ ::rtl::OUString sOldName;
+ ::rtl::OUString sNewName;
+
+ LibraryEntry()
+ :eType( eBasic )
+ ,sOldName()
+ ,sNewName()
+ {
+ }
+
+ LibraryEntry( const ScriptType& _eType, const ::rtl::OUString& _rOldName, const ::rtl::OUString& _rNewName )
+ :eType( _eType )
+ ,sOldName( _rOldName )
+ ,sNewName( _rNewName )
+ {
+ }
+ };
+
+ //====================================================================
+ //= DocumentEntry
+ //====================================================================
+ struct DocumentEntry
+ {
+ SubDocumentType eType;
+ ::rtl::OUString sName;
+ ::std::vector< LibraryEntry > aMovedLibraries;
+
+ DocumentEntry()
+ :eType( eForm )
+ ,sName()
+ ,aMovedLibraries()
+ {
+ }
+
+ DocumentEntry( const SubDocumentType _eType, const ::rtl::OUString& _rName )
+ :eType( _eType )
+ ,sName( _rName )
+ {
+ }
+ };
+
+ //====================================================================
+ //= DocumentLogs
+ //====================================================================
+ typedef ::std::map< DocumentID, DocumentEntry > DocumentLogs;
+
+ //====================================================================
+ //= ErrorLog
+ //====================================================================
+ typedef ::std::list< MigrationError > ErrorLog;
+
+ //====================================================================
+ //= MigrationLog_Data
+ //====================================================================
+ struct MigrationLog_Data
+ {
+ ::rtl::OUString sBackupLocation;
+ DocumentLogs aDocumentLogs;
+ ErrorLog aFailures;
+ ErrorLog aWarnings;
+ };
+
+ //====================================================================
+ //= MigrationLog
+ //====================================================================
+ //--------------------------------------------------------------------
+ MigrationLog::MigrationLog()
+ :m_pData( new MigrationLog_Data )
+ {
+ }
+
+ //--------------------------------------------------------------------
+ MigrationLog::~MigrationLog()
+ {
+ }
+
+ //--------------------------------------------------------------------
+ void MigrationLog::logFailure( const MigrationError& _rError )
+ {
+ m_pData->aFailures.push_back( _rError );
+ }
+
+ //--------------------------------------------------------------------
+ void MigrationLog::logRecoverable( const MigrationError& _rError )
+ {
+ m_pData->aWarnings.push_back( _rError );
+ }
+
+ //--------------------------------------------------------------------
+ bool MigrationLog::hadFailure() const
+ {
+ return !m_pData->aFailures.empty();
+ }
+
+ //--------------------------------------------------------------------
+ void MigrationLog::backedUpDocument( const ::rtl::OUString& _rNewDocumentLocation )
+ {
+ m_pData->sBackupLocation = _rNewDocumentLocation;
+ }
+
+ //--------------------------------------------------------------------
+ DocumentID MigrationLog::startedDocument( const SubDocumentType _eType, const ::rtl::OUString& _rName )
+ {
+#if OSL_DEBUG_LEVEL > 0
+ bool bAlreadyKnown = false;
+ for ( DocumentLogs::const_iterator doc = m_pData->aDocumentLogs.begin();
+ doc != m_pData->aDocumentLogs.end() && !bAlreadyKnown;
+ ++doc
+ )
+ {
+ bAlreadyKnown = ( doc->second.eType == _eType ) && ( doc->second.sName == _rName );
+ }
+ OSL_ENSURE( !bAlreadyKnown, "MigrationLog::startedDocument: document is already known!" );
+#endif
+
+ DocumentID nID = (DocumentID)( m_pData->aDocumentLogs.size() + 1 );
+ while ( m_pData->aDocumentLogs.find( nID ) != m_pData->aDocumentLogs.end() )
+ ++nID;
+
+ m_pData->aDocumentLogs[ nID ] = DocumentEntry( _eType, _rName );
+
+ return nID;
+ }
+
+ //--------------------------------------------------------------------
+ void MigrationLog::movedLibrary( const DocumentID _nDocID, const ScriptType _eScriptType,
+ const ::rtl::OUString& _rOriginalLibName, const ::rtl::OUString& _rNewLibName )
+ {
+ OSL_ENSURE( m_pData->aDocumentLogs.find( _nDocID ) != m_pData->aDocumentLogs.end(),
+ "MigrationLog::movedLibrary: document is not known!" );
+
+ DocumentEntry& rDocEntry = m_pData->aDocumentLogs[ _nDocID ];
+ rDocEntry.aMovedLibraries.push_back( LibraryEntry( _eScriptType, _rOriginalLibName, _rNewLibName ) );
+ }
+
+ //--------------------------------------------------------------------
+ void MigrationLog::finishedDocument( const DocumentID _nDocID )
+ {
+ OSL_ENSURE( m_pData->aDocumentLogs.find( _nDocID ) != m_pData->aDocumentLogs.end(),
+ "MigrationLog::finishedDocument: document is not known!" );
+
+ DocumentEntry& rDocEntry = m_pData->aDocumentLogs[ _nDocID ];
+ (void)rDocEntry;
+ // nothing to do here
+ }
+
+ //--------------------------------------------------------------------
+ const ::rtl::OUString& MigrationLog::getNewLibraryName( DocumentID _nDocID, ScriptType _eScriptType,
+ const ::rtl::OUString& _rOriginalLibName ) const
+ {
+ static ::rtl::OUString s_sEmptyString;
+
+ DocumentLogs::const_iterator docPos = m_pData->aDocumentLogs.find( _nDocID );
+ if ( docPos == m_pData->aDocumentLogs.end() )
+ {
+ OSL_ENSURE( false, "MigrationLog::getNewLibraryName: document is not known!" );
+ return s_sEmptyString;
+ }
+
+ const DocumentEntry& rDocEntry( docPos->second );
+ for ( ::std::vector< LibraryEntry >::const_iterator lib = rDocEntry.aMovedLibraries.begin();
+ lib != rDocEntry.aMovedLibraries.end();
+ ++lib
+ )
+ {
+ if ( ( _eScriptType == lib->eType )
+ && ( _rOriginalLibName == lib->sOldName )
+ )
+ return lib->sNewName;
+ }
+
+ OSL_ENSURE( false, "MigrationLog::getNewLibraryName: doc is known, but library isn't!" );
+ return s_sEmptyString;
+ }
+
+ //--------------------------------------------------------------------
+ namespace
+ {
+ //----------------------------------------------------------------
+ static void lcl_appendErrorDescription( ::rtl::OUStringBuffer& _inout_rBuffer, const MigrationError& _rError )
+ {
+ const sal_Char* pAsciiErrorDescription( NULL );
+ ::std::vector< const sal_Char* > aAsciiParameterNames;
+ switch ( _rError.eType )
+ {
+ case ERR_OPENING_SUB_DOCUMENT_FAILED:
+ pAsciiErrorDescription = "opening '#doc#' failed";
+ aAsciiParameterNames.push_back( "#doc#" );
+ break;
+
+ case ERR_CLOSING_SUB_DOCUMENT_FAILED:
+ pAsciiErrorDescription = "closing '#doc#' failed";
+ aAsciiParameterNames.push_back( "#doc#" );
+ break;
+
+ case ERR_STORAGE_COMMIT_FAILED:
+ pAsciiErrorDescription = "committing the changes for document '#doc#' failed";
+ aAsciiParameterNames.push_back( "#doc#" );
+ break;
+
+ case ERR_STORING_DATABASEDOC_FAILED:
+ pAsciiErrorDescription = "storing the database document failed";
+ break;
+
+ case ERR_COLLECTING_DOCUMENTS_FAILED:
+ pAsciiErrorDescription = "collecting the forms/reports of the database document failed";
+ break;
+
+ case ERR_UNEXPECTED_LIBSTORAGE_ELEMENT:
+ pAsciiErrorDescription = "unexpected #lib# storage element in document '#doc#', named '#element#'";
+ aAsciiParameterNames.push_back( "#doc#" );
+ aAsciiParameterNames.push_back( "#libstore#" );
+ aAsciiParameterNames.push_back( "#element#" );
+ break;
+
+ case ERR_CREATING_DBDOC_SCRIPT_STORAGE_FAILED:
+ pAsciiErrorDescription = "creating the database document's storage for #scripttype# scripts failed";
+ aAsciiParameterNames.push_back( "#scripttype#" );
+ break;
+
+ case ERR_COMMITTING_SCRIPT_STORAGES_FAILED:
+ pAsciiErrorDescription = "saving the #scripttype# scripts for document '#doc#' failed";
+ aAsciiParameterNames.push_back( "#scripttype#" );
+ aAsciiParameterNames.push_back( "#doc#" );
+ break;
+
+ case ERR_GENERAL_SCRIPT_MIGRATION_FAILURE:
+ pAsciiErrorDescription = "general error while migrating #scripttype# scripts of document '#doc#'";
+ aAsciiParameterNames.push_back( "#scripttype#" );
+ aAsciiParameterNames.push_back( "#doc#" );
+ break;
+
+ case ERR_GENERAL_MACRO_MIGRATION_FAILURE:
+ pAsciiErrorDescription = "general error during macro migration of document '#doc#'";
+ aAsciiParameterNames.push_back( "#doc#" );
+ break;
+
+ case ERR_UNKNOWN_SCRIPT_TYPE:
+ pAsciiErrorDescription = "unknown script type: #type#";
+ aAsciiParameterNames.push_back( "#type#" );
+ break;
+
+ case ERR_UNKNOWN_SCRIPT_LANGUAGE:
+ pAsciiErrorDescription = "unknown script language: #lang#";
+ aAsciiParameterNames.push_back( "#lang#" );
+ break;
+
+ case ERR_UNKNOWN_SCRIPT_NAME_FORMAT:
+ pAsciiErrorDescription = "unknown script name format: #script#";
+ aAsciiParameterNames.push_back( "#script#" );
+ break;
+
+ case ERR_SCRIPT_TRANSLATION_FAILURE:
+ pAsciiErrorDescription = "analyzing/translating the script URL failed; script type: #type#; script: #code#";
+ aAsciiParameterNames.push_back( "#type#" );
+ aAsciiParameterNames.push_back( "#code#" );
+ break;
+
+ case ERR_INVALID_SCRIPT_DESCRIPTOR_FORMAT:
+ pAsciiErrorDescription = "invalid script descriptor format";
+ break;
+
+ case ERR_ADJUSTING_DOCUMENT_EVENTS_FAILED:
+ pAsciiErrorDescription = "adjusting events for document '#doc#' failed";
+ aAsciiParameterNames.push_back( "#doc#" );
+ break;
+
+ case ERR_ADJUSTING_FORMCOMP_EVENTS_FAILED:
+ pAsciiErrorDescription = "adjusting form component events for '#doc#' failed";
+ aAsciiParameterNames.push_back( "#doc#" );
+ break;
+
+ case ERR_BIND_SCRIPT_STORAGE_FAILED:
+ pAsciiErrorDescription = "binding to the script storage failed for document '#doc#'";
+ aAsciiParameterNames.push_back( "#doc#" );
+ break;
+
+ case ERR_REMOVE_SCRIPTS_STORAGE_FAILED:
+ pAsciiErrorDescription = "removing a scripts storage failed for document '#doc#'";
+ aAsciiParameterNames.push_back( "#doc#" );
+ break;
+
+ case ERR_DOCUMENT_BACKUP_FAILED:
+ pAsciiErrorDescription = "backing up the document to #location# failed";
+ aAsciiParameterNames.push_back( "#location#" );
+ break;
+
+ case ERR_UNKNOWN_SCRIPT_FOLDER:
+ pAsciiErrorDescription = "unknown script folder '#name#' in document '#doc#'";
+ aAsciiParameterNames.push_back( "#doc#" );
+ aAsciiParameterNames.push_back( "#name#" );
+ break;
+
+ case ERR_EXAMINING_SCRIPTS_FOLDER_FAILED:
+ pAsciiErrorDescription = "examining the 'Scripts' folder failed for document '#doc#'";
+ aAsciiParameterNames.push_back( "#doc#" );
+ break;
+
+ case ERR_PASSWORD_VERIFICATION_FAILED:
+ pAsciiErrorDescription = "password verification failed for document '#doc#', #libtype# library '#name#'";
+ aAsciiParameterNames.push_back( "#doc#" );
+ aAsciiParameterNames.push_back( "#libtype#" );
+ aAsciiParameterNames.push_back( "#name#" );
+ break;
+
+ case ERR_NEW_STYLE_REPORT:
+ pAsciiErrorDescription = "#doc# could not be processed, since you don't have the Sun Report Builder (TM) extension installed.";
+ aAsciiParameterNames.push_back( "#doc#" );
+ break;
+
+ // do *not* add a default case here: Without a default, some compilers will warn you when
+ // you miss a newly-introduced enum value here
+ }
+ OSL_ENSURE( pAsciiErrorDescription, "lcl_appendErrorDescription: no error message!" );
+ if ( pAsciiErrorDescription )
+ {
+ ::rtl::OUString sSubstituted( ::rtl::OUString::createFromAscii( pAsciiErrorDescription ) );
+ OSL_ENSURE( aAsciiParameterNames.size() == _rError.aErrorDetails.size(),
+ "lcl_appendErrorDescription: unexpected number of error message parameters!" );
+
+ for ( size_t i=0; i < ::std::min( aAsciiParameterNames.size(), _rError.aErrorDetails.size() ); ++i )
+ {
+ ::comphelper::string::searchAndReplaceAsciiI( sSubstituted, aAsciiParameterNames[i],
+ _rError.aErrorDetails[i] );
+ }
+
+ _inout_rBuffer.append( sSubstituted );
+ }
+ }
+
+ //----------------------------------------------------------------
+ void lcl_describeErrors( ::rtl::OUStringBuffer& _rBuffer, const ErrorLog& _rErrors, const USHORT _nHeadingResId )
+ {
+ _rBuffer.appendAscii( "=== " );
+ _rBuffer.append ( String( MacroMigrationResId( _nHeadingResId ) ) );
+ _rBuffer.appendAscii( " ===\n" );
+
+ String sException( MacroMigrationResId( STR_EXCEPTION ) );
+
+ for ( ErrorLog::const_iterator error = _rErrors.begin();
+ error != _rErrors.end();
+ ++error
+ )
+ {
+ _rBuffer.append( sal_Unicode( '-' ) );
+ _rBuffer.append( sal_Unicode( ' ' ) );
+ lcl_appendErrorDescription( _rBuffer, *error );
+ _rBuffer.append( sal_Unicode( '\n' ) );
+
+ if ( !error->aCaughtException.hasValue() )
+ continue;
+
+ _rBuffer.append( sException );
+ _rBuffer.append( ::comphelper::anyToString( error->aCaughtException ) );
+ _rBuffer.append( sal_Unicode( '\n' ) );
+ _rBuffer.append( sal_Unicode( '\n' ) );
+ }
+ }
+ }
+
+ //--------------------------------------------------------------------
+ bool MigrationLog::movedAnyLibrary( const DocumentID _nDocID )
+ {
+ DocumentLogs::const_iterator docPos = m_pData->aDocumentLogs.find( _nDocID );
+ if ( docPos == m_pData->aDocumentLogs.end() )
+ {
+ OSL_ENSURE( false, "MigrationLog::movedAnyLibrary: document is not known!" );
+ return false;
+ }
+ return !docPos->second.aMovedLibraries.empty();
+ }
+
+ //--------------------------------------------------------------------
+ ::rtl::OUString MigrationLog::getCompleteLog() const
+ {
+ ::rtl::OUStringBuffer aBuffer;
+
+ if ( m_pData->sBackupLocation.getLength() )
+ {
+ String sBackedUp( MacroMigrationResId( STR_SAVED_COPY_TO ) );
+ sBackedUp.SearchAndReplaceAllAscii( "$location$", m_pData->sBackupLocation );
+
+ aBuffer.appendAscii( "=== " );
+ aBuffer.append ( String( MacroMigrationResId( STR_DATABASE_DOCUMENT ) ) );
+ aBuffer.appendAscii( " ===\n" );
+ aBuffer.append ( sBackedUp );
+ aBuffer.appendAscii( "\n\n" );
+ }
+
+ if ( !m_pData->aFailures.empty() )
+ {
+ lcl_describeErrors( aBuffer, m_pData->aFailures
+ , STR_ERRORS );
+ }
+ else
+ {
+ String sMovedLibTemplate( MacroMigrationResId( STR_MOVED_LIBRARY ) );
+
+ for ( DocumentLogs::const_iterator doc = m_pData->aDocumentLogs.begin();
+ doc != m_pData->aDocumentLogs.end();
+ ++doc
+ )
+ {
+ const DocumentEntry& rDoc( doc->second );
+
+ if ( rDoc.aMovedLibraries.empty() )
+ continue;
+
+ String sDocTitle( MacroMigrationResId( rDoc.eType == eForm ? STR_FORM : STR_REPORT ) );
+ sDocTitle.SearchAndReplaceAllAscii( "$name$", rDoc.sName );
+
+ aBuffer.appendAscii( "=== " );
+ aBuffer.append ( sDocTitle );
+ aBuffer.appendAscii( " ===\n" );
+
+ for ( ::std::vector< LibraryEntry >::const_iterator lib = rDoc.aMovedLibraries.begin();
+ lib != rDoc.aMovedLibraries.end();
+ ++lib
+ )
+ {
+ String sMovedLib( sMovedLibTemplate );
+ sMovedLib.SearchAndReplaceAllAscii( "$type$", getScriptTypeDisplayName( lib->eType ) );
+ sMovedLib.SearchAndReplaceAllAscii( "$old$", lib->sOldName );
+ sMovedLib.SearchAndReplaceAllAscii( "$new$", lib->sNewName );
+
+ aBuffer.append( sMovedLib );
+ aBuffer.append( sal_Unicode( '\n' ) );
+ }
+
+ aBuffer.append( sal_Unicode( '\n' ) );
+ }
+ }
+
+ if ( !m_pData->aWarnings.empty() )
+ {
+ lcl_describeErrors( aBuffer, m_pData->aWarnings, STR_WARNINGS );
+ }
+
+ return aBuffer.makeStringAndClear();
+ }
+
+//........................................................................
+} // namespace dbmm
+//........................................................................