# utilitiesStart.tcl
# Copyright for URLibService (c) 1995 - 2021, 2024
# by Gerald Banon. All rights reserved.
# utilities for start
package provide dpi.inpe.br/banon/1998/08.02.08.56 2.1
# ----------------------------------------------------------------------
# LoadGlobalVariables
# portEntry value examples are:
# {} default
# 80
# 1905
# gjfb 800
# gjfb 19050
# called by post, start and others
proc LoadGlobalVariables {{portEntry {}}} {
global tcl_platform
global auto_path
global homePath
global bib2referRepository
global bibpessoal2referRepository
global citationKeyRepository
global compileWordsRepository
global col
global copyrightWarningRepository
global defaultAccessIconRepository
global defaultDocRepository
global defaultMetadataRepository
global englishMirrorRepository
global portugueseBrasilMirrorRepository
global englishRepository ;# needed for start and post
global englishWordsRepository
global isis2referRepository
global mirrorHomePageRepository
global referRepository
# global BibINPERepository
global searchRepository
global inflectionRepository ;# needed by MountSearch (used to find related records)
global URLibBannerSequenceRepository
global URLibServiceRepository
# global downloadingEnvironmentRepository ;# used in MakeDownloadFile ;# not used any more after 2020-04
# global downloadForWindowsRepository ;# used in MakeDownloadFile ;# not used any more after 2020-04
# global downloadForSunOSRepository ;# used in MakeDownloadFile ;# not used any more after 2020-04
# global downloadForLinuxRepository ;# used in MakeDownloadFile ;# not used any more after 2020-04
global parsingRepository
global samplingRepository
global sampledDocumentDBRepository
global repositoryNameDBRepository
# global localCollectionIndexDBRepository ;# commented by GJFB in 2010-08-04
global pythonCgiScriptForHistoryCaptureRepository ;# used in CreateBriefEntry
global OAIProtocolRepository ;# parent repository for the URLibService
global administratorPageRepository ;# parent repository for the URLibService
global MTD2-BRRepository
global XReferRepository
global resolverIndexRepository ;# added by GJFB in 2017-12-21 to identify if the URLibService is running or not the urlib.net resolver
global resolverMirrorRepository ;# added by GJFB in 2022-08-13 to identify if the displayed IBI is or not the urlib.net resolver mirror (used in Get)
global saveFlag ;# used by SaveRepositoryProperties, SaveReferenceTable and SaveMetadata
global serverAddress
global serverAddressWithIP
global urlibServerAddress ;# www.urlib.net and port - urlibServerAddress value is a constant and may be used any time
global urlibServerAddressWithIP ;# ip and port of urlib.net
global standaloneModeFlag ;# used in CreateEnvironmentArray and GetURLPropertyList
global applicationName
global temporalResolution ;# set in this procedure and used in CreateIBI only
global installInitialCollection ;# set in this procedure
if 1 {
# useful when LoadGlobalVariables is called from outside the URLibService
if ![info exists homePath] {
regexp "(^.*)/col/" [pwd] m homePath
}
}
set col ../../../../..
set bib2referRepository dpi.inpe.br/banon/1999/07.17.00.02
set isis2referRepository dpi.inpe.br/banon/2001/03.25.01.06
set bibpessoal2referRepository iconet.com.br/banon/2001/11.24.15.12
set citationKeyRepository dpi.inpe.br/banon/1999/07.11.21.09
set compileWordsRepository dpi.inpe.br/banon/1999/04.25.14.34
set copyrightWarningRepository dpi.inpe.br/banon/2000/02.20.10.08 ;# Default copyright warning for the URLib collection
set defaultAccessIconRepository dpi.inpe.br/banon/1999/12.15.21.29
set defaultDocRepository dpi.inpe.br/banon/1999/09.19.18.20
set defaultMetadataRepository dpi.inpe.br/banon/1999/09.12.15.10
set englishMirrorRepository dpi.inpe.br/banon/1999/05.03.22.11
set portugueseBrasilMirrorRepository dpi.inpe.br/banon/1999/06.19.22.43
set englishRepository dpi.inpe.br/banon/1998/05.03.10.10
set englishWordsRepository dpi.inpe.br/banon/1999/04.25.10.22
set mirrorHomePageRepository dpi.inpe.br/banon/2000/01.23.20.24
set referRepository dpi.inpe.br/banon/1999/08.08.19.14
# set BibINPERepository iconet.com.br/banon/2003/04.18.13.10
set searchRepository dpi.inpe.br/banon/1999/04.21.17.06
set inflectionRepository dpi.inpe.br/banon-pc3@80/2010/02.03.13.25
set URLibBannerSequenceRepository dpi.inpe.br/banon/2000/02.05.09.57
set URLibServiceRepository dpi.inpe.br/banon/1998/08.02.08.56
# set URLibServiceUserGuideRepository iconet.com.br/banon/2000/12.31.20.38
# set downloadingEnvironmentRepository iconet.com.br/banon/2000/12.30.22.40 ;# not used any more after 2020-04
# set downloadForWindowsRepository iconet.com.br/banon/2002/02.02.09.41 ;# not used any more after 2020-04
# set downloadForSunOSRepository iconet.com.br/banon/2002/02.02.20.42 ;# not used any more after 2020-04
# set downloadForLinuxRepository iconet.com.br/banon/2002/02.04.12.37 ;# not used any more after 2020-04
set parsingRepository iconet.com.br/banon/2001/11.24.08.30
set samplingRepository iconet.com.br/banon/2001/11.04.16.39
set sampledDocumentDBRepository iconet.com.br/banon/2002/02.13.10.35
# set repositoryNameDBRepository iconet.com.br/banon/2002/01.25.22.23 ;# for testing repository registration
set repositoryNameDBRepository iconet.com.br/banon/2002/07.15.14.03
# set localCollectionIndexDBRepository iconet.com.br/banon/2002/11.23.19.51 ;# commented by GJFB in 2010-08-04
set pythonCgiScriptForHistoryCaptureRepository dpi.inpe.br/juliana/2003/08.18.12.28
set OAIProtocolRepository iconet.com.br/banon/2003/11.21.21.08
set administratorPageRepository dpi.inpe.br/banon-pc@1905/2005/02.19.00.40
set MTD2-BRRepository iconet.com.br/banon/2006/06.22.00.30
set XReferRepository iconet.com.br/banon/2004/11.15.21.08
set resolverIndexRepository dpi.inpe.br/banon/2004/02.16.09.29 ;# added by GJFB in 2017-12-21 to identify if the URLibService is running or not the urlib.net resolver
set resolverMirrorRepository dpi.inpe.br/banon/2004/02.16.09.30.00 ;# added by GJFB in 2022-08-13 to identify if the displayed IBI is or not the urlib.net resolver mirror (used in Get)
# set temporalResolution 60. ;# for minute
set temporalResolution 1. ;# for second
# set temporalResolution .001 ;# for millisecond
set saveFlag 0 ;# 0 means that no save is done after any update (save is done just when running Run-exit) - All along the current implementation saveFlag remains always to 0 and have no effect at all
global allowedCommandList
## LeaveQueue and WaitQueue2 have been removed from allowedCommandList by GJFB in 2012-12-29 (see waitingFlag in MultipleSubmit)
## StartApacheServer has been removed from allowedCommandList by GJFB in 2013-12-02 because seems not to be used - StartApacheServerAfterSubmission is used instead
# StartApacheServer has been put again in allowedCommandList by GJFB in 2014-05-11 because it is uased (twice) in SPOK (see SPDialog.tcl)
# GetURLibServerAddress has been removed from allowedCommandList by GJFB in 2014-12-18 because $env(URLIB_SERVER_ADDR) is used instead
# ComputeSize has been removed from allowedCommandList by GJFB in 2018-03-09 because it doesn't require to be used via socket
# StoreArray has been removed by GJFB in 2018-03-30 for security reason - was probably just used in SPOK
set allowedCommandList {
AddMetadata2
AddTwoFields
array
BuildReturnPathArray
CheckModifiedTime
CheckUsernamePassword
Check-htpasswd
ComputeAccess
ComputeCurrentDownloadPermission
ComputeInfo
ComputeVersionState
ConvertPS2PDF
CreateBibINPEOutput
CreateCommonWordsRepList
CreateEnvironmentArray
CreateExtraFields
CreateIBI
CreateLanguageTable
CreateMirrorLanguageTable
CreatePermissionList
CreateReferenceTypeList
CreateRepMetadataRep
DeleteChildOutOfDateDocZip
DirectoryMTime
DisplayNumberOfEntries3
DownloadFileExists
DownloadFileMtime
ExtractHistogram
Find-
FindAllLanguageVersions
FindCopyrightRepositories
FindCurrentDownloadPermission
FindMetadataRep
FindMetadataRep2
FindPreferredLanguage
FindRepositoryNameFromIBI
GetAuthor
GetAuthorHomePage
GetCitedRepositoryList
GetCitingRepositoryList
GetDefaultBibliographicMirror
GetDocumentState
GetEncodingName
GetEntry
GetFieldValue
GetHistogram
GetLastChange
GetLastUpdate
GetMetadata
GetMetadataArrayNames
GetMetadataLastUpdate
GetNumberOfVisits
GetOfficialIconRep
GetOptimizedListOfSites
GetPermission
GetSampledDocumentDBServerAddress
GetTargetFile
GetURLibAdEMailAddress
GetURLibServiceSiteWithIP
GetVersionStamp
ImportRepository
incr
info
InformURLibSystem
InstallCGIScript
InstallRepository
lappend
LeaveQueue
Load2
LoadEnvironmentArray
LoadHostCollection
LoadRepository
MakeCgiScript2
MakeDownloadFile
MakeTargetKey
Migrate2
PostponeOneClickCount
PostponeSaveToDisk
ProvideRepository
RegisterRepository
RemoveMetadata2
RemoveRepository
RepositoryMTime
ReturnFullServerNameIP
ReturnLoBiMiRep
ReturnNumberOfMetadataRep
ReturnReferModel
ReturnRepositoryName
ReturnStaticIPFlag
ReturnTargetFileContent
ReturnTheMostRecentVersions
ReturnTheMostRecentEntries2
ReturnType
ReturnWordListOfSearchExpression
Run-exit
SaveMetadata
SaveReferenceTable
SaveRepositoryProperties
SearchRepository
set
SetFieldValue3
SetAdvancedUserFromUserGroup
StartApacheServer
StartApacheServerAfterSubmission
StartLocalURLibServer
Store2
StorePassword2
StoreProgress
StoreRepository
StoreURLContent2
TestContentType
TestExecute
TestSentinelProcess
TestUpdateLastUpdate
TransferCopyright
unset
UpdateAccessFile
UpdateArchiveFile
UpdateArchivingPolicy
UpdateBase
UpdateCitingItemList
UpdateCollection
UpdateDownloadFilesByAdministrator
UpdateMetadata
UpdateMetadataFromBiblioDB
UpdateHistory
UpdateHostCollectionFieldValue
UpdateIBIToArchiveServiceArray
UpdateLastUpdate
UpdateMetadataBase
UpdateMultipleGlobalVariables
UpdateReferMetadata
UpdateReferenceTable
UpdateRepMetadataRep
UpdateRepository2
UpdateRepositoryListForPost
UpdateRepositoryProperties
UpdateVariables
WaitQueue2
}
global allowedCommandListForMultipleSubmit
# GetNumberOfItems is obsolete from 2011-01-15 - migration 2011-01-15
# FindSite is obsolete from 2012-05-05
# GetURLPropertyListList is obsolete from 2012-05-05
# PutURLibServerAddress is not used anymore since 2007
# new communication scheme (step 3)
# removed: GetSiteStamp
# added: ReturnConfirmation
set allowedCommandListForMultipleSubmit {
CaptureRepository
CheckPassword
CheckRegistration
FindBannerPath
FindRepositoryForFind-
FindSiteContainingTheOriginal
GetDocAccessLogFileContent
GetFieldValue2
GetFirstDay
GetHostCollectionSite
GetLanguageRepositories
GetMetadataRepositories
GetMostRecentMetadataRep
GetNumberOfReferences
GetSiteInformation
GetSiteList
GetUnfairAddrList
GetURLibServiceLastVersion
GetURLPropertyList
GetUserData
GetValue
GetVersionRegistrationTime
GetWordOccurrences
Identity
Identity2
MultipleArrayGet
MultipleLinesLoad2
RegisterRepositoryName
RegisterSampledDocument
ReturnConfirmation
ReturnHostCollection
ReturnSiteContainingTheOriginal
ReturnURLPropertyList
Select
Select2
UpdateSiteList
}
global fieldAttributeTable
if [info exists fieldAttributeTable] {unset fieldAttributeTable}
# refer and BibTeX define the appearance of the respective dynamic format
# refer model is used to defined the fields that may be displayed within the canvas of the URLibService window or on-line (throught HTML forms) - see ReturnReferModel
# Refer BibTeX multiple lines refer model service stored
array set fieldAttributeTable { referencetype,1 1 referencetype,2 0 referencetype,3 0 referencetype,4 0 referencetype,5 0 }
array set fieldAttributeTable { thesistype,1 1 thesistype,2 0 thesistype,3 0 thesistype,4 0 thesistype,5 0 }
array set fieldAttributeTable { previousedition,1 1 previousedition,2 0 previousedition,3 0 previousedition,4 0 previousedition,5 0 }
array set fieldAttributeTable { nextedition,1 1 nextedition,2 0 nextedition,3 0 nextedition,4 0 nextedition,5 0 }
array set fieldAttributeTable { alternatepublication,1 1 alternatepublication,2 0 alternatepublication,3 0 alternatepublication,4 0 alternatepublication,5 0 } ;# ,2 must be 0
array set fieldAttributeTable { stageofalternatepublication,1 1 stageofalternatepublication,2 0 stageofalternatepublication,3 0 stageofalternatepublication,4 0 stageofalternatepublication,5 0 } ;# ,2 must be 0
array set fieldAttributeTable { targetfile,1 1 targetfile,2 1 targetfile,3 0 targetfile,4 0 targetfile,5 0 }
array set fieldAttributeTable { citationkey,1 0 citationkey,2 0 citationkey,3 0 citationkey,4 0 citationkey,5 0 }
array set fieldAttributeTable { site,1 0 site,2 0 site,3 0 site,4 0 site,5 0 }
array set fieldAttributeTable { isbn,1 1 isbn,2 1 isbn,3 1 isbn,4 1 isbn,5 0 }
array set fieldAttributeTable { issn,1 1 issn,2 1 issn,3 1 issn,4 1 issn,5 0 }
array set fieldAttributeTable { copyholder,1 0 copyholder,2 1 copyholder,3 0 copyholder,4 1 copyholder,5 0 }
array set fieldAttributeTable { childrepositories,1 0 childrepositories,2 0 childrepositories,3 0 childrepositories,4 0 childrepositories,5 0 }
# array set fieldAttributeTable { sourcerepositories,1 1 sourcerepositories,2 1 sourcerepositories,3 0 sourcerepositories,4 0 sourcerepositories,5 0 }
array set fieldAttributeTable { databaserepository,1 0 databaserepository,2 1 databaserepository,3 0 databaserepository,4 0 databaserepository,5 0 }
array set fieldAttributeTable { e-mailaddress,1 0 e-mailaddress,2 0 e-mailaddress,3 0 e-mailaddress,4 1 e-mailaddress,5 0 }
array set fieldAttributeTable { secondarykey,1 0 secondarykey,2 0 secondarykey,3 0 secondarykey,4 1 secondarykey,5 0 }
array set fieldAttributeTable { holdercode,1 0 holdercode,2 0 holdercode,3 0 holdercode,4 1 holdercode,5 0 }
array set fieldAttributeTable { secondarytype,1 0 secondarytype,2 0 secondarytype,3 0 secondarytype,4 1 secondarytype,5 0 }
array set fieldAttributeTable { tertiarytype,1 0 tertiarytype,2 0 tertiarytype,3 0 tertiarytype,4 1 tertiarytype,5 0 }
array set fieldAttributeTable { subject,1 0 subject,2 0 subject,3 0 subject,4 1 subject,5 0 }
array set fieldAttributeTable { session,1 0 session,2 0 session,3 0 session,4 1 session,5 0 }
array set fieldAttributeTable { dissemination,1 0 dissemination,2 0 dissemination,3 0 dissemination,4 1 dissemination,5 0 }
array set fieldAttributeTable { format,1 0 format,2 0 format,3 0 format,4 1 format,5 0 }
array set fieldAttributeTable { secondarydate,1 0 secondarydate,2 0 secondarydate,3 0 secondarydate,4 1 secondarydate,5 0 }
array set fieldAttributeTable { area,1 0 area,2 1 area,3 0 area,4 1 area,5 0 }
array set fieldAttributeTable { resumeid,1 0 resumeid,2 0 resumeid,3 1 resumeid,4 1 resumeid,5 0 }
array set fieldAttributeTable { orcid,1 0 orcid,2 0 orcid,3 1 orcid,4 1 orcid,5 0 }
array set fieldAttributeTable { group,1 0 group,2 0 group,3 1 group,4 1 group,5 0 }
array set fieldAttributeTable { affiliation,1 1 affiliation,2 1 affiliation,3 1 affiliation,4 1 affiliation,5 0 }
array set fieldAttributeTable { electronicmailaddress,1 1 electronicmailaddress,2 1 electronicmailaddress,3 1 electronicmailaddress,4 1 electronicmailaddress,5 0 } ;# ,2 must be 0
array set fieldAttributeTable { project,1 0 project,2 0 project,3 0 project,4 1 project,5 0 }
array set fieldAttributeTable { course,1 0 course,2 0 course,3 0 course,4 1 course,5 0 }
array set fieldAttributeTable { usergroup,1 0 usergroup,2 0 usergroup,3 1 usergroup,4 1 usergroup,5 0 }
array set fieldAttributeTable { documentstage,1 0 documentstage,2 0 documentstage,3 0 documentstage,4 1 documentstage,5 0 }
array set fieldAttributeTable { progress,1 0 progress,2 0 progress,3 0 progress,4 1 progress,5 0 }
array set fieldAttributeTable { sponsor,1 0 sponsor,2 0 sponsor,3 1 sponsor,4 1 sponsor,5 0 }
# array set fieldAttributeTable { doi,1 0 doi,2 1 doi,3 1 doi,4 1 doi,5 0 } ;# commented in 2022-03-03
array set fieldAttributeTable { doi,1 1 doi,2 1 doi,3 0 doi,4 1 doi,5 0 } ;# added in 2022-03-03
array set fieldAttributeTable { accessdate,1 0 accessdate,2 1 accessdate,3 0 accessdate,4 1 accessdate,5 0 }
array set fieldAttributeTable { mark,1 0 mark,2 0 mark,3 0 mark,4 1 mark,5 0 } ;# ,2 must be 0
array set fieldAttributeTable { secondarymark,1 0 secondarymark,2 0 secondarymark,3 0 secondarymark,4 1 secondarymark,5 0 } ;# ,2 must be 0
array set fieldAttributeTable { tertiarymark,1 0 tertiarymark,2 0 tertiarymark,3 0 tertiarymark,4 1 tertiarymark,5 0 } ;# ,2 must be 0
array set fieldAttributeTable { index,1 0 index,2 0 index,3 0 index,4 0 index,5 0 }
array set fieldAttributeTable { lastupdate,1 0 lastupdate,2 0 lastupdate,3 0 lastupdate,4 0 lastupdate,5 1 }
array set fieldAttributeTable { metadatalastupdate,1 0 metadatalastupdate,2 0 metadatalastupdate,3 0 metadatalastupdate,4 0 metadatalastupdate,5 1 }
array set fieldAttributeTable { size,1 0 size,2 0 size,3 0 size,4 0 size,5 1 }
array set fieldAttributeTable { numberoffiles,1 0 numberoffiles,2 0 numberoffiles,3 0 numberoffiles,4 0 numberoffiles,5 1 }
array set fieldAttributeTable { language,1 1 language,2 1 language,3 0 language,4 1 language,5 1 }
array set fieldAttributeTable { contenttype,1 0 contenttype,2 0 contenttype,3 0 contenttype,4 1 contenttype,5 1 }
array set fieldAttributeTable { hostcollection,1 0 hostcollection,2 0 hostcollection,3 0 hostcollection,4 0 hostcollection,5 1 }
array set fieldAttributeTable { parentrepositories,1 0 parentrepositories,2 0 parentrepositories,3 0 parentrepositories,4 1 parentrepositories,5 1 }
array set fieldAttributeTable { username,1 0 username,2 0 username,3 0 username,4 0 username,5 1 }
array set fieldAttributeTable { readergroup,1 0 readergroup,2 0 readergroup,3 1 readergroup,4 1 readergroup,5 1 } ;# ,2 must be 0
array set fieldAttributeTable { readpermission,1 0 readpermission,2 0 readpermission,3 0 readpermission,4 1 readpermission,5 1 }
array set fieldAttributeTable { visibility,1 0 visibility,2 0 visibility,3 0 visibility,4 1 visibility,5 1 } ;# ,2 must be 0
array set fieldAttributeTable { mirrorrepository,1 0 mirrorrepository,2 0 mirrorrepository,3 0 mirrorrepository,4 1 mirrorrepository,5 0 } ;# ,2 must be 0
array set fieldAttributeTable { supervisor,1 0 supervisor,2 0 supervisor,3 1 supervisor,4 0 supervisor,5 0 }
array set fieldAttributeTable { lasthostcollection,1 0 lasthostcollection,2 0 lasthostcollection,3 0 lasthostcollection,4 0 lasthostcollection,5 0 }
array set fieldAttributeTable { identifier,1 0 identifier,2 0 identifier,3 0 identifier,4 0 identifier,5 1 }
array set fieldAttributeTable { lineage,1 1 lineage,2 0 lineage,3 1 lineage,4 1 lineage,5 0 }
array set fieldAttributeTable { transferableflag,1 0 transferableflag,2 0 transferableflag,3 0 transferableflag,4 0 transferableflag,5 1 } ;# ,2 must be 0
array set fieldAttributeTable { copyright,1 0 copyright,2 0 copyright,3 0 copyright,4 1 copyright,5 1 }
array set fieldAttributeTable { rightsholder,1 0 rightsholder,2 0 rightsholder,3 0 rightsholder,4 1 rightsholder,5 0 }
array set fieldAttributeTable { versiontype,1 0 versiontype,2 0 versiontype,3 0 versiontype,4 1 versiontype,5 0 }
array set fieldAttributeTable { archivingpolicy,1 0 archivingpolicy,2 0 archivingpolicy,3 0 archivingpolicy,4 1 archivingpolicy,5 0 }
array set fieldAttributeTable { nexthigherunit,1 0 nexthigherunit,2 0 nexthigherunit,3 1 nexthigherunit,4 1 nexthigherunit,5 0 }
array set fieldAttributeTable { previouslowerunit,1 0 previouslowerunit,2 0 previouslowerunit,3 1 previouslowerunit,4 1 previouslowerunit,5 0 }
array set fieldAttributeTable { agreement,1 0 agreement,2 0 agreement,3 0 agreement,4 0 agreement,5 0 }
array set fieldAttributeTable { descriptionlevel,1 0 descriptionlevel,2 0 descriptionlevel,3 0 descriptionlevel,4 1 descriptionlevel,5 0 }
array set fieldAttributeTable { archivist,1 0 archivist,2 0 archivist,3 1 archivist,4 1 archivist,5 0 }
array set fieldAttributeTable { creatorhistory,1 0 creatorhistory,2 0 creatorhistory,3 0 creatorhistory,4 1 creatorhistory,5 0 }
array set fieldAttributeTable { textlanguage,1 0 textlanguage,2 0 textlanguage,3 0 textlanguage,4 0 textlanguage,5 0 }
array set fieldAttributeTable { shorttitle,1 0 shorttitle,2 0 shorttitle,3 0 shorttitle,4 1 shorttitle,5 0 }
array set fieldAttributeTable { parameterlist,1 0 parameterlist,2 0 parameterlist,3 0 parameterlist,4 1 parameterlist,5 0 }
array set fieldAttributeTable { schedulinginformation,1 0 schedulinginformation,2 0 schedulinginformation,3 0 schedulinginformation,4 1 schedulinginformation,5 0 }
array set fieldAttributeTable { citingitemlist,1 0 citingitemlist,2 0 citingitemlist,3 1 citingitemlist,4 0 citingitemlist,5 1 } ;# added by GJFB in 2024-01-21
# Refer BibTeX multiple lines refer model service stored
package require http ;# added by GJFB in 2023-05-02 - for some reason, must be the first package require otherwise the package version appears to be 1.0 and procedures, like http::geturl, are not found even calling again 'package require http' (this problem has been found with patch 8.5.7 and package http 2.7.3 at plutao)
# puts [package names]
# puts {}
# puts "auto_path = $auto_path"
# Create fieldNameListForMountSearch and abbreviationArray
# global fieldNameList ;# used in MountSearch - commented by GJFB in 2022-07-18 - doesn't work when sourcing $homePath/col/$referRepository/doc/referTables.tcl below that contains another fieldNameList
global abbreviationArray ;# used in CreateFullEntry and Search only
if [file exists $homePath/col/$englishMirrorRepository/doc/mirror/enFieldName.tcl] {
# field::conversionTable
# if [info exists field::conversionTable] {unset field::conversionTable}
source $homePath/col/$englishMirrorRepository/doc/mirror/enFieldName.tcl ;# set field::conversionTable
if [file exists $homePath/col/$searchRepository] {
lappend auto_path $homePath/col/$searchRepository/doc
package require $searchRepository
global testingSearch ;# set in Search.tcl when texting Search
if ![info exists testingSearch] {
source $homePath/col/$searchRepository/doc/Search.tcl ;# added by GJFB in 2022-07-18
}
# set fieldNameList [CreateAbbreviation .*] ;# commented by GJFB in 2022-07-18
set ${searchRepository}::fieldNameListForMountSearch [CreateAbbreviation .*] ;# needs field::conversionTable - set abbreviationArray - added by GJFB in 2022-07-18
# puts [set ${searchRepository}::fieldNameListForMountSearch]
}
}
# Create fieldNameListForMountSearch and abbreviationArray - end
global multipleLineFieldNameList
global authorFieldNameList ;# used in Search in col/dpi.inpe.br/banon/1999/04.21.17.06/doc
global multipleLineReferFieldNamePattern
global multipleLineReferFieldNamePattern2
global multipleLineReferFieldNamePatternForCreator
global firstFieldNameList ;# added by GJFB in 2022-07-25
if 1 {
# Load ${referRepository}::orderingTable, ${referRepository}::referenceTypeXorderingTypeArray and ${referRepository}::conversionTable for Refer format
if [file exists $homePath/col/$referRepository/doc/referTables.tcl] {
source $homePath/col/$referRepository/doc/referTables.tcl
}
}
# multipleLineFieldNameList
# authorFieldNameList
set multipleLineFieldNameList {}
set authorFieldNameList {}
# %A
# set multipleLineFieldNameList [concat $multipleLineFieldNameList {author cartographer creatorname director editor programmer reporter runby fullname}] ;# %A
set outputList [CreateFieldNameList %A]
# puts --$outputList-- ;# executed in 2022-11-08
# => --author cartographer creatorname director editor fullname programmer reporter runby--
set multipleLineFieldNameList [concat $multipleLineFieldNameList $outputList] ;# %A
set authorFieldNameList [concat $authorFieldNameList $outputList] ;# %A
# %E
# set multipleLineFieldNameList [concat $multipleLineFieldNameList {committee editor program seriesdirector serieseditor source recipient}] ;# %E - added by GJFB in 2022-10-29 for Administrative Document
set outputList [CreateFieldNameList %E]
# puts --$outputList-- ;# executed in 2022-11-08
# => --committee editor program recipient seriesdirector serieseditor source--
set multipleLineFieldNameList [concat $multipleLineFieldNameList $outputList] ;# %E - added by GJFB in 2022-11-06
set authorFieldNameList [concat $authorFieldNameList $outputList] ;# %E
# %Y
# set multipleLineFieldNameList [concat $multipleLineFieldNameList {serieseditor producer receiver}] ;# %Y
set outputList [CreateFieldNameList %Y]
# puts --$outputList-- ;# executed in 2022-11-08
# => --producer receiver serieseditor--
set multipleLineFieldNameList [concat $multipleLineFieldNameList $outputList] ;# %Y
set authorFieldNameList [concat $authorFieldNameList $outputList] ;# %Y
# %?
# set multipleLineFieldNameList [concat $multipleLineFieldNameList {translator component photographer}] ;# %?
set outputList [CreateFieldNameList %\\?]
# puts --$outputList-- ;# executed in 2022-11-08
# => --component photographer translator--
set multipleLineFieldNameList [concat $multipleLineFieldNameList $outputList] ;# %?
set authorFieldNameList [concat $authorFieldNameList $outputList] ;# %?
# %O
# set multipleLineFieldNameList [concat $multipleLineFieldNameList {notes}] ;# %O
set outputList [CreateFieldNameList %O]
# puts --$outputList-- ;# executed in 2022-11-08
# => --notes--
set multipleLineFieldNameList [concat $multipleLineFieldNameList $outputList] ;# %O
set authorFieldNameList [concat $authorFieldNameList {archivist sponsor supervisor}] ;# added by GJFB in 2022-03-31 for the sake of simplicity (see below)
set multipleLineFieldNameList [lsort -unique $multipleLineFieldNameList]
set authorFieldNameList [lsort -unique $authorFieldNameList]
foreach item [array names fieldAttributeTable *,3] {
## affiliation archivist doi electronicmailaddress group isbn issn lineage readergroup resumeid orcid sponsor supervisor usergroup
# affiliation archivist electronicmailaddress group isbn issn lineage readergroup resumeid orcid sponsor supervisor usergroup
if $fieldAttributeTable($item) {
regsub {,3} $item {} fieldName
lappend multipleLineFieldNameList $fieldName
}
}
# firstFieldNameList
set firstFieldNameList {}
# add FIRST for some multiple line fields
foreach fieldName [lsort [set ${searchRepository}::fieldNameListForMountSearch]] {
if [regsub {^first} $fieldName {} fieldName2] {
lappend firstFieldNameList $fieldName
foreach fieldName3 $multipleLineFieldNameList {
if [string equal $fieldName2 $fieldName3] {
array set fieldAttributeTable [list $fieldName,1 0 $fieldName,2 0 $fieldName,3 1 $fieldName,4 0 $fieldName,5 0]
lappend multipleLineFieldNameList $fieldName
}
}
}
}
# puts $multipleLineFieldNameList
# puts $authorFieldNameList
if 0 {
# commented by GJFB in 2022-03-31 - too complicated
foreach item [array names fieldAttributeTable *,3] {
## add affiliation archivist doi electronicmailaddress group isbn issn lineage readergroup resumeid orcid sponsor supervisor usergroup
# add affiliation archivist electronicmailaddress group isbn issn lineage readergroup resumeid orcid sponsor supervisor usergroup
if $fieldAttributeTable($item) {
regsub {,3} $item {} fieldName
# if {[lsearch {affiliation doi electronicmailaddress group isbn issn lineage readergroup resumeid orcid usergroup} $fieldName] == -1} # ;# commented in 2022-03-03
# if {[lsearch {affiliation electronicmailaddress group isbn issn lineage readergroup resumeid orcid usergroup} $fieldName] == -1} # ;# added in 2022-03-03 - commented by GJFB in 2022-03-31
if {[lsearch {affiliation electronicmailaddress group isbn issn lineage readergroup resumeid orcid usergroup nexthigherunit previouslowerunit} $fieldName] == -1} { ;# added in 2022-03-31 - nexthigherunit previouslowerunit should be excluded as well
## exclude affiliation doi electronicmailaddress group isbn issn...
# exclude affiliation electronicmailaddress group isbn issn...
# author field: archivist sponsor supervisor
lappend authorFieldNameList $fieldName
}
}
}
} else {
# added by GJFB in 2022-03-31 for the sake of simplicity
foreach fieldName $authorFieldNameList {
# add FIRST for author field name
lappend authorFieldNameList first$fieldName
}
}
# puts $authorFieldNameList
# multipleLineReferFieldNamePattern
set multipleLineReferFieldNamePattern {A|E|Y|\?|O}
foreach item [array names fieldAttributeTable *,3] {
## add affiliation archivist doi electronicmailaddress group isbn issn lineage readergroup resumeid orcid sponsor supervisor usergroup
# add affiliation archivist electronicmailaddress group isbn issn lineage readergroup resumeid orcid sponsor supervisor usergroup
if $fieldAttributeTable($item) {
regsub {,3} $item {} fieldName
if [regexp {^first} $fieldName] {continue} ;# exclude the virtual fields beginning with first
append multipleLineReferFieldNamePattern |@$fieldName
}
}
# multipleLineReferFieldNamePattern2
# created by GJFB in 2018-01-07 to allow the two forms (one line or multiple lines) of %@previouslowerunit in @metadata.refer or in filling forms
set multipleLineReferFieldNamePattern2 {A|E|Y|\?|O}
foreach item [array names fieldAttributeTable *,3] {
## add affiliation archivist doi electronicmailaddress group isbn issn lineage readergroup resumeid orcid sponsor supervisor usergroup
# add affiliation archivist electronicmailaddress group isbn issn lineage readergroup resumeid orcid sponsor supervisor usergroup
if $fieldAttributeTable($item) {
regsub {,3} $item {} fieldName
if [regexp {^first} $fieldName] {continue} ;# exclude the virtual fields beginning with first
if [regexp {^nexthigherunit$|^previouslowerunit$} $fieldName] {continue} ;# exclude nexthigherunit and previouslowerunit
append multipleLineReferFieldNamePattern2 |@$fieldName
}
}
# puts $multipleLineReferFieldNamePattern2
# => A|E|Y|\?|O|@isbn|@lineage|@group|@orcid|@readergroup|@archivist|@sponsor|@resumeid|@affiliation|@supervisor|@electronicmailaddress|@issn|@usergroup
# multipleLineReferFieldNamePatternForCreator
set multipleLineReferFieldNamePatternForCreator {A|E|Y|\?|@archivist}
# see also AEY? pattern in LoadMetadata (utilities2.tcl) and in SampleFile (Sampling.tcl)
global mirrorLanguageTable
array set mirrorLanguageTable [CreateMirrorLanguageTable]
global webLanguageTable
array set webLanguageTable [CreateWebLanguageTable]
# update here (and in CreateWebLanguageTable), when including a new language
global masterLanguagePattern ;# used by CreateBibTeXEntry (cf., utilitiesMirror.tcl)
set masterLanguagePattern master|mestrado
global apacheDirectoryPath
global apacheMimeTypesFilePath
global apacheMagicFilePath
global apacheIconDirectoryPath
global apachePath
global apacheLibDirectoryPath
global phpiniDirectoryPath
global apacheRepository ;# used by ControlBCButtonState and post
global htpasswdPath
# global htpasswdRepository
# global apacheVersion ;# 1.3.1 1.3.3 1.3.11 1.3.20 1.3.22
# global linuxDistribution ;# commented by GJFB in 2021-12-19
global tclPath
global wishPath
global tclRepository
global pythonPath
# global pythonRepository
global zipPath
global zipRepository
global unZipPath
global unZipRepository ;# needed by start
global unRarPath
# Installation of a new Linux distribution
# set in this file:
# apacheMimeTypesFilePath mime.types
# apacheMagicFilePath magic
# apacheIconDirectoryPath icons
# apachePath httpd
# apacheLibDirectoryPath apache ? (use by LoadModule directive)
# htpasswdPath htpasswd ?
# linuxDistribution Mandrake
# tclPath tclsh
# wishPath wish
# zipPath zip
## set in ExtractURLibService:
# unZipPath unzip
# set in SPDialog.tcl:
# environmentArray(netscape) netscape
# get output of the following commands:
# httpd -v (see post)
# hostname (see in this file the FindInternetAddress procedure (in utilitiesStart.tcl))
## domainname
# nslookup (see in this file the FindInternetAddress procedure)
## /usr/bin/nslookup
## cat /etc/hosts
## ypcat hosts
## /sbin/ifconfig
# whoami (see CreateUser&GroupDirectives in StartServer.tcl)
# Installation of a new Linux distribution - end
global knownPathArray
# source knownPathArray.tcl ;# needed by SetPath
source $homePath/col/$URLibServiceRepository/doc/knownPathArray.tcl ;# needed by SetPath
# Linux, Slackware, Apache/2.2.13, mtc-m18.sid.inpe.br
# Linux, Slackware, Apache/2.2.15, mtc-m16.sid.inpe.br
# Linux, Slackware, Apache/2.2.16, mtc-m17.sid.inpe.br
# Linux, Slackware, Apache/2.2.19, mtc-m20.sid.inpe.br
# Linux, Slackware, Apache/2.2.22, mtc-m21.sid.inpe.br
# Linux, Centos, Apache/2.2.15, md-m09.sid.inpe.br
## Linux, Centos, Apache/2.4.6, plutao.sid.inpe.br
set apachePath [SetPath httpd #0]
set htpasswdPath [SetPath htpasswd #0]
set apacheLibDirectoryPath [SetPath httpdLibDirectory #0]
set apacheMimeTypesFilePath [SetPath httpdMimeTypesFile #0]
set apacheMagicFilePath [SetPath httpdMagicFile #0]
set apacheIconDirectoryPath [SetPath httpdIconDirectory #0]
set phpiniDirectoryPath [SetPath phpiniDirectory #0]
# if {$tcl_platform(os) == "Linux"} {
# if [file owned $apachePath] {exec chmod 774 $apachePath} ;# needed after Install Repository (IR)
# if [file owned $htpasswdPath] {exec chmod 774 $htpasswdPath} ;# needed after Install Repository (IR)
# }
# set linuxDistribution {} ;# commented by GJFB in 2021-12-19
set apacheRepository {}
# package require http ;# commented by GJFB in 2023-05-02 - now above - must be the first package require
set zipRepository {}
set zipExec zip
# puts --$apachePath--
# puts --$htpasswdPath--
# puts --$apacheLibDirectoryPath--
# puts --$apacheMimeTypesFilePath--
# puts --$apacheMagicFilePath--
# puts --$apacheIconDirectoryPath--
# puts --$phpiniDirectoryPath--
# exit
# if {[string equal {} $apachePath] || \
# [string equal {} $htpasswdPath] || \
# [string equal {} $apacheLibDirectoryPath] || \
# [string equal {} $apacheMimeTypesFilePath] || \
# [string equal {} $apacheMagicFilePath] || \
# [string equal {} $apacheIconDirectoryPath] || \
# [string equal {} $phpiniDirectoryPath]} # ;# commented by GJFB in 2018-10-15
if {[string equal {} $apachePath] && \
([string equal {} $htpasswdPath] || \
[string equal {} $apacheLibDirectoryPath] || \
[string equal {} $apacheMimeTypesFilePath] || \
[string equal {} $apacheMagicFilePath] || \
[string equal {} $apacheIconDirectoryPath] || \
[string equal {} $phpiniDirectoryPath])} { ;# added by GJFB in 2018-10-15 - try old code only if apachePath was empty
# try old code
# Windows
if {$tcl_platform(platform) == "windows"} {
if [file isdirectory {C:/Program Files/Apache Group/Apache2x}] {
# didn't work - apache 2.0.44
set apacheMimeTypesFilePath {C:/Program Files/Apache Group/Apache2/conf/mime.types}
set apacheMagicFilePath {C:/Program Files/Apache Group/Apache2/conf/magic}
set apacheIconDirectoryPath {C:/Program Files/Apache Group/Apache2/icons}
set apachePath {C:/Program Files/Apache Group/Apache2/bin/Apache.exe}
set apacheLibDirectoryPath {C:/Program Files/Apache Group/Apache2/modules}
# set apacheVersion 2.0.44
} elseif {[file isdirectory $homePath/col/urlib.net/www/2024/04.15.02.57x]} {
# gjfb:1905 - apache 2.4.59 - added by GJFB in 2024-05-01
set apacheRepository urlib.net/www/2024/04.15.02.57
set apacheExec httpd.exe
set apacheMimeTypesFilePath $homePath/col/$apacheRepository/doc/Apache24/conf/mime.types
set apacheMagicFilePath $homePath/col/$apacheRepository/doc/Apache24/conf/magic
set apacheIconDirectoryPath $homePath/col/$apacheRepository/doc/Apache24/icons ;# must be homePath (because of Alias Apache directive)
set apachePath $homePath/col/$apacheRepository/doc/Apache24/bin/$apacheExec
set apacheLibDirectoryPath $homePath/col/$apacheRepository/doc/Apache24/modules ;# needed for php
# set apacheVersion 2.4.59
} elseif {[file isdirectory $homePath/col/iconet.com.br/banon/2005/10.07.22.52x]} {
# banon-pc2 - apache 2.0.54
set apacheRepository iconet.com.br/banon/2005/10.07.22.52
set apacheExec Apache.exe
set apacheMimeTypesFilePath $homePath/col/$apacheRepository/doc/Apache2/conf/mime.types
set apacheMagicFilePath $homePath/col/$apacheRepository/doc/Apache2/conf/magic
set apacheIconDirectoryPath $homePath/col/$apacheRepository/doc/Apache2/icons ;# must be homePath (because of Alias Apache directive)
set apachePath $homePath/col/$apacheRepository/doc/Apache2/bin/$apacheExec
set apacheLibDirectoryPath $homePath/col/$apacheRepository/doc/Apache2/modules ;# needed for php
# set apacheVersion 2.0.54
} elseif {[file isdirectory {C:/Program Files/Apache Group/Apache}]} {
# notebook - apache 1.3.27
set apacheMimeTypesFilePath {C:/Program Files/Apache Group/Apache/conf/mime.types}
set apacheMagicFilePath {C:/Program Files/Apache Group/Apache/conf/magic}
set apacheIconDirectoryPath {C:/Program Files/Apache Group/Apache/icons}
set apachePath {C:/Program Files/Apache Group/Apache/Apache.exe}
set apacheLibDirectoryPath {C:/Program Files/Apache Group/Apache/modules}
# set apacheVersion 1.3.27
} elseif {[file isdirectory $homePath/col/iconet.com.br/banon/2003/03.16.13.05]} {
# Lise - apache 1.3.27
# banon-pc2 - apache 1.3.27
# gjfb:1095 - apache 1.3.27
set apacheRepository iconet.com.br/banon/2003/03.16.13.05
set apacheExec Apache.exe
set apacheMimeTypesFilePath $homePath/col/$apacheRepository/doc/conf/mime.types
set apacheMagicFilePath $homePath/col/$apacheRepository/doc/conf/magic
set apacheIconDirectoryPath $homePath/col/$apacheRepository/doc/icons ;# must be homePath (because of Alias Apache directive)
set apachePath $homePath/col/$apacheRepository/doc/$apacheExec
set apacheLibDirectoryPath $homePath/col/$apacheRepository/doc/modules ;# needed for php
# set apacheVersion 1.3.27
# # elseif [file isdirectory $homePath/col/iconet.com.br/banon/2001/12.28.20.28] #
# set apacheRepository iconet.com.br/banon/2001/12.28.20.28
# set apacheExec Apache.exe
# set apacheMimeTypesFilePath $homePath/col/$apacheRepository/doc/conf/mime.types
# set apacheMagicFilePath $homePath/col/$apacheRepository/doc/conf/magic
# set apacheIconDirectoryPath $homePath/col/$apacheRepository/doc/icons ;# must be homePath (because of Alias Apache directive)
# set apachePath $homePath/col/$apacheRepository/doc/$apacheExec
## set apacheVersion 1.3.22
} else {
# apache 1.3.3
set apacheRepository dpi.inpe.br/banon/1999/01.02.16.35
set apacheExec Apache.exe
set apacheMimeTypesFilePath $homePath/col/$apacheRepository/doc/conf/mime.types
set apacheMagicFilePath $homePath/col/$apacheRepository/doc/conf/magic
set apacheIconDirectoryPath $homePath/col/$apacheRepository/doc/icons ;# must be homePath (because of Alias Apache directive)
set apachePath $homePath/col/$apacheRepository/doc/$apacheExec
# set apacheVersion 1.3.3
}
# htpasswdPath
if [file isdirectory $homePath/col/iconet.com.br/banon/2002/12.15.15.27] {
# just used with the notebook
set htpasswdExec htpasswd.exe
set htpasswdRepository iconet.com.br/banon/2002/12.15.15.27
set htpasswdPath $homePath/col/$htpasswdRepository/doc/$htpasswdExec
} elseif {[file isdirectory {C:/Program Files/Apache Group/Apache}]} {
set htpasswdPath {C:/Program Files/Apache Group/Apache/bin/htpasswd.exe}
} elseif {[file isdirectory $homePath/col/iconet.com.br/banon/2003/03.16.13.05]} {
# 1.3.27
set apacheRepository iconet.com.br/banon/2003/03.16.13.05
set htpasswdPath $homePath/col/$apacheRepository/doc/bin/htpasswd.exe
}
if 0 {
# Juliana's work
set pythonExec python.exe
if [file isdirectory $homePath/col/dpi.inpe.br/juliana/2003/08.15.10.26] {
set pythonRepository dpi.inpe.br/juliana/2003/08.15.10.26
} else {
set pythonRepository {}
}
}
## see ExtractURLibService.tcl
# set unZipExec unzip
# set unZipRepository dpi.inpe.br/banon/2000/08.09.16.24
set zipRepository dpi.inpe.br/banon/1998/03.07.08.57
}
# Windows - end
if 0 {
# commented by GJFB in 2021-12-19 - operating sistems no more in use
# Unix
if {$tcl_platform(platform) == "unix"} {
# exec umask 2 ;# gives permission to the group - doesn't work here
set phpiniDirectoryPath {}
if {$tcl_platform(os) == "SunOS"} {
# SunOS
# set apacheConfDirectoryPath /usr/local/apache
set apacheMimeTypesFilePath /usr/local/apache/conf/mime.types
set apacheMagicFilePath /usr/local/apache/conf/magic
set apacheIconDirectoryPath /usr/local/apache/icons
set apachePath /usr/local/apache/bin/httpd
set apacheLibDirectoryPath /usr/local/apache
set htpasswdPath /usr/local/apache/bin/htpasswd
# set tclPath /usr/local/bin/tclsh
# set wishPath /usr/local/bin/wish
# set tclRepository {}
if 0 {
# Juliana's work (hermes:1910)
set pythonExec python
if [file isdirectory $homePath/col/dpi.inpe.br/banon/2004/06.22.11.51] {
set pythonRepository dpi.inpe.br/banon/2004/06.22.11.51
} else {
set pythonRepository {}
}
}
## see ExtractURLibService.tcl
# set unZipExec unzip
# set unZipRepository dpi.inpe.br/banon/2000/08.09.17.10
set zipRepository dpi.inpe.br/vagner/1999/07.22.16.12
if {[file isdirectory $homePath/col/$zipRepository/doc]} {
# it is better to get zip from a repository in order to
# capture its version when registering a document
# set zipExec zip
} elseif [file exists /usr/local/bin/zip] {
# set zipPath /usr/local/bin/zip ;# now in knownPathArray
set zipRepository {}
} else {
set zipRepository {}
}
# SunOS - end
} elseif {$tcl_platform(os) == "Linux"} {
# Linux
if [file isdirectory $homePath/col/dpi.inpe.br/banon-pc2@80/2006/08.03.13.25x] {
# x is to discard apache 1.3.37 because it doesn't work without a complicated installation of the php module libraries
# apache 1.3.37 with socket and mail, coming from Mandrake at netuno.dpi.inpe.br
set apacheRepository dpi.inpe.br/banon-pc2@80/2006/08.03.13.25
set apacheExec httpd
set apacheMimeTypesFilePath $homePath/col/$apacheRepository/doc/conf/mime.types
set apacheMagicFilePath $homePath/col/$apacheRepository/doc/conf/magic
set apacheIconDirectoryPath $homePath/col/$apacheRepository/doc/icons
set apachePath $homePath/col/$apacheRepository/doc/bin/$apacheExec
set apacheLibDirectoryPath $homePath/col/$apacheRepository/doc/libexec
set phpiniDirectoryPath $homePath/col/$apacheRepository/doc/bin
set htpasswdPath $homePath/col/$apacheRepository/doc/bin/htpasswd
set linuxDistribution Mandrake
if [file owned $apachePath] {exec chmod 774 $apachePath}
if [file owned $htpasswdPath] {exec chmod 774 $htpasswdPath}
} elseif {[file isdirectory $homePath/col/dpi.inpe.br/banon-pc2@1905/2006/05.18.15.44x]} {
# x is to discard apache 1.3.35 because it doesn't work without a complicated installation of the php module libraries
# apache 1.3.35 with socket, coming from Mandrake at dpi.inpe.br
set apacheRepository dpi.inpe.br/banon-pc2@1905/2006/05.18.15.44
set apacheExec httpd
set apacheMimeTypesFilePath $homePath/col/$apacheRepository/doc/conf/mime.types
set apacheMagicFilePath $homePath/col/$apacheRepository/doc/conf/magic
set apacheIconDirectoryPath $homePath/col/$apacheRepository/doc/icons
set apachePath $homePath/col/$apacheRepository/doc/bin/$apacheExec
set apacheLibDirectoryPath $homePath/col/$apacheRepository/doc/libexec
set phpiniDirectoryPath $homePath/col/$apacheRepository/doc/bin
set htpasswdPath $homePath/col/$apacheRepository/doc/bin/htpasswd
set linuxDistribution Mandrake
if [file owned $apachePath] {exec chmod 774 $apachePath}
if [file owned $htpasswdPath] {exec chmod 774 $htpasswdPath}
} elseif {[file isdirectory /usr/local/apache/icons]} {
# Mandrake distribution (marte.dpi.inpe.br)
# Mandrake distribution (hermes2.dpi.inpe.br)
# Mandrake distribution (plutao.dpi.inpe.br)
# (bibdigital.sid.inpe.br 2014-10-14)
set apacheMimeTypesFilePath /usr/local/apache/conf/mime.types
set apacheMagicFilePath /usr/local/apache/conf/magic
set apacheIconDirectoryPath /usr/local/apache/icons
set apachePath /usr/local/apache/bin/httpd
set apacheLibDirectoryPath /usr/local/apache/libexec
set htpasswdPath /usr/local/apache/bin/htpasswd
set linuxDistribution Mandrake
} elseif {[file isdirectory $homePath/col/iconet.com.br/banon/2005/12.06.21.35]} {
# apache 1.3.33 coming from Mandrake at dpi.inpe.br
set apacheRepository iconet.com.br/banon/2005/12.06.21.35
set apacheExec httpd
set apacheMimeTypesFilePath $homePath/col/$apacheRepository/doc/conf/mime.types
set apacheMagicFilePath $homePath/col/$apacheRepository/doc/conf/magic
set apacheIconDirectoryPath $homePath/col/$apacheRepository/doc/icons
set apachePath $homePath/col/$apacheRepository/doc/bin/$apacheExec
set htpasswdPath $homePath/col/$apacheRepository/doc/bin/htpasswd
set linuxDistribution Mandrake
if [file owned $apachePath] {exec chmod 774 $apachePath}
if [file owned $htpasswdPath] {exec chmod 774 $htpasswdPath}
} elseif {[file isdirectory $homePath/col/iconet.com.br/banon/2005/11.24.22.46]} {
# apache 2.0.53
# doesn't work because httpd2 needs shared libraries
set apacheRepository iconet.com.br/banon/2005/11.24.22.46
set apacheExec httpd2
set apacheDirectoryPath $homePath/col/$apacheRepository/doc/Apache2
set apacheMimeTypesFilePath $homePath/col/$apacheRepository/doc/Apache2/conf/apache-mime.types
set apacheMagicFilePath $homePath/col/$apacheRepository/doc/Apache2/conf/magic
set apacheIconDirectoryPath $homePath/col/$apacheRepository/doc/Apache2/icons ;# must be homePath (because of Alias Apache directive)
set apachePath $homePath/col/$apacheRepository/doc/Apache2/bin/$apacheExec
set apacheLibDirectoryPath $homePath/col/$apacheRepository/doc/Apache2/modules
set htpasswdPath $homePath/col/$apacheRepository/doc/Apache2/bin/htpasswd
set linuxDistribution Mandrake
} elseif {[file isdirectory /var/www/icons]} {
# Mandrake distribution (gemini.dpi.inpe.br)
# set apacheConfDirectoryPath /etc/httpd
set apacheMimeTypesFilePath /etc/httpd/conf/mime.types
set apacheMagicFilePath /etc/httpd/conf/magic
set apacheIconDirectoryPath /var/www/icons
set apachePath /usr/sbin/httpd
set apacheLibDirectoryPath /usr/lib/apache
set htpasswdPath /usr/sbin/htpasswd ;# ?
set linuxDistribution Mandrake
} elseif {[file isdirectory /home/httpd/icons]} {
# Conectiva distribution
# set apacheConfDirectoryPath /etc/httpd
set apacheMimeTypesFilePath /etc/mime.types
set apacheMagicFilePath /etc/httpd/conf/magic
set apacheIconDirectoryPath /home/httpd/icons
set apachePath /usr/sbin/httpd
set apacheLibDirectoryPath /usr/lib/apache
set htpasswdPath /usr/sbin/htpasswd ;# ?
set linuxDistribution Conectiva
} elseif {[file isdirectory /usr/local/apache2/icons]} {
# Slackware 8 distribution
# set apacheConfDirectoryPath /usr/local/apache2
set apacheMimeTypesFilePath /usr/local/apache2/conf/mime.types
set apacheMagicFilePath /usr/local/apache2/conf/magic
set apacheIconDirectoryPath /usr/local/apache2/icons
set apachePath /usr/local/apache2/bin/httpd
set htpasswdPath /usr/local/apache2/bin/htpasswd ;# ?
set linuxDistribution {Slackware 8}
} elseif {[file isdirectory /srv/www/icons]} {
# SuSE 8.2 distribution (lac)
set apacheMimeTypesFilePath /etc/mime.types
set apacheMagicFilePath /etc/httpd/magic
set apacheIconDirectoryPath /srv/www/icons
set apachePath /usr/sbin/httpd
# set apacheLibDirectoryPath /usr/httpd/modules
set apacheLibDirectoryPath /usr/lib/apache
set htpasswdPath /usr/bin/htpasswd
set linuxDistribution {SuSE 8.2}
} elseif {[file isdirectory /usr/share/apache2/icons]} {
# SuSE 9.3 distribution (matrix.lac.inpe.br)
set apacheMimeTypesFilePath /etc/apache2/mime.types
set apacheMagicFilePath /etc/apache2/magic ;# not used to create httpd.conf
set apacheIconDirectoryPath /usr/share/apache2/icons
set apachePath /usr/sbin/httpd2
set apacheLibDirectoryPath /usr/lib/apache2 ;# not used to create httpd.conf
set htpasswdPath /usr/sbin/htpasswd2
set linuxDistribution {SuSE 9.3}
} elseif {[file isdirectory /usr/share/apache/icons]} {
# Kurumin 4.1 (based on Knoppix (based on Debian))
set apacheMimeTypesFilePath /etc/mime.types
set apacheMagicFilePath /etc/magic
set apacheIconDirectoryPath /usr/share/apache/icons
set apachePath /usr/sbin/apache
set apacheLibDirectoryPath /usr/lib/apache/1.3
set htpasswdPath /usr/bin/htpasswd
set linuxDistribution {Kurumin 4.1}
} else {
# not found
set linuxDistribution {}
}
# Linux - end
} elseif {$tcl_platform(os) == "FreeBSD"} {
# FreeBSD
# set apacheConfDirectoryPath /usr/local/etc/apache
set apacheMimeTypesFilePath /usr/local/etc/apache/mime.types
set apacheMagicFilePath /usr/local/etc/apache/magic
set apacheIconDirectoryPath /usr/local/www/icons
set apachePath /usr/local/sbin/httpd
set apacheLibDirectoryPath /usr/local/libexec/apache
set htpasswdPath /usr/local/bin/htpasswd
# set tclPath /usr/local/bin/tclsh
# set wishPath /usr/local/bin/wish
# set tclRepository {}
# set pythonRepository {}
## set unZipPath /usr/local/bin/unzip ;# see ExtractURLibService
# set unZipRepository {}
# set zipPath /usr/local/bin/zip ;# now in knownPathArray
# set zipRepository {}
# FreeBSD - end
}
}
# Unix - end
}
} ;# end old code
global knownRepositoryArray
# source knownRepositoryArray.tcl ;# needed by SetRepository
source $homePath/col/$URLibServiceRepository/doc/knownRepositoryArray.tcl ;# needed by SetRepository
set tclRepository [SetRepository tcl #0]
set unZipRepository [SetRepository unzip #0] ;# needed by start
if 0 { ;# added by GJFB in 2018-10-17
# old code
if {![info exists apacheMimeTypesFilePath] || ![file exists $apacheMimeTypesFilePath]} {
if [file exists $homePath/col/$URLibServiceRepository/auxdoc/apacheMimeTypesFile.txt] {
Load $homePath/col/$URLibServiceRepository/auxdoc/apacheMimeTypesFile.txt apacheMimeTypesFilePath
}
}
if {![info exists apacheMagicFilePath] || ![file exists $apacheMagicFilePath]} {
if [file exists $homePath/col/$URLibServiceRepository/auxdoc/apacheMagicFile.txt] {
Load $homePath/col/$URLibServiceRepository/auxdoc/apacheMagicFile.txt apacheMagicFilePath
}
}
if {![info exists apacheIconDirectoryPath] || ![file exists $apacheIconDirectoryPath]} {
if [file exists $homePath/col/$URLibServiceRepository/auxdoc/apacheIconDirectory.txt] {
Load $homePath/col/$URLibServiceRepository/auxdoc/apacheIconDirectory.txt apacheIconDirectoryPath
}
}
if {![info exists apachePath] || ![file exists $apachePath]} {
if [file exists $homePath/col/$URLibServiceRepository/auxdoc/apache.txt] {
Load $homePath/col/$URLibServiceRepository/auxdoc/apache.txt apachePath
}
}
if {![info exists apacheLibDirectoryPath] || ![file exists $apacheLibDirectoryPath]} {
if [file exists $homePath/col/$URLibServiceRepository/auxdoc/apacheLibDirectory.txt] {
Load $homePath/col/$URLibServiceRepository/auxdoc/apacheLibDirectory.txt apacheLibDirectoryPath
}
}
set exit 0
if ![file exists $apacheMimeTypesFilePath] {
set log "LoadGlobalVariables:\nfile not found: $apacheMimeTypesFilePath\n"
Store log $homePath/@errorLog auto 0 a
puts $log
set exit 1
}
if ![file exists $apacheMagicFilePath] {
set log "LoadGlobalVariables:\nfile not found: $apacheMagicFilePath\n"
Store log $homePath/@errorLog auto 0 a
puts $log
set exit 1
}
if ![file exists $apacheIconDirectoryPath] {
set log "LoadGlobalVariables:\nfile not found: $apacheIconDirectoryPath\n"
Store log $homePath/@errorLog auto 0 a
puts $log
set exit 1
}
if ![file exists $apachePath] {
set log "LoadGlobalVariables:\nfile not found: $apachePath\n"
Store log $homePath/@errorLog auto 0 a
puts $log
set exit 1
}
if {[string compare {} $apacheLibDirectoryPath] != 0 && \
![file exists $apacheLibDirectoryPath]} {
set log "LoadGlobalVariables:\nfile not found: $apacheLibDirectoryPath\n"
Store log $homePath/@errorLog auto 0 a
puts $log
set exit 1
}
# htpasswdPath
if {![info exists htpasswdPath] || ![file exists $htpasswdPath]} {
if [file exists $homePath/col/$URLibServiceRepository/auxdoc/htpasswd.txt] {
Load $homePath/col/$URLibServiceRepository/auxdoc/htpasswd.txt htpasswdPath
}
}
if ![file exists $htpasswdPath] {
set log "LoadGlobalVariables:\nfile not found: $htpasswdPath\n"
Store log $homePath/@errorLog auto 0 a
puts $log
set exit 1
}
if $exit {exit}
} ;# end if 0
## zipPath
if [file isdirectory $homePath/col/$zipRepository/doc] {
# set zipPath $homePath/col/$zipRepository/doc/$zipExec ;# must be homePath - now in knownPathArray
if {$tcl_platform(os) == "SunOS"} {
# if ![file executable $homePath/col/$zipRepository/doc/$zipExec] # doesn't work
if [file owned $homePath/col/$zipRepository/doc/$zipExec] {
exec chmod 774 $homePath/col/$zipRepository/doc/$zipExec
}
# #
}
}
global fieldNameArray
# fieldNameArray (used in UpdateRepositoryProperties (see LoadServiceData) and UpdateField)
# output array value is a list of three elements: fieldName fileName indexName (indexName is used in repositoryProperties)
set fieldNameArray(contenttype) {contenttype type type}
set fieldNameArray(copyright) {copyright copyright copyright}
set fieldNameArray(authorhomepage) {authorhomepage authorHomePage authorhomepage}
set fieldNameArray(docpermission) {docpermission docPermission docpermission}
set fieldNameArray(downloadpermission) {downloadpermission downloadPermission downloadpermission}
set fieldNameArray(mirrorsites) {mirrorsites mirrorSites mirrorsites}
set fieldNameArray(docremotepermission) {docremotepermission docRemotePermission docremotepermission}
set fieldNameArray(downloadremotepermission) {downloadremotepermission downloadRemotePermission downloadremotepermission}
set fieldNameArray(hostcollection) {hostcollection hostCollection hostcollection}
# set fieldNameArray(copyholder) {copyholder copyHolder copyholder}
set fieldNameArray(language) {language language language}
set fieldNameArray(lastupdate) {lastupdate history history} ;# lastupdate name is used even for metadata repository (the value of metadalastupdate is set in CreateExtraFields)
set fieldNameArray(size) {size size size}
set fieldNameArray(numberoffiles) {numberoffiles numberOfFiles numberoffiles}
set fieldNameArray(targetfile) {targetfile targetFile targetfile}
# set fieldNameArray(e-mailaddress) {e-mailaddress e-mailAddress e-mailaddress}
# set fieldNameArray(cgiscriptname) {cgiscriptname cgiScriptName cgiscriptname}
set fieldNameArray(cgiscriptnamelist) {cgiscriptnamelist cgiScriptNameList cgiscriptnamelist}
set fieldNameArray(authenticatedusers) {authenticatedusers authenticatedUsers authenticatedusers}
set fieldNameArray(username) {username userName username}
# set fieldNameArray(documentstage) {documentstage documentStage documentstage}
if [file exists $homePath/col/$compileWordsRepository] {
lappend auto_path $homePath/col/$compileWordsRepository/doc
package require $compileWordsRepository
}
if [file exists $homePath/col/$citationKeyRepository] {
lappend auto_path $homePath/col/$citationKeyRepository/doc
package require $citationKeyRepository
# source $homePath/col/$citationKeyRepository/doc/createKey.tcl
}
if 0 {
# commented by GJFB in 2022-07-18 - now above
if [file exists $homePath/col/$searchRepository] {
lappend auto_path $homePath/col/$searchRepository/doc
package require $searchRepository
source $homePath/col/$searchRepository/doc/Search.tcl
}
}
if [file exists $homePath/col/$inflectionRepository] {
lappend auto_path $homePath/col/$inflectionRepository/doc
package require $inflectionRepository
}
if [file exists $homePath/col/$isis2referRepository] {
lappend auto_path $homePath/col/$isis2referRepository/doc
package require $isis2referRepository
}
if [file exists $homePath/col/$parsingRepository] {
lappend auto_path $homePath/col/$parsingRepository/doc
package require $parsingRepository
# if {[string compare {} [info procs $parsingRepository::ParseFullName]] == 0} #
# source $homePath/col/$parsingRepository/doc/Parsing.tcl
# #
# puts [expr [string compare {} [info procs $parsingRepository::ParseFullName]] == 0]
}
if [file exists $homePath/col/$samplingRepository] {
lappend auto_path $homePath/col/$samplingRepository/doc
package require $samplingRepository
}
if [file isdirectory $homePath/col/iconet.com.br/banon/2003/04.18.13.10] {
global BibINPERepository
set BibINPERepository iconet.com.br/banon/2003/04.18.13.10
lappend auto_path $homePath/col/$BibINPERepository/doc
package require $BibINPERepository
}
if [file exists $homePath/col/$bib2referRepository] {
lappend auto_path $homePath/col/$bib2referRepository/doc
package require $bib2referRepository
}
# if [file exists $homePath/col/$isis2referRepository] {
# lappend auto_path $homePath/col/$isis2referRepository/doc
# package require $isis2referRepository
# }
if [file exists $homePath/col/$bibpessoal2referRepository] {
lappend auto_path $homePath/col/$bibpessoal2referRepository/doc
package require $bibpessoal2referRepository
}
# Load bib.Tables.tcl from bib2referRepository
if [file exists $homePath/col/$bib2referRepository/doc/bibTables.tcl] {
source $homePath/col/$bib2referRepository/doc/bibTables.tcl
}
# Load bib.Tables.tcl from bib2referRepository - end
# Load bib.Tables.tcl from bibpessoal2referRepository
if [file exists $homePath/col/$bibpessoal2referRepository/doc/bibTables.tcl] {
source $homePath/col/$bibpessoal2referRepository/doc/bibTables.tcl
}
# Load bib.Tables.tcl from bibpessoal2referRepository - end
# environmentArray
global environmentArray
if 0 {
if [file exists $homePath/col/$URLibServiceRepository/auxdoc/.environmentArray.tcl] {
catch {source $homePath/col/$URLibServiceRepository/auxdoc/.environmentArray.tcl}
}
if ![info exists environmentArray(localCollectionIndexRepository)] {
# try .environmentArray2.tcl
if [file exists $homePath/col/$URLibServiceRepository/auxdoc/.environmentArray2.tcl] {
catch {source $homePath/col/$URLibServiceRepository/auxdoc/.environmentArray2.tcl}
}
}
}
if {[file exists $homePath/col/$URLibServiceRepository/auxdoc/.environmentArray.tcl] || \
[file exists $homePath/col/$URLibServiceRepository/auxdoc/.environmentArrayBackup.tcl]} {
SourceWithBackup $homePath/col/$URLibServiceRepository/auxdoc/.environmentArray.tcl environmentArray ;# added by GJFB in 2010-08-05
}
# puts $environmentArray(ipAddress)
if [string equal {} $portEntry] {
if ![info exists environmentArray(spPortEntry)] {
set environmentArray(spPortEntry) 1905
}
if ![info exists environmentArray(spPortList)] {
set environmentArray(spPortList) 1905
}
} else {
# added by GJFB for Arquive migration between computers (for example)
set environmentArray(spPortEntry) $portEntry
lappend environmentArray(spPortList) $portEntry
}
# loCoInRep
global loCoInRep
# loCoInId
global loCoInId ;# used in CreateEnvironmentArray, GetURLPropertyList and CreateConfigurationFiles only
# ibiToArchiveServiceArray
global ibiToArchiveServiceArray ;# updated in UpdateIBIToArchiveServiceArray - used in GetOptimizedListOfSites only
if [info exists environmentArray(localCollectionIndexRepository)] {
set loCoInRep $environmentArray(localCollectionIndexRepository)
Store loCoInRep $homePath/@loCoInRep
Load $homePath/col/$loCoInRep/doc/@sitesHavingReadPermission.txt fileContent
set environmentArray(sitesHavingReadPermission) [split $fileContent \n]
Load $homePath/col/$loCoInRep/doc/@sitesHavingWritePermission.txt fileContent
set environmentArray(sitesHavingWritePermission) [split $fileContent \n]
LoadService $loCoInRep identifier loCoInId 1 1
if [file exists $homePath/col/$loCoInRep/auxdoc/ibiToArchiveServiceArray.tcl] {
SourceWithBackup $homePath/col/$loCoInRep/auxdoc/ibiToArchiveServiceArray.tcl ibiToArchiveServiceArray 1 ;# array set ibiToArchiveServiceArray
}
if ![file exists $homePath/col/$loCoInRep/auxdoc/siteStampXcodedPasswordArray.tcl] {
set {siteStampXcodedPasswordArray({www.urlib.net 800} dpi.inpe.br/banon/2004/02.16.09.29 200.160.7.168)} {}
StoreArray siteStampXcodedPasswordArray $homePath/col/$loCoInRep/auxdoc/siteStampXcodedPasswordArray.tcl w array array 1 ;# added by GJFB in 2022-08-16 - required whenever the return path begins with urlib.net - otherwise the button symbols '<' and '<<' become red telling that the 83LX3pFwXQZeBBx/BbsHa next higher unit is missing
}
}
# loBiMiRep
global loBiMiRep
if [info exists environmentArray(localBibliographicMirrorRepository)] {
set loBiMiRep $environmentArray(localBibliographicMirrorRepository)
Store loBiMiRep $homePath/@loBiMiRep
if 0 {
# commented by GJFB in 2023-03-04
# loBiMiId
set loBiMiId [FindIdentifierNameFromIBI $loBiMiRep] ;# added by GJFB in 2022-06-13
Store loBiMiId $homePath/@loBiMiId ;# added by GJFB in 2022-06-13 - used in Get only
} else {
# added by GJFB in 2023-03-04 - FindIdentifierNameFromIBI can be used explicitly in Get
file delete $homePath/@loBiMiId
}
}
# loBiMiMetadataRep
global loBiMiMetadataRep
if [info exists environmentArray(localBibliographicMirrorMetadataRepository)] {
set loBiMiMetadataRep $environmentArray(localBibliographicMirrorMetadataRepository) ;# used in MakeRepository
}
if 0 {
# Load ${referRepository}::orderingTable, ${referRepository}::referenceTypeXorderingTypeArray and ${referRepository}::conversionTable for Refer format
if [file exists $homePath/col/$referRepository/doc/referTables.tcl] {
source $homePath/col/$referRepository/doc/referTables.tcl
}
}
# global ${referRepository}::conversionTable
# Load ${referRepository}::orderingTable and ${referRepository}::conversionTable for Refer format - end
set languageRepository $englishMirrorRepository
source $homePath/col/$englishMirrorRepository/doc/mirror/enSearchResult.tcl
set languageRepository $portugueseBrasilMirrorRepository
source $homePath/col/$portugueseBrasilMirrorRepository/doc/mirror/pt-BRSearchResult.tcl
# Load BibINPEStyleSheet
if [file exists $homePath/col/$BibINPERepository/doc/BibINPEStyleSheet.tcl] {
source $homePath/col/$BibINPERepository/doc/BibINPEStyleSheet.tcl
}
# global ${BibINPERepository}::BibINPEStyleSheet
# Load BibINPEStyleSheet - end
# Create inverseTable
global inverseTable
array set inverseTable [CreateInverseTable]
# set xxx [array get inverseTable]
# Store xxx C:/tmp/bbb.txt auto 0 a
# Create inverseTable - end
# Create referenceTypeList
global referenceTypeList
set referenceTypeList [CreateReferenceTypeList]
# puts $referenceTypeList
# Create referenceTypeList - end
# Create referenceTypeXcreatorNameArray
# added by GJFB in 2021-01-23 - used in CreateFullEntry only
global referenceTypeXcreatorNameArray
array set referenceTypeXcreatorNameArray [CreateReferenceTypeXcreatorNameArray]
# puts [array get referenceTypeXcreatorNameArray]
# Create referenceTypeXcreatorNameArray - end
# Create fieldNameXareaArray
# by GJFB in 2020-11-18
global fieldNameXareaArray
global ${referRepository}::fieldOrderListForArray
global ${referRepository}::referenceTypeXorderingTypeArray
foreach type $referenceTypeList {
if [info exists fieldOrderArray] {unset fieldOrderArray}
array set fieldOrderArray $fieldOrderListForArray($referenceTypeXorderingTypeArray($type))
foreach name [array names inverseTable $type,*] {
regsub {.*,} $name {} fieldName
array set fieldNameXareaArray [list $type,$fieldName $fieldOrderArray($inverseTable($type,$fieldName))]
}
}
# Create fieldNameXareaArray - end
StoreArray fieldNameXareaArray $homePath/col/$URLibServiceRepository/auxdoc/.fieldNameXareaArray.tcl w list array ;# fieldNameXareaArray recreated in CreateMirror
set tclPath [SetPath tclsh #0]
set wishPath [SetPath wish #0]
set zipPath [SetPath zip #0]
set unZipPath [SetPath unzip #0]
set unRarPath [SetPath unrar #0]
set pythonPath [SetPath python #0]
if [info exists applicationName] {
if [string equal {start} $applicationName] {
# editorPath
global editorPath
set editorPath [SetPath textEditor] ;# needs knownPathArray
if [string equal {} $editorPath] {Load $homePath/col/$URLibServiceRepository/auxdoc/editor.txt editorPath}
if {$tcl_platform(platform) == "windows"} {
# mswordEditorPath
# used in XXRepository
global mswordEditorPath
set mswordEditorPath [SetPath mswordEditor] ;# needs knownPathArray
if [string equal {} $editorPath] {Load $homePath/col/$URLibServiceRepository/auxdoc/mswordEditor.txt mswordEditorPath}
}
}
}
# maximumNumberOfEntries
## used by RemoveMetadata and by CreateRepArray (to compute mostRecentReferences and mostRecentFullTexts)
# used by RemoveMetadata2, UpdateMetadata and by CreateRepArray (to compute mostRecentReferences and mostRecentFullTexts)
global maximumNumberOfEntries
set maximumNumberOfEntries 10
if [info exists environmentArray(localCollectionIndexRepository)] { ;# added by GJFB in 2016-04-28
set installInitialCollection 0
} else {
set installInitialCollection 1
}
if $installInitialCollection {
set serverAddress {} ;# added by GJFB in 2016-04-28 - environmentArray is incomplete at installation and GetServerAddress cannot be run
set serverAddressWithIP {} ;# added by GJFB in 2016-04-28
} else {
set serverAddress [GetServerAddress] ;# banon-pc2.dpi.inpe.br 800
set serverAddressWithIP [GetServerAddress 1]
# @archiveFederation
# added by GJFB in 2023-11-15 - used in urlib.net/www/2023/06.03.21.17 only
Load $homePath/col/$loBiMiRep/doc/@siteList.txt fileContent
set lineList {}
# lappend lineList {}
# lappend lineList
# lappend lineList {
}
# lappend lineList { }
# lappend lineList " - $serverAddress
"
lappend lineList [ReturnHTTPHost $serverAddress]
foreach item [split $fileContent \n] {
# lappend lineList " - [lindex $item 0]
"
lappend lineList [ReturnHTTPHost [lindex $item 0]]
}
# lappend lineList {
}
# lappend lineList { }
# lappend lineList
set fileContent [join $lineList \n]
Store fileContent $homePath/@archiveFederation
}
set urlibServerAddress [GetURLibServerAddress 0] ;# www.urlib.net 800
set urlibServerAddressWithIP [GetURLibServerAddress] ;# 150.163.34.64 800
set standaloneModeFlag [string equal {{} 800} $urlibServerAddressWithIP] ;# 1 iff in standalone mode
return
}
# LoadGlobalVariables - end
# ----------------------------------------------------------------------
# ReturnLoBiMiRep
# used in Get only
proc ReturnLoBiMiRep {} {
global loBiMiRep
return $loBiMiRep
}
# ReturnLoBiMiRep - end
# ----------------------------------------------------------------------
# CreateReferenceTypeList
proc CreateReferenceTypeList {} {
global referRepository
global ${referRepository}::conversionTable
set referenceTypeList {}
foreach referenceType [array names conversionTable *,%0] {
regsub {,%0} $referenceType {} referenceType
lappend referenceTypeList $referenceType
}
return $referenceTypeList
}
# CreateReferenceTypeList - end
# ----------------------------------------------------------------------
# CreateOpenAIREListForArray
# added by GJFB in 2023-08-04
proc CreateOpenAIREListForArray {} {
global referRepository
global ${referRepository}::openAIRETable
return [array get openAIRETable]
}
# CreateOpenAIREListForArray - end
# ----------------------------------------------------------------------
# CreateFieldNameList
# created by GJFB in 2022-11-06
# used in LoadGlobalVariables only
# referFieldName value example is %E
proc CreateFieldNameList {referFieldName} {
global referRepository
global ${referRepository}::conversionTable
set outputList {}
foreach input [array names conversionTable *,$referFieldName] {
set output $conversionTable($input)
if {![string equal {} $output] && ![regexp {Generic} $input]} {lappend outputList $output}
}
return [lsort -unique $outputList]
}
# CreateFieldNameList - end
# ----------------------------------------------------------------------
# CreateReferenceTypeXcreatorNameArray
proc CreateReferenceTypeXcreatorNameArray {} {
global referRepository
global ${referRepository}::conversionTable
foreach name [array names conversionTable *,%A] {
regsub {,%A} $name {} referenceType
set referenceTypeXcreatorNameArray($referenceType) $conversionTable($name)
}
return [array get referenceTypeXcreatorNameArray]
}
# CreateReferenceTypeXcreatorNameArray - end
# ----------------------------------------------------------------------
# CreateInverseTable
# example of conversionTable pair:
# set {conversionTable(Journal Article,%A)} author
# example of inverseTable pair:
# set {inverseTable(Journal Article,author)} %A
# set {inverseTable(Journal Article,firstauthor)} %A
proc CreateInverseTable {} {
global referRepository
global ${referRepository}::conversionTable
# global multipleLineReferFieldNamePattern
global multipleLineReferFieldNamePattern2
global firstFieldNameList
foreach index [array names conversionTable *,%*] {
set fieldName $conversionTable($index) ;# author
if {$fieldName == ""} {continue}
regexp {(.*),(%.*)} $index m type referFieldName ;# {Journal Article} %A
set inverseTable($type,$fieldName) $referFieldName
if 1 {
# could be commented after a long period, once files like .repArray.tcl have been recreated - it is a way to reduce the size of fsuch files since, for exampe, isbn doesn't have firstisbn
# if [regexp {%A|%E|%Y|%\?|%@group|%@affiliation|%@electronicmailaddress} $referFieldName]
# if [regexp $multipleLineReferFieldNamePattern $referFieldName] # ;# commented by GJFB in 2018-01-07
if [regexp $multipleLineReferFieldNamePattern2 $referFieldName] { ;# added by GJFB in 2018-01-07 to exclude nexthigerunit and previouslowerunit
# add FIRST for multiple line fields
set inverseTable($type,first$fieldName) $referFieldName
}
} else {
# not yet in use
# added by GJFB in 2022-07-25
# add FIRST
if {[lsearch $firstFieldNameList first$fieldName] != -1} {
set inverseTable($type,first$fieldName) $referFieldName
}
}
}
return [array get inverseTable]
}
# CreateInverseTable - end
# ----------------------------------------------------------------------
# MakeCgiScript
# example:
# docRep is the repository containing the tcl script
# auxdocRep is the repository containing the cgi script
# cgiScriptName == test.cgi
# procFileName == test.tcl
# procName == Test
# directoryName is cgi, cgi2 or freeAccessCGI
# cgi2 is used to host the update script) - cgi2 was introduced to avoid name conflic with repository containing cgi script
# freeAccessCGI is used to host customizeerror.cgi script only
# store value is 0 or 1, 1 means to store the cgi script
# 0 is used in post to test if the cgi scripts must be changed
proc MakeCgiScript {docRep auxdocRep cgiScriptName procFileName procName {directoryName cgi} {store 1}} {
# runs with start and post
# global tclRepository
global tclPath
global pythonPath
# global col
global homePath
global tcl_platform
global URLibServiceRepository
if $store {file mkdir $homePath/col/$auxdocRep/auxdoc/$directoryName}
if {$tcl_platform(platform) == "windows"} {
if [regexp -nocase {tcl$} $procFileName] {
# tcl script
# if [file isdirectory $homePath/col/iconet.com.br/banon/2005/10.07.22.52] #
## Apache 2.0.54
set script "#!\"$tclPath\"
source \"$homePath/col/$docRep/doc/cgi/$procFileName\"
source \"$homePath/col/$URLibServiceRepository/auxdoc/.envArray.tcl\"
if \$env(ERROR_TRACE) {
if \[info exists env(PATH_INFO)\] {
set pathInfo \$env(PATH_INFO)
} else {
set pathInfo /
}
set pid \[pid\]
set clicks \[clock clicks\]
# set log \"\\\[\[clock format \[clock seconds\] -format %Y:%m.%d.%H.%M.%S\]\\\] \[pid\] $procName\"
set log \"\\\[\[clock format \[clock seconds\] -format %Y:%m.%d.%H.%M.%S\]\\\] $procName (\$pid - \$clicks):\\nclient at \$env(REMOTE_ADDR) is asking to execute the cgi script with the path info:\\n\$pathInfo\\nand with the query string:\\n\\\"\$env(QUERY_STRING)\\\"\\n\"
# set fileId \[open \"$homePath/@cgiLog\" a\]
# puts \$fileId \$log
# close \$fileId
set fileId \[open \"$homePath/@errorLog\" a\]
puts \$fileId \$log
close \$fileId
set fileId \[open \"$homePath/@cgiLog\$clicks-\$pid\" a\]
puts \$fileId \$log
close \$fileId
}
set applicationNameForReverseEngineering [lindex $procName 0] ;# for reverse engineering only
set applicationRuningTime \[clock format \[clock seconds\] -format %Y:%m.%d.%H.%M.%S\] ;# for reverse engineering only
set applicationFileName \"'$homePath/col/$docRep/doc/cgi/$procFileName'\" ;# for reverse engineering only
$procName
if \$env(ERROR_TRACE) {
file delete \"$homePath/@cgiLog\$clicks-\$pid\"
}"
} elseif [regexp -nocase {(.*)\.py$} $procFileName m procFileName] {
# python script
set script "#!\"$pythonPath\"
import sys
sys.path.append('$homePath/col/$docRep/doc/cgi')
import $procFileName"
# $procFileName.${procName}()"
} else {
# make nothing
return
}
if $store {Store script $homePath/col/$auxdocRep/auxdoc/$directoryName/$cgiScriptName}
}
if {$tcl_platform(platform) == "unix"} {
if [regexp -nocase {tcl$} $procFileName] {
# tcl script
set script "#!/bin/sh
# \\
exec $tclPath \"\$0\" \${1+\"\$@\"}
source \"$homePath/col/$docRep/doc/cgi/$procFileName\"
source \"$homePath/col/$URLibServiceRepository/auxdoc/.envArray.tcl\"
if \$env(ERROR_TRACE) {
if \[info exists env(PATH_INFO)\] {
set pathInfo \$env(PATH_INFO)
} else {
set pathInfo /
}
set pid \[pid\]
set clicks \[clock clicks\]
# set log \"\\\[\[clock format \[clock seconds\] -format %Y:%m.%d.%H.%M.%S\]\\\] \[pid\] $procName\"
set log \"\\\[\[clock format \[clock seconds\] -format %Y:%m.%d.%H.%M.%S\]\\\] $procName (\$pid - \$clicks):\\nclient at \$env(REMOTE_ADDR) is asking to execute the cgi script with the path info:\\n\$pathInfo\\nand with the query string:\\n\\\"\$env(QUERY_STRING)\\\"\\n\"
# set fileId \[open \"$homePath/@cgiLog\" a\]
# puts \$fileId \$log
# close \$fileId
set fileId \[open \"$homePath/@errorLog\" a\]
puts \$fileId \$log
close \$fileId
set fileId \[open \"$homePath/@cgiLog\$clicks-\$pid\" a\]
puts \$fileId \$log
close \$fileId
}
set applicationNameForReverseEngineering [lindex $procName 0] ;# for reverse engineering only
set applicationRuningTime \[clock format \[clock seconds\] -format %Y:%m.%d.%H.%M.%S\] ;# for reverse engineering only
set applicationFileName \"'$homePath/col/$docRep/doc/cgi/$procFileName'\" ;# for reverse engineering only
$procName
if \$env(ERROR_TRACE) {
file delete \"$homePath/@cgiLog\$clicks-\$pid\"
}"
} elseif [regexp -nocase {(.*)\.py$} $procFileName m procFileName] {
# python script
# #!\"$pythonPath\" doesn't work in Unix
set script "#!$pythonPath
import sys
sys.path.append('$homePath/col/$docRep/doc/cgi')
import $procFileName"
# $procFileName.${procName}()"
} else {
# make nothing
return
}
if $store {
Store script $homePath/col/$auxdocRep/auxdoc/$directoryName/$cgiScriptName
# exec chmod -f +x $homePath/col/$auxdocRep/auxdoc/$directoryName/$cgiScriptName
# exec chmod +x $homePath/col/$auxdocRep/auxdoc/$directoryName/$cgiScriptName
# exec chmod 755 $homePath/col/$auxdocRep/auxdoc/$directoryName/$cgiScriptName
if [file owned $homePath/col/$auxdocRep/auxdoc/$directoryName/$cgiScriptName] {exec chmod 775 $homePath/col/$auxdocRep/auxdoc/$directoryName/$cgiScriptName}
}
}
return $script
}
# MakeCgiScript - end
# ----------------------------------------------------------------------
# MakeCgiScript2
# makes update cgi
# Secure version of MakeCgiScript
# used only by SetAdvancedUserFromUserGroup
# and by a cgi script to set an advanced user name in a set of repositories
# (see dpi.inpe.br/banon-pc@1905/2005/02.19.00.40)
# password must be coded
proc MakeCgiScript2 {rep userName password} {
# runs with post
global environmentArray
global URLibServiceRepository
if ![string equal administrator $userName] {
regsub {@.*$} $environmentArray(spMailEntry) {} administratorUserName
if [string equal $administratorUserName $userName] {
# $userName is the administrator
} else {
# $userName is not the administrator
return "MakeCgiScript2: $userName is not the administrator"
}
}
if [CheckPassword $userName $password] {
return "MakeCgiScript2: the password is incorrect or the user name doesn't exist"
}
# MakeCgiScript $URLibServiceRepository $rep update update.tcl Update cgi2
MakeCgiScript $URLibServiceRepository $rep update mirror.tcl {CreateMirror 1} cgi2
return ;# needed, otherwise the first line of $script returned by MakeCgiScript is returned by MakeCgiScript2 (this is a problem for Script in dpi.inpe.br/banon-pc@1905/2005/02.19.00.40)
}
# MakeCgiScript2 - end
# ----------------------------------------------------------------------
# MakeAllCgiScripts
# cgiScriptName procFileName procName
# wholeCollection value is 0 or 1; 1 means to make the cgi scripts for the whole collection
proc MakeAllCgiScripts {{wholeCollection 0}} {
global URLibServiceRepository
global repositoryList
global homePath
global pwd
global repositoryProperties
global OAIProtocolRepository ;# parent repository for the URLibService
global administratorPageRepository ;# parent repository for the URLibService
# proc MakeCgiScript {docRep auxdocRep cgiScriptName procFileName procName {directoryName cgi} {store 1}}
set rep $URLibServiceRepository
# to add a new cgi script update this procedure
# see also ScriptAlias in CreateConfigurationFiles (in StartServer.tcl)
# set updateLevel(3) with a new date (update date) in $homePath/newVersion
# for the developing collection just delete auxdoc/cgi/get and do unpost/post
# cgiScriptName == getibi-.cgi
# procFileName == get-.tcl
# procName == Get
# MakeCgiScript $rep $rep getibi- get-.tcl Get- ;# tested by GJFB in 2021-10-09 but not necessary
MakeCgiScript $rep $rep get- get-.tcl Get-
# MakeCgiScript $rep $rep getibi get.tcl Get ;# tested by GJFB in 2021-10-09 but not necessary
MakeCgiScript $rep $rep get get.tcl Get
# MakeCgiScript $rep $rep getibiproperties getibiproperties.tcl GetIBIProperties ;# added by GJFB in 2012-06-03 - used in IBI resolution - obsolete, now Script in col/urlib.net/www/2014/03.16.03.40/cgi/script.tcl
MakeCgiScript $rep $rep getprogress getprogress.tcl GetProgress ;# added by GJFB in 2013-09-15 - used in Get
MakeCgiScript $rep $rep cover cover.tcl Cover
MakeCgiScript $rep $rep from from.tcl From
MakeCgiScript $rep $rep mirror.cgi mirror.tcl CreateMirror
# MakeCgiScript $rep $rep metadata.cgi metadata.tcl CreateMetadata ;# commented by GJFB in 2023-02-21 because the CreateMetadata procedure name is already used in cgi/oai.tcl
MakeCgiScript $rep $rep metadata.cgi metadata.tcl DisplayMetadata ;# added by GJFB in 2023-02-21
MakeCgiScript $rep $rep mirrorrecent.cgi mirrorrecent.tcl MirrorRecent
MakeCgiScript $rep $rep mirrorsearch.cgi mirrorsearch.tcl MirrorSearch
MakeCgiScript $rep $rep mirrorget.cgi mirrorget.tcl MirrorGet
MakeCgiScript $rep $rep mirrorfind-.cgi mirrorfind-.tcl Find-
# MakeCgiScript $rep $rep mirrorfind2-.cgi mirrorfind2-.tcl Find2-
MakeCgiScript $rep $rep checkchange.cgi checkchange.tcl CheckChange
MakeCgiScript $rep $rep copyright.cgi copyright.tcl Copyright
# MakeCgiScript $rep $rep customizeerror.cgi customizeerror.tcl CustomizeError
# MakeCgiScript $rep $rep customizeerror.cgi customizeerror.tcl CustomizeError cgi2 ;# added by GJFB in 2020-07-22 - required when setting the option Use User Authentication in Setting the Preferences in the URLibServive window
# Migration - 2020-09-12
file delete $homePath/col/$rep/auxdoc/cgi/customizeerror.cgi
file delete $homePath/col/$rep/auxdoc/cgi2/customizeerror.cgi
# Migration - 2020-09-12 - end
MakeCgiScript $rep $rep customizeerror.cgi customizeerror.tcl CustomizeError freeAccessCGI
MakeCgiScript $rep $rep statistics.cgi statistics.tcl Statistics
MakeCgiScript $rep $rep download.cgi download.tcl Download
MakeCgiScript $rep $rep archive.cgi archive.tcl Archive
MakeCgiScript $rep $rep attachment.cgi attachment.tcl Attachment ;# added by GJFB in 2014-08-19 - used in CreateDirectoryContentList (called by DisplayDocContent (option GetFileList))
MakeCgiScript $rep $rep export.cgi export.tcl Export
MakeCgiScript $rep $rep advertising.cgi advertising.tcl CreateAdvertisingWarning
MakeCgiScript $rep $rep submit.cgi submit.tcl Submit
MakeCgiScript $rep $rep confirm.cgi confirm.tcl Confirm
# MakeCgiScript $rep $rep update update.tcl Update
# MakeCgiScript $rep $rep review review.tcl Review
MakeCgiScript $rep $rep createpage.cgi createpage.tcl CreatePage
MakeCgiScript $rep $rep createindex.cgi createindex.tcl CreateIndex
MakeCgiScript $rep $rep search.cgi search.tcl Search
MakeCgiScript $rep $rep register.cgi register.tcl Register
MakeCgiScript $rep $rep processreview.cgi processreview.tcl ProcessReview
MakeCgiScript $rep $rep forcenewpassword.cgi forcenewpassword.tcl ForcePassword cgi2
MakeCgiScript $rep $rep info info.tcl Info
MakeCgiScript $rep $rep test2 test2.tcl TestExecute
MakeCgiScript $rep $rep resolve resolve.tcl Resolve
MakeCgiScript $rep $rep getenv getenv.tcl GetEnv
MakeCgiScript $rep $rep displaydoccontent.cgi displaydoccontent.tcl DisplayDocContent
MakeCgiScript $rep $rep findsimilarrecords.cgi findsimilarrecords.tcl FindSimilarRecords
if $wholeCollection {
CreateRepositoryList
foreach rep $repositoryList {
# if [info exists repositoryProperties($rep,username)] # ;# commented by GJFB in 2016-01-19 - cgi2/update is not deleted when turning the username empty, therefore when returning to any username after a migration cgi2/update might be out of date
if [file exists $homePath/col/$rep/auxdoc/cgi2/update] {
MakeCgiScript $URLibServiceRepository $rep update mirror.tcl {CreateMirror 1} cgi2
}
# if [TestContentType $rep {^CGI Script$|^Submission Form$}] #
if [TestContentType $rep {^CGI Script$}] {
InstallCGIScript $rep
}
# migration 2007-10-16
# cgi2 -> cgi3
if [file exists $homePath/col/$rep/auxdoc/cgi2/review] {
MakeCgiScript $URLibServiceRepository $rep review review.tcl Review cgi3
file delete $homePath/col/$rep/auxdoc/cgi2/review
}
# migration 2007-10-16 - end
if [file exists $homePath/col/$rep/auxdoc/cgi3/review] {
MakeCgiScript $URLibServiceRepository $rep review review.tcl Review cgi3
}
}
} else {
set rep $OAIProtocolRepository
MakeCgiScript $rep $rep oai.cgi oai.tcl oai
set rep $administratorPageRepository
MakeCgiScript $rep $rep script.cgi script.tcl Script
}
}
# CreateConfigurationFiles must also be edited
# (when adding a new cgi script in URLibServiceRepository)
# MakeAllCgiScripts - end
# ----------------------------------------------------------------------
# InstallCGIScript
# installs the scripts (tcl and python) stored in doc/cgi
# installation occurs when the content type option {Cgi Script}
# is selected
proc InstallCGIScript {rep} {
# runs with post
global col
global pwd
global repositoryProperties
global startApacheServer
if ![file isdirectory $col/$rep/doc/cgi] {return}
cd $col/$rep/doc/cgi
set procFileNameList [glob -nocomplain {*.[tT][cC][lL]}] ;# ex: test.tcl
set procFileNameList [concat $procFileNameList [glob -nocomplain {*.[pP][yY]}]] ;# ex: test.py
cd $pwd
if [info exists repositoryProperties($rep,cgiscriptnamelist)] {
set oldCGIScriptNameList $repositoryProperties($rep,cgiscriptnamelist)
} else {
set oldCGIScriptNameList {}
}
set startApacheServer 0
set cgiScriptNameList {}
foreach procFileName $procFileNameList {
# test.tcl -> test.cgi
if ![regsub -nocase {tcl$|py$} $procFileName {cgi} cgiScriptName] {
# nothing to install
continue
}
if {[set i [lsearch -exact $oldCGIScriptNameList $cgiScriptName]] == -1} {
# the script is a new one
set startApacheServer 1
} else {
set oldCGIScriptNameList [lreplace $oldCGIScriptNameList $i $i]
}
Load $col/$rep/doc/cgi/$procFileName fileContent ;# ex: load test.tcl
if [regexp -nocase {tcl$} $procFileName] {
# tcl script
if ![regexp "\nproc +(\[^ \]*)" $fileContent m procName] {continue}
} elseif [regexp -nocase {py$} $procFileName] {
# python script
# if ![regexp "^def +(\[^\(\]*)" $fileContent m procName] {
# regexp "\ndef +(\[^\(\]*)" $fileContent m procName
# }
set procName {}
} else {
# nothing to install
continue
}
# set xxx [list $rep $cgiScriptName $procFileName $procName]
# set xxx [list $rep]
# Store xxx C:/tmp/bbb auto 0 a
MakeCgiScript $rep $rep $cgiScriptName $procFileName $procName
lappend cgiScriptNameList $cgiScriptName
}
if ![string equal {} $oldCGIScriptNameList] {
# some old scripts are not used anymore
set startApacheServer 1
}
if ![string equal {} $cgiScriptNameList] {
set repositoryProperties($rep,cgiscriptnamelist) $cgiScriptNameList
StoreService cgiScriptNameList $rep cgiScriptNameList 0 1
}
}
# InstallCGIScript - end
# ----------------------------------------------------------------------
# CreateCommonWordsRepList
proc CreateCommonWordsRepList {} {
# runs with post
global referenceTable
global repositoryProperties
global compileWordsRepository
set commonWordsRepList {}
foreach index [array names referenceTable *,$compileWordsRepository] {
regsub {,.*} $index {} rep
if {[info exists repositoryProperties($rep,targetfile)] && \
[regexp {Words.tcl} \
$repositoryProperties($rep,targetfile)]} {
lappend commonWordsRepList $rep
}
}
return $commonWordsRepList
}
# CreateCommonWordsRepList - end
# ----------------------------------------------------------------------
# ConvertMultipleRefer2MetadataList
# Examples:
# ConvertMultipleRefer2MetadataList 0 $entry $metadataRep (in CreateIdentificationKey)
# ConvertMultipleRefer2MetadataList 0 $fileContent $rep (in StartService)
# ConvertMultipleRefer2MetadataList 0 $fileContent $metadataRep (in GetMetadataRepositories)
# ConvertMultipleRefer2MetadataList 1 [${bib2referRepository}::Bib2Refer $fileContent] $rep (in LoadBiblioDB)
# ConvertMultipleRefer2MetadataList 1 $fileContent $rep (in Refer2Bib)
# ConvertMultipleRefer2MetadataList 0 $fileContent $metadataRep (in UpdateMetadataBase)
# ConvertMultipleRefer2MetadataList 0 $entry $metadataRep (in XXRepository)
# metadataRep is the name of the repository containing the bibliographic
# references (-i)
# first value is 0 or 1
# 0 is used to specified a metadata for URLibService (-0)
# (metadata contained in a @metadata.refer file)
# 1 is used to specified metadata contained in any other bibliographic
# file (e.g. @reference.bib)
# if metadataArrayName == {} return list
# otherwise place the result in metadataArray
# (this variable must be defined in the calling procedure) - used in LoadBiblioDB
proc ConvertMultipleRefer2MetadataList {first references metadataRep {metadataArrayName {}}} {
# runs with start and post
if ![string equal {} $metadataArrayName] {upvar $metadataArrayName metadataArray}
regsub -all "\n+" $references "\n" references
regsub -all {@} $references {#!#} references ;# @ > #!#
regsub -all {%0} $references {@%0} references
set i $first
foreach entry [lrange [split $references @] 1 end] {
# set x 0; after 1 {set x 1}; vwait x ;# nice procedure - commented by GJFB in 2012-10-19 otherwise if executing Get of a Journal Article with his archiving policy previously removed using the URLibService interface, then this nice procedure waits until the submission queue is cleared - the problem appears after including UpdateReadPermissionFromSecondaryDate (that calls UpdateRepMetadataRep) in GetURLPropertyList (running under post)
regsub -all {#!#} $entry {@} entry ;# #!# > @
# the two lines below have not been tested
# regsub -all "\[^-\]\n" $entry { } entry2
# regsub -all -- "-\n" $entry2 {} entry2 ;# hyphen
array set metadataArray [ConvertRefer2MetadataList $entry $metadataRep $i]
## Update citationkey
# set citationkey [CreateCitationKey metadataArray $metadataRep-$i 1]
# set metadataArray($metadataRep-$i,citationkey) $citationkey
## Update citationkey - end
incr i
}
if [string equal {} $metadataArrayName] {return [array get metadataArray]}
}
# ConvertMultipleRefer2MetadataList - end
# ----------------------------------------------------------------------
# ConvertRefer2MetadataList
# working example:
# previousFieldName fieldName previousDifferentFields differentFields store
# Loop --------------------------------------------------------------------
# 0(initial) 0 0(initial) 0
# 0 A 0 1 0
# A A 1 0 A(first)
# A A 0 0
# A T 0 1 A(all)
# T D 1 1 T
# End Loop ----------------------------------------------------------------
# D 1 D
# Loop --------------------------------------------------------------------
# 0(initial) 0 0(initial) 0
# 0 A 0 1 0
# A T 1 1 A(first and all)
# T D 1 1 T
# End Loop ----------------------------------------------------------------
# D 1 D
proc ConvertRefer2MetadataList {entry metadataRep i} {
# runs with start and post
global referRepository
global ${referRepository}::conversionTable
# global multipleLineReferFieldNamePattern
global multipleLineReferFieldNamePattern2
global firstFieldNameList
# Create a list of reference types
set referenceTypes {}
foreach referenceType \
[array names conversionTable *,%0] {
regsub {,%0} $referenceType {} referenceType
lappend referenceTypes $referenceType
}
# Create a list of reference types - end
set entry2 \n[string trim $entry \n]
regsub -all {@} $entry2 {#!#} entry2 ;# @ -> #!#
regsub -all "\n%(\[^ \\.;,\])" $entry2 {@\1} entry2
# regsub -all "\n" $entry2 { } entry2
regsub -all "\n+" $entry2 { } entry2
# type
set field [lindex [split $entry2 @] 1]
# we assume that 0 is the first field
if ![regexp "^0 (.*)" $field m type] {return [list $metadataRep-$i,referencetype Misc]}
if {[lsearch -exact $referenceTypes $type] == -1} {
set type Generic
}
# Ordering the refer fields
set referMetadata {}
set beginWith- 0
set index $i
foreach field [lrange [split $entry2 @] 1 end] {
# puts --$field--
# if ![regexp { } $field] {continue} ;# drop field with no value (otherwise we may get duplicate title)
regsub -all {#!#} $field {@} field ;# #!# -> @
if [regexp {^@index} $field] {set begingWith- 1}
if [regexp {^@index (.*)} $field m index] {set begingWith- 1}
lappend referMetadata %$field
}
# puts [join $referMetadata \n]
# rep-i
# set rep-i $metadataRep-$i
set rep-i $metadataRep-$index
set referMetadata [lsort -command ReferFieldCompare $referMetadata]
# Ordering the refer fields - end
if 0 {
# old code - still working
set previousFieldName 0
set previousDifferentFields 0
set fieldContent {}
# FOREACH
foreach field $referMetadata {
# Store field C:/tmp/aaa auto 0 a
if [regexp "%(\[^ \]*) +(.*)" $field m fieldName fieldValue] {
set fieldValue [string trimright $fieldValue]
} else {
# empty field
regexp {%(.*)} $field m fieldName
set fieldValue {}
}
# Add trailing comma
# usefull when data come from isis
if [regexp {A|E|Y|\?} $fieldName] {
if [regexp {,} $fieldValue] {
set fieldValue [string trimright $fieldValue ,]
set fieldValue $fieldValue, ;# add trailing comma
}
}
# Add trailing comma - end
set differentFields [expr [string compare $fieldName $previousFieldName] != 0]
if {[info exists conversionTable($type,%$previousFieldName)] && $conversionTable($type,%$previousFieldName) != {}} {
if $previousDifferentFields {
if 0 {
# commented by GJFB in 2022-07-25 - for exampe isbn doesn't have firstisbn
# if [regexp {A|E|Y|\?|@group|@affiliation|@electronicmailaddress} $previousFieldName]
# if [regexp $multipleLineReferFieldNamePattern $previousFieldName] # ;# commented by GJFB in 2018-01-07
if [regexp $multipleLineReferFieldNamePattern2 $previousFieldName] { ;# added by GJFB in 2018-01-07 to exclude nexthigerunit and previous lowerunit
## add FIRST for some multiple line fields
# add FIRST for multiple line fields
# store first of A, E, Y, ?, @group, @affiliation ...
set localMetadataArray(${rep-i},first$conversionTable($type,%$previousFieldName)) $fieldContent
}
} else {
# added by GJFB in 2022-07-25
set metadataFieldName $conversionTable($type,%$previousFieldName)
if {[lsearch $firstFieldNameList first$metadataFieldName] != -1} {
# add FIRST
set localMetadataArray(${rep-i},first$metadataFieldName) $fieldContent
}
}
}
}
if !$differentFields {
lappend fieldContent $fieldValue
} else {
if {[info exists conversionTable($type,%$previousFieldName)] && $conversionTable($type,%$previousFieldName) != {}} {
# if [regexp {A|E|Y|\?|@group|@affiliation|@electronicmailaddress} $previousFieldName]
# if [regexp $multipleLineReferFieldNamePattern $previousFieldName] # ;# commented by GJFB in 2018-01-07
if [regexp $multipleLineReferFieldNamePattern2 $previousFieldName] { ;# added by GJFB in 2018-01-07 to exclude nexthigerunit and previous lowerunit
# multiple line fields
# store all of A, E, Y, ?, @group, @affiliation, @electronicmailaddress ...
set localMetadataArray(${rep-i},$conversionTable($type,%$previousFieldName)) $fieldContent
} else {
# not A, E, Y, ?, @group, @affiliation, electronicmailaddress ...
set localMetadataArray(${rep-i},$conversionTable($type,%$previousFieldName)) [join $fieldContent]
}
}
set fieldContent [list $fieldValue]
}
set previousFieldName $fieldName
set previousDifferentFields $differentFields
}
# FOREACH - end
# process the last field
if {$conversionTable($type,%$fieldName) != {}} {
# if [regexp {A|E|Y|\?|@group|@affiliation|@electronicmailaddress} $fieldName]
# if [regexp $multipleLineReferFieldNamePattern $fieldName] # ;# commented by GJFB in 2018-01-07
if [regexp $multipleLineReferFieldNamePattern2 $fieldName] { ;# added by GJFB in 2018-01-07 to exclude nexthigerunit and previous lowerunit
# multiple line fields
if $differentFields {
if 0 {
# commented by GJFB in 2022-07-25 - for exampe isbn doesn't have firstisbn
# if [regexp $multipleLineReferFieldNamePattern $fieldName] # ;# commented by GJFB in 2018-01-07
if [regexp $multipleLineReferFieldNamePattern2 $fieldName] { ;# added by GJFB in 2018-01-07 to exclude nexthigerunit and previous lowerunit
## add FIRST for some multiple line fields
# add FIRST for multiple line fields
# store first of A, E, Y, ?, @group, @affiliation ...
set localMetadataArray(${rep-i},first$conversionTable($type,%$fieldName)) $fieldContent
}
} else {
# added by GJFB in 2022-07-25
set metadataFieldName $conversionTable($type,%$fieldName)
if {[lsearch $firstFieldNameList first$metadataFieldName] != -1} {
# add FIRST
set localMetadataArray(${rep-i},first$metadataFieldName) $fieldContent
}
}
}
# store all of A, E, Y, ?, @group, @affiliation, @electronicmailaddress ...
set localMetadataArray(${rep-i},$conversionTable($type,%$fieldName)) $fieldContent
} else {
# not A, E, Y, ?, @group, @affiliation, @electronicmailaddress ...
set localMetadataArray(${rep-i},$conversionTable($type,%$fieldName)) [join $fieldContent]
}
}
} else {
# new code (simpler) by GJFB in 2017-01-07
# FOREACH
foreach field $referMetadata {
# Store field C:/tmp/aaa auto 0 a
if [regexp "%(\[^ \]*) +(.*)" $field m fieldName fieldValue] {
set fieldValue [string trimright $fieldValue]
} else {
# empty field
regexp {%(.*)} $field m fieldName
set fieldValue {}
}
# Add trailing comma
# usefull when data come from isis
if [regexp {A|E|Y|\?} $fieldName] {
if [regexp {,} $fieldValue] {
set fieldValue [string trimright $fieldValue ,]
set fieldValue $fieldValue, ;# add trailing comma
}
}
# Add trailing comma - end
if {[info exists conversionTable($type,%$fieldName)] && $conversionTable($type,%$fieldName) != {}} {
set metadataFieldName $conversionTable($type,%$fieldName)
# puts --$fieldName--
# puts --$metadataFieldName--
# if [regexp $multipleLineReferFieldNamePattern $fieldName] # ;# commented by GJFB in 2018-01-07
if [regexp $multipleLineReferFieldNamePattern2 $fieldName] { ;# added by GJFB in 2018-01-07 to exclude nexthigerunit and previouslowerunit
if ![info exists localMetadataArray(${rep-i},first$metadataFieldName)] {
if 0 {
# commented by GJFB in 2022-07-25 - for exampe isbn doesn't have firstisbn
# add FIRST for some multiple line fields
# store first of A, E, Y, ?, @group, @affiliation ...
set localMetadataArray(${rep-i},first$metadataFieldName) [list $fieldValue]
} else {
# added by GJFB in 2022-07-25
if {[lsearch $firstFieldNameList first$metadataFieldName] != -1} {
# add FIRST
set localMetadataArray(${rep-i},first$metadataFieldName) [list $fieldValue]
}
}
}
lappend localMetadataArray(${rep-i},$metadataFieldName) $fieldValue
} else {
# puts --$fieldValue--
if ![info exists localMetadataArray(${rep-i},$metadataFieldName)] {
set localMetadataArray(${rep-i},$metadataFieldName) $fieldValue
} else {
append localMetadataArray(${rep-i},$metadataFieldName) " $fieldValue"
}
}
}
}
# FOREACH - end
}
# puts [array get localMetadataArray]
# Process firstgroup
# drop initial empty groups (meaningful firstgroup must not be empty)
if [info exists localMetadataArray(${rep-i},group)] {
foreach group $localMetadataArray(${rep-i},group) {
if ![string equal {} $group] {
set localMetadataArray(${rep-i},firstgroup) $group
break
}
}
}
# Process firstgroup - end
if !${beginWith-} {
# could be for all (if could be dropped)
set localMetadataArray(${rep-i},index) $index ;# used to display the full reference (mirror)
}
# Update citationkey
# at update, author, year and title might have changed
set citationkey [CreateCitationKey localMetadataArray $metadataRep-$index 1]
set localMetadataArray($metadataRep-$index,citationkey) $citationkey
# puts "citationkey updated in $metadataRep-$index"
# Update citationkey - end
# puts [array get localMetadataArray]
return [array get localMetadataArray]
}
if 0 {
# testing
source cgi/mirrorfind-.tcl ;# Load
source utilitiesStart.tcl
source utilities1.tcl ;# CreateWebLanguageTable
source utilitiesMirror.tcl
LoadGlobalVariables
source $homePath/col/$URLibServiceRepository/auxdoc/.repositoryProperties.tcl ;# used in CreateCommonWordsRepList
source $homePath/col/$URLibServiceRepository/auxdoc/.referenceTable.tcl ;# ;# used in CreateCommonWordsRepList
set commonWords [${compileWordsRepository}::CompileWords [CreateCommonWordsRepList]] ;# used in CreateCitationKey
# set metadataRep dpi.inpe.br/banon/1995/09.18.18.50
# set metadataRep dpi.inpe.br/banon-pc2@1905/2005/07.11.21.15.43
# set metadataRep urlib.net/www/2013/05.21.00.26.04
set metadataRep iconet.com.br/banon/2005/12.30.19.29.37
Load ../../../../../$metadataRep/doc/@metadata.refer entry
# set i 1
set i 0
set list [ConvertRefer2MetadataList $entry $metadataRep $i]
puts $list
# =>
# iconet.com.br/banon/2005/12.30.19.29.37-0,index 0 iconet.com.br/banon/2005/12.30.19.29.37-0,repository iconet.com.br/banon/2005/12.30.19.29 iconet.com.br/banon/2005/12.30.19.29.37-0,copyholder SID/SCD iconet.com.br/banon/2005/12.30.19.29.37-0,referencetype {Newspaper Article} iconet.com.br/banon/2005/12.30.19.29.37-0,documentstage {not transferred} iconet.com.br/banon/2005/12.30.19.29.37-0,firstreporter {{Ribeiro, João,}} iconet.com.br/banon/2005/12.30.19.29.37-0,reporter {{Ribeiro, João,} {Batista, Laura,}} iconet.com.br/banon/2005/12.30.19.29.37-0,citationkey RibeiroBati:2002:Te iconet.com.br/banon/2005/12.30.19.29.37-0,newspaper {O Globo} iconet.com.br/banon/2005/12.30.19.29.37-0,targetfile clipping1.html iconet.com.br/banon/2005/12.30.19.29.37-0,issuedate 2002-03-12 iconet.com.br/banon/2005/12.30.19.29.37-0,metadatarepository iconet.com.br/banon/2005/12.30.19.29.37 iconet.com.br/banon/2005/12.30.19.29.37-0,year 2002 iconet.com.br/banon/2005/12.30.19.29.37-0,title Teste2 iconet.com.br/banon/2005/12.30.19.29.37-0,type {URLibService test} iconet.com.br/banon/2005/12.30.19.29.37-0,usergroup banon iconet.com.br/banon/2005/12.30.19.29.37-0,firstusergroup banon iconet.com.br/banon/2005/12.30.19.29.37-0,nexthigherunit {J8LNKB5R7W/3GFJKM8 J8LNKB5R7W/3LBEQ3H} iconet.com.br/banon/2005/12.30.19.29.37-0,firstaffiliation {{Instituto Nacional de Pesquisas Espaciais (INPE)}} iconet.com.br/banon/2005/12.30.19.29.37-0,affiliation {{Instituto Nacional de Pesquisas Espaciais (INPE)}}
}
# ConvertRefer2MetadataList - end
# ----------------------------------------------------------------------
# SaveMetadata
# Save metadata if saveMetadata == 1
# used in StartService and others
# force value is 0 or 1; 1 means to save anyway (independently of saveFlag)
# proc SaveMetadata {{force 0} {suffix {}}}
proc SaveMetadata {{force 0}} {
# runs with post
global saveMetadata
global col
global URLibServiceRepository
global saveFlag
global repArray
global repArray2
# set xxx [CallTrace]
# Store xxx C:/tmp/bbb auto 0 a
# Store saveMetadata C:/tmp/bbb auto 0 a
# puts $saveFlag
if {($saveFlag || $force) && (![info exists saveMetadata] || $saveMetadata)} {
set auxDoc $col/$URLibServiceRepository/auxdoc
StoreArray metadataArray $auxDoc/.metadataArray.tcl w list
# if [llength [array names repArray]] {StoreArray repArray $auxDoc/.repArray.tcl w list}
if [info exists repArray] {StoreArray repArray $auxDoc/.repArray.tcl w list}
if [info exists repArray2] {StoreArray repArray2 $auxDoc/.repArray2.tcl w list}
StoreArray authorArray $auxDoc/.authorArray.tcl w list ;# authorArray created/updated in CreateRepArray
StoreArray groupArray $auxDoc/.groupArray.tcl w list ;# groupArray created/updated in CreateRepArray
StoreArray committeeArray $auxDoc/.committeeArray.tcl w list ;# committeeArray created/updated in CreateRepArray
StoreArray journalArray $auxDoc/.journalArray.tcl w list ;# journalArray created/updated in CreateRepArray
StoreArray conferencenameArray $auxDoc/.conferencenameArray.tcl w list ;# conferencenameArray created/updated in CreateRepArray
StoreArray wordOccurrenceArray $auxDoc/.wordOccurrenceArray.tcl w list
StoreArray mostRecentReferences $auxDoc/.mostRecentReferences.tcl w list
StoreArray mostRecentFullTexts $auxDoc/.mostRecentFullTexts.tcl w list
set saveMetadata 0
}
}
# SaveMetadata - end
# ----------------------------------------------------------------------
# SaveRepositoryProperties
# force value is 0 or 1; 1 means to save anyway (independently of saveFlag)
proc SaveRepositoryProperties {{force 0}} {
# runs with post
global col
global URLibServiceRepository
global saveFlag
if {$saveFlag || $force} {
set auxDoc $col/$URLibServiceRepository/auxdoc
StoreArray repositoryProperties $auxDoc/.repositoryProperties.tcl w list
}
}
# SaveRepositoryProperties - end
# ----------------------------------------------------------------------
# SaveReferenceTable
# force value is 0 or 1; 1 means to save anyway (independently of saveFlag)
proc SaveReferenceTable {{force 0}} {
# runs with post
global col
global URLibServiceRepository
global saveFlag
if {$saveFlag || $force} {
set auxDoc $col/$URLibServiceRepository/auxdoc
StoreArray referenceTable $auxDoc/.referenceTable.tcl w list
}
}
# SaveReferenceTable - end
# ----------------------------------------------------------------------
# UpdateKeyRepositoryList
# updates the key if rep exists
# if listName is keyRepositoryList adds a key-repository item without repetition
# Examples of listName values:
# keyRepositoryList (default)
# ddSelectedKeyRepList
# storeKeyRepositoryListFlag value is 0 or 1; 1 means to store the keyRepositoryList
# example of keyRepositoryList: {{BanonPess::BiFiFo dpi.inpe.br/banon/1995/08.25.00.00} {Banon:1995:CoDeFu dpi.inpe.br/banon/1995/09.01.10.50}}
proc UpdateKeyRepositoryList {rep {storeKeyRepositoryListFlag 0} {listName {keyRepositoryList}}} {
# runs with start
# global col
# global URLibServiceRepository
upvar #0 $listName list
if [string equal keyRepositoryList $listName] {
# listName is keyRepositoryList
if ![info exists list] {set list {}}
set i [lsearch -regexp $list $rep$] ;# may result in an error: couldn't compile regular expression pattern - when $rep (see content of auxdoc/.repositoryListForStart.tcl) is not a rep name (but for example a list like: {servername citationkey versionstamp metadatarep-i 1})
# example of a non rep name (at the end fo the file): {{mtc-m12.sid.inpe.br 800} {} {2013:02.08.15.28.12 sid.inpe.br/banon/2001/04.06.10.52 marciana {D 2005}} sid.inpe.br/iris@1912/2005/12.26.17.22.42-0 1 {}}
if {$i != -1} {
set oldKeyRepository [lindex $list $i]
# delete (the key may be old)
set list [lreplace $list $i $i]
} else {
set oldKeyRepository {}
}
set newKeyRepository [list [CreateIdentificationKey $rep] $rep]
lappend list $newKeyRepository
# SAVE
if {$newKeyRepository != "$oldKeyRepository"} {
# set auxDoc $col/$URLibServiceRepository/auxdoc
# StoreList $listName $auxDoc/.keyRepositoryList.tcl
set storeKeyRepositoryListFlag 1 ;# keyRepositoryList need to be stored
}
# SAVE - end
} else {
# listName is not keyRepositoryList
if ![info exists list] {return}
set i [lsearch -regexp $list $rep$]
if {$i != -1} {
# delete (the key may be old)
set list [lreplace $list $i $i]
set newKeyRepository [list [CreateIdentificationKey $rep] $rep]
lappend list $newKeyRepository
}
}
return $storeKeyRepositoryListFlag
}
# UpdateKeyRepositoryList - end
# ----------------------------------------------------------------------
# AddKey
# delete the URLib home path and add the key
# the key may exist
# the key may be missing even when reverse == 0 (key first)
# if the key is in the keyRepositoryList then it is used
# example: AddKey $repName/ 0
# uses CreateIdentificationKey
proc AddKey {string {reverse {1}}} {
# runs with start
global keyRepositoryList
regsub {^.*/col/} $string {} string
if ![regexp { } $string] {
# the key does not exist
if [regexp {[^/]*/[^/]*/[^/]*/[^/]*/$} $string] {
# repository name well formed, the key must be added
regsub {/$} $string {} rep ;# delete trailing /
# Extract key
if ![info exists keyRepositoryList] {
# keyRepositoryList may not exist, e.g. when first use DDRoutine
set keyRepositoryList {}
}
set i [lsearch -regexp $keyRepositoryList $rep$]
if {$i == -1} {
set key [CreateIdentificationKey $rep]
} else {
set key [lindex [lindex $keyRepositoryList $i] 0]
}
# Extract key - end
if $reverse {
return "$rep $key"
} else {
return "$key $rep"
}
}
}
# don't add key
return $string
}
# puts [AddKey c:/usuario/gerald/URLib/col/dpi.inpe.br/banon/1998/08.02.08.56/]
# => dpi.inpe.br/banon/1998/08.02.08.56 Banon::UR
# puts [AddKey dpi.inpe.br/banon/1998/08.02.08.56/]
# => dpi.inpe.br/banon/1998/08.02.08.56 Banon::UR
# AddKey - end
# ----------------------------------------------------------------------
# CreateIdentificationKey
# used by AddKey and UpdateKeyRepositoryList only
# Examples:
# Banon:2000:Co
# :metadata.cgi:
# the citation key is obtained from the data in the @metadataRefer file
proc CreateIdentificationKey {rep} {
# runs with start
global col
global homePath
global tcl_platform
global applicationName
if [Eval TestContentType $rep Metadata] {
# metadata have no metadata
return :metadata.cgi:
} else {
set metadataRep [Eval FindMetadataRep $rep]
if ![file isdirectory $homePath/col/$metadataRep] {
UpdateVariables $metadataRep ;# discards rep from keyRepositoryList
set metadataRep ""
}
if {$metadataRep == ""} {
return [Eval MakeTargetKey $rep]
} else {
if ![file exists $col/$metadataRep/doc/@metadata.refer] {
if {$tcl_platform(platform) == "windows" && [string equal {start} $applicationName]} {
console show
}
puts {syntax error:}
puts {the metadata file doesn't exist in} ;# '
puts "$homePath/col/$metadataRep/doc"
puts {or its name is not @metadata.refer}
puts {solution:}
puts {create a metadata file named @metadata.refer}
puts {press exit}
puts {start again URLibService}
vwait forever
}
if 1 {
# new code added by GJFB in 2012-06-16 (faster)
set citationKey [Get metadataArray($metadataRep-0,citationkey)]
} else {
# old code
Load $col/$metadataRep/doc/@metadata.refer entry
array set metadataArray [ConvertMultipleRefer2MetadataList 0 $entry $metadataRep]
set citationKey [CreateCitationKey metadataArray $metadataRep-0 1]
}
return $citationKey
}
}
}
# CreateIdentificationKey - end
# ----------------------------------------------------------------------
# CreateCitationKey
# return the citation key of a rep-i metadata
proc CreateCitationKey {metadataArrayName rep-i {level {#0}}} {
# runs with start and post
global referRepository
global ${referRepository}::conversionTable
global citationKeyRepository
global commonWords
upvar $level $metadataArrayName metadataArray
## type
# set type [ReturnType metadataArray ${rep-i} 1]
# author
set author [GetAuthor ${rep-i} 1] ;# uses metadataArray
# set author [EscapeUntrustedData $author] ;# added by GJFB in 2018-06-08 - escape untrusted data - XSS prevention
# referenceType
set referenceType $metadataArray(${rep-i},referencetype)
# year
if [string equal {Film or Broadcast} $referenceType] {
ConditionalSet year metadataArray(${rep-i},yearreleased) {}
} elseif {[string equal {Resume} $referenceType]} {
ConditionalSet dayOfBirth metadataArray(${rep-i},dayofbirth) {}
# regexp {^\d{4,}} $dayOfBirth year
regsub {^\d{4,}-(\d{2})-(\d{2})$} $dayOfBirth {\1\2} year ;# hide the year
} else {
ConditionalSet year metadataArray(${rep-i},year) {}
}
# set year [EscapeUntrustedData $year] ;# added by GJFB in 2018-06-08 - escape untrusted data - XSS prevention
# suffix
# in Medeiros:1974:Es14 14 is the suffix
set suffix {}
if [string equal {Newspaper} $referenceType] {
if [info exists metadataArray(${rep-i},number)] {
set suffix $metadataArray(${rep-i},number)
# set suffix [EscapeUntrustedData $suffix] ;# added by GJFB in 2018-06-08 - escape untrusted data - XSS prevention
if ![regexp {\d+} $suffix suffix] {set suffix {}} ;# # keep just the decimal part
}
}
# title
set title [GetFieldValue ${rep-i} title 1]
# set title [EscapeUntrustedData $title] ;# added by GJFB in 2018-06-08 - escape untrusted data - XSS prevention
return [${citationKeyRepository}::CreateKey $author $year $title $commonWords $suffix]
}
# CreateCitationKey - end
# ----------------------------------------------------------------------
# FindMetadataRep
# returns the metadata repository name of the metadata repository whose language is the one informed in the language argument
# if the language argument is empty or if there is no repository containing metadata within the required language
# then it returns the one which contains the metadata within the first/original language
# (returns the metadata repository name even though the metadata repository has been deleted)
# FindMetadataRep is case sensitive
# rep can be any repository (metadata repository or not)
# if it is a metadata repository FindMetadataRepList returns empty
proc FindMetadataRep {rep {language {}}} {
# runs with post
global repositoryProperties
global homePath
# new code by GJFB in 2012-08-18
# language defined
# puts "rep = $rep"
set metadataRepList [FindMetadataRepList $rep]
# puts "metadataRepList = --$metadataRepList--"
if [string equal {} $metadataRepList] {return} ;# metadataRep not found or rep is a metadata repository
set foundFlag 0 ;# not found
if ![string equal {} $language] {
foreach metadataRep $metadataRepList {
if [info exists repositoryProperties($metadataRep,language)] {
set metadataLanguage $repositoryProperties($metadataRep,language)
regexp {\[(.*)\]} $metadataLanguage m metadataLanguage ;# English {[en]} -> en
if [string equal $metadataLanguage $language] {set foundFlag 1; break}
}
}
}
# puts $foundFlag
if !$foundFlag {
# foundFlag == 0
# puts --$metadataRepList--
set metadataRep [lindex $metadataRepList 0] ;# name of the metadata repository which contains the metadata within the first/original language
if [string equal {} $metadataRep] {return} ;# metadataRep not found
}
# puts "metadataRep = --$metadataRep--"
# metadataRep found
if 0 {
# commented by GJFB in 2014-09-11 - doesn't work when the metadata repository has been deleted - in such situation, one must use FindMetadataRep2
if ![file isdirectory $homePath/col/$metadataRep] {
# the metadata repository has been deleted
UpdateVariables $metadataRep
# Check consistency with the file system
# CheckMetadataConsistency $metadataRep-0
set rep-iList $metadataRep-0
CheckMetadataConsistency rep-iList
# Check consistency with the file system - end
}
}
return $metadataRep
}
# FindMetadataRep - end
# ----------------------------------------------------------------------
# FindMetadataRep2
# reintroduced by GJFB in 2014-09-11 to be used in CompleteEntry when the repository has been deleted
# returns the first encountered which is not a metadata translation
# (returns the metadata repository name even though the metadata repository has been deleted)
# FindMetadataRep2 is case sensitive
# used in CompleteEntry only
proc FindMetadataRep2 {rep} {
# runs with post
global referenceTable
# global repositoryProperties
global homePath
foreach index [array names referenceTable *,$rep] {
regsub {,.*} $index {} metadataRep
# puts "metadataRep = --$metadataRep--"
if [TestContentType $metadataRep Metadata] {
if {$referenceTable($index) != "+"} {
set break 0
foreach index [array names referenceTable $metadataRep,*] {
if {$referenceTable($index) == "+"} {
# metadataRep contains a metadata translation
set break 1
}
}
if $break {continue} ;# metadataRep contains a metadata translation
# the metadata is in the first language
# puts OK1
if ![file isdirectory $homePath/col/$metadataRep] {
# the metadata repository has been deleted
# puts OK2
UpdateVariables $metadataRep
# Check consistency with the file system
# CheckMetadataConsistency $metadataRep-0
set rep-iList $metadataRep-0
CheckMetadataConsistency rep-iList
# Check consistency with the file system - end
}
return $metadataRep
}
}
}
# metadataRep not found
}
# FindMetadataRep2 - end
# ----------------------------------------------------------------------
# FindMetadataRepList
# Example:
# FindMetadataRepList dpi.inpe.br/banon/1998/08.02.08.56 .window.main.bc.rep.h2.entry.entry bc(result1)
# returns the metadata repository list for rep
# rep can be any repository (metadata repository or not)
# if it is a metadata repository FindMetadataRepList returns empty
# the original metadata is the first one (the others are translations)
proc FindMetadataRepList {rep {entryWidget {}} {varName {}}} {
# runs with start and post
global col
global applicationName
# set xxx [CallTrace]
# Store xxx C:/tmp/bbb.txt binary 0 a
if [string equal {} $rep] {
# not the repository syntax
# security issue - if $rep were empty, FindMetadataRepList could return all the metadata repositories
return
}
set metadataRepList {}
# example:
# child parent comment
# dpi.inpe.br/banon/1999/04.02.15.49,dpi.inpe.br/banon/1998/08.02.08.56 1 by TestContentType the child is metadata
# dpi.inpe.br/banon/2000/05.25.20.06,dpi.inpe.br/banon/1998/08.02.08.56 1 by TestContentType the child is metadata
# dpi.inpe.br/banon/2000/05.25.20.06,dpi.inpe.br/banon/1999/04.02.15.49 + child is translation metadata
# dpi.inpe.br/banon/1999/04.02.15.49,language {English [en]}
if {$applicationName == "start"} {
# start
# puts --$rep--
# puts --[Array names referenceTable *,$rep]--
foreach index [Array names referenceTable *,$rep] {
regsub {,.*} $index {} child
if ![file isdirectory $col/$child] {
# child doesn't exist
UpdateVariables $child ;# updates the keyRepositoryList
Eval UpdateVariables $child
regexp {^..} $varName xx ;# dd
SetIndicator $xx $entryWidget
} else {
# child exists
if [Eval TestContentType $child Metadata] {
if {[Get referenceTable($index)] != "+"} {
# metadataRepList
set index [lindex [Array names referenceTable *,$child] 0]
if {![string equal {} $index] && [Get referenceTable($index)] == "+"} {
# original metadata - must be the first language metadada
set metadataRepList [concat $child $metadataRepList]
} else {
lappend metadataRepList $child
}
}
}
}
}
}
if {$applicationName == "post"} {
# post
global referenceTable
# puts OK
# puts [info exists referenceTable]
# puts --$rep--
# puts --[array names referenceTable *,$rep]--
foreach index [array names referenceTable *,$rep] {
# puts $index
regsub {,.*} $index {} child ;# a child repository (might be a metadata repository or a translation repository)
if ![file isdirectory $col/$child] {
# child doesn't exist
UpdateVariables $child
} else {
# child exists
# warning: if contentType is corrupted (e.g., empty) for $child which is a metadata repository, then one may get the error message:
# can't read "repositoryProperties(,history)": no such variable
# when running GetVersionStamp $metadataRep within GetURLPropertyList (during an IBI resolution)
if [TestContentType $child Metadata] {
# child is a metadata
if {$referenceTable($index) == "+"} {
# child is a metada translation
# rep has a metadata translation, that is
# rep is a metadata repository (a parent metadata repository) but metadata repository has no metadata repository therefore nothing to append
} else {
# rep is not a metadata repository
# metadataRepList
set index [lindex [array names referenceTable *,$child] 0]
if {![string equal {} $index] && $referenceTable($index) == "+"} {
# original metadata - must be the first language metadada
set metadataRepList [concat $child $metadataRepList]
} else {
lappend metadataRepList $child
}
}
}
}
}
}
# puts $metadataRepList
return $metadataRepList
}
if 0 {
# testing
source utilitiesStart.tcl
source utilities1.tcl
source cgi/mirrorfind-.tcl
source ../auxdoc/.referenceTable.tcl
source ../auxdoc/.repositoryProperties.tcl
set applicationName post
set col ../../../../..
FindMetadataRepList dpi.inpe.br/banon/1998/08.02.08.56
# => dpi.inpe.br/banon/1999/04.02.15.49 dpi.inpe.br/banon/2000/05.25.20.06
}
# FindMetadataRepList - end
# ----------------------------------------------------------------------
# AddItem
# Add a non-empty item in a list without repetition
# not used
proc AddItem2 {listName item} {
upvar #0 $listName inputList
set outputList $inputList
if {[lsearch -exact $outputList $item] == -1 && $item != ""} {
lappend outputList $item
}
return $outputList
}
# AddItem - end
# ----------------------------------------------------------------------
# MakeTargetKey
# makes the identification key when the document in $rep has no metadata
# used in CreateIdentificationKey only
proc MakeTargetKey {rep} {
# runs with post
global repositoryProperties
UpdateRepositoryProperties $rep targetfile
if [info exists repositoryProperties($rep,targetfile)] {
return :$repositoryProperties($rep,targetfile):
} else {
return ::
}
}
# MakeTargetKey - end
# ----------------------------------------------------------------------
# SourceLanguage
# example: SourceLanguage environmentArray
proc SourceLanguage {arrayName} {
# runs with start and post
upvar #0 $arrayName array
global col
global mirrorLanguageTable
global mirrorLanguageConversionTable
set currentLanguage $array(spLanguageEntry)
set repository $array(serviceLanguageRepository)
set currentLanguage2 $currentLanguage
# if [string equal {Português} $currentLanguage] {set currentLanguage2 {Portuguese}}
if [regexp {^Portugu.s$} $currentLanguage] {set currentLanguage2 {Portuguese}}
if [file exists $col/$repository] {
source $col/$repository/doc/${currentLanguage2}Language.tcl
}
set path [glob $col/$mirrorLanguageTable($currentLanguage2)/doc/mirror/*FieldName.tcl]
source $path
array set mirrorLanguageConversionTable [array get field::conversionTable]
}
# SourceLanguage - end
# ----------------------------------------------------------------------
# StoreList
proc StoreList {listName fileName {option {w}}} {
upvar #0 $listName list
if [catch {open $fileName w} fileId] {
puts stderr $fileId
} else {
puts $fileId "set $listName [list $list]"
close $fileId
}
}
# StoreList - end
# ----------------------------------------------------------------------
# CreateRepositoryList
proc CreateRepositoryList {} {
global repositoryList
global homePath
global pwd
if ![info exists repositoryList] {
cd $homePath/col
set repositoryList [glob -nocomplain */*/*/*]
cd $pwd
}
}
# CreateRepositoryList - end
# ----------------------------------------------------------------------
# StartService
# called in post
proc StartService {} {
# runs with post
# global startService
global environmentArray
# global env
global auto_path
global URLibServiceRepository ;# set in post
# global downloadingEnvironmentRepository ;# set in post - not used any more after 2020-04
# global URLibBannerSequenceRepository
# global citationKeyRepository
# global searchRepository
global compileWordsRepository
global referRepository
global ${referRepository}::conversionTable
global orderingTable
global bib2referRepository
# global isis2referRepository
global bibpessoal2referRepository
global englishMirrorRepository
global defaultDocRepository
global defaultMetadataRepository
global defaultAccessIconRepository
global mirrorHomePageRepository
# global commonWordsRepList
global metadataArray
global repArray ;# may be created by the source procedure
global repArray2 ;# may be created by the source procedure (contains no accent and lower case only)
global authorArray
global groupArray
global committeeArray
global journalArray
global conferencenameArray
global wordOccurrenceArray
global mostRecentReferences
global mostRecentFullTexts
global saveMetadata
global loCoInRep ;# set first (at installation) in MakeRepository and then in LoadGlobalVariables
# global loCoInMetadataRep ;# set in this procedure
global loBiMiRep ;# set in this procedure
global loBiMiMetadataRep ;# set in this procedure and used in MakeRepository
global referenceTable
global repositoryProperties
global col
global homePath
global pwd
# global keyRepositoryList
global commonWords
# global inverseTable
# global dateFieldPattern
# global localURLibClientSocketId
global repositoryList
global indexRepList
global bannerSequenceRepList
global officialIconRepList
# global abbreviationArray
global argv
global serverAddress
global serverAddressWithIP
# global urlibServerAddressWithIP ;# ip and port of urlib.net
global startApacheServer
global tcl_platform
global urlibServiceVersion
global devLoCoInRep ;# set in post
global maximumNumberOfEntries
global htpasswdPath
global tclPath
global wishPath
global repositoryListForPost
global repositoryListForStart
global installInitialCollection ;# set in post and in LoadGlobalVariables
global phpiniDirectoryPath
global urlibServiceSiteWithIP ;# set in post
global applicationName ;# set in post
global registrationKey ;# used in MakeRepository
set saveMetadata 0 ;# just in case of a crash
foreach fileName [glob -nocomplain ../auxdoc/insertionOn-*] {
file delete $fileName ;# see EnterQueue
}
file delete ../auxdoc/symmetricKeySessionList ;# added by GJFB in 2020-01-23 because symmetricKeySessionList may contain inconsistent time values which don't let exit from the first while in the OpenSession procedure and consequently forbid the bibliographic mirror opening
foreach fileName [glob -nocomplain ../auxdoc/tmpForAdministratorPassword-*] {
file delete $fileName ;# see Submit in submit.tcl
}
file delete ../auxdoc/processList ;# see StartApacheServer and Submit
# Install initial collection
if $installInitialCollection {
# installation begins here
# Load ../../../../../../../installationRegistrationPasswordFor[file tail $homePath] installationRegistrationPassword ;# added by GJFB in 2016-04-28 - must match the value set in col/dpi.inpe.br/banon/2004/02.16.09.30.00/auxdoc/localCollectionPasswordArray.tcl in urlib.net
Load ../../../../../../registrationKey registrationKey ;# added by GJFB in 2016-04-28 - must match the value set in col/dpi.inpe.br/banon/2004/02.16.09.30.00/auxdoc/localCollectionPasswordArray.tcl in urlib.net
# Load ../../../../../../../installationAgencyResolverAddressFor[file tail $homePath] installationAgencyResolverAddress ;# added by GJFB in 2017-02-20 - example: licuri.ibict.br - used to inform the urlib.net resolver, at the first connection, about the agency resolver providing support to the Archive
Load ../../../../../../installationAgencyResolverAddress installationAgencyResolverAddress ;# added by GJFB in 2017-02-20 - example: licuri.ibict.br - used to inform the urlib.net resolver, at the first connection, about the agency resolver providing support to the Archive
# set loCoInRep [CreateNewRepository]
CreateNewRepository ;# set loCoInRep (see MakeRepository)
if ![info exists loCoInRep] {
set message {unknown local collection or wrong registration key}
Store message ../auxdoc/messageForStart
exit
}
set transferableFlag 0 ;# loCoInRep is not transferable
StoreService transferableFlag $loCoInRep transferableFlag 1 1
set visibility 1 ;# hidden
StoreService visibility $loCoInRep visibility 1 1
set repList $loCoInRep
set environmentArray(localCollectionIndexRepository) $loCoInRep
set fileContent {}
Store fileContent $col/$loCoInRep/doc/@siteList.txt
# Store fileContent $col/$loCoInRep/doc/@sitesForRepositoryCapture.txt ;# not used anymore
set fileContent {array set allowedSitesArray {}}
Store fileContent $col/$loCoInRep/doc/@sitesAllowedToTransferCopyright.tcl
set fileContent \
{All Sites
Main Site}
Store fileContent $col/$loCoInRep/doc/@sitesHavingReadPermission.txt
set environmentArray(sitesHavingReadPermission) [split $fileContent \n]
set fileContent {}
Store fileContent $col/$loCoInRep/doc/@sitesHavingWritePermission.txt
set environmentArray(sitesHavingWritePermission) [split $fileContent \n]
set type Index
Store type $col/$loCoInRep/service/type
# regsub {0\.} [expr [SortRandomNumber]/double(233280)] {} registrationPassword ;# added by GJFB in 2010-08-03 - needed by urlib.net for site authentication
# StoreService registrationPassword $loCoInRep registrationPassword 1 1 ;# added by GJFB in 2010-08-03
StoreService registrationKey $loCoInRep registrationPassword 1 1 ;# added by GJFB in 2016-04-28
StoreService installationAgencyResolverAddress $loCoInRep agencyResolverAddress 1 1 ;# added by GJFB in 2017-02-20 - used just at the first connection to the urlib.net resolver
set loCoInMetadataRep [CreateNewRepository]
file delete $col/$loCoInMetadataRep/service/transferableFlag
# lappend repositoryList $loCoInMetadataRep
lappend repList $loCoInMetadataRep
set environmentArray(localCollectionIndexMetadataRepository) $loCoInMetadataRep ;# not used by URLibservice
set metadata "%0 Misc
%A URLib Librarian,
%T Local Collection Index at $loCoInRep
%I Deposited in the URlib collection.
%2 $loCoInMetadataRep
%4 $loCoInRep
%K metadata, URLib system."
Store metadata $col/$loCoInMetadataRep/doc/@metadata.refer
set targetFile metadata.cgi
Store targetFile $col/$loCoInMetadataRep/service/targetFile
# set repositoryProperties($loCoInMetadataRep,targetfile) $targetFile
set type Metadata
Store type $col/$loCoInMetadataRep/service/type
# set repositoryProperties($loCoInMetadataRep,type) $type
set reference ../$col/col/$loCoInRep
Store reference $col/$loCoInMetadataRep/service/reference
} else {
# not installation
file delete ../../../../../../registrationKey ;# must be deleted for security reason
file delete ../../../../../../installationAgencyResolverAddress
if 0 {
# added by GJFB in 2016-04-28
## useful just for storing, if required, a new local collection password (registration key), different from installationRegistrationPassword, while the Archive is at gjfb
# useful just for storing, if required, a new local collection password (registration key), different from installationRegistrationPassword, while the Archive is at vaio
if [file exists C:/tmp/localCollectionPasswordArray.tcl] {
source C:/tmp/localCollectionPasswordArray.tcl ;# registration key - C:/tmp/localCollectionPasswordArray.tcl at gjfb (now at vaio) - array set localCollectionPasswordArray
# array set localCollectionPasswordArray {
# urlib.net/www/2016/05.05.01.26 814751309513
# }
if [info exists localCollectionPasswordArray($loCoInRep)] {
set registrationPassword $localCollectionPasswordArray($loCoInRep)
StoreService registrationPassword $loCoInRep registrationPassword 1 1
}
}
}
}
if ![info exists environmentArray(localBibliographicMirrorRepository)] {
set installInitialCollection 1
set loBiMiRep [CreateNewRepository]
set transferableFlag 0 ;# loBiMiRep is not transferable
StoreService transferableFlag $loBiMiRep transferableFlag 1 1
set visibility 1 ;# hidden
StoreService visibility $loBiMiRep visibility 1 1
# lappend repositoryList $loBiMiRep
lappend repList $loBiMiRep
set environmentArray(localBibliographicMirrorRepository) $loBiMiRep
set targetFile mirror.cgi
Store targetFile $col/$loBiMiRep/service/targetFile
set reference ../$col/col/$mirrorHomePageRepository
Store reference $col/$loBiMiRep/service/reference
set type Mirror
Store type $col/$loBiMiRep/service/type
# set repositoryProperties($loBiMiRep,targetfile) $targetFile
set loBiMiMetadataRep [CreateNewRepository]
file delete $col/$loBiMiMetadataRep/service/transferableFlag
# lappend repositoryList $loBiMiMetadataRep
lappend repList $loBiMiMetadataRep
set environmentArray(localBibliographicMirrorMetadataRepository) $loBiMiMetadataRep ;# used just in LoadGlobalVariables
set metadata "%0 Misc
%A URLib Librarian,
%T Local Bibliographic Mirror at $loBiMiRep
%I Deposited in the URlib collection.
%2 $loBiMiMetadataRep
%3 mirror.cgi
%4 $loBiMiRep
%K metadata, URLib system."
Store metadata $col/$loBiMiMetadataRep/doc/@metadata.refer
# set targetFile @metadata.refer
set targetFile metadata.cgi
Store targetFile $col/$loBiMiMetadataRep/service/targetFile
# set repositoryProperties($loBiMiMetadataRep,targetfile) $targetFile
set type Metadata
Store type $col/$loBiMiMetadataRep/service/type
# set repositoryProperties($loBiMiMetadataRep,type) $type
set reference ../$col/col/$loBiMiRep
Store reference $col/$loBiMiMetadataRep/service/reference
# Create the @siteList.txt file in the loBiMiRep
if ![file exists $col/$loBiMiRep/doc/@siteList.txt] {
set fileContent {}
Store fileContent $col/$loBiMiRep/doc/@siteList.txt
}
# Create the @siteList.txt file in the loBiMiRep - end
## Create the @hidedMetadataRepositoryList.txt file in the loBiMiRep
# not used
# set hidedMetadataRepositoryList {} ;# show all metadata repositories
# Store hidedMetadataRepositoryList $col/$loBiMiRep/doc/@hidedMetadataRepositoryList.txt
## Create the @hidedMetadataRepositoryList.txt file in the loBiMiRep - end
}
if $installInitialCollection {
# Create the default document repository
file mkdir $col/$defaultDocRepository/auxdoc
file mkdir $col/$defaultDocRepository/source
file mkdir $col/$defaultDocRepository/doc
file mkdir $col/$defaultDocRepository/service
set fileContent [list [list 1999:09.19.18.20.04 dpi.inpe.br/banon/1999/01.09.22.14]]
Store fileContent $col/$defaultDocRepository/service/history
# StoreHostCollection $defaultDocRepository dpi.inpe.br/banon/1999/01.09.22.14 ;# there is no host collection containing the original
set visibility 1 ;# hidden
StoreService visibility $defaultDocRepository visibility 1 1
# lappend repositoryList $defaultDocRepository
lappend repList $defaultDocRepository
# Create the default document repository - end
# Create the metadata repository the for default document repository
set metadataRep dpi.inpe.br/banon/1999/09.19.22.25
file mkdir $col/$metadataRep/auxdoc
file mkdir $col/$metadataRep/source
file mkdir $col/$metadataRep/doc
file mkdir $col/$metadataRep/service
set fileContent {%0 Misc
%A URLib Librarian,
%T Default Document
%I Deposited in the URlib collection.
%2 dpi.inpe.br/banon/1999/09.19.22.25
%4 dpi.inpe.br/banon/1999/09.19.18.20
%K URLib system.
}
Store fileContent $col/$metadataRep/doc/@metadata.refer
set history [list [list 1999:11.27.20.37.56 dpi.inpe.br/banon/1999/01.09.22.14]]
Store history $col/$metadataRep/service/history
# StoreHostCollection $metadataRep dpi.inpe.br/banon/1999/01.09.22.14
set reference ../$col/col/dpi.inpe.br/banon/1999/09.19.18.20
Store reference $col/$metadataRep/service/reference
set targetFile metadata.cgi
Store targetFile $col/$metadataRep/service/targetFile
set fileContent Metadata
Store fileContent $col/$metadataRep/service/type
# lappend repositoryList $metadataRep
lappend repList $metadataRep
# Create the metadata repository for the default document repository - end
# Create the default metadata repository
file mkdir $col/$defaultMetadataRepository/auxdoc
file mkdir $col/$defaultMetadataRepository/source
file mkdir $col/$defaultMetadataRepository/doc
file mkdir $col/$defaultMetadataRepository/service
set fileContent {%0 Misc
%A URLib Librarian,
%D 2000
%T Default title
%I Deposited in the URLib collection.
}
Store fileContent $col/$defaultMetadataRepository/doc/@metadata.refer
set history [list [list 2000:01.08.01.46.07 dpi.inpe.br/banon/1999/01.09.22.14]]
Store history $col/$defaultMetadataRepository/service/history
# StoreHostCollection $defaultMetadataRepository dpi.inpe.br/banon/1999/01.09.22.14 ;# there is no host collection containing the original
set targetFile @metadata.refer
Store targetFile $col/$defaultMetadataRepository/service/targetFile
set visibility 1 ;# hidden
StoreService visibility $defaultMetadataRepository visibility 1 1
# lappend repositoryList $defaultMetadataRepository
lappend repList $defaultMetadataRepository
# Create the default metadata repository - end
# Create the metadata repository the for default metadata repository
set metadataRep dpi.inpe.br/banon/1999/09.12.15.17
file mkdir $col/$metadataRep/auxdoc
file mkdir $col/$metadataRep/source
file mkdir $col/$metadataRep/doc
file mkdir $col/$metadataRep/service
set fileContent {%0 Misc
%A URLib Librarian,
%T Default Metadata
%I Deposited in the URlib collection.
%2 dpi.inpe.br/banon/1999/09.12.15.17
%3 @metadata.refer
%4 dpi.inpe.br/banon/1999/09.12.15.10
%K metadata, URLib system.}
Store fileContent $col/$metadataRep/doc/@metadata.refer
set history [list [list 2000:01.08.01.46.07 dpi.inpe.br/banon/1999/01.09.22.14]]
Store history $col/$metadataRep/service/history
# StoreHostCollection $metadataRep dpi.inpe.br/banon/1999/01.09.22.14
set reference ../$col/col/dpi.inpe.br/banon/1999/09.12.15.10
Store reference $col/$metadataRep/service/reference
set targetFile metadata.cgi
Store targetFile $col/$metadataRep/service/targetFile
set fileContent Metadata
Store fileContent $col/$metadataRep/service/type
# lappend repositoryList $metadataRep
lappend repList $metadataRep
# Create the metadata repository for the default metadata repository - end
# Update history to have the correct most recent references
# set xxx [list $repList]
# Store xxx C:/tmp/xxx auto 0 a
foreach rep $repList {
set seconds [DirectoryMTime $homePath/col/$rep/doc]
set versionStamp [CreateVersionStamp $seconds]
UpdateHistory $rep $versionStamp
}
# Update history to have the correct most recent references - end
if [info exists repositoryList] {
set repositoryList [concat $repositoryList $repList]
} else {
set repositoryList $repList
}
# Update properties and references
foreach rep $repositoryList {
UpdateRepositoryProperties $rep
UpdateReferenceTable $rep
}
# UpdateReferenceFileForLoCoInRep
# Update properties and references - end
# SAVE
StoreArray repositoryProperties ../auxdoc/.repositoryProperties.tcl w list
StoreArray referenceTable ../auxdoc/.referenceTable.tcl w list
# SAVE - end
}
# Install initial collection - end
# Set the schedule parameters for the Local Collection Index
# added by GJFB in 2023-03-16 - used in post when updating periodically the Local Collection Index
set schedule {
set startingTime 02:00:00
# set timePeriod 0 ;# infinite
# set timePeriod 1 ;# 1 second
# set timePeriod [expr 24*60*60] ;# 1 day
set timePeriod [expr 7*24*60*60] ;# 7 days
set numberOfSubstitutions 1 ;# value is 1 or 2
set storeTclPage 1 ;# value is 0 or 1 (default - enables restricted access, if any)
}
Store schedule $homePath/col/$loCoInRep/doc/@schedule.tcl
# Set the schedule parameters for the Local Collection Index - end
# Create orderingTable
# this ordering table is computed from the one in referRepository
# it is used in the FieldCompare procedure (utilitiesMirror.tcl)
array set orderingTable [CreateOrderingTable]
# Create orderingTable - end
# Create commonWords
set commonWords [${compileWordsRepository}::CompileWords [CreateCommonWordsRepList]] ;# needs repositoryProperties and referenceTable
# Create commonWords - end
if 0 {
# commented by GJFB in 2018-11-03 - urlibadm is now obsolete
# Create urlibadm advanced user
if ![file exists $col/$loCoInRep/auxdoc/urlibadmFlag] {
Load $col/$loCoInRep/auxdoc/@passwords.txt fileContent
if ![regexp {urlibadm:{SHA}} $fileContent] {
set line urlibadm:{SHA}CiW6WZExa92kqbOrzuIQYBbfKKA=
Store line $col/$loCoInRep/auxdoc/@passwords.txt auto 0 a
set urlibadmUserCreated 1 ;# could be anything
Store urlibadmUserCreated $col/$loCoInRep/auxdoc/urlibadmFlag
}
}
# Create urlibadm advanced user - end
}
# needed with post
## Create indexRepList
# Create bannerSequenceRepList
# Create officialIconRepList
set indexRepList {}
set bannerSequenceRepList {}
set officialIconRepList {}
foreach index [array names repositoryProperties *,type] {
regsub {,.*} $index {} rep
# Migration 15/9/07
if 1 {
if [TestContentType $rep Index] {
lappend indexRepList $rep
}
}
# Migration 15/9/07 - end
if [TestContentType $rep {Banner Sequence}] {
lappend bannerSequenceRepList $rep
}
if [TestContentType $rep {Access Icon}] {
if {$rep != "$defaultAccessIconRepository"} {
lappend officialIconRepList $rep
}
}
}
## Create indexRepList - end
# Create bannerSequenceRepList - end
# Create officialIconRepList - end
# Load bannerPathArray
LoadBannerPathArray
# Load bannerPathArray - end
## Inform the URLib system
# InformURLibSystem
## Inform the URLib system - end
# Update OAI repository date
UpdateOAIRepositoryData
# Update OAI repository data - end
## UPDATE METADATA
# set metadataList {} ;# for add
# set metadata2List {} ;# for remove
# Create metadataArray, repArray and wordOccurrenceArray
set auxDoc $col/$URLibServiceRepository/auxdoc
set conditionA [expr [file exists $auxDoc/.metadataArray.tcl] && \
[file exists $auxDoc/.repArray.tcl] && \
[file exists $auxDoc/.repArray2.tcl] && \
[file exists $auxDoc/.authorArray.tcl] && \
[file exists $auxDoc/.groupArray.tcl] && \
[file exists $auxDoc/.committeeArray.tcl] && \
[file exists $auxDoc/.journalArray.tcl] && \
[file exists $auxDoc/.conferencenameArray.tcl] && \
[file exists $auxDoc/.wordOccurrenceArray.tcl]]
if $conditionA {
# .metadataArray.tcl, .repArray.tcl and .wordOccurrenceArray.tcl exist
# LoadService $loCoInRep workingKey workingKey 1 1 ;# commented by GJFB in 2024-09-25 - not required anymore
# set installationDatePlus60Days [expr ([ComputeNOD [join [lrange [file split $loCoInRep] 2 3] {.}]] + 60) * 24 * 3600] ;# commented by GJFB in 2024-09-25 - not required anymore
# if {$installationDatePlus60Days < [clock scan "Apr 30, 2006"] || \
# ![catch {set workingKey [Compress $workingKey]}] && \
# [string compare $loCoInRep $workingKey] == 0} # ;# commented by GJFB in 2021-07-11
if 1 { ;# added by GJFB in 2021-07-11 - workingKey is not required anymore, instead registrationKey is required at installation
puts {licensed copy}
if [catch {
source $auxDoc/.repArray.tcl
source $auxDoc/.repArray2.tcl
} m] {
# puts {.repArray.tcl or repArray2 has been deleted or is corrupted - it will be recreated} ;# commented by GJFB in 2024-09-25
set log {.repArray.tcl or repArray2 have been deleted or are corrupted - they will be recreated} ;# added by GJFB in 2024-09-25
puts [StoreLog {notice} {StartService (1)} $log] ;# added by GJFB in 2024-09-25
file delete $auxDoc/.repArray.tcl
file delete $auxDoc/.repArray2.tcl
set conditionA 0
}
} else {
if {[clock seconds] <= $installationDatePlus60Days} {
puts "evaluating period - it expires on [clock format $installationDatePlus60Days -format "%b %d, %Y"]"
if [catch {
source $auxDoc/.repArray.tcl
source $auxDoc/.repArray2.tcl
} m] {
puts {.repArray.tcl or repArray2 has been deleted or is corrupted - it will be recreated}
file delete $auxDoc/.repArray.tcl
file delete $auxDoc/.repArray2.tcl
set conditionA 0
}
} else {
puts {evaluating period has expired - search has been disabled}
}
}
# use catch here ....
source $auxDoc/.metadataArray.tcl
source $auxDoc/.authorArray.tcl
source $auxDoc/.groupArray.tcl
source $auxDoc/.committeeArray.tcl
source $auxDoc/.journalArray.tcl
source $auxDoc/.conferencenameArray.tcl
source $auxDoc/.wordOccurrenceArray.tcl
# set saveMetadata 0
}
# Merged Archives
# must be after Create metadataArray (because of Select)
# when merging an Archive, ./reset & must be done
set repList [Select repository {contenttype, Index}] ;# returns a list of repository names
# puts --$repList--
if [info exists loCoInRep] {
set i [lsearch $repList $loCoInRep]
set repList [lreplace $repList $i $i]
}
# puts --$repList--
global deletedRepositoryList2 ;# for merged Archives - used in GetURLPropertyList only
global deletedIdentifierList2 ;# for merged Archives - used in GetURLPropertyList only
set deletedRepositoryList2 {}
set deletedIdentifierList2 {}
set deletedRecordList2 {} ;# for OAI-PMH
foreach rep $repList {
if [file exists $homePath/col/$rep/doc/@deletedRepositoryList.tcl] {
source $homePath/col/$rep/doc/@deletedRepositoryList.tcl ;# set deletedRepositoryList
set deletedRepositoryList2 [concat $deletedRepositoryList2 $deletedRepositoryList]
unset deletedRepositoryList
}
if [file exists $homePath/col/$rep/doc/@deletedIdentifierList.tcl] {
source $homePath/col/$rep/doc/@deletedIdentifierList.tcl ;# set deletedIdentifierList
set deletedIdentifierList2 [concat $deletedIdentifierList2 $deletedIdentifierList]
unset deletedIdentifierList
}
if [file exists $homePath/col/$rep/doc/@deletedRecordList.tcl] {
source $homePath/col/$rep/doc/@deletedRecordList.tcl ;# set deletedRecordList - used with OAI-PMH only (see iconet.com.br/banon/2003/11.21.21.08)
set deletedRecordList2 [concat $deletedRecordList2 $deletedRecordList]
unset deletedRecordList
}
}
# Merged Archives - end
# Load deletedRepositoryList and deletedIdentifierList
global deletedRepositoryList ;# used in GetURLPropertyList
if {[info exists loCoInRep] && [file exists $homePath/col/$loCoInRep/doc/@deletedRepositoryList.tcl]} {
source $homePath/col/$loCoInRep/doc/@deletedRepositoryList.tcl ;# set deletedRepositoryList
} else {
set deletedRepositoryList {}
}
global deletedIdentifierList ;# used in GetURLPropertyList
if {[info exists loCoInRep] && [file exists $homePath/col/$loCoInRep/doc/@deletedIdentifierList.tcl]} {
source $homePath/col/$loCoInRep/doc/@deletedIdentifierList.tcl ;# set deletedIdentifierList
} else {
set deletedIdentifierList {}
}
# Load deletedRepositoryList and deletedIdentifierList - end
# Update @deletedRecordList.tcl
if ![string equal {} $deletedRecordList2] {
if [file exists $homePath/col/$loCoInRep/doc/@deletedRecordList.tcl] {
source $homePath/col/$loCoInRep/doc/@deletedRecordList.tcl ;# set deletedRecordList - used with OAI-PMH only (see iconet.com.br/banon/2003/11.21.21.08)
set deletedRecordList2 [concat $deletedRecordList2 $deletedRecordList]
unset deletedRecordList
array set array $deletedRecordList2 ;# drop duplicated entries
set deletedRecordList2 [array get array] ;# drop duplicated entries
}
StoreArray deletedRecordList2 $homePath/col/$loCoInRep/doc/@deletedRecordList.tcl w list listforarray 1 deletedRecordList
}
# Update @deletedRecordList.tcl - end
# Migration 2007-11-30
if ![info exists repositoryListForPost] {set repositoryListForPost {}}
# Migration 2007-11-30 - end
# Migration 2008-08-13
if [file exists $col/$loCoInRep/service/reference] {
file delete $col/$loCoInRep/service/reference
}
# Migration 2008-08-13 - end
set parseCollection 0 ;# 1 means to parse the collection to find unexpected repository name like: ltid.inpe.br/sbsr/2002/goto-
if !$parseCollection {
if {!$conditionA || ![string equal {} $repositoryListForPost]} {
if $conditionA {
set repositoryList2 $repositoryListForPost
} else {
# all repositories
CreateRepositoryList
set repositoryList2 $repositoryList
}
set numberOfRepositories [llength $repositoryList2]
if $conditionA {
set log "reloading $numberOfRepositories repositories..."
} else {
# all repositories
set log "reloading all repositories ($numberOfRepositories)..."
}
puts [StoreLog {notice} {StartService (2)} $log]
file delete $auxDoc/.mostRecentReferences.tcl
file delete $auxDoc/.mostRecentFullTexts.tcl
file delete $homePath/robots2.txt
# FOREACH
# set enableTrace 1
Load $homePath/col/$URLibServiceRepository/auxdoc/@enableTrace enableTrace
TraceProcedure {} 1 ;# clear previous current time
# TraceProcedure [clock format [clock seconds] -format %Y:%m.%d.%H.%M.%S]
TraceProcedure StartService
TraceProcedure {Begin of FOREACH}
foreach rep $repositoryList2 {
# puts $rep ;# the last printed is a corrupted repository
TraceProcedure ;# add executing time interval
TraceProcedure $rep
if [TestContentType $rep Metadata] { ;# TestContentType uses the global variable repositoryProperties updated in post through UpdateRepositoryProperties
# $rep contains a metadata
set metadata2List [GetMetadata $rep-*] ;# get metadata from metadataArray
## REMOVE METADATA
TraceProcedure ;# add executing time interval
TraceProcedure {Removing metadata}
# RemoveMetadata $metadata2List ;# commented by GJFB in 2020-08-18
TraceProcedure ;# add executing time interval
TraceProcedure {Metadata removed}
set metadataList {} ;# for add
if ![file exists $col/$rep/doc/@metadata.refer] {
if {$tcl_platform(platform) == "windows" && [string equal {start} $applicationName]} {
console show
}
puts {syntax error:}
puts {the metadata file doesn't exist in}
puts "$homePath/col/$rep/doc"
puts {or its name is not @metadata.refer}
puts {solution:}
puts {create a metadata file named @metadata.refer}
puts {press exit}
puts {start again URLibService}
vwait forever
}
if 0 {
# old code
# time consuming
# Force some fields based on information within the service directory
# repository
set repName [ReturnRepositoryName $rep]
# repName might be empty if referenceTable was corrupted and if service/reference doesn't exist
if {$repName == {}} {continue}
Load $col/$rep/doc/@metadata.refer fileContent
if [string equal {} $fileContent] {
if {$tcl_platform(platform) == "windows" && [string equal {start} $applicationName]} {
console show
}
puts {syntax error:}
puts {the metadata doesn't exist} ;# '
puts {the file:}
puts $homePath/$rep/doc/@metadata.refer
puts {doesn't exist or is empty} ;# '
puts {create the file and/or edit the file content}
puts {or delete the repository:}
puts $rep
puts {press exit}
puts {start again URLibService}
vwait forever
}
set referMetadata [UpdateRefer $fileContent [concat repository $repName]]
# target file
if [info exists repositoryProperties($repName,targetfile)] {
set referMetadata [UpdateRefer $referMetadata \
[concat targetfile $repositoryProperties($repName,targetfile)]]
}
## content type
# if [info exists repositoryProperties($repName,type)] {
# set referMetadata [UpdateRefer $referMetadata \
# [concat contenttype $repositoryProperties($repName,type)]]
# }
# Ordering $referMetadata
set entry2 \n[string trim $referMetadata \n]
regsub -all {@} $entry2 {#!#} entry2 ;# @ > #!#
regsub -all "\n%(\[^ \\.;,\])" $entry2 {@\1} entry2
regsub -all "\n" $entry2 { } entry2
set referMetadata {}
foreach field [lrange [split $entry2 @] 1 end] {
regsub -all {#!#} $field {@} field ;# #!# > @
lappend referMetadata %$field
}
set referMetadata [lsort -command ReferFieldCompare $referMetadata]
set referMetadata [join $referMetadata \n]
# Ordering $referMetadata - end
if ![string equal $referMetadata $fileContent] {
# Update @metadata.refer
Store referMetadata $col/$rep/doc/@metadata.refer
}
set fileContent $referMetadata
# Force some fields based on information within the service directory - end
} else {
# same code as in UpdateCollection
TraceProcedure ;# add executing time interval
TraceProcedure {Adding metadata}
Load $col/$rep/doc/@metadata.refer fileContent
set encodingSystem [encoding system]
Load $col/$rep/service/encodingSystem encodingSystem2
if [string equal {utf-8} $encodingSystem] {
# encoding system is utf-8
if ![string equal {utf-8} $encodingSystem2] {
# service/encodingSystem didn't exist (was not utf-8)
# the service/encodingSystem file must be updated or created
Store encodingSystem $col/$rep/service/encodingSystem ;# inform the local encoding system
}
} else {
# encoding system is not utf-8
if [string equal {utf-8} $encodingSystem2] {
# service/encodingSystem was utf-8
# rep probably results from a migration
# code added by GJFB in 2010-11-23 - convertfrom utf-8 is NOT idempotent for all graphemes
set fileContent [encoding convertfrom $encodingSystem2 $fileContent] ;# solves the accent problem when migrating from a collection using utf-8 encoding - e.g., migrating J8LNKAN8RW/34BETDS from plutao to banon-pc3
set mtime [file mtime $col/$rep/doc/@metadata.refer]
Store fileContent $col/$rep/doc/@metadata.refer
file mtime $col/$rep/doc/@metadata.refer $mtime ;# restore mtime
file delete $col/$rep/service/encodingSystem
}
}
}
set metadataList [concat $metadataList [ConvertMultipleRefer2MetadataList 0 $fileContent $rep]]
set metadataList [concat $metadataList [CreateExtraFields $rep $serverAddress]]
# Add citationkey
array set metadataImport $metadataList
set citationkey [CreateCitationKey metadataImport $rep-0 1]
set metadataList [concat $metadataList [list $rep-0,citationkey $citationkey]]
# Add citationkey - end
## ADD METADATA
# AddMetadata $metadataList ;# commented by GJFB in 2020-08-18
TraceProcedure ;# add executing time interval
TraceProcedure {Metadata added}
# UPDATE METADATA
UpdateMetadata $metadata2List $metadataList ;# added by GJFB in 2020-08-18 - uses metadata2List and metadataList
} elseif [TestContentType $rep {Bibliography Data Base}] {
# For collection created with Version 1.1
if {$tcl_platform(platform) == "unix" && \
[file isdirectory $homePath/col/$rep/bib]} {
set path1 [eval file join [lrange [file split $rep] 0 2]]
set path2 [lindex [file split $rep] end]
set firstCharacter [string index [exec ls -l $homePath/col/$path1 | grep $path2] 0]
if {$firstCharacter != "d"} {continue}
}
# For collection created with Version 1.1 - end
# not a symbolic link
LoadBiblioDB $rep
} else {
# no content type might occur with deleted repositories
if ![file isdirectory $homePath/col/$rep] {
# deleted repository - the deleted repository might be a metadata repository
# CheckMetadataConsistency $rep-0 ;# removes possible metadata
set rep-iList $rep-0
CheckMetadataConsistency rep-iList
}
# LoadService $rep visibility visibility 1 1
# LoadService $rep docPermission docPermission 0 1
# set booleanDocPermission [regexp {deny} $docPermission]
# UpdateRobotstxtFile $rep $visibility $booleanDocPermission ;# added by GJFB in 2011-06-13
}
} ;# FOREACH end
if $conditionA {
set log "$numberOfRepositories repositories reloaded"
} else {
# all repositories
set log "all repositories reloaded"
}
puts $log
StoreLog {notice} {StartService (3)} $log
set saveMetadata 1
}
# Create metadataArray, repArray and wordOccurrenceArray - end
if ![string equal {} $repositoryListForPost] {
SaveRepositoryProperties 1
SaveReferenceTable 1
# set saveMetadata 1
SaveMetadata 1
# unset repositoryListForPost
set repositoryListForStart {}
if [file exists ../auxdoc/.repositoryListForStart.tcl] {
source ../auxdoc/.repositoryListForStart.tcl ;# set the variable repositoryListForStart
}
set repositoryListForStart [concat $repositoryListForPost $repositoryListForStart]
set repositoryListForStart [lsort -unique $repositoryListForStart]
StoreList repositoryListForStart ../auxdoc/.repositoryListForStart.tcl
file delete ../auxdoc/.repositoryListForPost.tcl
#
set repositoryListForPost {}
}
# file delete ../auxdoc/.repositoryListForPost.tcl
# Create mostRecentReferences and mostRecentFullTexts
if ![file exists $auxDoc/.mostRecentReferences.tcl] {
# array set mostRecentReferences [FindTheMostRecentReferences metadataArray $maximumNumberOfEntries]
array set mostRecentReferences [FindTheMostRecentReferences2 $maximumNumberOfEntries]
set saveMetadata 1
} else {
source $auxDoc/.mostRecentReferences.tcl
}
if ![file exists $auxDoc/.mostRecentFullTexts.tcl] {
# array set mostRecentFullTexts [FindTheMostRecentReferences metadataArray $maximumNumberOfEntries 1]
array set mostRecentFullTexts [FindTheMostRecentReferences2 $maximumNumberOfEntries 1]
set saveMetadata 1
} else {
source $auxDoc/.mostRecentFullTexts.tcl
}
# Create mostRecentReferences and mostRecentFullTexts - end
}
# Create robots.txt file
# the code below is sensible to unexpected repository name like: ltid.inpe.br/sbsr/2002/goto-
if 0 {
# old code
Load $homePath/robots.txt fileContent
set lineList [lrange [split [string trim $fileContent] \n] 1 end]
if {![file exists $homePath/robots.txt] || \
(!$conditionA && [lsearch -exact $lineList "Disallow: /"] == -1)} {
# robots.txt doesn't exist or reset has been enabled and robots.txt doesn't contain "Disallow: /"
CreateRepositoryList
set lineList {}
foreach rep $repositoryList {
if ![TestContentType $rep Metadata] {
if [file exists $homePath/col/$rep/service/visibility] {
LoadService $rep visibility visibility 1 1
if $visibility {
# hidden
set metadataRep [FindMetadataRep $rep]
set metadataRepList [FindAllLanguageVersions $metadataRep]
foreach item [concat $rep $metadataRepList] {
lappend lineList "Disallow: /col/$item"
}
}
}
}
}
set lineList [concat {{User-agent: *}} $lineList]
if {[llength $lineList] == 1} {
set lineList [concat $lineList {{Disallow:}}]
}
set fileContent [join $lineList \n]
Store fileContent $homePath/robots.txt
}
} else {
# new code
# Create robots.txt file
if {![file exists $homePath/robots.txt] || !$conditionA} {
# robots.txt doesn't exist or reset has been enabled
CreateRepositoryList
ConditionalSet defaultAuthenticationFlag environmentArray(spUseUserAuthentication) 0
if $defaultAuthenticationFlag {
set robotsLineList {{User-agent: *} {Disallow: /}}
} else {
set robotsLineList {{User-agent: *} {Disallow:}}
}
foreach rep $repositoryList {
if ![TestContentType $rep Metadata] {
if [catch {LoadService $rep visibility visibility 1 1} message] {
puts [StoreLog {alert} {StartService (4)} "error while loading visibility from $rep\n$message"]
exit
}
LoadService $rep docPermission docPermission 0 1
set booleanDocPermission [regexp {deny} $docPermission]
UpdateRobotstxtFile $rep $visibility $booleanDocPermission robotsLineList ;# added by GJFB in 2011-06-13
}
}
UpdateRobotstxtFile $loBiMiRep 1 1 robotsLineList ;# added by GJFB in 2024-11-26 to avoid mirror access by robots
set fileContent2 [join $robotsLineList \n]
Store fileContent2 $homePath/robots2.txt ;# useful when it is necessary to withdraw Disallow: / in robots.txt; in this case it is sufficient to a copy the content of robots2.txt into robots.txt
if $defaultAuthenticationFlag {
set robotsLineList {{User-agent: *} {Disallow: /}}
set fileContent [join $robotsLineList \n]
} else {
set fileContent $fileContent2
}
Store fileContent $homePath/robots.txt
}
}
# Create robots.txt file - end
if $parseCollection {
puts {end of collection parsing - no unexpected repository names found}
exit
}
# Create environmentArray(mirrorRepList)
# used in SearchEntry and LoadReference
if ![info exists environmentArray(mirrorRepList)] {
CreateRepositoryList
foreach rep $repositoryList {
if [TestContentType $rep Mirror] {
lappend environmentArray(mirrorRepList) $rep
}
}
} else {
# update
foreach mirrorRep $environmentArray(mirrorRepList) {
# Migration 16/10/04
if 0 {
# not used
Load $col/$mirrorRep/doc/@hidedMetadataRepositoryList.txt fileContent
set fileContent [string trim $fileContent " \n"]
set environmentArray($mirrorRep,hidedmetadatarepositorylist) $fileContent
} else {
file delete $col/$mirrorRep/doc/@hidedMetadataRepositoryList.txt
if [info exists environmentArray($mirrorRep,hidedmetadatarepositorylist)] {
unset environmentArray($mirrorRep,hidedmetadatarepositorylist)
}
}
# Migration 16/10/04 - end
}
}
# Create environmentArray(mirrorRepList) - end
# Update the URLib local collection
if [file exists $homePath/newVersion] {
if {[info exists loCoInRep] && $loCoInRep != "$devLoCoInRep"} {
if [file exists ../auxdoc/.urlibServiceVersion.tcl] {
source ../auxdoc/.urlibServiceVersion.tcl ;# set urlibServiceVersion
} else {
set urlibServiceVersion 0
}
# set xxx $urlibServiceVersion
# Store xxx C:/tmp/aaa auto 0 a
source $homePath/newVersion ;# set updateLevel
# set xxx $updateLevel(4)
# Store xxx C:/tmp/aaa auto 0 a
set saveMetadata 1 ;## must be before ComputeRepositoryList
# Update URLibService
# see also start
Load $homePath/packedRepository packedRepository
# if {[string equal $URLibServiceRepository $packedRepository] || \
# [string equal $downloadingEnvironmentRepository $packedRepository]} #
## packedRepository is URLibServiceRepository or downloadingEnvironmentRepository
if [string equal $URLibServiceRepository $packedRepository] {
# packedRepository is URLibServiceRepository
Load $homePath/repositoryList repList2
UpdateCollection $repList2
if [string equal [ReturnCommunicationAddress $urlibServiceSiteWithIP] $serverAddressWithIP] {
# the current site is the one having a copy of the URLibService last version (see post)
# Create the download file
foreach rep $repList2 {
if ![TestContentType $rep Metadata] {
set currentDownloadPermission [FindCurrentDownloadPermission $rep] ;# urlibServiceSiteWithIP must be a mirror site
if ![string equal {deny from all} $currentDownloadPermission] {
if [string equal $rep $packedRepository] {
file mkdir $homePath/col/$rep/download ;# the download folder must contain a .htaccess file with the directive: allow form all
file copy -force $homePath/doc.zip $homePath/col/$rep/download/doc.zip
} else {
regsub {@.*$} $environmentArray(spMailEntry) {} administratorUserName
# UpdateDownloadFile $rep ;# may set saveMetadata to 1
UpdateDownloadFile $rep 0 0 $administratorUserName ;# may set saveMetadata to 1
}
}
}
}
# Create the download file - end
}
}
# Update URLibService - end
if 0 { ;# commented by GJFB in 2021-01-16 - migration no more necessary
# Migration 5/8/01
if {[string compare $updateLevel(6) $urlibServiceVersion] > 0} {
# old version - rename auxdoc
CreateRepositoryList
foreach rep $repositoryList {
if {[string compare $URLibServiceRepository $rep] != 0} {
if ![file isdirectory $homePath/col/$rep/source] {
if [file isdirectory $homePath/col/$rep/auxdoc] {
file rename $homePath/col/$rep/auxdoc $homePath/col/$rep/source
file mkdir $homePath/col/$rep/auxdoc
}
}
} else {
file mkdir $homePath/col/$rep/source
}
}
}
# Migration 5/8/01 - end
}
if 0 { ;# commented by GJFB in 2021-01-16 - migration no more necessary
# Migration 23/9/01
if {[string compare $updateLevel(7) $urlibServiceVersion] > 0} {
# old version - add numberoffiles field
set metadataList {}
CreateRepositoryList
foreach rep $repositoryList {
foreach {size numberOfFiles} [ComputeInfo $rep] {break}
Store numberOfFiles $homePath/col/$rep/service/numberOfFiles
set repositoryProperties($rep,numberoffiles) $numberOfFiles
set metadataRep [FindMetadataRep $rep]
if {[string compare {} $metadataRep] != 0} {
foreach mRep [FindAllLanguageVersions $metadataRep] {
set metadataList [concat $metadataList [list \
$mRep-0,numberoffiles $numberOfFiles]]
}
}
}
# AddMetadata $metadataList ;# commented by GJFB in 2020-08-18
AddMetadata2 $metadataList ;# added by GJFB in 2020-08-18
set saveMetadata 1
}
# Migration 23/9/01 - end
} else { ;# added by GJFB in 2021-01-16 - required because some service/numberOfFiles became out-of-date due to a change made in ComputeFileList and ComputeFileList during 2018
# Migration 31/1/21
# reset is required after this migration
if {[string compare $updateLevel(7) $urlibServiceVersion] > 0} {
# old version - update service/numberOfFiles file and numberoffiles field
puts {updating service/numberOfFiles file and numberoffiles field...}
# set metadataList {}
# set metadata2List {}
# puts [info exists repositoryList]
CreateRepositoryList
# puts [llength $repositoryList]
foreach rep [lrange $repositoryList 0 end] {
if [TestContentType $rep Metadata] {
# puts metadata-$rep
file delete $homePath/col/$rep/service/size ;# useless
file delete $homePath/col/$rep/service/numberOfFiles ;# useless
file delete $homePath/col/$rep/service/metadataRepositoryList ;# useless
} else {
# puts data-$rep
# Update repositoryProperties, metadataArray and repArray
# array set metadataArray {dpi.inpe.br/banon/1995/09.18.18.50-36,volume 31}
# array set repArray {Refer,keywords {dpi.inpe.br/banon/2000/04.23.10.10.26-0}}
# set size $metadataArray($metadataRep-0,size)
# set numberOfFiles [expr $metadataArray($metadataRep-0,numberoffiles) + 1]
# puts "$size $numberOfFiles"
set metadataList {}
set metadata2List {}
foreach {size numberOfFiles} [ComputeInfo $rep] {break}
set metadataRep [FindMetadataRep $rep]
if {$numberOfFiles == 0} {
file delete $homePath/col/$rep/service/size
file delete $homePath/col/$rep/service/numberOfFiles
if [info exists repositoryProperties($rep,size)] {unset repositoryProperties($rep,size)}
if [info exists repositoryProperties($rep,numberoffiles)] {unset repositoryProperties($rep,numberoffiles)}
DeleteMetadataField $metadataRep size metadata2List 1
DeleteMetadataField $metadataRep numberoffiles metadata2List 1
RemoveMetadata2 $metadata2List 1
} else {
Store size $homePath/col/$rep/service/size
Store numberOfFiles $homePath/col/$rep/service/numberOfFiles
set repositoryProperties($rep,size) $size
set repositoryProperties($rep,numberoffiles) $numberOfFiles
UpdateMetadataField $metadataRep size $size metadataList metadata2List 1
UpdateMetadataField $metadataRep numberoffiles $numberOfFiles metadataList metadata2List 1
UpdateMetadata $metadata2List $metadataList ;# added by GJFB in 2021-01-18
}
# puts [lsearch -exact $repArray($numberOfFiles,numberoffiles) $metadataRep-0]
# Update repositoryProperties, metadataArray and repArray - end
}
}
## UpdateMetadata $metadata2List $metadataList ;# commented by GJFB in 2021-01-18 - doesn't work - probably metadata2List metadataList too long - must be within the foreach above
set saveMetadata 1 ;# commented by GJFB in 2021-01-23
puts {service/numberOfFiles file and numberoffiles field updated}
}
# Migration 31/1/21 - end
}
# Migration 12/10/02
if {[string compare $updateLevel(9) $urlibServiceVersion] > 0} {
# old version - add notRegistered file
CreateRepositoryList
foreach rep $repositoryList {
if [file exists $homePath/col/$rep/service/registrationPassword] {
set notRegistered {}
Store notRegistered $homePath/col/$rep/service/notRegistered
}
}
}
# Migration 12/10/02 - end
# Migration 17/8/03
# puts $urlibServiceVersion
# puts $updateLevel(11)
if {[string compare $updateLevel(11) $urlibServiceVersion] > 0} {
# old version - include username
# puts {migrating...}
set metadataList {}
CreateRepositoryList
foreach rep $repositoryList {
if [file exists $col/$rep/service/userName] {
LoadService $rep userName userName 1 1
set metadataRep [FindMetadataRep $rep]
set metadataList [concat $metadataList [list \
$metadataRep-0,username $userName]]
}
}
# AddMetadata $metadataList ;# commented by GJFB in 2020-08-18
AddMetadata2 $metadataList ;# added by GJFB in 2020-08-18
set saveMetadata 1
}
# Migration 17/8/03 - end
# Migration 10/10/04
if {[string compare $updateLevel(13) $urlibServiceVersion] > 0} {
# old version - update visibility file
set urlibEnvironment [GetCitedRepositoryList $URLibServiceRepository]
lappend urlibEnvironment $URLibServiceRepository
set query {title, Parecer and referencetype, Misc}
# set reviewMetadataRepList [MultipleExecute [list $serverAddress] [list list GetMetadataRepositories {} 0 $query yes yes 0]]
set reviewMetadataRepList [MultipleExecute [list $serverAddressWithIP] [list list GetMetadataRepositories {} 0 $query yes yes 0]]
# puts $reviewMetadataRepList
set metadataList {}
set metadata2List {}
CreateRepositoryList
foreach rep $repositoryList {
if ![TestContentType $rep Metadata] {
set metadataRep [FindMetadataRep $rep]
if {![file exists $col/$rep/service/visibility] || \
[lsearch $reviewMetadataRepList $metadataRep-0] != -1} {
if {[lsearch $reviewMetadataRepList $metadataRep-0] == -1 && \
[lsearch $urlibEnvironment $rep] == -1} {
set visibility 0 ;# shown
} else {
set visibility 1 ;# hidden
}
# puts [list $rep $visibility]
StoreService visibility $rep visibility 1 1
set visibility2 [expr $visibility?{hidden}:{shown}]
UpdateMetadataField $metadataRep visibility \
$visibility2 metadataList metadata2List 1
if [TestContentType $rep {Bibliography Data Base}] {
if [info exists repArray($rep,databaserepository)] {
foreach rep-i $repArray($rep,databaserepository) {
set metadata2List [concat $metadata2List \
[GetMetadata ${rep-i},visibility]]
set metadataList [concat $metadataList [list \
${rep-i},visibility $visibility2]]
}
}
}
}
}
}
if 0 {
# commented by GJFB in 2020-08-18
RemoveMetadata $metadata2List
AddMetadata $metadataList
} else {
UpdateMetadata $metadata2List $metadataList ;# added by GJFB in 2020-08-18 - uses metadata2List and metadataList
}
set saveMetadata 1
}
# Migration 10/10/04 - end
# Migration 03/12/05
if {[string compare $updateLevel(14) $urlibServiceVersion] > 0} {
# old version - insert .htaccess file
puts {inserting access files...}
CreateRepositoryList
foreach rep $repositoryList {
if ![TestContentType $rep Metadata] {
UpdateAccessFile $rep
}
}
puts {access files inserted}
}
# Migration 03/12/05 - end
# Migration 05/06/11
if {[string compare $updateLevel(15) $urlibServiceVersion] > 0} {
# old version - insert .htaccess and .htaccess2 files in the agreement folder
puts {inserting access files in the agreement folder...}
CreateRepositoryList
set htaccessContent {Require user administrator}
foreach rep $repositoryList {
if ![TestContentType $rep Metadata] {
if [file isdirectory $homePath/col/$rep/agreement] {
Store htaccessContent $homePath/col/$rep/agreement/.htaccess
Store htaccessContent $homePath/col/$rep/agreement/.htaccess2
# Update mtime
if [file exists $homePath/col/$rep/agreement/autorizacao.pdf] {
if [catch {file mtime $homePath/col/$rep/agreement/autorizacao.pdf [clock seconds]} m] {
puts "mtime not updated for $homePath/col/$rep/agreement/autorizacao.pdf"
}
}
# Update mtime - end
}
}
}
puts {access files inserted in the agreement folder}
}
# Migration 05/06/11 - end
# Migration 20/12/15
if {[string compare $updateLevel(16) $urlibServiceVersion] > 0} {
# old version - add files service/metadataRepositoryList
puts {add files service/metadataRepositoryList...}
CreateRepositoryList
foreach rep $repositoryList {
set metadataRepList [FindMetadataRepList $rep]
set fileContent [join $metadataRepList \n]
StoreService fileContent $rep metadataRepositoryList 0 1
}
puts {files service/metadataRepositoryList added}
}
# Migration 20/12/15 - end
}
}
# Migration 15/9/07
if 0 {
# statistics of access are now within the service directory of each repository
if ![file exists $homePath/col/$loCoInRep/service/accessLog] {
puts {creating accessLog files...}
CreateRepositoryList
foreach rep $repositoryList {
if ![file exists $homePath/col/$rep/service/accessLog] {
if ![TestContentType $rep Metadata] {
set path [file split $rep]
set year [lindex $path 2]
set rest [lreplace $path 2 2]
regsub -all { } $rest {=} rest
set outputLineList {}
foreach indexRep $indexRepList {
set filePath [ConvertFilePath $homePath/col/$indexRep/doc/access/$year/$rest]
if {[string compare {} $filePath] != 0} {
Load $filePath fileContent
foreach line [split $fileContent \n] {
if [regexp {(.*)-(.*)} $line m day numberOfClicks] {
if {[set i [lsearch -regexp $outputLineList $day]] == -1} {
lappend outputLineList $line
} else {
set line2 [lindex $outputLineList $i]
if [regexp {.*-(.*)} $line2 m numberOfClicks2] {
incr numberOfClicks $numberOfClicks2
set outputLineList [lreplace $outputLineList $i $i "$day-$numberOfClicks"]
}
}
}
}
}
}
set fileContent [join [lsort $outputLineList] \n]
Store fileContent $homePath/col/$rep/service/accessLog
}
}
}
puts {accessLog files created}
}
}
# Migration 15/9/07 - end
# Migration 2008-06-01
# creation of service/transferableFlag file
if 0 {
if ![file exists $homePath/col/$loCoInRep/service/transferableFlag] {
puts {creating transferableFlag files...}
file delete $homePath/col/$defaultDocRepository/service/hostCollection
file delete $homePath/col/dpi.inpe.br/banon/1999/09.19.22.25/service/hostCollection
file delete $homePath/col/$defaultMetadataRepository/service/hostCollection
file delete $homePath/col/dpi.inpe.br/banon/1999/09.12.15.17/service/hostCollection
CreateRepositoryList
foreach rep $repositoryList {
if [file exists $homePath/col/$rep/service/hostCollection] {
if ![GetDocumentState $rep] {
file delete $homePath/col/$rep/service/hostCollection
UpdateRepositoryProperties $rep hostcollection
UpdateRepositoryListForPost $rep
}
}
if ![TestContentType $rep Metadata] {
if [file exists $homePath/col/$rep/service/hostCollection] {
if {[string equal $loCoInRep $rep] || [string equal $loBiMiRep $rep]} {
set transferableFlag 0
} else {
set transferableFlag 1
}
StoreService transferableFlag $rep transferableFlag 1 1
}
}
}
puts {transferableFlag files created}
}
}
# Migration 2008-06-01 - end
if 0 {
# commented by GJFB in 2016-04-28
# Migration 2010-10-09
set transferableFlag 0
StoreService transferableFlag $loCoInRep transferableFlag 1 1
StoreService transferableFlag $loBiMiRep transferableFlag 1 1
set metadataList {}
set metadata2List {}
set metadataRep [FindMetadataRep $loCoInRep]
UpdateMetadataField $metadataRep transferableflag $transferableFlag metadataList metadata2List 1
set metadataRep [FindMetadataRep $loBiMiRep]
UpdateMetadataField $metadataRep transferableflag $transferableFlag metadataList metadata2List 1
RemoveMetadata $metadata2List
AddMetadata $metadataList
set saveMetadata 1
# Migration 2010-10-09 - end
}
# Migration 17/10/04
# Create @passwords.txt and .userArray.tcl
if ![file exists $homePath/col/$loCoInRep/auxdoc/@passwords.txt] {
Load $homePath/col/$loCoInRep/auxdoc/@readPasswords.txt readPasswords
Load $homePath/col/$loCoInRep/auxdoc/@writePasswords.txt writePasswords
set readPassworList [split $readPasswords \n]
set writePassworList [split $writePasswords \n]
set passwordList $writePassworList
foreach line $readPassworList {
regexp {(.*):} $line m userName
if {[lsearch -regexp $writePassworList "^$userName:"] == -1} {
# not found
lappend passwordList $line
}
}
set passwords [join $passwordList \n]
Store passwords $homePath/col/$loCoInRep/auxdoc/@passwords.txt
}
if ![file exists $homePath/col/$loCoInRep/auxdoc/.userArray.tcl] {
if [file exists $homePath/col/$loCoInRep/auxdoc/.readUserArray.tcl] {
source $homePath/col/$loCoInRep/auxdoc/.readUserArray.tcl
}
if [file exists $homePath/col/$loCoInRep/auxdoc/.writeUserArray.tcl] {
source $homePath/col/$loCoInRep/auxdoc/.writeUserArray.tcl
}
array set userArray [array get writeUserArray]
set writeUserList [array names writeUserArray *,e-mailaddress]
foreach index [array names readUserArray *,e-mailaddress] {
regsub {,e-mailaddress} $index {} userName
if {[lsearch -regexp $writeUserList "^$userName,"] == -1} {
# not found
set userArray($index) $readUserArray($index)
}
}
StoreArray userArray $homePath/col/$loCoInRep/auxdoc/.userArray.tcl w list array 1
}
# Create @passwords.txt and .userArray.tcl - end
# Migration 17/10/04 - end
# Migration (done)
# removing the submitted papers
# for
# lagavulin.ltid.inpe.br:1905
if 0 {
set metadataRepList [GetMetadataRepositories dpi.inpe.br/lise/2002/05.13.12.20 0 {conferencen 11} no no 0]
foreach rep-i $metadataRepList {
regexp {(.*)-} ${rep-i} m metadataRep
set repositoryName $metadataArray($metadataRep-0,repository)
file delete -force $homePath/col/$repositoryName
puts "$repositoryName deleted"
file delete -force $homePath/col/$metadataRep
puts "$metadataRep deleted"
}
}
# the URLibService must then be restarded with the option -r
# Migration - end
if 1 {
# added by GJFB in 2018-07-15 for security reason
# Migration 2018-07-15
file delete -force $homePath/col/$loCoInRep/archive
# Migration 2018-07-15 - end
}
if 0 {
# used just for devLoCoInRep
source ../auxdoc/.urlibServiceVersion.tcl ;# set urlibServiceVersion
source $homePath/newVersion ;# set updateLevel
puts $urlibServiceVersion
puts $updateLevel(11)
puts [llength $repositoryList]
if {[string compare $updateLevel(11) $urlibServiceVersion] > 0} {
# old version - include username
puts {migrating...}
set metadataList {}
set metadata2List {}
CreateRepositoryList
foreach rep $repositoryList {
if [file exists $col/$rep/service/userName] {
LoadService $rep userName userName 1 1
set metadataRep [FindMetadataRep $rep]
# set metadataList [concat $metadataList [list $metadataRep-0,username $userName]]
UpdateMetadataField $metadataRep username $userName metadataList metadata2List 1
}
}
if 0 {
# commented by GJFB in 2020-08-18
RemoveMetadata $metadata2List
AddMetadata $metadataList
} else {
UpdateMetadata $metadata2List $metadataList ;# added by GJFB in 2020-08-18 - uses metadata2List and metadataList
}
set saveMetadata 1
}
}
# Update the URLib local collection - end
if {$tcl_platform(platform) == "unix"} {
# >>> start
# start comes with doc.zip
if [file owned $homePath/start] {exec chmod 774 $homePath/start}
# >>> post
set fileContent "#!/bin/sh
cd col/$URLibServiceRepository/doc
umask 2
PHPRC=$phpiniDirectoryPath
export PHPRC
$tclPath post $@"
Store fileContent $homePath/post
if [file owned $homePath/post] {exec chmod 774 $homePath/post}
# >>> unpost
set fileContent "#!/bin/sh
cd $homePath/col/$URLibServiceRepository/doc
umask 2
$tclPath post -x
# cd $homePath
# ./kill"
Store fileContent $homePath/unpost
if [file owned $homePath/unpost] {exec chmod 774 $homePath/unpost}
# >>> reset
set fileContent "#!/bin/sh
cd $homePath/col/$URLibServiceRepository/doc
umask 2
$tclPath post -x
# cd $homePath
# ./kill
# cd $homePath/col/$URLibServiceRepository/doc
PHPRC=$phpiniDirectoryPath
export PHPRC
$tclPath post -r"
Store fileContent $homePath/reset
if [file owned $homePath/reset] {exec chmod 774 $homePath/reset}
# >>> updateURLibService
set fileContent "#!/bin/sh
cd $homePath/col/$URLibServiceRepository/doc
umask 2
$tclPath post -x -u
# cd $homePath
# ./kill
# cd $homePath/col/$URLibServiceRepository/doc
PHPRC=$phpiniDirectoryPath
export PHPRC
$tclPath post -s"
Store fileContent $homePath/updateURLibService
if [file owned $homePath/updateURLibService] {exec chmod 774 $homePath/updateURLibService}
# >>> unpost-kill-post - added by GJFB in 2020-01-22
set fileContent "#!/bin/sh
cd $homePath/col/$URLibServiceRepository/doc
umask 2
$tclPath post -x
cd $homePath
./kill
cd $homePath/col/$URLibServiceRepository/doc
PHPRC=$phpiniDirectoryPath
export PHPRC
$tclPath post $@"
Store fileContent $homePath/unpost-kill-post
if [file owned $homePath/unpost-kill-post] {exec chmod 774 $homePath/unpost-kill-post}
# >>> kill-post - added by GJFB in 2020-10-05 to do automatically kill/post when the first error message: 'infinite loop?' is detected in ServeLocalCollection
# examples of use:
# cd /mnt/dados1/URLibGJFB0520
# [root@mtc-m12 URLibGJFB0520]# ./kill-post &
# [root@mtc-m12 URLibGJFB0520]# ./kill-post ../URLibSIBGRAPI/ &
set fileContent "#!/bin/sh
umask 2
cd $homePath
\$@./kill
cd $homePath/\$@col/$URLibServiceRepository/doc
PHPRC=$phpiniDirectoryPath
export PHPRC
$tclPath post $@"
Store fileContent $homePath/kill-post
if [file owned $homePath/kill-post] {exec chmod 774 $homePath/kill-post}
# >>> kill - see post
}
## files used in Juliana's work
# Store loCoInRep $homePath/loCoInRep
# Store htpasswdPath $homePath/htpasswdPath
# Index creation
Load localIndexInOnePage.html fileContent
Store fileContent $homePath/col/$loCoInRep/doc/index.html
if ![file exists $homePath/col/$loCoInRep/service/targetFile] {
UpdateTargetFile $loCoInRep index.html 0
StoreArray repositoryProperties ../auxdoc/.repositoryProperties.tcl w list
}
# Index creation - end
# Check consistency with the file system
if 0 {
# usually redundant and time consuming
CreateRepositoryList
# Clean repository properties
set flag 0
foreach index [array names repositoryProperties] {
regsub {,.*} $index {} rep
if {[lsearch $repositoryList $rep] == -1} {
unset repositoryProperties($index)
set flag 1
}
}
if $flag {
# update .repositoryProperties.tcl
StoreArray repositoryProperties ../auxdoc/.repositoryProperties.tcl w list
}
# Clean repository properties - end
# Clean references
set flag 0
foreach index [array names referenceTable] {
regsub {,.*} $index {} rep1
regsub {.*,} $index {} rep2
if {[lsearch $repositoryList $rep1] == -1 || \
[lsearch $repositoryList $rep2] == -1} {
unset referenceTable($index)
set flag 1
}
}
if $flag {
# update .referenceTable.tcl
StoreArray referenceTable ../auxdoc/.referenceTable.tcl w list
}
# Clean references - end
}
# Check consistency with the file system - end
# SAVE
SaveMetadata 1
# SAVE - end
# urlibServiceVersion
# set urlibServiceVersion [lindex [GetURLibServiceLastVersion] 0] ;# commented by GJFB in 2023-02-28 - now in post
# SAVE
# StoreArray environmentArray ../auxdoc/.environmentArray.tcl
# StoreArray environmentArray ../auxdoc/.environmentArray2.tcl ;# backup
# StoreArrayWithBackup environmentArray ../auxdoc/.environmentArray.tcl ;# added by GJFB in 2010-08-05
StoreArrayWithBackup environmentArray ../auxdoc/.environmentArray.tcl w list ;# added by GJFB in 2010-08-05
# StoreList urlibServiceVersion ../auxdoc/.urlibServiceVersion.tcl ;# commented by GJFB in 2023-02-28 - now in post
# SAVE - end
# puts "servers at $serverAddress started"
# set startService 0 ;# service started - doesn't need to be started again
}
# StartService - end
# ----------------------------------------------------------------------
# CreatePermissionList
# creates and updates permissionList (in environmentArray)
# creates and updates languagePreference (in environmentArray) and
# creates and updates displayReviewButton (in environmentArray) as well
# used by post, PerformCheck and UpdateRepMetadataRep
## return 1 if apache must be stopped and started, and 0 otherwise
# displayControl.tcl -> environmentArray
# This procedure follows the model given in:
# BANON, G. J. F. Customizing the Bibliographic Mirror. In: BANON, Gerald Jean Francis (Ed.).
# URLib Service User's Guide. Deposited in the URLib collection, work-in-progress.
# IBI: . Available from: . Access in: 2023, Dec. 18.
proc CreatePermissionList {mirrorRepList} {
# runs with post
global col
global environmentArray
global loCoInRep ;# used when sourcing $col/$parentRepository/doc/displayControl.tcl
global homePath ;# used when sourcing $col/$parentRepository/doc/displayControl.tcl
global mirrorHomePageRepository ;# added by GJFB in 2022-10-10
# puts $mirrorRepList
if {[llength $mirrorRepList] != 1} {
foreach item [array names environmentArray *,permissionList] {
unset environmentArray($item)
}
foreach item [array names environmentArray *,languagePreference] {
unset environmentArray($item)
}
foreach item [array names environmentArray *,displayReviewButton] {
unset environmentArray($item)
}
}
source $col/$mirrorHomePageRepository/doc/displayControl.tcl ;# added by GJFB in 2022-10-10 required to set the list referenceTypeList that migth be used in some sources below, for example when sourcing col/iconet.com.br/banon/2003/05.31.10.26/doc/displayControl.tcl
foreach mirrorRep $mirrorRepList {
# puts $mirrorRep
# controlArray.tcl in doc customizes displayControl.tcl in doc
# displayControl.tcl in auxdoc customizes controlArray.tcl in doc
# auxdoc/displayControl.tcl should be used in place of auxdoc/@writePermission.tcl
set parentRepository [lindex [GetCitedRepositoryList $mirrorRep] 0]
# puts 1-$parentRepository
# => 1-dpi.inpe.br/banon/2000/01.23.20.24
if [info exists languagePreference] {unset languagePreference}
if ![info exists permissionListArray($parentRepository)] {
if [file exists $col/$parentRepository/doc/displayControl.tcl] {
set log "sourcing col/$parentRepository/doc/displayControl.tcl"
StoreLog {notice} {CreatePermissionList} $log
# SOURCE displayControl.tcl - may set permissionList, languagePreference and displayReviewButton
if [catch {source $col/$parentRepository/doc/displayControl.tcl}] {
global errorInfo
set log "\[[clock format [clock seconds] -format %Y:%m.%d.%H.%M.%S]\] CreatePermissionList (1): error while sourcing:\ncol/$parentRepository/doc/displayControl.tcl\n$errorInfo\n"
puts $log
Store log $homePath/@errorLog auto 0 a
} else {
if [info exists displayTable] {unset displayTable} ;# free memory location
# set environmentArray($mirrorRep,permissionList) $permissionList
# environmentArray
ConditionalSet environmentArray($mirrorRep,permissionList) permissionList {}
# ConditionalSet environmentArray($mirrorRep,languagePreference) languagePreference en
ConditionalSet environmentArray($mirrorRep,languagePreference) languagePreference {}
ConditionalSet environmentArray($mirrorRep,displayReviewButton) displayReviewButton 1
set permissionListArray($parentRepository) $environmentArray($mirrorRep,permissionList)
set languagePreferenceArray($parentRepository) $environmentArray($mirrorRep,languagePreference)
set displayReviewButtonArray($parentRepository) $environmentArray($mirrorRep,displayReviewButton)
}
}
} else {
# added by GJFB in 2013-01-09 to avoid sourcing more than once
set environmentArray($mirrorRep,permissionList) $permissionListArray($parentRepository)
set environmentArray($mirrorRep,languagePreference) $languagePreferenceArray($parentRepository)
set environmentArray($mirrorRep,displayReviewButton) $displayReviewButtonArray($parentRepository)
}
foreach parentRepository [GetCitedRepositoryList $parentRepository] {
# puts 2-$parentRepository
# => 2-dpi.inpe.br/banon/1999/05.03.22.11
# SUBMISSION FORM
if [TestContentType $parentRepository {Submission Form}] {
if ![info exists permissionListArray($parentRepository)] {
if [file exists $col/$parentRepository/doc/displayControl.tcl] {
set log "sourcing col/$parentRepository/doc/displayControl.tcl"
StoreLog {notice} {CreatePermissionList} $log
# SOURCE displayControl.tcl - may set permissionList, languagePreference and displayReviewButton
if [catch {source $col/$parentRepository/doc/displayControl.tcl}] {
global errorInfo
set log "\[[clock format [clock seconds] -format %Y:%m.%d.%H.%M.%S]\] CreatePermissionList (2): error while sourcing:\ncol/$parentRepository/doc/displayControl.tcl\n$errorInfo\n"
puts $log
Store log $homePath/@errorLog auto 0 a
}
}
if [info exists displayTable] {unset displayTable} ;# free memory location
if [file exists $col/$parentRepository/doc/controlArray.tcl] {
if [file exists $col/$parentRepository/doc/controlArray.tcl] {
set log "sourcing col/$parentRepository/doc/controlArray.tcl"
StoreLog {notice} {CreatePermissionList} $log
if [catch {source $col/$parentRepository/doc/controlArray.tcl}] {
global errorInfo
set log "\[[clock format [clock seconds] -format %Y:%m.%d.%H.%M.%S]\] CreatePermissionList (3): error while sourcing:\ncol/$parentRepository/doc/controlArray.tcl\n$errorInfo\n"
puts $log
Store log $homePath/@errorLog auto 0 a
}
}
foreach index [array names controlArray] {
set $index $controlArray($index)
}
}
if [file exists $col/$parentRepository/auxdoc/@writePermission.tcl] {
set log "sourcing col/$parentRepository/auxdoc/@writePermission.tcl"
StoreLog {notice} {CreatePermissionList} $log
if [catch {source $col/$parentRepository/auxdoc/@writePermission.tcl}] {
global errorInfo
set log "\[[clock format [clock seconds] -format %Y:%m.%d.%H.%M.%S]\] CreatePermissionList (4): error while sourcing:\ncol/$parentRepository/auxdoc/@writePermission.tcl\n$errorInfo\n"
puts $log
Store log $homePath/@errorLog auto 0 a
}
}
if [file exists $col/$parentRepository/auxdoc/displayControl.tcl] {
set log "sourcing col/$parentRepository/doc/auxdoc/displayControl.tcl"
StoreLog {notice} {CreatePermissionList} $log
if [catch {source $col/$parentRepository/auxdoc/displayControl.tcl}] {
global errorInfo
set log "\[[clock format [clock seconds] -format %Y:%m.%d.%H.%M.%S]\] CreatePermissionList (5): error while sourcing:\ncol/$parentRepository/auxdoc/displayControl.tcl\n$errorInfo\n"
puts $log
Store log $homePath/@errorLog auto 0 a
}
}
# environmentArray
ConditionalSet environmentArray($mirrorRep,permissionList) permissionList {}
# ConditionalSet environmentArray($mirrorRep,languagePreference) languagePreference en ;# commented by GJFB in 2023-12-18
ConditionalSet environmentArray($mirrorRep,languagePreference) languagePreference {} ;# added by GJFB in 2023-12-18 to allow the use of the browser language preference
# puts "$mirrorRep $environmentArray($mirrorRep,languagePreference)"
ConditionalSet environmentArray($mirrorRep,displayReviewButton) displayReviewButton 1
set permissionListArray($parentRepository) $environmentArray($mirrorRep,permissionList)
set languagePreferenceArray($parentRepository) $environmentArray($mirrorRep,languagePreference)
set displayReviewButtonArray($parentRepository) $environmentArray($mirrorRep,displayReviewButton)
break
} else {
set environmentArray($mirrorRep,permissionList) $permissionListArray($parentRepository)
set environmentArray($mirrorRep,languagePreference) $languagePreferenceArray($parentRepository)
set environmentArray($mirrorRep,displayReviewButton) $displayReviewButtonArray($parentRepository)
}
}
}
}
}
# CreatePermissionList - end
# ----------------------------------------------------------------------
# CreateOrderingTable
# this ordering table is computed from the one in referRepository
# it is used in the FieldCompare procedure (utilitiesMirror.tcl)
proc CreateOrderingTable {} {
global referRepository
global ${referRepository}::conversionTable
# global multipleLineReferFieldNamePattern
global multipleLineReferFieldNamePattern2
global firstFieldNameList
# foreach index [array names conversionTable *,%*] #
foreach index [array names conversionTable] {
set fieldName $conversionTable($index) ;# author
if {$fieldName == {}} {continue}
regexp {(.*),(%.*)} $index m referenceType referFieldName
# set orderingTable($referenceType,$fieldName) [set ${referRepository}::orderingTable($referFieldName)] ;# commented by GJFB in 2020-11-18
set orderingTable($referenceType,$fieldName) [set ${referRepository}::orderingTable($referenceType,$referFieldName)] ;# added by GJFB in 2020-11-18 to allow organizing Full Entry by reference type (see refer repository)
if 1 {
# could be commented after a long period, once files like .repArray.tcl have been recreated - it is a way to reduce the size of fsuch files since, for exampe, isbn doesn't have firstisbn
# if [regexp {%A|%E|%Y|%\?|%@group|%@affiliation|%@electronicmailaddress} $referFieldName]
# if [regexp $multipleLineReferFieldNamePattern $referFieldName] # ;# commented by GJFB in 2018-01-07
if [regexp $multipleLineReferFieldNamePattern2 $referFieldName] { ;# added by GJFB in 2018-01-07 to exclude nexthigerunit and previous lowerunit
## add FIRST for some multiple line fields
# add FIRST for multiple line fields
# set orderingTable($referenceType,first$fieldName) [set ${referRepository}::orderingTable($referFieldName)] ;# commented by GJFB in 2020-11-18
set orderingTable($referenceType,first$fieldName) [set ${referRepository}::orderingTable($referenceType,$referFieldName)] ;# added by GJFB in 2020-11-18 to allow organizing Full Entry by reference type (see refer repository)
}
} else {
# not yet in use
# added by GJFB in 2022-07-25
# add FIRST
if {[lsearch $firstFieldNameList first$fieldName] != -1} {
set orderingTable($referenceType,first$fieldName) [set ${referRepository}::orderingTable($referenceType,$referFieldName)] ;# added by GJFB in 2020-11-18 to allow organizing Full Entry by reference type (see refer repository)
}
}
}
return [array get orderingTable] ;# {Misc,author 4 Misc,title 5}
}
# CreateOrderingTable - end
# ----------------------------------------------------------------------
# FindTheMostRecentReferences
# used in UpdateTheMostRecent (in Search.tcl) only
## excludes all the parent repositories of the URLibService
# excludes all the hidden repositories
# removeTheOldest value is 0 or 1
# 1 means to remove the oldest entries (used by UpdateTheMostRecent)
# justFullTexts value is 0 or 1
# 1 means to consider just full texts
# Example:
# FindTheMostRecentReferences mostRecentReferences 10 0 1
# =>
# iconet.com.br/banon/2001/07.27.00.56.36-0,metadatalastupdate {2001:08.07.18.31.04 dpi.inpe.br/banon/1999/01.09.22.14}
proc FindTheMostRecentReferences {arrayName maximumNumberOfEntries {justFullTexts 0} {removeTheOldest 0}} {
# runs with post
global metadataArray
upvar #0 $arrayName metadataArray2 ;# may be metadataArray or mostRecentReferences or mostRecentFullTexts
# set xxx [CallTrace]
# Store xxx C:/tmp/bbb auto 0 a
# =>
# call stack
# 7: FindTheMostRecentReferences mostRecentReferences 10 0 1
# 6: UpdateTheMostRecent mostRecentReferences
# 5: dpi.inpe.br/banon/1999/04.21.17.06::CreateRepArray ...
# 4: UpdateMetadata ...
# 3: UpdateCollection {urlib.net/www/2016/06.14.22.58 urlib.net/www/2016/06.14.22.58.50}
# 2: UpdateRepMetadataRep ...
# 1: ServeLocalCollection sock800 192.168.0.102 60439
# call stack - end
set list {}
foreach {index stamp} [array get metadataArray2 *,metadatalastupdate] {
# puts $index
# => urlib.net/www/2021/03.06.22.00.48-0,metadatalastupdate
# if [regsub -- {-0[^-]*$} $index {} metadataRep] #
# if [regsub -- {-0$} $index {} metadataRep] # ;# commented by GJFB in 2021-03-25 programming error
if [regsub -- {-0.*$} $index {} metadataRep] { ;# added by GJFB in 2021-03-25
# keep only the -0 references
if {[info exists metadataArray($metadataRep-0,visibility)] && \
[string compare {shown} $metadataArray($metadataRep-0,visibility)] == 0} {
# keep only the visible references
if $justFullTexts {
regsub {,.*} $index {} rep-i
if [info exists metadataArray(${rep-i},size)] {
# keep only the references having a full text
lappend list [list $index $stamp]
}
} else {
lappend list [list $index $stamp]
}
}
}
}
# compare stamp
set list [lsort -command Compare10- $list]
if $removeTheOldest {
unset metadataArray2
}
return [join [lrange $list 0 [expr $maximumNumberOfEntries - 1]]]
}
# FindTheMostRecentReferences - end
# ----------------------------------------------------------------------
# FindTheMostRecentReferences2
# a more efficient coding when there is no need to remove the oldest
# used in GetMostRecentMetadataRep and UpdateTheMostRecent (in Search.tcl) only
proc FindTheMostRecentReferences2 {maximumNumberOfEntries {justFullTexts 0}} {
# runs with post
global metadataArray
global repArray
set list {}
set i 1
foreach index [lsort -decreasing [array names repArray *:??.??.??.??.??,metadatalastupdate]] {
foreach rep-i $repArray($index) {
if [regexp -- {-0$} ${rep-i}] {
# keep only the -0 references
set rep-0 ${rep-i}
if {[info exists metadataArray(${rep-0},visibility)] && \
[string compare {shown} $metadataArray(${rep-0},visibility)] == 0} {
# keep only the visible references
if $justFullTexts {
if [info exists metadataArray(${rep-0},size)] {
# keep only the references having a full text
set list [concat $list [list ${rep-0},metadatalastupdate $metadataArray(${rep-0},metadatalastupdate)]]
if {$i == $maximumNumberOfEntries} {return $list}
incr i
}
} else {
set list [concat $list [list ${rep-0},metadatalastupdate $metadataArray(${rep-0},metadatalastupdate)]]
if {$i == $maximumNumberOfEntries} {return $list}
incr i
}
}
}
}
}
return $list
}
# FindTheMostRecentReferences2 - end
# ----------------------------------------------------------------------
# Compare10-
# used to compare stamp in FindTheMostRecentReferences
proc Compare10- {a b} {
set a10 [lindex [lindex $a 1] 0]
set b10 [lindex [lindex $b 1] 0]
return [string compare $b10 $a10]
}
# Compare10- - end
# ----------------------------------------------------------------------
# LoadBannerPathArray
proc LoadBannerPathArray {} {
# runs with post
global bannerSequenceRepList
global URLibBannerSequenceRepository
global bannerPathArray
global col
# get the first encountered
set bannerSequenceRep [lindex $bannerSequenceRepList 0]
if {$bannerSequenceRep == "$URLibBannerSequenceRepository" && \
[llength $bannerSequenceRepList] > 1} {
set bannerSequenceRep [lindex $bannerSequenceRepList 1]
}
if [file exists $col/$bannerSequenceRep/doc/@bannerSequence.tcl] {
# bannerPathArray (set in @bannerSequence.tcl)
catch {source $col/$bannerSequenceRep/doc/@bannerSequence.tcl}
}
}
# LoadBannerPathArray
# ----------------------------------------------------------------------
# StoreHostCollection
proc StoreHostCollection {rep hostCollection} {
# runs with start and post
set var $hostCollection
StoreService var $rep hostCollection 1 1
}
if 0 {
# testing
set col ../../../../..
source utilities1.tcl
StoreHostCollection dpi.inpe.br/banon/2000/05.25.20.06 dpi.inpe.br/banon/1999/01.09.22.14
StoreHostCollection dpi.inpe.br/banon-pc2@80/2009/03.13.22.03 {dpi.inpe.br/banon/1999/01.09.22.14
dpi.inpe.br/banon/2003/12.10.19.30
dpi.inpe.br/banon/1999/01.09.22.14} ;# old data format
}
# StoreHostCollection - end
# ----------------------------------------------------------------------
# LoadHostCollection
# return an empty list if the hostCollection file was corrupted
proc LoadHostCollection {rep} {
LoadService $rep hostCollection data 1 1
return $data
}
if 0 {
# testing
set col ../../../../..
source cgi/mirrorfind-.tcl
source utilities1.tcl
source utilitiesStart.tcl
set homePath {C:/Gerald/URLib 2}
puts [LoadHostCollection dpi.inpe.br/banon/1999/05.03.22.11]
puts [LoadHostCollection iconet.com.br/banon/2000/12.30.22.40]
puts [LoadHostCollection dpi.inpe.br/banon-pc2@80/2009/03.13.22.03]
}
# LoadHostCollection - end
# ----------------------------------------------------------------------
# FindInternetAddress
#
# Finds host name, domain name and ip address
# used in post and start
proc FindInternetAddress {} {
# runs with start and post
global tcl_platform
global environmentArray
global installInitialCollection
global serverAddress
global serverAddressWithIP
if {$tcl_platform(platform) == "windows"} {
# exec ping -n 1 localhost > ../auxdoc/pingMessage
exec ping -4 -n 1 localhost > ../auxdoc/pingMessage ;# added by GJFB in 2010-10-01 - force IPv4
# Pinging banon-pc2 [127.0.0.1] with 32 bytes of data: ...
# Disparando gjfb [127.0.0.1] com 32 bytes de dados: ...
Load ../auxdoc/pingMessage fileContent
# serverName
# regexp {([^ ]*) \[([^\]]*)\]} $fileContent m serverName ipAddress
regexp {([^ ]*) \[[^\]]*\]} $fileContent m serverName ;# banon-pc2
# puts --$serverName--
# hostName
set hostName [info hostname]
# puts --$hostName--
if [string equal {localhost} $serverName] {set serverName $hostName}
# domainName
set domainName {}
if ![string equal {} $hostName] {
if ![regexp "^$hostName\.(.*)$" $serverName m domainName] {
# >>> here it is assumed that the complete host name without domain doesn't contain any periods (.)
# regexp {^([^\.]*)\.(.*)$} $serverName m hostName domainName
regexp {^(.*?)\.(.*)$} $serverName m hostName domainName
}
} else {
# >>> here it is assumed that the complete host name without domain doesn't contain any periods (.)
# regexp {^([^\.]*)\.(.*)$} $serverName m hostName domainName
regexp {^(.*?)\.(.*)$} $serverName m hostName domainName
}
if [string equal {} $hostName] {
set message {host name not found}
Store message ../auxdoc/messageForStart
exit
}
# Store serverName C:/tmp/bbb auto 0 a
# exec ping -n 1 $serverName > ../auxdoc/pingMessage
exec ping -4 -n 1 $serverName > ../auxdoc/pingMessage ;# added by GJFB in 2010-10-01 - force IPv4
# Pinging banon-pc2 [150.163.2.174] with 32 bytes of data: ...
# Pinging banon-pc2 [192.168.1.6] with 32 bytes of data: ...
# Pinging banon-pc2 [127.0.0.1] with 32 bytes of data: ...
# Pinging banon-pc3 [192.168.1.100] with 32 bytes of data: ...
# Disparando gjfb [fe80::2c34:2cb0:4033:511%8] com 32 bytes de dados: ...
Load ../auxdoc/pingMessage fileContent
# ipAddress
regexp {\[([^\]]*)\]} $fileContent m ipAddress
if ![info exists ipAddress] {
set message {ip address not found}
Store message ../auxdoc/messageForStart
exit
}
}
if {$tcl_platform(platform) == "unix"} {
if {$tcl_platform(os) == "Linux"} {
# Linux
# serverName
if [catch {exec ping -c 1 localhost > ../auxdoc/pingMessage}] {
# ping: unknown host localhost
# message gotten from licari.ibict.br
set serverName localhost
} else {
# PING banon-pc3 (127.0.0.1) 56(84) bytes of data. ...
# PING netuno.dpi.inpe.br (127.0.0.1) 56(84) bytes of data. ...
# PING mtc-m18 (127.0.0.1) 56(84) bytes of data. ...
# PING localhost.localdomain (127.0.0.1) 56(84) bytes of data. ...
# PING localhost (127.0.0.1) 56(84) bytes of data. ...
# PING mtc-m22 (127.0.0.1) 56(84) bytes of data. ...
Load ../auxdoc/pingMessage fileContent
# regexp {([^ ]*) \(([^\)]*)\)} $fileContent m serverName ipAddress
regexp {([^ ]*) \([^\)]*\)} $fileContent m serverName ;# netuno.dpi.inpe.br, localhost, mtc-m22
}
# hostName
set hostName [info hostname] ;# netuno.dpi.inpe.br mtc-m18, urlibservice.eng.REGISTRO.br, mtc-m22
# if [string equal {localhost} $serverName] {set serverName $hostName} ;# use hostName
if [regexp {^localhost} $serverName] {set serverName $hostName} ;# use hostName - added by GJFB in 2014-11-01 - now ping might return localhost.localdomain instead of just localhost
# domainName
set domainName {}
if ![string equal {} $hostName] {
if ![regexp "^$hostName\.(.*)$" $serverName m domainName] {
# >>> here it is assumed that the complete host name without domain doesn't contain any periods (.)
# regexp {^([^\.]*)\.(.*)$} $serverName m hostName domainName
regexp {^(.*?)\.(.*)$} $serverName m hostName domainName
}
} else {
# >>> here it is assumed that the complete host name without domain doesn't contain any periods (.)
# regexp {^([^\.]*)\.(.*)$} $serverName m hostName domainName
regexp {^(.*?)\.(.*)$} $serverName m hostName domainName
}
if [string equal {} $hostName] {
set message {host name not found}
Store message ../auxdoc/messageForStart
exit
}
# exec ping -c 1 $serverName > ../auxdoc/pingMessage ;# commented by GJFB in 2024-10-14
if [catch {exec ping -c 1 $serverName > ../auxdoc/pingMessage} m] { ;# catch added by GJFB in 2024-10-14 - useful when ping returns 100% packet loss
puts [StoreLog alert FindInternetAddress "$m while executing 'ping -c 1 $serverName'"]
exit
}
# PING hermes2.dpi.inpe.br (150.163.2.23) 56(84) bytes of data. ...
# PING netuno.dpi.inpe.br (127.0.0.1) 56(84) bytes of data. ...
# PING mtc-m18 (127.0.0.1) 56(84) bytes of data. ...
# PING bibdigital.sid.inpe.br (150.163.34.247) 56(84) bytes of data.
Load ../auxdoc/pingMessage fileContent
# ipAddress
regexp {\(([^\)]*)\)} $fileContent m ipAddress
if ![info exists ipAddress] {
set message {ip address not found}
Store message ../auxdoc/messageForStart
exit
}
} else {
# SunOS
set hostName [exec hostname]
if [string equal {} $hostName] {
set message {host name not found}
Store message ../auxdoc/messageForStart
exit
}
if [catch {ReturnFullServerNameIP $hostName} output] {
Load ../auxdoc/domainName.txt domainName
Load ../auxdoc/ipAddress.txt ipAddress
} else {
# >>> here it is assumed that the complete host name without domain doesn't contain any periods (.)
regsub {\..*$} $hostName {} hostName ;# gemini.dpi.inpe.br -> gemini
foreach {fullServerName ipAddress} $output {break}
set domainName {}
# regexp "^$hostName\.(.*)" [lindex $itemList2 2] m domainName
regexp "^$hostName\.(.*)" $fullServerName m domainName
# set ipAddress [lindex $itemList2 3]
}
if [string equal {} $ipAddress] {
set message {ip address not found}
Store message ../auxdoc/messageForStart
exit
}
}
}
# Trying to find the domain name using nslookup
if [string equal {127.0.0.1} $ipAddress] {
foreach {fullServerName ipAddress} [ReturnFullServerNameIP $serverName] {break}
if [string equal {} $ipAddress] {
set ipAddress {127.0.0.1}
} else {
if [string equal {} $domainName] {
if ![regexp "^$hostName\.(.*)$" $fullServerName m domainName] {
# >>> here it is assumed that the complete host name without domain doesn't contain any periods (.)
# regexp {^[^\.]*\.(.*)$} $fullServerName m domainName
regexp {^.*?\.(.*)$} $fullServerName m domainName
}
}
}
} else {
# puts --$domainName--
# => {}
if [string equal {} $domainName] {
foreach {fullServerName ip} [ReturnFullServerNameIP $serverName] {break}
# foreach {fullServerName ip} [ReturnFullServerNameIP $ipAddress] {break} ;# added by GJFB in 2012-07-01 - the domain name may be found using the ipAddress instead of the serverName - useful at c94a96c1.virtua.com.br <- this URL doesn't work (server not found)
# ip not used
# puts --$serverName--
# => gjfb
# puts --$hostName--
# => gjfb
# puts --$fullServerName--
# => gjfb.Home
if ![regexp "^$hostName\.(.*)$" $fullServerName m domainName] {
# >>> here it is assumed that the complete host name without domain doesn't contain any periods (.)
# regexp {^[^\.]*\.(.*)$} $fullServerName m domainName
regexp {^.*?\.(.*)$} $fullServerName m domainName
}
}
}
# puts --$domainName--
# => Home
# Trying to find the domain name using nslookup - end
# >>> environmentArray(hostName) and environmentArray(domainName) might be fixed in post for dynamic IP
# in the example above, hostName becomes gjfb.home and domainName becomes {}
# OBS: environmentArray(hostName) is not the name of the virtual host (if any), it is just the computer name
# OBS: environmentArray(domainName) is used in GetServerAddress
# set environmentArray(hostName) $hostName
set environmentArray(hostName) [string tolower $hostName] ;# because rep is case-insensitive and because of env(PATH_INFO) that might contain the path info in lower case
set environmentArray(domainName) [string tolower $domainName] ;# because rep is case-insensitive (security issue - normaly should not be necessary)
set environmentArray(ipAddress) $ipAddress
# StoreArray environmentArray ../auxdoc/.environmentArray.tcl
# StoreArray environmentArray ../auxdoc/.environmentArray2.tcl ;# backup
# StoreArrayWithBackup environmentArray ../auxdoc/.environmentArray.tcl ;# added by GJFB in 2010-08-05
StoreArrayWithBackup environmentArray ../auxdoc/.environmentArray.tcl w list ;# added by GJFB in 2010-08-05
# puts [list $hostName $domainName $ipAddress]
# Update serverAddress and serverAddressWithIP
# update both based on environmentArray
# added by GJFB in 2016-06-29 - avoids the need of a second post round when posting from a new Internet address
# puts >>>$environmentArray(ipAddress)
# puts >>>$serverAddressWithIP
if ![string equal $environmentArray(ipAddress) $serverAddressWithIP] {
# if !$installInitialCollection # ;# commented by GJFB in 2021-12-09 to have a nonempty serverAddressWithIP at installation when displaying "posting the URLib local collection at <$serverAddressWithIP>..." in post
set serverAddress [GetServerAddress] ;# banon-pc2.dpi.inpe.br 800
set serverAddressWithIP [GetServerAddress 1]
# #
}
# Update serverAddress and serverAddressWithIP - end
}
# FindInternetAddress - end
# ----------------------------------------------------------------------
# ConvertHex
# used in FindInternetAddress for Windows 2000
proc ConvertHex {string1} {
foreach {character x} [split $string1 {}] {append string2 $character}
regsub -all {\\\n\n } $string2 {} string3
regsub {\n\n$} $string3 {} string3
regsub -all {,00} $string3 {} string3
foreach number [split $string3 ,] {
append string4 [binary format H2 $number]
}
return $string4
}
# ConvertHex - end
# ----------------------------------------------------------------------
# UpdateMetadataFromBiblioDB
# remove value is 0 or 1
# 1 means just to remove, not to load
# 0 means to load the bibliographic data base
# flag value is 0 or 1
# 0 means to ignore the - signal
# 1 means to take into account the - signal (at the beginning of the file)
# flag is used by Bib2Refer
proc UpdateMetadataFromBiblioDB {rep remove flag} {
# runs with post
# remove
if $remove {
set metadata2List [GetMetadata $rep-*]
# RemoveMetadata $metadata2List ;# commented by GJFB in 2020-08-18
RemoveMetadata2 $metadata2List ;# added by GJFB in 2020-08-18
} else {
# load
LoadBiblioDB $rep $flag
}
}
# UpdateMetadataFromBiblioDB - end
# ----------------------------------------------------------------------
# UpdateMetadataFromBiblioDB2
# remove value is 0 or 1
# 1 means just to remove, not to load
# 0 means to load the bibliographic data base
# flag value is 0 or 1
# 0 means to ignore the - signal
# 1 means to take into account the - signal (at the beginning of the file)
# flag is used by Bib2Refer
proc UpdateMetadataFromBiblioDB2 {rep {remove 0} {flag 0}} {
# runs with start
global col
Set updateMetadataFromBiblioDBInUse 1
set log [clock format [clock seconds]]
Store log $col/$rep/doc/@log auto 0 a
set message [Eval UpdateMetadataFromBiblioDB $rep $remove $flag]
if {[regsub -all {^<|>$} $message {} message] == 2} {
set message [join $message \n]
Store message $col/$rep/doc/@log auto 0 a
}
Set updateMetadataFromBiblioDBInUse 0
}
# UpdateMetadataFromBiblioDB2 - end
# ----------------------------------------------------------------------
# LoadBiblioDB
# used in UpdateMetadataFromBiblioDB, UpdateCollection, StartService and Script (Administrator page) only
# flag value is 0 or 1
# 0 means to ignore the - signal
# 1 means to take into account the - signal (at the beginning of the file)
# flag is used by Bib2Refer
proc LoadBiblioDB {rep {flag 0}} {
# runs with post
# runs with cgi-script
# global col
global homePath
global metadataArray
global repositoryProperties ;# to test if running with post or cgi-script
global bib2referRepository
global bibpessoal2referRepository
global isis2referRepository
global inverseTable
global serverAddress
global environmentArray
global multipleLineFieldNameList
# set xxx LoadBiblioDB0
# Store xxx C:/tmp/aaa auto 0 a
set beSelective 0
set reference {}
if [file exists $homePath/col/$rep/doc/@reference.bib] {
Load $homePath/col/$rep/doc/@reference.bib fileContent
# beginWith-
set beginWith- [regexp {^-} $fileContent]
set beSelective [expr $flag && ${beginWith-}]
# source $homePath/col/$bib2referRepository/doc/Bib2Refer.tcl ;# for testing code adjustment
set reference [${bib2referRepository}::Bib2Refer $fileContent $beSelective]
} elseif [file exists $homePath/col/$rep/doc/@reference.refer] {
Load $homePath/col/$rep/doc/@reference.refer reference
} elseif [file exists $homePath/col/$rep/doc/@reference.isis] {
if [file isdirectory $homePath/col/$isis2referRepository] {
Load $homePath/col/$rep/doc/@reference.isis fileContent binary
set reference [${isis2referRepository}::Isis2Refer $fileContent $rep]
}
} elseif [file exists $homePath/col/$rep/doc/a.txt] {
if [file isdirectory $homePath/col/$isis2referRepository] {
Load $homePath/col/$rep/doc/a.txt fileContent binary
set reference [${isis2referRepository}::Isis2Refer $fileContent $rep]
}
} elseif [file exists $homePath/col/$rep/doc/A.txt] {
if [file isdirectory $homePath/col/$isis2referRepository] {
Load $homePath/col/$rep/doc/A.txt fileContent binary
set reference [${isis2referRepository}::Isis2Refer $fileContent $rep]
}
} elseif [file exists $homePath/col/$rep/doc/a.TXT] {
if [file isdirectory $homePath/col/$isis2referRepository] {
Load $homePath/col/$rep/doc/a.TXT fileContent binary
set reference [${isis2referRepository}::Isis2Refer $fileContent $rep]
}
} elseif [file exists $homePath/col/$rep/doc/A.TXT] {
if [file isdirectory $homePath/col/$isis2referRepository] {
Load $homePath/col/$rep/doc/A.TXT fileContent binary
set reference [${isis2referRepository}::Isis2Refer $fileContent $rep]
}
} elseif [file exists $homePath/col/$rep/doc/@reference.bp1] {
if [file isdirectory $homePath/col/$bibpessoal2referRepository] {
Load $homePath/col/$rep/doc/@reference.bp1 fileContent
set reference [${bibpessoal2referRepository}::BibPessoal2Refer $fileContent 0]
}
} elseif [file exists $homePath/col/$rep/doc/@reference.bp2] {
if [file isdirectory $homePath/col/$bibpessoal2referRepository] {
Load $homePath/col/$rep/doc/@reference.bp2 fileContent binary
set reference [${bibpessoal2referRepository}::BibPessoal2Refer $fileContent 1]
}
}
# Store rep C:/tmp/aaa auto 0 a
# Store reference C:/tmp/aaa auto 0 a
ConvertMultipleRefer2MetadataList 1 $reference $rep localMetadataArray ;# sets localMetadataArray
# set metadataList [array get localMetadataArray]
# Store metadataList C:/tmp/bbb.txt auto 0 a
# set numberOfRef [llength [array names localMetadataArray *,referencetype]]
# set numberOfRef [regsub -all {,referencetype} $metadataList {} m]
# array set localMetadataArray $metadataList
# set numberOfRef [llength [array names localMetadataArray *,referencetype]]
# Store numberOfRef C:/tmp/aaa auto 0 a
# set versionStamp [lindex $repositoryProperties($rep,history) end]
if [info exists repositoryProperties] {
# post running
set versionStamp [GetVersionStamp $rep] ;# need repositoryProperties
} else {
# cgi-scrip running
set versionStamp {}
}
# for {set i 1} {$i <= $numberOfRef} {incr i}
if !$beSelective {
# remove
set metadata2List [GetMetadata $rep-*]
# RemoveMetadata $metadata2List ;# commented by GJFB in 2020-08-18
RemoveMetadata2 $metadata2List ;# added by GJFB in 2020-08-18
}
# visibility
LoadService $rep visibility visibility 1 1
if [string equal {} $visibility] {set visibility 0} ;# shown
foreach item [array names localMetadataArray *,index] {
set i $localMetadataArray($item)
set x 0; after 1 {set x 1}; vwait x ;# nice procedure
if $beSelective {
# remove
# set metadata2List [GetMetadata $rep-$i*] ;# commented by GJFB in 2013-06-10 - the comma is missing
set metadata2List [GetMetadata $rep-$i,*] ;# added by GJFB in 2013-06-10
# RemoveMetadata $metadata2List ;# commented by GJFB in 2020-08-18
RemoveMetadata2 $metadata2List ;# added by GJFB in 2020-08-18
}
set index [array names localMetadataArray $rep-$i,metadatarepository]
if ![string equal {} $index] {
# there is a nonempty metadatarepository field (i.e., a metadataRep) in the reference $rep-$i
# example: see Achache reference in id 83LX3pFwXQZeBBx/onedv
# 102
set metadataRep $localMetadataArray($index)
if ![string equal {} $metadataRep] {
if [file isdirectory $homePath/col/$metadataRep] {
# remove
set metadata2List [array get metadataArray $metadataRep-0,*]
# Store metadata2List C:/tmp/aaa auto 0 a
# RemoveMetadata $metadata2List ;# commented by GJFB in 2020-08-18
RemoveMetadata2 $metadata2List ;# added by GJFB in 2020-08-18
# Update @metadata.refer
# (metadata -> refer)
# similar to CreateFullReferEntry
set referenceType $localMetadataArray($rep-$i,referencetype)
# Store referenceType C:/tmp/bbb auto 0 a
# set xxx [array get localMetadataArray $rep-$i,*]
# set xxx [join $xxx \n]
# Store xxx C:/tmp/bbb auto 0 a
set output {}
set targetFile {}
foreach index [array names localMetadataArray $rep-$i,*] {
# value
set value $localMetadataArray($index)
# field
regsub {.*,} $index {} field
# Update localMetadataArray
unset localMetadataArray($index)
set localMetadataArray($metadataRep-0,$field) $value
# Update localMetadataArray - end
if [regexp {^citationkey$|^firstauthor$|^index$|^repository$} $field] {continue}
if [regexp {^targetfile$} $field] {set targetFile $value}
# if [regexp {^author|^editor|^programmer|^reporter|^cartographer|^base|^committee|^translator|^serieseditor|^source|^group|^affiliation|^supervisor} $field]
if {[lsearch -exact $multipleLineFieldNameList $field] != -1} {
# multiple line fields
foreach item $value {
lappend output "$inverseTable($referenceType,$field) $item"
}
} else {
lappend output "$inverseTable($referenceType,$field) $value"
}
}
foreach {repName output} \
[AddTwoFields $metadataRep $referenceType $targetFile $output] \
{break}
# set output [lsort -command ReferFieldCompare $output] ;# now in AddTwoFields
set output [join $output \n]
set path $homePath/col/$metadataRep/doc/@metadata.refer
Load $path fileContent
if ![string equal $output $fileContent] {
# update the @metadata.refer file content
Store output $path
regsub {@.*$} $environmentArray(spMailEntry) {} administratorUserName
# UpdateLastUpdate $metadataRep {}
UpdateLastUpdate $metadataRep {} none $administratorUserName
# MakeDownloadFile $repName 0 1
MakeDownloadFile $repName 0 1 0 $administratorUserName
}
# Update @metadata.refer - end
# Append repName to the repositoryListForStart file content
# (used to update keyRepositoryList in PerformCheck)
Store repName ../auxdoc/repositoryListForStart auto 0 a
# Append repName to the repositoryListForStart file content - end
# UPDATE METADATA
set metadataList {} ;# for add
set metadata2List {} ;# for remove
UpdateMetadataField $metadataRep index 0 metadataList metadata2List
UpdateMetadataField $metadataRep repository $repName metadataList metadata2List
set metadataList [concat $metadataList [CreateExtraFields $metadataRep $serverAddress]]
# set metadataList [concat $metadataList [CreateExtraFields $metadataRep [GetServerAddress]]]
# RemoveMetadata $metadata2List ;# commented by GJFB in 2020-08-18
RemoveMetadata2 $metadata2List ;# added by GJFB in 2020-08-18
array set localMetadataArray $metadataList
# set xxx [CallTrace]
# Store xxx C:/tmp/aaa auto 0 a
# set xxx [array get localMetadataArray $metadataRep-0,*]
# set xxx [join $xxx \n]
# Store xxx C:/tmp/aaa auto 0 a
} else {
# Add the metadatalastupdate and databaserepository fields
set localMetadataArray($rep-$i,metadatalastupdate) $versionStamp
set localMetadataArray($rep-$i,databaserepository) $rep
# Add the metadatalastupdate and databaserepository fields - end
}
} else {
# metadataRep is empty (bibpessoal case)
# Add the metadatalastupdate and databaserepository fields
set localMetadataArray($rep-$i,metadatalastupdate) $versionStamp
set localMetadataArray($rep-$i,databaserepository) $rep
# Add the metadatalastupdate and databaserepository fields - end
}
} else {
# there is no metadataRep in the reference
# Add the metadatalastupdate and databaserepository fields
set localMetadataArray($rep-$i,metadatalastupdate) $versionStamp
set localMetadataArray($rep-$i,databaserepository) $rep
set localMetadataArray($rep-$i,visibility) [expr $visibility?{hidden}:{shown}]
# Add the metadatalastupdate and databaserepository fields - end
}
}
# ADD METADATA
# set metadataList [array get localMetadataArray]
# Store metadataList C:/tmp/aaa auto 0 a
# AddMetadata [array get localMetadataArray] ;# commented by GJFB in 2020-08-18
AddMetadata2 [array get localMetadataArray] ;# added by GJFB in 2020-08-18
}
# LoadBiblioDB - end
# ----------------------------------------------------------------------
# AddTwoFields
# adds the fields targetfile and repName
# targetFile -> repositoryProperties and service/targetFile
# targetFile and repName -> fieldList
# Example:
# AddTwoFields $metadataRep $referenceType $targetFile $fieldList
# used in LoadBiblioDB and LoadMetadata only
proc AddTwoFields {metadataRep referenceType targetFile fieldList} {
# runs with post
# global col
global homePath
global inverseTable
global repositoryProperties
set repName [ReturnRepositoryName $metadataRep]
# Add the targetfile field
if ![string equal {} $targetFile] {
# target file defined in the incoming metadata
set repositoryProperties($repName,targetfile) $targetFile
Store targetFile $homePath/col/$repName/service/targetFile
} else {
# no target file defined in the incoming metadata - use the existing value in repositoryProperties
if [info exists repositoryProperties($repName,targetfile)] {
set targetFile $repositoryProperties($repName,targetfile)
lappend fieldList "$inverseTable($referenceType,targetfile) $targetFile"
}
}
# Add the targetfile field - end
# Add the repository field
lappend fieldList "$inverseTable($referenceType,repository) $repName" ;# "%4 $repName"
set fieldList [lsort -command ReferFieldCompare $fieldList]
# Add the repository field - end
return [list $repName $fieldList]
}
# AddTwoFields - end
# ----------------------------------------------------------------------
# ReturnRepositoryName
# used in StartService
proc ReturnRepositoryName {metadataRep} {
# runs with post
global referenceTable
foreach index [array names referenceTable $metadataRep,*] {
if {$referenceTable($index) != "+"} {
regsub {.*,} $index {} repName
return $repName
}
}
# repName not found
# the referenceTable may have been damaged,
# Update referenceTable
UpdateReferenceTable $metadataRep ;# try to repair referenceTable - uses source/reference to recreate repName
# UpdateReferenceFileForLoCoInRep
# Update referenceTable - end
foreach index [array names referenceTable $metadataRep,*] {
if {$referenceTable($index) != "+"} {
regsub {.*,} $index {} repName
return $repName
}
}
# repName not found
# case of a bibliographic data base (is a set of metadata to no repository)
# returns empty
}
# ReturnRepositoryName - end
# ----------------------------------------------------------------------
# ReturnType
proc ReturnType {metadataArrayName rep-i {level {#0}}} {
# runs with start and post
upvar $level $metadataArrayName metadataArray
return $metadataArray(${rep-i},referencetype)
}
# ReturnType - end
# ----------------------------------------------------------------------
# GetServerAddress
# the ipFlag option is used to compare the server address
# with the result of GetURLibServerAddress
# in InformURLibSystem (this file) and FindBannerPath (utilitiesMirror.tcl)
# and to communicate via socket (using domain name instead of ip leads to: "too many nested evaluations (infinite loop?)")
# the result is always in the form {ipAddress urlibPort}
proc GetServerAddress {{ipFlag 0}} {
# runs with start and post
global environmentArray
# puts [regexp {(.*) +(.*)} $environmentArray(spPortEntry) m httpHostName urlibPortNumber]
if [regexp {(.*) +(.*)} $environmentArray(spPortEntry) m httpHostName urlibPortNumber] {
# environmentArray(spPortEntry) => {banon-pc2 800}
# environmentArray(spPortEntry) => {www.urlib.net 800}
if $ipFlag {
# set ipAddress $environmentArray(ipAddress)
# regsub {.$} $urlibPortNumber {} serverPort ;# drop the last digit
# set serverAddress $ipAddress:$serverPort
set serverName $environmentArray(ipAddress)
} else {
set hostName $httpHostName ;# banon-pc2 or www.urlib.net
if [regexp {\.} $hostName] {
# host name is already a full server name, e.g., www.urlib.net or banon-pc2.dpi.inpe.br
set serverName $hostName
} else {
set domainName $environmentArray(domainName)
if [string equal {} $domainName] {
set serverName $hostName
} else {
set serverName $hostName.$domainName ;# banon-pc2.dpi.inpe.br
}
}
}
set serverAddress [list $serverName $urlibPortNumber] ;# banon-pc2.dpi.inpe.br 800
} else {
# old usage
# environmentArray(spPortEntry) => {80}
# environmentArray(spPortEntry) => {1905}
if $ipFlag {
set serverName $environmentArray(ipAddress)
} else {
set hostName $environmentArray(hostName)
set domainName $environmentArray(domainName)
if [string equal {} $domainName] {
set serverName $hostName
} else {
set serverName $hostName.$domainName
}
}
set portNumber $environmentArray(spPortEntry)
set serverAddress $serverName:$portNumber
set serverAddress [ReturnCommunicationAddress $serverAddress] ;# banon-pc2.dpi.inpe.br:80 -> banon-pc2.dpi.inpe.br 800
}
return $serverAddress
}
# GetServerAddress - end
# ----------------------------------------------------------------------
# CreateNewRepository
# documentType value are empty or default or directory
# empty means to deposit nothing in the new repository
# default means to deposit the document from the default repository
# directory means to deposit a folder document named documentPath
# targetFileOption value is disable or enable
# option value is "copy" or "preserve" or "delete" (see DDRoutine)
# unzip value is 0 or 1; 1 means to unzip the deposited document
# contentType value is Metadata, External Contribution, ...
## copyToSource value is 0 or 1; 1 means to deposit the document into the source as well
# copyToSource value is 0 or 1; 1 means to deposit the document into the source (only)
# userName is the name of the advanced user who is creating the version stamp
# postSubmissionScriptRepList is a list of repositories containing scripts to process
# the submitted files
# $reference ==>
# {%0 Misc} {%@tertiarytype } {%A aa} {%I Deposited in the URLib collection.} {%X aa} {%T tt} {%@secondarykey INPE--/}
# reference is used for post-submission
proc CreateNewRepository {{documentType {empty}} {documentPath {}} \
{targetFileOption disable} {option copy} {unzip 0} {repName {}} \
{fileInfo 1} {contentType {}} {copyToSource 0} {userName {}} \
{postSubmissionScriptRepList {}} {reference {}}} {
# runs with start and post
set argument ""
set argument "$argument -targetfile $targetFileOption"
set argument "$argument -documenttype $documentType"
set argument "$argument -repositorytype new"
set argument "$argument -option $option"
set argument "$argument -reverse 0"
set argument "$argument -documentpath [list $documentPath]"
set argument "$argument -unzip $unzip"
set argument "$argument -fileinfo $fileInfo"
set argument "$argument -contenttype [list $contentType]"
set argument "$argument -copytosource $copyToSource"
set argument "$argument -username [list $userName]" ;# name of the advanced user who is creating the version stamp
set argument "$argument -postsubmissionscriptreplist [list $postSubmissionScriptRepList]"
set argument "$argument -reference [list $reference]"
# set xxx 1-$argument
# Store xxx C:/tmp/aaa auto 0 a
# set return [DDRoutine $argument]
set return [DDRoutine $argument 0 $repName]
if {$return == 1} {return}
if {$return == 0} {return}
return $return
}
# CreateNewRepository - end
# ----------------------------------------------------------------------
# CheckAccess
# used by UpdateRepository2 and UpdateRepMetadataRep
# password must be coded or a session number
# "no advanced user" for the rep is equivalent to "the administrator is the advanced user"
proc CheckAccess {rep userName password} {
# runs with post
global environmentArray
global repositoryProperties
set procedureName [lindex [info level [expr [info level] - 1]] 0]
regsub {@.*$} $environmentArray(spMailEntry) {} administratorUserName
if [info exists repositoryProperties($rep,username)] {
# there is a user with write permission for this repository
if ![regexp "^$repositoryProperties($rep,username)$|^administrator$|^$administratorUserName$" $userName] {
# $userName is neither this user nor the administrator
return "$procedureName: '$userName' has no write permission for the repository $rep"
}
} else {
# there is no user with write permission for this repository
if ![regexp "^administrator$|^$administratorUserName$" $userName] {
# $userName is not the administrator
return "$procedureName: '$userName' has no write permission for the repository $rep"
}
}
if [CheckPassword $userName $password] {
# return "$procedureName: the password is incorrect or the user name doesn't exist"
if [CheckSession $password $userName] {
return "$procedureName: the password is incorrect or the user name doesn't exist, or the session doesn't exist"
} else {
return ;# the session exists
}
}
# the password is correct
}
# CheckAccess - end
# ----------------------------------------------------------------------
# StorePassword2
# Secure version of StorePassword
## used to force a password in processMail in dpi.inpe.br/banon/2005/12.08.20.05
## used only to force a password in cgi/createNewPassword.tcl in iconet.com.br/banon/2009/05.17.20.29
# used only in col/iconet.com.br/banon/2009/05.17.20.29/doc/cgi/createNewPassword.tcl to force the password of an existing user or enter the password of a new user
# ex: is called by cgi/createNewPassword.tcl in urlib.net and run in urlib.net
# Any change in the IBI Network must be reflected in the file col/iconet.com.br/banon/2009/05.17.20.29/auxdoc/conf.tcl in urlib.net
# password and administratorPassword must be coded
# passwordTypeFlag added by GJFB in 2020-10-09 - used to accept new users whose login satisfy the authorizedEmailDomains defined in displayControl.tcl
# passwordTypeFlag value 0 means that the request is for a new password, 1 means the request is for a first password
proc StorePassword2 {userName password administratorPassword {passwordTypeFlag 0}} {
# runs with post
global homePath
global loCoInRep
# Check administrator password
set checkPassordResponse [CheckPassword administrator $administratorPassword]
if $checkPassordResponse {
set checkPassordResponse [CheckPassword passwordmanager $administratorPassword] ;# added by GJFB in 2019-05-28
if $checkPassordResponse {
# if [CheckPassword urlibadm $administratorPassword read] # commented by GJFB in 2018-11-03 - urlibadm is now obsolete
## read is needed because urlibadm is just a read user (he has no full name)
# return "StorePassword2: no administrator or wrong administrator password" ;# commented by GJFB in 2019-05-28
return "StorePassword2: no administrator (or no passwordmanager) or wrong administrator password (or wrong passwordmanager password)" ;# added by GJFB in 2019-05-28
# return "StorePassword2: checkPassordResponse value is $checkPassordResponse, no administrator or wrong administrator password --$administratorPassword--"
# => StorePassword2: checkPassordResponse value is 1, no administrator or wrong administrator password --OfbuXA--.
# #
}
}
# Check administrator password - end
# Waiting for the completion of other authentications
WaitQueue StorePassword2 authentication
# Waiting for the completion of other authentications - end
# Check user name
set return [CheckUsernamePassword $userName {} {} 1 read]
if [string equal {unknown username} $return] {
# new username
if $passwordTypeFlag {
# first password
# added by GJFB in 2020-10-09
set userArray($userName,e-mailaddress) $userName
StoreArray userArray $homePath/col/$loCoInRep/auxdoc/.userArray.tcl w list array 1
} else {
# new password
LeaveQueue StorePassword2 authentication ;# added by GJFB in 2020-11-21
return "StorePassword2: $return"
}
}
# Check user name - end
StorePassword $userName $password
# LeaveQueue [pid] authentication
LeaveQueue StorePassword2 authentication
}
# StorePassword2 - end
# ----------------------------------------------------------------------
# UpdateRepository2
# Secure version of UpdateRepository
# used by Submit (ePrint) and ProcessReview
# password must be coded
proc UpdateRepository2 {
rep metadataRep userName password {documentType {empty}}
{documentPath {}} {targetFileOption disable}
} {
# runs with post
global saveMetadata
set message [CheckAccess $rep $userName $password]
if {[string compare {} $message] != 0} {
return $message
}
# UpdateRepository $rep $documentType $documentPath $targetFileOption
UpdateRepository $rep $documentType $documentPath $targetFileOption copy 0 $userName
# UpdateLastUpdate $rep $metadataRep none
UpdateLastUpdate $rep $metadataRep none $userName
set metadataList {}
set metadata2List {}
if 0 {
# nextUser -> userName
if {[string compare {} $nextUser] != 0} {
StoreService nextUser $rep userName 1 1
UpdateMetadataField $metadataRep username \
$nextUser metadataList metadata2List
}
}
UpdateCrossReferences $rep $metadataRep metadataList metadata2List ;# uses $homePath/col/$rep/service/reference
# UPDATE METADATA (needed to process review)
if 0 {
# commented by GJFB in 2020-08-18
RemoveMetadata $metadata2List
AddMetadata $metadataList
} else {
UpdateMetadata $metadata2List $metadataList ;# added by GJFB in 2020-08-18 - uses metadata2List and metadataList
}
# SAVE
set saveMetadata 1
SaveMetadata
}
# UpdateRepository2 - end
# ----------------------------------------------------------------------
# UpdateRepository
# documentType value is empty or default or directory
# empty means to deposit nothing in the updated repository
# default means to deposit the document from the default repository
# directory means to deposit a folder document named documentPath
# targetFileOption value is disable or enable
# option value is "copy" or "preserve" or "delete" (see DDRoutine)
# unzip value is 0 or 1; 1 means to unzip the deposited document
# copyToSource value is 0 or 1; 1 means to deposit the document into the source (only)
# moveToSource value is 0 or 1 ; 0 means don't move, 1 move the doc content to source - added by GJFB in 2016-05-10 to preserve old doc content before updating it - set in Administrator page for customizing the conference submission forms (iconet.com.br/banon/2006/07.02.02.18)
# moveBackToDoc value is 0 or 1 ; 0 means don't move, 1 move the source content to doc - added by GJFB in 2021-05-27 to give access to previously hidden video (ex: id 8JMKD3MGPGW34M/44N7JSP)
# postSubmissionScriptRepList is a list of repositories containing scripts to process
# the submitted files
# $reference ==>
# {%0 Misc} {%@tertiarytype } {%A aa} {%I Deposited in the URLib collection.} {%X aa} {%T tt} {%@secondarykey INPE--/}
# reference is used for post-submission
# deleteDocContentBeforeUpdate value is 0 or 1; 1 means to delete the doc content before depositing the new document - 1 is default
# updateAgreement value is 0 or 1; 1 means to update the agreement folder
proc UpdateRepository {
rep {documentType {empty}} {documentPath {}}
{targetFileOption disable} {option copy} {unzip 0} {userName {}}
{postSubmissionScriptRepList {}} {reference {}} {deleteDocContentBeforeUpdate 1}
{copyToSource 0} {folderName {}} {updateAgreement 0} {moveToSource 0}
{moveBackToDoc 0}
} {
# runs with start and post
# puts >>>UpdateRepository
set argument ""
set argument "$argument -targetfile $targetFileOption"
set argument "$argument -documenttype $documentType"
set argument "$argument -repositorytype repository"
set argument "$argument -option $option"
set argument "$argument -reverse 0"
set argument "$argument -documentpath [list $documentPath]"
set argument "$argument -repositoryentry [list [list :: $rep]]"
set argument "$argument -unzip $unzip"
set argument "$argument -selectedfiles no"
set argument "$argument -username $userName"
set argument "$argument -postsubmissionscriptreplist [list $postSubmissionScriptRepList]"
set argument "$argument -reference [list $reference]"
set argument "$argument -deletedoccontentbeforeupdate $deleteDocContentBeforeUpdate"
set argument "$argument -copytosource $copyToSource"
set argument "$argument -foldername [list $folderName]"
set argument "$argument -updateagreement $updateAgreement" ;# added by GJFB in 2010-12-05
set argument "$argument -movetosource $moveToSource" ;# added by GJFB in 2016-05-10
set argument "$argument -movebacktodoc $moveBackToDoc" ;# added by GJFB in 2021-05-27
# set xxx 1-$argument
# Store xxx C:/tmp/aaa auto 0 a
set return [DDRoutine $argument]
# set xxx $return
# Store xxx C:/tmp/aaa auto 0 a
if {$return == 1} {return}
if {$return == 0} {return}
return $return
}
# UpdateRepository - end
# ----------------------------------------------------------------------
# GetFieldValue
# used by DisplayMultipleSearch
proc GetFieldValue {rep-i fieldName {level {#0}}} {
# runs with start and post
upvar $level metadataArray metadataArray
if [info exists metadataArray(${rep-i},$fieldName)] {
set fieldValue $metadataArray(${rep-i},$fieldName)
} else {
set fieldValue {}
}
return $fieldValue
}
# GetFieldValue - end
# ----------------------------------------------------------------------
# GetFieldValue2
# used to call GetFieldValue from MultipleSubmit
# used in Script (administrator page for unifying field values)
proc GetFieldValue2 {rep-i fieldName {level {#0}}} {
return [GetFieldValue ${rep-i} $fieldName $level]
}
# GetFieldValue2 - end
# ----------------------------------------------------------------------
# GetMetadata
# example:
# set metadata2List [GetMetadata $callingRep-0,metadatalastupdate]
# set metadata2List [GetMetadata $rep-*]
proc GetMetadata {index} {
# runs with post
global metadataArray
return [array get metadataArray $index]
}
# GetMetadata - end
# ----------------------------------------------------------------------
# RemoveMetadata
# Example:
# set metadata2List [concat $metadata2List [GetMetadata $metadataRep-*]]
# RemoveMetadata $metadata2List
# removeOnly value is 0 or 1
# 1 means only remove (no add follows remove) - used when a repository is deleted
# use of metadataList is made in UpdateCollection
if 0 {
# commented by GJFB in 2021-03-24
# not used anymore
proc RemoveMetadata {metadata2List {removeOnly 0} {metadataList {}}} {
# runs with post
global metadataArray
global searchRepository
global commonWords
global maximumNumberOfEntries ;# defined in LoadGlobalVariables
# puts -2-$metadata2List--
# puts --$metadataList--
# Update abstract accelerator - added by GJFB in 2010-12-10
# get the difference between metadata2List and metadataList
array set newMetadataArray $metadataList
array set oldMetadataArray $metadata2List
# puts --[array names oldMetadataArray]--
set flag 0
foreach name [array names oldMetadataArray] {
# Update metadataArray
# if [info exists metadataArray($name)] {unset metadataArray($name)} ;# commented by GJFB in 2020-08-14
if {[info exists metadataArray($name)] && ![info exists newMetadataArray($name)]} {unset metadataArray($name)} ;# added by GJFB in 2020-08-14 to avoid unnecessary unset
# Update metadataArray - end
# if [regexp {abstract|synopsis} $name] # ;# commented by GJFB in 2020-08-14
if [regexp {abstract|synopsis|title} $name] { ;# added by GJFB in 2020-08-14
if [info exists newMetadataArray($name)] {
set flag 1 ;# metadata2List can be simplified
# puts "old == $oldMetadataArray($name)"
# puts "new == $newMetadataArray($name)"
regsub -all {[\.,;:]\s|\s['’"]|['’"]\s} [regsub -all {\s} " $oldMetadataArray($name) " { }] { } oldMetadataArray($name) ;# added by GJFB in 2020-08-14 - 'fim' "a'b" do resumo. -> fim a'b do resumo
regsub -all {[\.,;:]\s|\s['’"]|['’"]\s} [regsub -all {\s} " $newMetadataArray($name) " { }] { } newMetadataArray($name) ;# added by GJFB in 2020-08-14 - 'fim' "a'b" do resumo. -> fim a'b do resumo
set oldMetadataArray($name) [ListNegatedImplication oldMetadataArray($name) newMetadataArray($name)]
# puts "old = $oldMetadataArray($name)"
}
}
}
if $flag {
# use a simplified metadata2List
set metadata2List [array get oldMetadataArray] ;# added by GJFB in 2010-12-10
}
# Update abstract accelerator - end
# puts -2-$metadata2List--
${searchRepository}::CreateRepArray $metadata2List $commonWords 1 $removeOnly $maximumNumberOfEntries
}
}
# RemoveMetadata - end
# ----------------------------------------------------------------------
# RemoveMetadata2
# version 2 - 2020-08-18
proc RemoveMetadata2 {metadata2List {removeOnly 0}} {
# runs with post
global metadataArray
global searchRepository
global commonWords
global maximumNumberOfEntries ;# defined in LoadGlobalVariables
array set oldMetadataArray $metadata2List
# Update metadataArray
foreach name [array names oldMetadataArray] {
if [info exists metadataArray($name)] {unset metadataArray($name)}
}
# Update metadataArray - end
# Update repArray
${searchRepository}::CreateRepArray $metadata2List $commonWords 1 $removeOnly $maximumNumberOfEntries
# Update repArray - end
}
# RemoveMetadata2 - end
# ----------------------------------------------------------------------
# AddMetadata
# example: AddMetadata $metadataList
# use of metadata2List is made in UpdateCollection
if 0 {
# commented by GJFB in 2021-03-24
# not used anymore
proc AddMetadata {metadataList {metadata2List {}}} {
# runs with post
global metadataArray
global searchRepository
global commonWords
# puts =2-$metadata2List--
# puts =-$metadataList--
# Update metadataArray
array set metadataArray $metadataList
# Update metadataArray - end
# Update abstract accelerator - added by GJFB in 2010-12-10
# get the difference between metadataList and metadata2List
if ![string equal {} $metadata2List] {
array set newMetadataArray $metadataList
array set oldMetadataArray $metadata2List
set flag 0
foreach name [array names newMetadataArray] {
# if [regexp {abstract|synopsis} $name] # ;# commented by GJFB in 2020-08-14
if [regexp {abstract|synopsis|title} $name] { ;# added by GJFB in 2020-08-14
if [info exists oldMetadataArray($name)] {
set flag 1 ;# metadataList can be simplified
regsub -all {[\.,;:]\s|\s['’"]|['’"]\s} [regsub -all {\s} " $oldMetadataArray($name) " { }] { } oldMetadataArray($name) ;# added by GJFB in 2020-08-14 - 'fim' "a'b" do resumo. -> fim a'b do resumo
regsub -all {[\.,;:]\s|\s['’"]|['’"]\s} [regsub -all {\s} " $newMetadataArray($name) " { }] { } newMetadataArray($name) ;# added by GJFB in 2020-08-14 - 'fim' "a'b" do resumo. -> fim a'b do resumo
set newMetadataArray($name) [ListNegatedImplication newMetadataArray($name) oldMetadataArray($name)]
}
}
}
if $flag {
# use a simplified metadataList
set metadataList [array get newMetadataArray] ;# added by GJFB in 2010-12-10
}
}
# Update abstract accelerator - end
# puts =-$metadataList--
${searchRepository}::CreateRepArray $metadataList $commonWords
}
}
# AddMetadata - end
# ----------------------------------------------------------------------
# AddMetadata2
# version 2 - 2020-08-18
proc AddMetadata2 {metadataList} {
# runs with post
global metadataArray
global searchRepository
global commonWords
# Update metadataArray
array set metadataArray $metadataList
# Update metadataArray - end
# Update repArray
${searchRepository}::CreateRepArray $metadataList $commonWords
# Update repArray - end
}
# AddMetadata2 - end
# ----------------------------------------------------------------------
# UpdateMetadata
# updates metadataArray
# Example:
# set metadata2List [concat $metadata2List [GetMetadata $metadataRep-*]]
# UpdateMetadata $metadata2List
# removeOnly value is 0 or 1
# 1 means only remove (no add follows remove) - used when a repository is deleted
# use of metadataList is made in UpdateCollection
proc UpdateMetadata {metadata2List metadataList {removeOnly 0}} {
# runs with post
global metadataArray
global searchRepository
global commonWords
global maximumNumberOfEntries ;# defined in LoadGlobalVariables
array set newMetadataArray $metadataList
array set oldMetadataArray $metadata2List
set oldMetadataNameList [array names oldMetadataArray]
set newMetadataNameList [array names newMetadataArray]
set intersectionMetadataNameList [ListIntersection oldMetadataNameList newMetadataNameList]
# strictly old metadata
set strictlyOldMetadataNameList [ListNegatedImplication oldMetadataNameList newMetadataNameList]
foreach name $strictlyOldMetadataNameList {
if [info exists metadataArray($name)] {unset metadataArray($name)} ;# remove metadata
}
# strictly new metadata
set strictlyNewMetadataNameList [ListNegatedImplication newMetadataNameList oldMetadataNameList]
array set metadataArray $metadataList ;# add and update metadata
# update repArray
# distinctMetadataNameList
set distinctMetadataNameList {}
foreach name $intersectionMetadataNameList {
if ![string equal $oldMetadataArray($name) $newMetadataArray($name)] {
lappend distinctMetadataNameList $name
}
}
# atualOldMetadataArray
# atualNewMetadataArray
foreach name $distinctMetadataNameList {
if [regexp {abstract|synopsis|title} $name] {
regsub -all {[\.,;:]\s|\s['’"]|['’"]\s} [regsub -all {\s} " $oldMetadataArray($name) " { }] { } simplifiedOldMetadata ;# 'fim' "a'b" do resumo. -> fim a'b do resumo
regsub -all {[\.,;:]\s|\s['’"]|['’"]\s} [regsub -all {\s} " $newMetadataArray($name) " { }] { } simplifiedNewMetadata ;# 'fim' "a'b" do resumo. -> fim a'b do resumo
set simplifiedOldMetadata [lsort -unique $simplifiedOldMetadata]
set simplifiedNewMetadata [lsort -unique $simplifiedNewMetadata]
set atualOldMetadata [ListNegatedImplication simplifiedOldMetadata simplifiedNewMetadata]
if [llength $atualOldMetadata] {set atualOldMetadataArray($name) $atualOldMetadata}
set atualNewMetadata [ListNegatedImplication simplifiedNewMetadata simplifiedOldMetadata]
if [llength $atualNewMetadata] {set atualNewMetadataArray($name) $atualNewMetadata}
} else {
# other fields - added by GJFB in 2021-01-22
set atualOldMetadataArray($name) $oldMetadataArray($name)
set atualNewMetadataArray($name) $newMetadataArray($name)
}
}
# Compute the simplifiedMetadata2List containing just the necessary metadata to be removed in repArray
foreach name $strictlyOldMetadataNameList {
set atualOldMetadataArray($name) $oldMetadataArray($name)
}
if [info exists atualOldMetadataArray] {
# use a simplified metadata2List
set simplifiedMetadata2List [array get atualOldMetadataArray]
} else {
set simplifiedMetadata2List $metadata2List
}
${searchRepository}::CreateRepArray $simplifiedMetadata2List $commonWords 1 $removeOnly $maximumNumberOfEntries
# Compute the simplifiedMetadata2List containing just the necessary metadata to be removed in repArray - end
# Compute the simplifiedMetadataList containing just the necessary metadata to be added in repArray
foreach name $strictlyNewMetadataNameList {
set atualNewMetadataArray($name) $newMetadataArray($name)
}
if [info exists atualNewMetadataArray] {
# use a simplified metadataList
set simplifiedMetadataList [array get atualNewMetadataArray]
} else {
set simplifiedMetadataList $metadataList
}
# puts --$simplifiedMetadataList--
${searchRepository}::CreateRepArray $simplifiedMetadataList $commonWords
}
# UpdateMetadata - end
# ----------------------------------------------------------------------
# CreateExtraFields
## creates fields which are not part of EndNote, i.e., targetfile, lastupdate,
# creates fields which are part of the service directory, i.e., targetfile, lastupdate,
# metadatalastupdate, contenttype, hostcollection, site, size, numberoffiles,
# language, username, agreement
# used in UpdateCollection, LoadBiblioDB, StartService, UpdateMetadataBase and GetClipboard only
## not used in remote submission
# repositoryProperties -> metadataList
# or referenceTable -> metadataList (childrepositories and parentrepositories cases)
# or service -> metadataList (visibility, identifier, transferableflag and citingitemlist cases)
# or agreement -> metadataList
# site is the server address (e.g., banon-pc2 19050)
proc CreateExtraFields {metadataRep site} {
# runs with post
global errorInfo
global environmentArray
set error 1 ;# needed to know if an error has actually occurred within the catch (because catch returns 1 when an error was catch before by another catch, e.g. by catch {puts $sock $query} in PutQuery)
set errorInfo {} ;# needed in order to get the correct return value when no error occurs
if [catch {
global repositoryProperties
global homePath
# puts [CallTrace]
set repName [ReturnRepositoryName $metadataRep]
set metadataList {}
# Add the targetfile field
if [info exists repositoryProperties($repName,targetfile)] {
set targetFile $repositoryProperties($repName,targetfile)
# puts $targetFile
set metadataList [concat $metadataList [list $metadataRep-0,targetfile $targetFile]]
}
# Add the targetfile field - end
# Add the last update fields
if [info exists repositoryProperties($metadataRep,history)] {
# set versionStamp [lindex $repositoryProperties($metadataRep,history) end]
set versionStamp [GetVersionStamp $metadataRep]
set metadataList [concat $metadataList [list $metadataRep-0,metadatalastupdate $versionStamp]]
}
if [info exists repositoryProperties($repName,history)] {
# set versionStamp [lindex $repositoryProperties($repName,history) end]
set versionStamp [GetVersionStamp $repName]
set metadataList [concat $metadataList [list $metadataRep-0,lastupdate $versionStamp]]
# set xxx [CallTrace]
# Store xxx C:/tmp/aaa auto 0 a
## Tcl Call Trace
## 5: CreateExtraFields iconet.com.br/banon/2000/12.30.22.40.05 banon-pc.dpi.inpe.br:1905
## 4: UpdateMetadataBase iconet.com.br/banon/2000/12.30.22.40.05 metadataList metadata2List banon-pc.dpi.inpe.br:1905 update
## 3: CheckMetadataConsistency iconet.com.br/banon/2000/12.30.22.40.05-0 10
## 2: GetMetadataRepositories 0 {repository, iconet.com.br/banon/2000/12.30.22.40} no no 1 metadatalastupdate
## 1: ServeLocalCollection sock22 150.163.8.245
## Tcl Call Trace - end
# set xxx [list versionStamp = $versionStamp]
# Store xxx C:/tmp/aaa auto 0 a
}
# Add the last update fields - end
# Add the contenttype field
if [info exists repositoryProperties($repName,type)] {
set contentType $repositoryProperties($repName,type)
set metadataList [concat $metadataList [list $metadataRep-0,contenttype $contentType]]
}
# Add the contenttype field - end
# Add the copyright field
if [info exists repositoryProperties($repName,copyright)] {
set copyright $repositoryProperties($repName,copyright)
set metadataList [concat $metadataList [list $metadataRep-0,copyright $copyright]]
}
# Add the copyright field - end
# Add the hostcollection field
if [info exists repositoryProperties($repName,hostcollection)] {
# if [GetDocumentState $repName] # ;# commented by GJFB in 2015-11-16 - metadataList should be identical to repositoryProperties to avoid missinterpretation
## the document is the original
set hostCollection $repositoryProperties($repName,hostcollection)
set hostCollection [lrange $hostCollection 0 end] ;# added by GJFB in 2012-05-03 - turn hostCollection a list without new lines - useful for old data format
set metadataList [concat $metadataList [list $metadataRep-0,hostcollection $hostCollection]]
# #
}
# Add the hostcollection field - end
# Add the site field
set metadataList [concat $metadataList [list $metadataRep-0,site $site]]
# Add the site field - end
# Add the size field
if [info exists repositoryProperties($repName,size)] {
set size $repositoryProperties($repName,size)
set metadataList [concat $metadataList [list $metadataRep-0,size $size]]
}
# Add the size field - end
# Add the numberoffiles field
if [info exists repositoryProperties($repName,numberoffiles)] {
set numberOfFiles $repositoryProperties($repName,numberoffiles)
set metadataList [concat $metadataList [list $metadataRep-0,numberoffiles $numberOfFiles]]
}
# Add the numberoffiles field - end
# Add the language field
if [info exists repositoryProperties($repName,language)] {
set language $repositoryProperties($repName,language)
regexp {\[(.*)\]} $language m language ;# English {[en]} -> en
set metadataList [concat $metadataList [list $metadataRep-0,language $language]]
}
# Add the language field - end
# Add the textlanguage field
# added by GJFB in 2013-02-11 to search for the proper metadata repository based on its language and display the corresponding entry in the proper language
# useful for multiple language document to display resume or archival unit document in the proper language
if [info exists repositoryProperties($metadataRep,language)] {
set language $repositoryProperties($metadataRep,language)
regexp {\[(.*)\]} $language m language ;# English {[en]} -> en
set metadataList [concat $metadataList [list $metadataRep-0,textlanguage $language]]
}
# Add the textlanguage field - end
# Add username
if [info exists repositoryProperties($repName,username)] {
set userName $repositoryProperties($repName,username)
set metadataList [concat $metadataList [list $metadataRep-0,username $userName]]
}
# Add username - end
# Add authenticatedusers/readergroup
if [info exists repositoryProperties($repName,authenticatedusers)] {
set readerGroup $repositoryProperties($repName,authenticatedusers)
set metadataList [concat $metadataList [list $metadataRep-0,readergroup $readerGroup]]
}
# Add authenticatedusers/readergroup - end
# Add childrepositories field
set childRepositories [GetCitingRepositoryList $repName]
# Drop the metadataRep from the childRepositories
set i [lsearch -exact $childRepositories $metadataRep]
set childRepositories [lreplace $childRepositories $i $i]
# Drop the metadataRep from the childRepositories - end
if ![string equal {} $childRepositories] {
set metadataList [concat $metadataList [list $metadataRep-0,childrepositories $childRepositories]]
}
# Add childrepositories field - end
# Add parentrepositories field
set parentRepositories [GetCitedRepositoryList $repName]
if ![string equal {} $parentRepositories] {
set metadataList [concat $metadataList [list $metadataRep-0,parentrepositories $parentRepositories]]
}
# Add parentrepositories field - end
# Add readpermission field
if 0 {
# new code below
if [info exists repositoryProperties($repName,docpermission)] {
set docPermission $repositoryProperties($repName,docpermission)
# puts 1-$docPermission
regsub -all "\n" $docPermission { and } readPermission
set metadataList [concat $metadataList [list $metadataRep-0,readpermission $readPermission]]
}
}
# administratorUserName
regsub {@.*$} $environmentArray(spMailEntry) {} administratorUserName
# ipAddress
set ipAddress $environmentArray(ipAddress)
# compute default access
foreach {defaultAuthenticationFlag spDocAccessPermission spDownloadAccessPermission directivesForCGI} [ComputeDefaultAccess $ipAddress 1] {break}
# compute access
foreach {authDirectives docPermission downloadPermission} [ComputeAccess $repName $administratorUserName $defaultAuthenticationFlag $spDocAccessPermission $spDownloadAccessPermission $ipAddress 1] {break}
# puts 2-$docPermission
if ![string equal {} $docPermission] {
# set docPermission2 [string trim $docPermission \n] ;# added by GJFB in 2011-04-10
set docPermission2 [string trim $docPermission] ;# added by GJFB in 2015-04-19 - tab must be trimmed as well (otherwise, Permission and Remote Permission in Dialog doesn't work properly)
regsub -all "\n" $docPermission2 { and } readPermission
set metadataList [concat $metadataList [list $metadataRep-0,readpermission $readPermission]]
}
# Add readpermission field - end
# puts [CallTrace]
# Add visibility field
if [file exists $homePath/col/$repName/service/visibility] {
LoadService $repName visibility visibility 1 1
set metadataList [concat $metadataList [list $metadataRep-0,visibility [expr $visibility?{hidden}:{shown}]]]
}
# Add visibility field - end
# Add identifier field
if [file exists $homePath/col/$repName/service/identifier] {
LoadService $repName identifier identifier 1 1
set metadataList [concat $metadataList [list $metadataRep-0,identifier $identifier]]
}
# Add identifier field - end
# Add transferableflag field
if [file exists $homePath/col/$repName/service/transferableFlag] {
LoadService $repName transferableFlag transferableFlag 1 1
set metadataList [concat $metadataList [list $metadataRep-0,transferableflag $transferableFlag]]
}
# Add transferableflag field - end
# Add agreement field
set dir $homePath/col/$repName/agreement
if [file isdirectory $dir] {
set fileList {}
DirectoryContent fileList $dir $dir
set metadataList [concat $metadataList [list $metadataRep-0,agreement $fileList]]
}
# Add agreement field - end
# Add the citingitemlist field
# added by GJFB in 2024-01-21 - citingItemList is used by robust hyperlinks
if [file exists $homePath/col/$repName/service/citingItemList] {
source $homePath/col/$repName/service/citingItemList ;# citingArray
# Reduce to the 3 most frequent citing
# same code in UpdateCitingItemList
set citingList {}
foreach {repository frequency} [array get citingArray] {
lappend citingList [list $repository $frequency]
}
set value [lrange [lsort -integer -decreasing -index 1 $citingList] 0 2]
# Reduce to the 3 most frequent citing - end
set metadataList [concat $metadataList [list $metadataRep-0,citingitemlist $value]]
}
# Add the citingitemlist field - end
set error 0 ;# no error has occurred
return $metadataList
} m] {
if !$error {return $m}
lappend message "CreateExtraFields ([clock format [clock seconds]]):"
lappend message [CallTrace]
set log [join $message \n]
puts $log
Store log $homePath/@errorLog auto 0 a
error $m $errorInfo
}
}
# CreateExtraFields - end
# ----------------------------------------------------------------------
# UpdateSiteList
# Include/exclude Archive
# Updates the file @siteList.txt in the local bibliographic mirror repository.
# used only by InformURLibSystem
# siteRepIp is the list consisting of eight elements:
# archiveaddress the archive internet address,
# archiveserviceibi the archive local collection index ibi,
# archiveip the archive ip address,
# archiveprotocol the archive protocol,
# archiveplatformversion the archive URLibService repository last update,
# archiveadmemailaddress the archive administrator e-mail address
# agencyResolverAddress
# staticIPFlag
# called by Script in 'Resolver service for IBI generation and archive inclusion/exclusion' in col/urlib.net/www/2014/03.22.01.53/doc/cgi/script.tcl
# Examples:
# banon-pc.dpi.inpe.br:1906 dpi.inpe.br/banon/1999/09.07.13.24 150.163.8.245
# {mtc-m16d.sid.inpe.br 806} sid.inpe.br/mtc-m19@80/2009/08.21.17.02 150.163.34.248 USP 2020:03.22.18.45.55 bibdigital@inpe.br licuri.ibict.br 1
# {vaio 19050} dpi.inpe.br/banon/1999/01.09.22.14 192.168.0.102 USP 2020:05.24.17.29.52 gerald.banon@gmail.com 0 0
# {gjfb0520.sid.inpe.br 806} dpi.inpe.br/banon/2001/02.23.19.23 150.163.34.249 USP 2020:05.16.03.00.18 banon@dpi.inpe.br {} 1
# localCollectionPassword is the local collection password stored in service of loCoInRep
# it used to allow local collection with dynamic IP, updating @siteList.txt
## update of localCollectionPasswordArray.tcl requires executing unpost/post
# unpostFlag value is 0 or 1; 1 means that the remote local collection is beeing unposted
# @siteList.txt doesn't contain the reference to the current (i.e., local) site
# new version by GJFB in 2010-08-03 for security reason (to control access from dynamic IP)
proc UpdateSiteList {siteRepIp {localCollectionPassword {}} {unpostFlag 0}} {
# runs with post
global loBiMiRep
global loCoInRep
global col
# global localCollectionIndexDBRepository ;# commented by GJFB in 2010-08-04
# global localCollectionPasswordArray ;# added by GJFB in 2010-08-03 - commented by GJFB in 2020-05-23
# return 1 ;# for testing communication
if 0 {
# old code
if {![info exists localCollectionPasswordArray] && \
([file exists $col/$loBiMiRep/auxdoc/localCollectionPasswordArray.tcl] || \
[file exists $col/$loBiMiRep/auxdoc/localCollectionPasswordArrayBackup.tcl])} {
SourceWithBackup $col/$loBiMiRep/auxdoc/localCollectionPasswordArray.tcl localCollectionPasswordArray ;# set localCollectionPasswordArray
# localCollectionPasswordArray: loCoInRep |-> localCollectionPassword
# example: set localCollectionPasswordArray(dpi.inpe.br/banon/1999/01.09.22.14) 896322016416
# localCollectionPasswordArray must contain the local collection passwords of all the created local collections
}
} else {
if 0 {
# commented by GJFB in 2020-05-23
# new code by GJFB in 2014-11-03 - for security reason localCollectionPasswordArray must be updated manually
if [file exists $col/$loBiMiRep/auxdoc/localCollectionPasswordArray.tcl] {
set mTime [file mtime $col/$loBiMiRep/auxdoc/localCollectionPasswordArray.tcl]
} else {
set mTime 0
}
if [file exists $col/$loBiMiRep/auxdoc/sourceTime] {
Load $col/$loBiMiRep/auxdoc/sourceTime sourceTime
} else {
set sourceTime 0
}
# $mTime > $sourceTime means that localCollectionPasswordArray.tcl has been updated manually and should be sourced
# localCollectionPasswordArray
if {(![info exists localCollectionPasswordArray] || $mTime > $sourceTime) && \
([file exists $col/$loBiMiRep/auxdoc/localCollectionPasswordArray.tcl] || \
[file exists $col/$loBiMiRep/auxdoc/localCollectionPasswordArrayBackup.tcl])} {
SourceWithBackup $col/$loBiMiRep/auxdoc/localCollectionPasswordArray.tcl localCollectionPasswordArray ;# source the most recent file - set localCollectionPasswordArray
set sourceTime [clock seconds]
Store sourceTime $col/$loBiMiRep/auxdoc/sourceTime
# localCollectionPasswordArray: loCoInRep |-> localCollectionPassword
# example: set localCollectionPasswordArray(dpi.inpe.br/banon/1999/01.09.22.14) 896322016416
# localCollectionPasswordArray must contain the local collection passwords of all the created local collections
}
} else {
# added by GJFB in 2020-05-23 - simplifying
SourceWithBackup $col/$loBiMiRep/auxdoc/localCollectionPasswordArray.tcl localCollectionPasswordArray 1 ;# source the most recent file - set localCollectionPasswordArray
}
}
# site index (of the remote collection)
## foreach {site index ip} $siteRepIp {break}
## ip not used
foreach {site index} $siteRepIp {break}
if 0 {
# old scheme
if ![info exists localCollectionPasswordArray($index)] {return}
if ![string equal $localCollectionPassword $localCollectionPasswordArray($index)] {return}
} else {
# communication scheme step 5
if ![info exists localCollectionPasswordArray($index)] {return 2} ;# do nothing - Archive not yet registered - added by GJFB in 2014-11-04 for security reason
if ![string equal $localCollectionPassword $localCollectionPasswordArray($index)] {return 3} ;# do nothing - unfair request - wrong localCollectionPassword - added by GJFB in 2014-11-04 for security reason
}
# siteWithIP (of the remote collection)
set serverAddress [ReturnCommunicationAddress $site] ;# server address of the remote collection
# foreach {serverName urlibPort} $serverAddress {break}
# set siteWithIP [list $ip $urlibPort]
## Inclusion/exclusion confirmation
if !$unpostFlag { ;# if added by GJFB in 2018-05-25
# Inclusion confirmation
## security issue
if 0 {
# using USP (URLibService protocol)
# communication scheme step 3
set command [list list ReturnConfirmation]
# MULTIPLE SUBMIT
# set siteRepIpConfirmation [MultipleExecute [list $siteWithIP] $command] ;# commented by GJFB in 2010-12-08 - banon-pc3 returns to urlib.net (not ismm.dpi.inpe.br) when using ip 187.106.147.7 (provided by net)
# puts --$serverAddress-- ;# only port 1905 is allowed from dpi.inpe.br
# set siteRepIpConfirmation [MultipleExecute [list $serverAddress] $command] ;# added by GJFB in 2010-12-08 - banon-pc3 doesn't return when using an empty domain name - this is the correct behavior
set confirmation [MultipleExecute [list $serverAddress] $command] ;# added by GJFB in 2010-12-08 - banon-pc3 doesn't return when using an empty domain name - this is the correct behavior
} else {
# using HTTP
package require http
# servicesubject=inclusionConfirmationRequest
# communication scheme step 3
set queryString servicesubject=inclusionConfirmationRequest
set site2 [ReturnHTTPHost $site]
## J8LNKB5R7W/3FTRH3S == Archive service for IBI resolution
# http://gjfb0520.sid.inpe.br/dpi.inpe.br/banon/2001/02.23.19.23?servicesubject=inclusionConfirmationRequest
# http://licuri.ibict.br/urlib.net/www/2017/10.16.01.16?servicesubject=inclusionConfirmationRequest
# => confirmation yes
# GETURL
# if [catch {http::geturl [ConvertURLToHexadecimal http://$site2/J8LNKB5R7W/3FTRH3S?$queryString]} token] #
if [catch {http::geturl [ConvertURLToHexadecimal http://$site2/$index?$queryString 1]} token] {
# puts --$token-- ;# error message - --couldn't open socket: connection refused--
# set siteRepIpConfirmation {} ;# no response
set confirmation {} ;# no response
} else {
# geturl returned
if [string equal {404} [::http::ncode $token]] {
# not found
# puts {not found}
# set siteRepIpConfirmation {} ;# no response
set confirmation {} ;# no response
} else {
# puts OK
# set siteRepIpConfirmation [string trimright [http::data $token]]
set confirmation [string trimright [http::data $token]]
}
http::cleanup $token
}
}
# puts --$confirmation--
# if [string equal {} $siteRepIpConfirmation] #
if [string equal {} $confirmation] {
# no response
# probably a local collection using dynamic IP - use the local collection password to confirm
# local collection using dynamic IP cannot be registred for security reason
set staticIPFlag 0 ;# added by GJFB in 2010-08-14
# use as siteRepIp the proper argument of the proc
} else {
# confirmation received
set staticIPFlag 1 ;# added by GJFB in 2010-08-14
if [string equal $index $loCoInRep] {
# remote == current - don't add
return $staticIPFlag ;# return 1 - if left empty, one cannot create a new repository
}
if 0 {
# commented by GJFB in 2014-11-03
# for security reason localCollectionPasswordArray must be updated manually
# it is updated manually only in urlib.net at installation of a new collection
if {![info exists localCollectionPasswordArray($index)] || \
[string equal {} $localCollectionPasswordArray($index)]} {
# new local collection using static IP - register the localCollectionPassword
# registry is important because a local collection may become using dynamic IP in the future
set localCollectionPasswordArray($index) $localCollectionPassword
StoreArrayWithBackup localCollectionPasswordArray $col/$loBiMiRep/auxdoc/localCollectionPasswordArray.tcl w list
}
}
}
# Inclusion confirmation - end
} else {
set staticIPFlag {} ;# added by GJFB in 2018-05-25 - force staticIPFlag to empty (used in MultipleSubmit)
}
# siteList
LoadWithBackup $col/$loBiMiRep/doc/@siteList.txt fileContent
set fileContent [string trim $fileContent " \t\n"] ;# drop leading and trailing blank lines
regsub -all "\n+" $fileContent "\n" fileContent
set siteList [split $fileContent \n]
# if $unpostFlag {set staticIPFlag {}} ;# added by GJFB in 2010-09-20 - the collection is being unposted - force staticIPFlag to empty (used in MultipleSubmit) - commented by GJFB in 2018-05-25 (now above)
set flag 1 ;# siteList must be updated to include a new local collection
set siteList2 {}
foreach siteRepIp2 $siteList {
# index2
set index2 [lindex $siteRepIp2 1] ;# remote loCoInRep in @siteList.txt of the resolver
if [string equal $index2 $index] {
# update
set agencyResolverAddress2 [lindex $siteRepIp2 6] ;# remote agencyResolverAddress in @siteList.txt of the resolver - added by GJFB in 2017-02-20 - part of the agency structure code
set siteRepIp [lreplace $siteRepIp 6 6 $agencyResolverAddress2] ;# maintain the agencyResolverAddress value contained in @siteList.txt - added by GJFB in 2017-02-20 - part of the agency structure code
lappend siteList2 [concat $siteRepIp $staticIPFlag] ;# added by GJFB in 2010-08-14
set flag 0
} else {
# let unchange
lappend siteList2 $siteRepIp2
}
}
if $flag {
# add
# if $unpostFlag #
if 0 {
# the index should be previously registered - abnormal state
# added by GJFB in 2013-06-29 in order to avoid adding a new entry at unpost - sometimes at unpost the URLib server is in an abnormal state (in this case it has been observed that siteRepIpConfirmation above contains outputs of GetMetadataRepositories before the expected value)
StoreLog alert UpdateSiteList "unexpected value for siteRepIpConfirmation: $siteRepIpConfirmation"
} else {
# the index was not previously registered
lappend siteList2 [concat $siteRepIp $staticIPFlag] ;# added by GJFB in 2010-08-14
set agencyResolverAddress2 [lindex $siteRepIp 6] ;# the agencyResolverAddress value defined at installation of the remote Archive - added by GJFB in 2017-02-20 - part of the agency structure code
}
}
set fileContent2 [join $siteList2 \n]
# SAVE
StoreWithBackup fileContent2 $col/$loBiMiRep/doc/@siteList.txt
# return $staticIPFlag ;# added by GJFB in 2010-08-23 - commented by GJFB in 2017-02-20
# puts [list $staticIPFlag $agencyResolverAddress2]
# return [list $staticIPFlag $agencyResolverAddress2] ;# added by GJFB in 2017-02-20 - part of the agency structure code - commented by GJFB in 2022-06-06
return [list [list $staticIPFlag $agencyResolverAddress2]] ;# added by GJFB in 2022-06-06 - list is required because UpdateSiteList is remotely call using MultipleExecute (see resolver service for archive inclusion and exclusion - id J8LNKB5R7W/3FUQHC5)
}
## set loCoInRep dpi.inpe.br/banon/1999/01.09.22.14
# set loBiMiRep dpi.inpe.br/banon/1999/06.19.17.00
# set addr 200.210.103.243
# set col ../../../../..
# source cgi/mirrorfind-.tcl
# source utilities1.tcl
## source utilities2.tcl
# UpdateSiteList [list ntserver.iconet.com.br:1905 iconet.com.br/banon/2000/10.18.19.50 200.210.103.243 {2000:03.25.23.09.12 dpi.inpe.br/banon/1999/01.09.22.14} banon@iconet.com.br]
# UpdateSiteList - end
# ----------------------------------------------------------------------
# GetSiteList
# used in change.tcl
proc GetSiteList {input} {
global loBiMiRep
global col
if {[Compress $input] == "les.livres.sont.nos.amis"} {
Load $col/$loBiMiRep/doc/@siteList.txt fileContent
set fileContent [string trim $fileContent " \n"]
regsub -all "\n+" $fileContent "\n" fileContent
set siteList [split $fileContent \n]
} else {
set siteList {}
}
return $siteList
}
# GetSiteList - end
# ----------------------------------------------------------------------
# TestExecute
proc TestExecute {x} {
# global TestExecute
# after 10000 {set TestExecute 1}
# vwait TestExecute
return $x
}
# TestExecute - end
# ----------------------------------------------------------------------
# GetSiteStamp
# used in InformURLibSystem and TransferCopyright only
proc GetSiteStamp {} {
global col
global URLibServiceRepository
global loCoInRep
global environmentArray
global serverAddress
# set serverAddress [GetServerAddress] ;# could be drop using global serverAddress
set ip $environmentArray(ipAddress)
Load $col/$URLibServiceRepository/service/history history
set lastUpdate [lindex [lindex $history end] 0] ;# just date
set administratorEMailAddress $environmentArray(spMailEntry)
set archiveProtocol USP ;# USP (URlibService Protocol) or HTTP (Hypertext Transfer Protocol)
LoadService $loCoInRep agencyResolverAddress agencyResolverAddress 1 1 ;# added by GJFB in 2017-02-20 - part of the agency structure code
# return [list $serverAddress $loCoInRep $ip $archiveProtocol $lastUpdate $administratorEMailAddress] ;# commented by GJFB in 2017-02-20
return [list $serverAddress $loCoInRep $ip $archiveProtocol $lastUpdate $administratorEMailAddress $agencyResolverAddress] ;# added by GJFB in 2017-02-20 - part of the agency structure code
}
# GetSiteStamp
# ----------------------------------------------------------------------
# ReturnConfirmation
# used in UpdateSiteList and Script (urlib.net/www/2014/03.16.03.40) only
proc ReturnConfirmation {} {
return {confirmation yes} ;# could be anything but not empty
}
# ReturnConfirmation
# ----------------------------------------------------------------------
# InformURLibSystem
# Used in:
# post
# SPDialog (SPDialog.tcl)
# unpostFlag value is 0 or 1; 1 means that the local collection is beeing unposted
proc InformURLibSystem {{unpostFlag 0}} {
# runs with post
global homePath
global URLibServiceRepository
global serverAddress ;# set in LoadGlobalVariables
# global serverAddressWithIP ;# set in LoadGlobalVariables
global urlibServerAddress ;# set in LoadGlobalVariables
global loCoInRep
global loBiMiRep
# global staticIPFlag ;# set in this procedure - used in CreateEnvironmentArray (see StartServer.tcl) MakeRepository
global staticIPFlag ;# set in this procedure - used in MakeRepository (see DDDialog.tcl) and CreateFullEntry (see utilitiesMirror.tcl)
global environmentArray ;# changed temporarily in this procedure
global installInitialCollection ;# set in LoadGlobalVariables
global ipChangeFlag ;# set in post
global resolverIndexRepository ;# added by GJFB in 2017-12-21 to identify if the URLibService is running or not the urlib.net resolver
if [file exists $homePath/readOnlySite] {return}
# if {[string equal $serverAddress $urlibServerAddress] || [string equal www.$serverAddress $urlibServerAddress]} {return 1} - commented by GJFB in 2017-12-21
if [string equal $resolverIndexRepository $loCoInRep] {return 1} ;# added by GJFB in 2017-12-21
# about the file $homePath/@informURLibSystemFlag
# the file $homePath/@informURLibSystemFlag is created or removed manually only
# it is used when creating a copy of a local collection on a new host and the post command is run for testing on this new host
# this is useful when preparing a local collection migration between hosts
# the contain of $homePath/@informURLibSystemFlag is 0 or 1
# 1 must be used when the host has a static IP otherwise 0 must be used
# after migration the file $homePath/@informURLibSystemFlag must removed
if [file exists $homePath/@informURLibSystemFlag] { ;# added by GJFB in 2018-10-14 - to prepare a local collection migration between hosts
Load $homePath/@informURLibSystemFlag informURLibSystemFlag
set log "the local collection which index is $loCoInRep is a copy of an original local collection, its staticIPFlag was set to $informURLibSystemFlag (see $homePath/@informURLibSystemFlag file)"
puts [StoreLog {warning} {InformURLibSystem (1)} $log]
return $informURLibSystemFlag
}
# not the resolver urlib.net
if 0 {
# not used
# localCollectionPassword
if ![file exists $homePath/col/$URLibServiceRepository/auxdoc/localCollectionPassword] {
# localCollectionPassword file doesn't exist
regsub {0\.} [expr [SortRandomNumber]/double(233280)] {} localCollectionPassword
set data [Shift $loCoInRep $localCollectionPassword]
Store data $homePath/col/$URLibServiceRepository/auxdoc/localCollectionPassword binary 1
} else {
# localCollectionPassword file already exists
Load $homePath/col/$URLibServiceRepository/auxdoc/localCollectionPassword data binary
set data [UnShift $data]
set localCollectionPassword [lindex $data end]
}
}
if 0 {
# commented by GJFB in 2017-10-15 - now below - loCoInRep is not known at installation
if [LoadService $loCoInRep registrationPassword registrationPassword 1 1] {
# corrupted password
set log "\[[clock format [clock seconds] -format %Y:%m.%d.%H.%M.%S]\] InformURLibSystem (1): $loCoInRep has a corrupted registration password\n"
puts $log
Store log $homePath/@errorLog auto 0 a
return
}
}
# puts "Registration key for $loCoInRep: $registrationPassword" ;# useful to register an Archive within the IBI resoltion system
set environmentArrayFlag [info exists environmentArray(sitesHavingReadPermission)]
if $environmentArrayFlag {
set sitesHavingReadPermission $environmentArray(sitesHavingReadPermission)
set environmentArray(sitesHavingReadPermission) {{Main Site}} ;# to allow confirmation of the output of GetSiteStamp by urlib.net (see UpdateSiteList) - otherwise UpdateSiteList might return 0 even for static IP (for example, when sitesHavingReadPermission is {{No Sites}}). In this case the domain name will be set to empty.
}
if $installInitialCollection {
set staticIPFlag 0
} else {
if [LoadService $loCoInRep registrationPassword registrationPassword 1 1] { ;# added by GJFB in 2017-10-15 - loCoInRep is not known at installation
# corrupted password
# set log "\[[clock format [clock seconds] -format %Y:%m.%d.%H.%M.%S]\] InformURLibSystem (1): $loCoInRep has a corrupted registration password\n"
# puts $log
# Store log $homePath/@errorLog auto 0 a
set log "$loCoInRep has a corrupted registration password"
puts [StoreLog {alert} {InformURLibSystem (2)} $log]
return
}
set siteStamp [GetSiteStamp]
# MULTIPLE SUBMIT
# UPDATESITELIST
# set staticIPFlag {} ;# reply of MultipleSubmit - must be global
if 0 {
# using USP (URLibService protocol)
set query [list list UpdateSiteList $siteStamp $registrationPassword $unpostFlag] ;# added by GJFB in 2010-09-20
# puts $query
if 0 {
set staticIPFlag {} ;# reply of MultipleSubmit - must be global
MultipleSubmit {} $query staticIPFlag 1 [list {www.urlib.net 800}] ;# used to update auxdoc/localCollectionPasswordArray.tcl and doc/@siteList.txt
} else {
# added by GJFB in 2012-12-19 to avoid using MultipleSubmit with empty pid
# set staticIPFlag [MultipleExecute [list {www.urlib.net 800}] $query 1] ;# scenario 1 - commented by GJFB in 2017-02-20
foreach {staticIPFlag agencyResolverAddress} [MultipleExecute [list {www.urlib.net 800}] $query] {break} ;# default scenario 0 - added by GJFB in 2017-02-20 - part of the agency structure code
# set staticIPFlag [MultipleExecute [list {gjfb.home 800}] $query 1]
# set staticIPFlag [Execute {gjfb 800} [list UpdateSiteList [GetSiteStamp] $registrationPassword $unpostFlag]]
}
} else {
# using HTTP
package require http ;# see online manual
# Convert URLibServive format to norm format
# communication scheme step 2
# set siteStampListForArray [ConvertSimpleListToListForArray {archiveaddress archiveserviceibi archiveip archiveprotocol archiveplatformversion archiveadmemailaddress} $siteStamp] ;# commented by GJFB in 2017-02-20
set siteStampListForArray [ConvertSimpleListToListForArray {archiveaddress archiveserviceibi archiveip archiveprotocol archiveplatformversion archiveadmemailaddress agencyresolveraddress} $siteStamp] ;# added by GJFB in 2017-02-20 - part of the agency structure code
if $unpostFlag {
set queryList servicesubject=exclusionRequest
} else {
set queryList servicesubject=inclusionRequest
}
foreach {name value} $siteStampListForArray {
lappend queryList $name=$value
}
foreach {name value} $siteStampListForArray {
if {$installInitialCollection && [string equal archiveserviceibi $name]} {
lappend queryList $name= ;# added by GJFB in 2016-04-28 - value of archiveserviceibi (loCoInRep) is empty at installation (loCoInRep is unknown before installation)
} else {
lappend queryList $name=$value
}
}
lappend queryList registrationkey=$registrationPassword ;# used in UpdateSiteList - should be encrypted
set queryString [join $queryList &]
# Convert URLibServive format to norm format - end
# set site2 www.urlib.net
set site2 [ReturnHTTPHost $urlibServerAddress] ;# www.urlib.net
# set site2 gjfb.home
# puts http://$site2/J8LNKB5R7W/3FUQHC5?$queryString
# =>
# http://www.urlib.net/J8LNKB5R7W/3FUQHC5?servicesubject=inclusionRequest&archiveaddress=gjfb.home+800&archiveserviceibi=dpi.inpe.br/banon/1999/01.09.22.14&archiveip=192.168.1.31&archiveprotocol=USP&archiveplatformversion=2014:10.04.01.25.28&archiveadmemailaddress=gerald.banon@gmail.com®istrationkey=896322016461
# http://www.urlib.net/J8LNKB5R7W/3FUQHC5?servicesubject=inclusionRequest&archiveaddress=gjfb.home+800&archiveserviceibi=dpi.inpe.br/banon/1999/01.09.22.14&archiveip=192.168.1.31&archiveprotocol=USP&archiveplatformversion=2014:10.04.01.25.28&archiveadmemailaddress=gerald.banon@gmail.com®istrationkey=896322016461&agencyresolveraddress=
# http://www.urlib.net/J8LNKB5R7W/3FUQHC5?servicesubject=exclusionRequest&archiveaddress=gjfb.home+800&archiveserviceibi=dpi.inpe.br/banon/1999/01.09.22.14&archiveip=192.168.1.31&archiveprotocol=USP&archiveplatformversion=2014:10.04.01.25.28&archiveadmemailaddress=gerald.banon@gmail.com®istrationkey=896322016461
# http://gjfb:1905/J8LNKB5R7W/3FUQHC5?servicesubject=exclusionRequest&archiveaddress=gjfb.home+800&archiveserviceibi=dpi.inpe.br/banon/1999/01.09.22.14&archiveip=192.168.1.31&archiveprotocol=USP&archiveplatformversion=2014:10.04.01.25.28&archiveadmemailaddress=gerald.banon@gmail.com®istrationkey=896322016461&agencyresolveraddress=
# J8LNKB5R7W/3FUQHC5 == Resolver service for IBI archive registration
# include Archive (2)
# exclude Archive (7)
# GETURL
if [catch {http::geturl [ConvertURLToHexadecimal http://$site2/J8LNKB5R7W/3FUQHC5?$queryString 1]} token] {
# puts --$token--
set staticIPFlag {} ;# no response
} else {
# geturl returned
if [string equal {404} [::http::ncode $token]] {
# not found
set log {404 - not found}
puts [StoreLog {error} {InformURLibSystem (3)} $log]
set staticIPFlag {} ;# no response
} else {
# puts OK
set resolverResponse [string trimright [http::data $token]]
# puts --$resolverResponse-- ;# >>> resolverResponse may content an error message
if [regexp {^<(.*)>$} $resolverResponse m errorMessage] {
set log $errorMessage
puts [StoreLog {error} {InformURLibSystem (4)} $log]
set staticIPFlag {}
} else {
set {responseArray(nothing to return)} {nothing to return}
if [catch {array set responseArray $resolverResponse} m] { ;# added by GJFB in 2016-04-02
# list element in quotes followed by ":" instead of space
# puts --$resolverResponse-- ;# >>> resolverResponse may content an error message
# => --can't read "responseArray({})": no such element in array--
# => --can't read "staticIPFlag": no such variable--
set log $m\n--$resolverResponse--
puts [StoreLog {error} {InformURLibSystem (5)} $log] ;# added by GJFB in 2022-03-05
set staticIPFlag {} ;# no response - urlib.net need to be reposted, it returns "error writing "sock7": broken pipe"
} else {
ConditionalSet archiveStatus responseArray(status.archive) {}
ConditionalSet confirmationStatus responseArray(status.confirmation) {}
set staticIPFlag {}
if [string equal {included} $archiveStatus] {
set staticIPFlag [string equal {successful} $confirmationStatus] ;# 0 (dynamic IP or firewall problem), 1 (static IP) or empty (not registered, wrong key or unposted)
ConditionalSet agencyResolverAddress responseArray(agencyresolveraddress) {} ;# agencyresolveraddress is optional - added by GJFB in 2017-02-20 - part of the agency structure code
if [string equal {} $agencyResolverAddress] {
file delete $homePath/col/$loCoInRep/service/agencyResolverAddress
} else {
StoreService agencyResolverAddress $loCoInRep agencyResolverAddress 1 1 ;# added by GJFB in 2017-02-20 - part of the agency structure code - the value of agencyResolverAddress is stored in service/agencyResolverAddress but at the moment this (updated) value is not used by the URLibService
}
# Inform the agency resolver as well
if {![string equal {} $agencyResolverAddress] && ![string equal [ReturnHTTPHost $serverAddress] $agencyResolverAddress]} {
if ![catch {http::geturl [ConvertURLToHexadecimal http://$agencyResolverAddress/J8LNKB5R7W/3FUQHC5?$queryString 1]} token] { ;# added by GJFB in 2017-02-20 - part of the agency structure code
# geturl returned
http::cleanup $token
}
}
# Inform the agency resolver as well - end
}
}
}
}
# puts --[::http::data $token]--
# puts --[::http::code $token]--
# puts --[::http::status $token]--
# puts --[::http::error $token]--
http::cleanup $token
}
} ;# using HTTP - end
}
# puts --$staticIPFlag--
if $environmentArrayFlag {set environmentArray(sitesHavingReadPermission) $sitesHavingReadPermission} ;# restore the original permission (if any)
if {![string equal {} $staticIPFlag] || $ipChangeFlag || ![info exists environmentArray(staticIPFlag)]} { ;# added by GJFB in 2017-04-28 avoiding MakeRepository to crash when urlib.net is down (otherwise we would get a "Submission NOT completed..." message
set environmentArray(staticIPFlag) $staticIPFlag ;# added by GJFB in 2014-10-29 - used in MakeRepository only (when MakeRepository runs with start)
} else {
# staticIPFlag is empty and ipChangeFlag is 0 (no ip change) and environmentArray(staticIPFlag) exists
# leave environmentArray(staticIPFlag) as it is because urlib.net may be down when running post (in this case staticIPFlag is empty and MakeRepository crashes)
}
return $staticIPFlag ;# added by GJFB in 2010-08-23
}
# InformURLibSystem - end
# ----------------------------------------------------------------------
# GetAuthor
# comma value is {,} or {}
# {} is used in the BibINPE format
# example:
# with comma == {,}
# GetAuthor returns: Banon, G. J. F.,
# with comma == {}
# GetAuthor returns: Banon, G. J. F.
# nameFormat value is short, familynamefirst or familynamelast
# (used by CreateBriefTitleAuthorEntry)
proc GetAuthor {rep-i {level {#0}} {comma {,}} {nameFormat {short}}} {
global referRepository
global ${referRepository}::conversionTable
upvar $level metadataArray metadataArray
if {$level != "#0"} {set level [expr $level + 1]}
set type [ReturnType metadataArray ${rep-i} $level]
if [info exists metadataArray(${rep-i},$conversionTable($type,%A))] {
set authorList $metadataArray(${rep-i},$conversionTable($type,%A))
} else {
return
}
return [FormatAuthorName $authorList $comma $nameFormat]
}
# GetAuthor - end
# ----------------------------------------------------------------------
# CapitalizeLastName
# comma value is {,} or {}
# {} is used in the BibINPE format
# example:
# with comma == {,}
# CapitalizeLastName returns: BANON, Gerald Jean Francis,
# with comma == {}
# CapitalizeLastName returns: BANON, Gerald Jean Francis
proc CapitalizeLastName {authorList {comma {}}} {
set authorList2 {}
foreach author $authorList {
regsub {,$} $author {} author
if [regexp {(.*),(.*)} $author m lastName otherNames] {
lappend authorList2 "[string toupper $lastName], $otherNames$comma"
} else {
lappend authorList2 "[string toupper $author]$comma"
}
}
return $authorList2
}
# CapitalizeLastName - end
# ----------------------------------------------------------------------
# LoadServiceData
# Examples:
# LoadServiceData $rep contenttype type type
# LoadServiceData $rep lastupdate history history
# service -> repositoryProperties array
proc LoadServiceData {rep fieldName fileName indexName} {
# runs with post
global col
global repositoryProperties
if [file exists $col/$rep/service/$fileName] {
if [regexp {^username|^hostcollection|^mirrorsites|^docremotepermission|^downloadremotepermission} $fieldName] {
LoadService $rep $fileName fileContent 1 1
} else {
Load $col/$rep/service/$fileName fileContent
}
set fileContent [string trim $fileContent \n]
if {$fileContent == {}} {
if [info exists repositoryProperties($rep,$indexName)] {
unset repositoryProperties($rep,$indexName)
}
file delete $col/$rep/service/$fileName
} else {
# puts "$indexName = $fileContent"
set repositoryProperties($rep,$indexName) $fileContent
}
} else {
if [info exists repositoryProperties($rep,$indexName)] {
unset repositoryProperties($rep,$indexName)
}
}
}
# LoadServiceData - end
# ----------------------------------------------------------------------
# UpdateRepositoryProperties
# Update properties in repositoryProperties from the files in the
# service directory
# field value is all (default) or a field name (e.g., hostcollection)
# all means update all fields
# if rep doesn't exists the data are deleted
#
# field names examples:
# targetfile, lastupdate, contenttype, hostcollection,
# size, numberoffiles, copyright, docpermission,
# downloadpermission, language, mirrorsites,
# docremotepermission, downloadremotepermission,
# authenticatedusers, username
#
# service -> repositoriesProperties array (done in LoadServiceData)
proc UpdateRepositoryProperties {rep {field {all}}} {
# runs with post
global fieldNameArray ;# set in LoadGlobalVariables
if {$rep == {}} {return}
if {$field == "all"} {
foreach field [array names fieldNameArray] {
eval "LoadServiceData $rep $fieldNameArray($field)"
# LoadServiceData $rep $fieldNameArray($field)
}
} else {
eval "LoadServiceData $rep $fieldNameArray($field)"
# LoadServiceData $rep $fieldNameArray($field)
}
}
# UpdateRepositoryProperties - end
# ----------------------------------------------------------------------
# GetTargetFile
# used in ReturnTargetFileContent and Copyright (cgi/copyright.tcl)
proc GetTargetFile {rep} {
# runs with post
global repositoryProperties
if 0 {
# commmented by GJFB in 2023-03-07
set rep2 [string tolower $rep] ;# rep is case-insensitive
if [info exists repositoryProperties($rep2,targetfile)] {
set targetFile $repositoryProperties($rep2,targetfile)
} elseif [info exists repositoryProperties($rep,targetfile)] {
# dpi.inpe.br/Gemini and sid.inpe.br/MTC-m13 are exceptions
set targetFile $repositoryProperties($rep,targetfile)
} else {
set targetFile {}
}
} else {
# added by GJFB in 2023-03-07 - rep should be the repository name as it is in the file system, possibly with some capital letters, therefore the code above can be simplified
if [info exists repositoryProperties($rep,targetfile)] {
set targetFile $repositoryProperties($rep,targetfile)
} else {
set targetFile {}
}
}
return $targetFile
}
# GetTargetFile - end
# ----------------------------------------------------------------------
# GetEncodingName
proc GetEncodingName {} {
return [encoding system]
}
# GetEncodingName - end
# ----------------------------------------------------------------------
# GetAuthorHomePage
proc GetAuthorHomePage {rep} {
global repositoryProperties
if [info exists repositoryProperties($rep,authorhomepage)] {
set authorHomePage $repositoryProperties($rep,authorhomepage)
} else {
set authorHomePage {}
}
return $authorHomePage
}
# GetAuthorHomePage - end
# ----------------------------------------------------------------------
# GetCitedRepositoryList
# Return the list of cited repositories in the document
# contained in $rep
# flag value is 0, 1 or 2
# 0 means to return all
# 1 means to exclude the cited copyright repositories
# 2 means to return just the first (if any) mirror repository (used in CreatePage)
# extrated from the referenceTable array
# GetCitedRepositoryList is NOT RECURSIVE
# repository name must NOT contain comma (see regsub below)
proc GetCitedRepositoryList {rep {flag 0}} {
# runs with post
global referenceTable
set indexList [array names referenceTable $rep,*]
if $flag {
set citedRepositoryList {}
if {$flag == 1} {
# exclude the cited copyright repositories
foreach index $indexList {
regsub {.*,} $index {} citedRep
if {![TestContentType $citedRep {Copyright}] && \
![TestContentType $citedRep {Local Copyright}]} {
lappend citedRepositoryList $citedRep
}
}
}
if {$flag == 2} {
# return just the first mirror repository
foreach index $indexList {
regsub {.*,} $index {} citedRep
if [TestContentType $citedRep {Mirror}] {
set citedRepositoryList $citedRep
break
}
}
}
} else {
# return all
regsub -all { [^,]*,} " $indexList" { } citedRepositoryList
set citedRepositoryList [string trimleft $citedRepositoryList]
}
return $citedRepositoryList
}
# GetCitedRepositoryList - end
# ----------------------------------------------------------------------
# GetCitingRepositoryList
# Return the list of citing repositories in the document
# contained in $rep (including metadata repositories)
proc GetCitingRepositoryList {rep} {
# runs with post
global referenceTable
set indexList [array names referenceTable *,$rep]
set citingRepositoryList {}
foreach index $indexList {
regsub {,.*} $index {} citingRep
lappend citingRepositoryList $citingRep
}
return $citingRepositoryList
}
# GetCitingRepositoryList - end
# ----------------------------------------------------------------------
# GetCitingRepositoryList-
# Return the list of citing repositories in the document
# contained in $rep, excluding the metadata repositories
proc GetCitingRepositoryList- {rep entryWidget varName} {
# runs with start
set metadataRepList [FindMetadataRepList $rep $entryWidget $varName]
set list [Eval GetCitingRepositoryList $rep]
set citingRepositoryList {}
foreach citingRepository $list {
set break 0
foreach metadataRep $metadataRepList {
if {[string compare $citingRepository $metadataRep] == 0} {
set break 1
break
}
}
if !$break {lappend citingRepositoryList $citingRepository}
}
return $citingRepositoryList
}
# GetCitingRepositoryList- - end
# ----------------------------------------------------------------------
# FindPreferredLanguage
# finds the available translations of the firstLanguageRep
# returns the language in languageButton if this language is among the available translations of the firstLanguageRep
# otherwise it returns the preferred language (usually based on the browser language preference given in languagePreference) if this language is among the available translations of the firstLanguageRep
# otherwise it returns the language of the firstLanguageRep
# i.e., when languageButton is not empty and is among the available translations of the firstLanguageRep it has priority over the preferred language
# used in FindLanguage and FindLanguageForSubmissionForm (utilities1.tcl)
# fileName is the target file without the language prefix
# Example: filName is Index.html for the target files enIndex.html, pt-BRIndex.html, ...
# or FillingInstructions.tcl (previously, Submit.html) for the target files enFillingInstructions.tcl,
# pt-BRFillingInstructions.tcl, ...
# languageButton value is en, pt-BR ...
# languagePreference is for example, using env(HTTP_ACCEPT_LANGUAGE): pt-br,en;q=0.5
proc FindPreferredLanguage {firstLanguageRep fileName languagePreference languageButton} {
# runs with post
global referenceTable
global repositoryProperties
set languageRepList {}
# Find the language of the firstLanguageRep
# >>>>> xx$fileName MUST BE the target file of firstLanguageRep <<<<<
if [info exists repositoryProperties($firstLanguageRep,targetfile)] {
set targetFile $repositoryProperties($firstLanguageRep,targetfile)
if [regexp "(.*)$fileName" $targetFile m firstLanguage] {
set languageRepList [list $firstLanguage $firstLanguageRep]
} else {
if 0 {
# Migration 12/11/04
if {[string compare FillingInstructions.tcl $fileName] == 0} {
if [regexp "(.*)Submit\.html" $targetFile m firstLanguage] {
set languageRepList [list $firstLanguage $firstLanguageRep]
}
}
# Migration 12/11/04 - end
}
}
}
# Find the language of the firstLanguageRep - end
# Explore the child repositories of the firstLanguageRep
foreach index [array names referenceTable *,$firstLanguageRep] {
regsub {,.*} $index {} rep
if [info exists repositoryProperties($rep,targetfile)] {
set targetFile $repositoryProperties($rep,targetfile)
if [regexp "(.*)$fileName" $targetFile m language] {
if {[info exists firstLanguage] && [string compare $firstLanguage $language] == 0} {continue}
set languageRepList [concat $languageRepList [list $language $rep]]
} else {
if 0 {
# Migration 12/11/04
if {[string compare FillingInstructions.tcl $fileName] == 0} {
if [regexp "(.*)Submit\.html" $targetFile m language] {
if {[info exists firstLanguage] && [string compare $firstLanguage $language] == 0} {continue}
set languageRepList [concat $languageRepList [list $language $rep]]
}
}
# Migration 12/11/04 - end
}
}
}
}
# Explore the child repositories of the firstLanguageRep - end
if {$languageRepList == ""} {return [list {} {}]} ;# may cause problem (e.g., with sendMail.php)
# languageRepArray
array set languageRepArray $languageRepList
# puts [array names languageRepArray]
# => pt-BR en
set language [lindex $languageRepList 0] ;# first language
# puts 1-$language
# StoreLog {notice} {FindPreferredLanguage} 1-$language
# if {![string equal {} $languageButton] && [lsearch -exact [array names languageRepArray] $languageButton] != -1} #
# set language $languageButton
# new code added by GJFB in 2012-06-29 to convert pt into pt-BR
if {![string equal {} $languageButton] && [set i [lsearch -regexp [array names languageRepArray] ^$languageButton]] != -1} {
set language [lindex [array names languageRepArray] $i]
} elseif {$languagePreference != ""} {
foreach preferredLanguage [split $languagePreference ,] {
set preferredLanguage [lindex [split $preferredLanguage \;] 0] ;# pt-br
regexp {(..)(.*)} $preferredLanguage m a b
set preferredLanguage $a[string toupper $b] ;# pt-br -> pt-BR
if {[lsearch -exact [array names languageRepArray] $preferredLanguage] != -1} {
set language $preferredLanguage
break
}
}
}
# puts 2-$language
set languageRep $languageRepArray($language)
return [list $language $languageRep]
}
# FindPreferredLanguage - end
# ----------------------------------------------------------------------
# FindLanguageRepList
# Find the available translations of the firstLanguageRep
# Used in FindLanguage (utilities1.tcl)
# fileName is the target file without the language prefix
# Example: filName is Form.html for the target files enForm.html,
# pt-BRForm.html, ...
# not used
proc FindLanguageRepList {firstLanguageRep fileName} {
global referenceTable
global repositoryProperties
set languageRepList ""
if {[info exists repositoryProperties($firstLanguageRep,targetfile)] && \
[regexp "(.*)$fileName" \
$repositoryProperties($firstLanguageRep,targetfile) \
m language]} {
set languageRepList [list $language $firstLanguageRep]
}
foreach index [array names referenceTable *,$firstLanguageRep] {
regsub {,.*} $index {} rep
if {[info exists repositoryProperties($rep,targetfile)] && \
[regexp "(.*)$fileName" \
$repositoryProperties($rep,targetfile) \
m language]} {
set languageRepList [concat $languageRepList \
[list $language $rep]]
}
}
return $languageRepList
}
# FindLanguageRepList - end
# ----------------------------------------------------------------------
# CheckMetadataConsistency
# Check the metadata consistency with the file system
# (just for a short list of metadata - less than $maximumNumberOfEntries)
# used by StartService, FindMetadataRep and RemoveRepository
# rep-iListName is a list of metadata repositories
# simplyfied version - effective just for missing repositories
proc CheckMetadataConsistency {rep-iListName {maximumNumberOfEntries 1}} {
# runs with post
global col
global homePath
global metadataArray
global loCoInRep
# global serverAddress
global deletedRepositoryList
global deletedIdentifierList
upvar ${rep-iListName} rep-iList
# set xxx ${rep-iList}
# Store xxx C:/tmp/bbb.txt auto 0 a
# set xxx [CallTrace]
# puts $xxx
# Store xxx C:/tmp/bbb.txt auto 0 a
set update 0
if {[llength ${rep-iList}] <= "$maximumNumberOfEntries"} {
## site
## set site [GetServerAddress]
# set site $serverAddress
set list {}
set metadataList {} ;# for add
set metadata2List {} ;# for remove
set removeOnly 0
foreach rep-i ${rep-iList} {
# regsub -- {-[^-]*$} ${rep-i} {} metadataRep
regexp {(.*)-([^-]*)$} ${rep-i} m metadataRep i ;# i not used
if ![file isdirectory $col/$metadataRep] {
# the metadata repository has been deleted
# the deletedRecord argument is needed because insertionOn- may be already in use
# when CheckMetadataConsistency is called
# Waiting for the completion of other authentications
WaitQueue CheckMetadataConsistency deletedRecord
# Waiting for the completion of other authentications - end
set metadata2List [concat $metadata2List [GetMetadata $metadataRep-*]] ;# extract from the global array: metadataArray
# Transient deleted record
# if [info exists metadataArray(${rep-i},hostcollection)] #
if [ReturnState ${rep-i}] {
# just the repositories containing an original document are considered
if [file exists $col/$loCoInRep/doc/@deletedRecordList.tcl] {
source $col/$loCoInRep/doc/@deletedRecordList.tcl ;# set deletedRecordList - used with OAI-PMH only (see iconet.com.br/banon/2003/11.21.21.08)
} else {
set deletedRecordList {}
}
# metadataLastUpdate
set metadataLastUpdate [lindex [CreateVersionStamp [clock seconds]] 0]
if {[lsearch -exact $deletedRecordList $metadataRep-0] == -1} {
# not found
lappend deletedRecordList $metadataRep-0 $metadataLastUpdate
# STORE
StoreArray deletedRecordList $col/$loCoInRep/doc/@deletedRecordList.tcl w list listforarray 1
}
set storeFlag 0 ;# don't store
if [info exists metadataArray(${rep-i},repository)] {
set repository $metadataArray(${rep-i},repository)
if ![file isdirectory $col/$repository] {
if {[lsearch -exact $deletedRepositoryList $repository] == -1} {
# not found
lappend deletedRepositoryList $repository $metadataLastUpdate
set storeFlag 1 ;# store
}
}
}
if {[lsearch -exact $deletedRepositoryList $metadataRep] == -1} {
# not found
lappend deletedRepositoryList $metadataRep $metadataLastUpdate
set storeFlag 1 ;# store
}
# STORE
if $storeFlag {StoreArray deletedRepositoryList $col/$loCoInRep/doc/@deletedRepositoryList.tcl w list listforarray 1}
if [info exists metadataArray(${rep-i},identifier)] {
set identifier $metadataArray(${rep-i},identifier)
if {[lsearch -exact $deletedIdentifierList $identifier] == -1} {
# not found
lappend deletedIdentifierList $identifier $metadataLastUpdate
# STORE
StoreArray deletedIdentifierList $col/$loCoInRep/doc/@deletedIdentifierList.tcl w list listforarray 1
}
}
}
# Transient deleted record - end
set rep [ReturnRepositoryName $metadataRep]
UpdateVariables $rep ;# discard from repositoryProperties and referenceTable
UpdateVariables $metadataRep ;# discard from repositoryProperties and referenceTable
set update 1
LeaveQueue [pid] deletedRecord
} else {
# the metadata repository exists
lappend list ${rep-i}
}
}
if $update {
# Update metadata
# puts {updating...}
## RemoveMetadata $metadata2List 1 ;# commented by GJFB in 2021-03-24
# RemoveMetadata $metadata2List 1 ;# commented by GJFB in 2020-08-18
RemoveMetadata2 $metadata2List 1 ;# added by GJFB in 2020-08-18
# Update metadata - end
}
set rep-iList $list
} else {
# set list ${rep-iList}
}
# return [list $list $update]
return $update
}
# CheckMetadataConsistency - end
# ----------------------------------------------------------------------
# UpdateReferenceTable
# updates references
# service/reference is a fileName for a file containing the patterns
# (starting from doc) like xxx.tcl or *.html
# of files that may contain relative links to other repositories
# or a proper relative link
# example of service/reference file content:
# ../../../../../../col/dpi.inpe.br/banon/1999/10.31.20.32
# xxx.tcl
# *.html
# discard value is 0 or 1
# 1 means to discard any old references in rep (i.e, the parent repositories)
# 0 means to doesn't discard (used only when we know that there is no
# old reference in rep)
# if rep doesn't exists the data are deleted (discard must be 1)
# service -> referenceTable
proc UpdateReferenceTable {rep {discard 1}} {
# runs with post
global referenceTable
global homePath
global col
global pwd
global loCoInRep
# set xxx [CallTrace]
# Store xxx C:/tmp/aaa auto 0 a
# the references may be old and must be discarded
if $discard {DiscardRepository $rep referenceTable}
if ![file isdirectory $homePath/col/$rep] {return}
if 0 {
# not used anymore since 2009-07-16
# process copyright data
if [file exists $homePath/col/$rep/service/copyright] {
Load $homePath/col/$rep/service/copyright copyright
foreach repName $copyright {
set referenceTable($rep,$repName) 1
}
}
}
# process reference data
if [file exists $homePath/col/$rep/service/reference] {
set fileList {}
Load $homePath/col/$rep/service/reference reference
# set reference [string trim $reference \n]
foreach line [split $reference \n] {
if [regexp {^../} $line] {
# called repository in the reference file
# examples:
# ../../../../../../col/dpi.inpe.br/banon/1999/10.31.20.32
# ../../../../../../col/iconet.com.br/banon/2001/02.10.22.55 +
# + indicates that rep is a translation of the calledRep (here iconet.com.br/banon/2001/02.10.22.55)
if [regexp \
"../$col/col/(\[^/\]*/\[^/\]*/\[^/\]*/\[^/ \]*).*$" $line m calledRep] {
if {[llength $m] == 2} {
set value [lindex $m 1] ;# +
} else {
set value 1
}
set referenceTable($rep,$calledRep) $value
} else {
if [TestContentType $rep Metadata] {
# the link to the repository containing the document has been corrupted
# it should be recreated
# 1
file delete $homePath/col/$rep/service/reference
if [CreateReferenceFile $rep] {
lappend message "UpdateReferenceTable (1) ([clock format [clock seconds]]): reference file not recreated"
lappend message "%4 field in $homePath/col/$rep/doc/@metadata.refer has been probably damaged"
lappend message [CallTrace]
set log [join $message \n]
puts $log
Store log $homePath/@errorLog auto 0 a
}
}
}
} else {
# the line contains a pattern to files to be searched
if [regexp {^ *\* *$} $reference] {
# * - get all the files below doc
set dir $homePath/col/$rep/doc
DirectoryContent fileList $dir $dir
} else {
if [TestContentType $rep Metadata] {
# the link to the repository containing the document has been corrupted
# it should be recreated
# 2
file delete $homePath/col/$rep/service/reference
if [CreateReferenceFile $rep] {
lappend message "UpdateReferenceTable (2) ([clock format [clock seconds]]): reference file not recreated"
lappend message "%4 field in $homePath/col/$rep/doc/@metadata.refer has been probably damaged"
lappend message [CallTrace]
set log [join $message \n]
puts $log
Store log $homePath/@errorLog auto 0 a
}
} else {
cd $homePath/col/$rep/doc
set fileList2 [glob -nocomplain -- $line]
cd $pwd
set fileList [concat $fileList $fileList2]
}
}
}
}
foreach file $fileList {
if [catch {open $col/$rep/doc/$file r} fileId] {
puts stderr $fileId
} else {
set fileContent [read $fileId]
foreach line [split $fileContent \n] {
if [regexp \
"../$col/col/(\[^/\]*/\[^/\]*/\[^/\]*/\[^/ >\]*)" $line m calledRep] {
set referenceTable($rep,$calledRep) 1
}
}
close $fileId
}
}
} else {
if [TestContentType $rep Metadata] {
# the link to the repository containing the document has been lost
# it should be recreated
# 3
if [CreateReferenceFile $rep] {
lappend message "UpdateReferenceTable (3) ([clock format [clock seconds]]): reference file not recreated"
lappend message "%4 field in $homePath/col/$rep/doc/@metadata.refer has been probably damaged"
lappend message [CallTrace]
set log [join $message \n]
puts $log
Store log $homePath/@errorLog auto 0 a
}
}
}
if 0 {
if ![info exists loCoInRep] {return} ;# installation time
if [TestContentType $rep Metadata] {
# establishes a virtual link between loCoInRep and rep
set referenceTable($loCoInRep,$rep) 1
}
}
}
# UpdateReferenceTable - end
# ----------------------------------------------------------------------
# DiscardRepository
# varName examples: repositoryProperties, referenceTable, ...
proc DiscardRepository {rep varName} {
upvar #0 $varName var
set flag 0
foreach index [array names var $rep,*] {
unset var($index)
set flag 1
}
return $flag
}
# DiscardRepository - end
# ----------------------------------------------------------------------
# UpdateMetadataBase
# (used with CheckMetadataConsistency and PerformCheck)
# updates metadata from repositoryProperties, reference, service and @metadata.refer
# we assume that a UpdateRepositoryProperties for the METADATA repository was done before
# on output, flag value 1 means that the metadata base must be updated
# (used only in CheckMetadataConsistency)
# service -> repositoryProperties -> metadataList and metadata2List - (service -> repositoryProperties done in UpdateRepositoryProperties)
# site is the server address (e.g., banon-pc2 19050)
proc UpdateMetadataBase {metadataRep metadataListName metadata2ListName site flagName} {
# runs with post
global col
global metadataArray
global repositoryProperties
# global startApacheServer
upvar $metadataListName metadataList
upvar $metadata2ListName metadata2List
upvar $flagName flag
# puts [CallTrace]
# repName
set repName [ReturnRepositoryName $metadataRep]
UpdateRepositoryProperties $repName
UpdateReferenceTable $repName
if ![info exists repositoryProperties($repName,history)] {return}
# versionStamp for repName
# set history $repositoryProperties($repName,history)
# set repStamp [lindex $history end]
set repStamp [GetVersionStamp $repName] ;# uses repositoryProperties
if ![info exists repositoryProperties($metadataRep,history)] {return}
# versionStamp for metadataRep
# set history $repositoryProperties($metadataRep,history)
# set metadataRepStamp [lindex $history end]
set metadataRepStamp [GetVersionStamp $metadataRep] ;# uses repositoryProperties
if {![info exists metadataArray($metadataRep-0,lastupdate)] || \
![info exists metadataArray($metadataRep-0,metadatalastupdate)] || \
[GetLastUpdate $metadataRep-0] != "$repStamp" || \
$metadataArray($metadataRep-0,metadatalastupdate) != "$metadataRepStamp"} {
# Update metadata lists
Load $col/$metadataRep/doc/@metadata.refer fileContent
set metadataList [concat $metadataList [ConvertMultipleRefer2MetadataList 0 $fileContent $metadataRep]]
set metadataList [concat $metadataList [CreateExtraFields $metadataRep $site]]
set metadata2List [concat $metadata2List [GetMetadata $metadataRep-*]]
set flag 1
# Update metadata lists - end
}
}
# UpdateMetadataBase - end
# ----------------------------------------------------------------------
# FindCopyrightRepositories
# Finds the repositories containing the copyrights (in the first language)
# such repositories are:
# 1. the copyright repository of repName (defined in the file service/copyright) (if any)
# and the copyright repositories of PARENT repositories of repName (if any)
# 2. the local copyright repositories (if any)
# 3. the default copyright warning repository
# used in Copyright only
proc FindCopyrightRepositories {repName language} {
# runs with post
global referenceTable
global repositoryProperties
global copyrightWarningRepository ;# Default copyright warning for the URLib collection
# global loCoInRep
global homePath
# 1.
# puts 1.
# look for copyright repositories of repName and of its parents
set citedRepositoryList [CreateCitedRepositoryList $repName] ;# get the parent repositories recursively
# puts citedRepositoryList=--$citedRepositoryList--
lappend citedRepositoryList $repName ;# include repName
# set copyrightRepositories {}
foreach citedRepository $citedRepositoryList {
if [file exists $homePath/col/$citedRepository/service/copyright] {
Load $homePath/col/$citedRepository/service/copyright copyrightRep
# puts copyrightRep=--$copyrightRep--
# Find copyright repository in the appropriate language
set siteRep [FindSite2 $copyrightRep 1 $language] ;# find rep in the appropriate language
# puts siteRep=--$siteRep--
if {$siteRep == {}} {
# site not found
set appropriateCopyrightRep $copyrightRep
} else {
foreach {site appropriateCopyrightRep} $siteRep {break}
# site not used
}
# Find copyright repository in the appropriate language - end
# metadataRep
set metadataRep [FindMetadataRep $citedRepository]
set title [GetFieldValue $metadataRep-0 title]
set author [FormatAuthorList [GetAuthor $metadataRep-0] {;} 0 0 {&} 3]
# lappend copyrightRepositoryArray($copyrightRep) "$citedRepository - \"$title\" by $author"
lappend copyrightRepositoryArray($appropriateCopyrightRep) "$citedRepository - \"$title\" by $author"
}
}
if [info exists copyrightRepositoryArray] {
# puts copyrightRepositoryList=--[array get copyrightRepositoryArray]--
return [array get copyrightRepositoryArray]
}
# 2.
# puts 2.
# find local the copyright repositories
if {![TestContentType $repName {External Contribution}]} {
# look for the local copyright
foreach index [array names repositoryProperties *,type] {
# rep
regsub {,type} $index {} rep
if [TestContentType $rep {Local Copyright}] {
# puts rep=--$rep--
if [GetDocumentState $rep] {
# the local copyright repository is from the local collection
set list [array names referenceTable $rep,*]
# puts list=--$list--
if {[llength $list] == 0} {
# rep is not the child of any repository (i.e., it has no parents)
# found (in the first language)
# metadataRep
set metadataRep [FindMetadataRep $rep]
set title [GetFieldValue $metadataRep-0 title]
set author [FormatAuthorList [GetAuthor $metadataRep-0] {;} 0 0 {&} 3]
set copyrightRepositoryArray($rep) "$repName - \"$title\" by $author"
# puts copyrightRepositoryList=--[array get copyrightRepositoryArray]--
return [array get copyrightRepositoryArray]
}
}
}
}
}
# 3.
# puts 3.
# return the repository containing the copyright warning
set metadataRep [FindMetadataRep $repName]
set title [GetFieldValue $metadataRep-0 title]
set author [FormatAuthorList [GetAuthor $metadataRep-0] {;} 0 0 {&} 3]
set copyrightRepositoryArray($copyrightWarningRepository) "$repName - \"$title\" by $author"
return [array get copyrightRepositoryArray]
}
# FindCopyrightRepositories - end
# ----------------------------------------------------------------------
# GetLastUpdate
# Return the last update value (time stamp)
proc GetLastUpdate {rep-i {level {#0}}} {
upvar $level metadataArray metadataArray
return $metadataArray(${rep-i},lastupdate)
}
# GetLastUpdate - end
# ----------------------------------------------------------------------
# GetMetadataLastUpdate
# Return the last update value (time stamp)
proc GetMetadataLastUpdate {rep-i {level {#0}}} {
upvar $level metadataArray metadataArray
return $metadataArray(${rep-i},metadatalastupdate)
}
# GetMetadataLastUpdate - end
# ----------------------------------------------------------------------
# UpdateBase
# It is assumed that the field value was extracted from the service directory
# Example:
# UpdateBase $rep hostcollection $hostCollection
proc UpdateBase {rep fieldName fieldValue} {
# runs with post
global repositoryProperties
global saveMetadata
global homePath
# UPDATE REPOSITORY PROPERTIES
set repositoryProperties($rep,$fieldName) $fieldValue
# UPDATE METADATA
# metadataRep
set metadataRep [FindMetadataRep $rep]
if ![file isdirectory $homePath/col/$metadataRep] {
set metadataRep {}
}
if {[string compare {} $metadataRep] != 0} {
# remove and add
set metadataList {}
set metadata2List {}
UpdateMetadataField $metadataRep $fieldName \
$fieldValue metadataList metadata2List
if 0 {
# commented by GJFB in 2020-08-18
RemoveMetadata $metadata2List
AddMetadata $metadataList
} else {
UpdateMetadata $metadata2List $metadataList ;# added by GJFB in 2020-08-18 - uses metadata2List and metadataList
}
set saveMetadata 1
# SAVE
SaveMetadata
# SAVE - end
}
}
# UpdateBase - end
# ----------------------------------------------------------------------
# UpdateField
# example:
# UpdateField $rep $metadataRep contenttype metadataList metadata2List
# repositoryProperties array -> metadata
# used in PerformCheck, Dialog and UpdateTargetFile only
proc UpdateField {rep metadataRep fieldName metadataListName metadata2ListName} {
# runs with start
# global repositoryProperties ;# post
global fieldNameArray
upvar $metadata2ListName metadata2List
# puts -1-$metadata2List--
upvar $metadataListName metadataList
# puts -1-$metadataList--
# => ... iconet.com.br/banon/2003/08.18.12.15.26-0,targetfile {20 - [ARTIGO][INPE] Michelly Karoline Alves Santana.jpg} ...
if [string equal {targetfile} $fieldName] {
# added by GJFB in 2021-01-21 because Get lost extra white spaces disfiguring the target file name
array set currentMetadataArray $metadataList
if [info exists currentMetadataArray($metadataRep-0,targetfile)] {
set targetFile $currentMetadataArray($metadataRep-0,targetfile)
UpdateMetadataField $metadataRep $fieldName $targetFile metadataList metadata2List 1
} else {
DeleteMetadataField $metadataRep $fieldName metadata2List 1
}
} else {
set indexName [lindex $fieldNameArray($fieldName) 2]
if [Info exists repositoryProperties($rep,$indexName)] {
set value [Get repositoryProperties($rep,$indexName)]
if {$fieldName == "language"} {
regexp {\[(.*)\]} $value m value ;# English {[en]} -> en
}
# puts $value
# => 20 - {[ARTIGO][INPE]} Michelly Karoline Alves Santana.jpg
# the braces were added and the second white space before Michelly was lost when using Get (which use GetReply)
if {$fieldName == "targetfile"} {
set value [join $value] ;# {RBMET_SAULO[1].pdf} -> RBMET_SAULO[1].pdf - braces appear while executing: lappend replyList $reply, within GetReply
}
# puts $value
# => 20 - [ARTIGO][INPE] Michelly Karoline Alves Santana.jpg
UpdateMetadataField $metadataRep $fieldName $value metadataList metadata2List 1
} else {
DeleteMetadataField $metadataRep $fieldName metadata2List 1
}
}
}
# UpdateField - end
# ----------------------------------------------------------------------
# GetValue
# Example:
# GetValue repositoryProperties($rep,type)
proc GetValue {varName} {
global repositoryProperties ;# used remotely by start
global referenceTable ;# used remotely by start
global metadataArray ;# used remotely by start (see CreateIdentificationKey via Get)
global repArray ;# used remotely by start
global saveMetadata ;# used remotely by start
global startApplicationInUse ;# used remotely by start
global environmentArray ;# used by get.tcl
# return [subst $$varName]
# puts $varName
# puts [set $varName]
return [set $varName]
}
# GetValue - end
# ----------------------------------------------------------------------
# ReturnTheMostRecentVersions
# returns the five most recent versions
# example:
# set history [ReturnTheMostRecentVersions $rep]
proc ReturnTheMostRecentVersions {rep} {
# runs with post
global repositoryProperties
set history $repositoryProperties($rep,history)
set end [expr [llength $history] -1]
set begin [expr $end - 4]
return [lrange $history $begin $end]
}
# ReturnTheMostRecentVersions - end
# ----------------------------------------------------------------------
# UpdateGlobalVariable
# varName is the name of a list of repositories
# Example:
# Eval UpdateGlobalVariable indexRepList Index $rep
proc UpdateGlobalVariable {varName contentType rep} {
# runs with post
upvar #0 $varName var
# Drop the rep if it exists
if {[set i [lsearch -exact $var $rep]] != -1} {
set var [lreplace $var $i $i]
}
# Drop the rep if it exists - end
# Add the rep
if [TestContentType $rep $contentType] {
lappend var $rep
}
# Add the rep - end
}
# UpdateGlobalVariable - end
# ----------------------------------------------------------------------
# UpdateMultipleGlobalVariables
# used by PerformCheck and Dialog
proc UpdateMultipleGlobalVariables {rep} {
# runs with post
## Update indexRepList
## indexRepList is used for making access statistics
# Migration 15/9/07
if 1 {
UpdateGlobalVariable indexRepList Index $rep
}
# Migration 15/9/07 - end
## Update indexRepList - end
# Update bannerSequenceRepList
UpdateGlobalVariable bannerSequenceRepList {Banner Sequence} $rep
# Update bannerSequenceRepList - end
# Update officialIconRepList
UpdateGlobalVariable officialIconRepList {Access Icon} $rep
# Update officialIconRepList - end
# Update bannerPathArray
if [TestContentType $rep {Banner Sequence}] {
LoadBannerPathArray
}
# Update bannerPathArray - end
}
# UpdateMultipleGlobalVariables - end
# ----------------------------------------------------------------------
# ReturnNumberOfMetadataRep
# example:
# set numberOfmetadataRep [Eval ReturnNumberOfMetadataRep]
proc ReturnNumberOfMetadataRep {} {
# runs with post
global metadataArray
return [llength [array names metadataArray *,repository]]
}
# ReturnNumberOfMetadataRep - end
# ----------------------------------------------------------------------
# LoadTextLog
proc LoadTextLog {} {
# runs with start and post
global textLog
global homePath
global URLibServiceRepository
if [file exists $homePath/col/$URLibServiceRepository/auxdoc/textLog] {
Load $homePath/col/$URLibServiceRepository/auxdoc/textLog textLog
set length [llength $textLog]
set j [expr $length - 200] ;# 200 == maximum number of log lines
set textLog [lreplace $textLog 0 $j]
} else {
set textLog {}
}
}
# LoadTextLog - end
# ----------------------------------------------------------------------
# StoreTextLog
proc StoreTextLog {} {
# runs with start and post
global textLog
global homePath
global URLibServiceRepository
if [info exists textLog] {
Store textLog $homePath/col/$URLibServiceRepository/auxdoc/textLog
}
}
# StoreTextLog - end
# ----------------------------------------------------------------------
# LoadEnvironmentArray
# used in SPOK only
proc LoadEnvironmentArray {} {
# runs with post
global environmentArray
# source ../auxdoc/.environmentArray.tcl
SourceWithBackup ../auxdoc/.environmentArray.tcl environmentArray ;# added by GJFB in 2010-08-05
}
# LoadEnvironmentArray - end
# ----------------------------------------------------------------------
# CreateLanguageTable
proc CreateLanguageTable {} {
# runs with start and post
# runs with start only at installation
global referenceTable
global repositoryProperties
global englishRepository
global homePath
global environmentArray
# global languageList
# global languageTable
# languageRepositories (list of language repositories)
set languageRepositories $englishRepository
foreach index [array names referenceTable *,$englishRepository] {
regsub {,.*} $index {} rep
if [info exists repositoryProperties($rep,targetfile)] {
set targetFile $repositoryProperties($rep,targetfile)
if [regexp {Language.tcl} $targetFile] {
lappend languageRepositories $rep
}
}
}
set languageList {}
foreach languageRepository $languageRepositories {
set pathFile [glob -nocomplain $homePath/col/$languageRepository/doc/*Language.tcl]
regexp {.*/(.*)Language.tcl} $pathFile m language
set language2 $language
if [string equal {Portuguese} $language] {set language2 {Português}}
lappend languageList $language2
set languageTable($language2) $languageRepository
}
if {[lsearch -exact $languageList $environmentArray(spLanguageEntry)] == -1} {
set environmentArray(spLanguageEntry) English
}
# puts $languageList
return [array get languageTable]
}
# CreateLanguageTable - end
# ----------------------------------------------------------------------
# CreateMirrorLanguageTable
proc CreateMirrorLanguageTable {} {
global englishMirrorRepository
global portugueseBrasilMirrorRepository
set languageTable(English) $englishMirrorRepository
# set languageTable(Português) $portugueseBrasilMirrorRepository
set languageTable(Portuguese) $portugueseBrasilMirrorRepository
return [array get languageTable]
}
# CreateMirrorLanguageTable - end
# ----------------------------------------------------------------------
# CheckModifiedTime
# returns one of the values: Modified Unchanged Unchecked
# Unchanged means that
# the lastupdate in the file system == lastupdate in the metadata
#
# seconds is the mTime of the repository ($rep) being checked
# seconds is given by DirectoryMTime or RepositoryMTime; examples:
# set seconds [DirectoryMTime $homePath/col/$rep/doc 1]
# set seconds [Eval RepositoryMTime $rep $homePath 1]
#
# metadataRep and versionStamp may be given by:
# set metadataRep [FindMetadataRep $rep]
# set versionStamp [GetLastUpdate $metadataRep-0]
#
# works with gmt
# new code - adapted to migration reality (+ 1 second) and to clock ajustment for daylight saving (+- 3600 seconds or +- 7200 secconds) - by GJFB in 2010-11-23
# IR in banon-pc3 of sid.inpe.br/mtc-m12@80/2006/11.30.18.29 from m12
proc CheckModifiedTime {rep seconds {metadataRep none} {versionStamp none}} {
global homePath
# set seconds [DirectoryMTime $homePath/col/$rep/doc 1]
if {$seconds == ""} {
# repository content too big
return Unchecked
}
if {$metadataRep == "none"} {set metadataRep [FindMetadataRep $rep]}
if {$metadataRep == ""} {return Unchecked}
# lastChange1 (in the file system)
set lastChange1 $seconds
# lastChange2 (registered in the metadata)
if {$versionStamp == "none"} {set versionStamp [GetLastUpdate $metadataRep-0]}
if {[info tclversion] > 8.4} {
set lastChange2 [clock scan [lindex $versionStamp 0] -format %Y:%m.%d.%H.%M.%S -gmt 1]
} else {
set monthTable(01) Jan
set monthTable(02) Feb
set monthTable(03) Mar
set monthTable(04) Apr
set monthTable(05) May
set monthTable(06) Jun
set monthTable(07) Jul
set monthTable(08) Aug
set monthTable(09) Sep
set monthTable(10) Oct
set monthTable(11) Nov
set monthTable(12) Dec
regexp {(....):(..)\.(..)\.(..)\.(..)\.(..)} [lindex $versionStamp 0] match Y m d H M S
set lastChange2 [clock scan "$monthTable($m) $d $H:$M:$S $Y" -gmt 1]
}
set lastChange2List $lastChange2
lappend lastChange2List [expr $lastChange2 + 1]
lappend lastChange2List [expr $lastChange2 + 3600]
lappend lastChange2List [expr $lastChange2 + 3601]
lappend lastChange2List [expr $lastChange2 + 7200]
lappend lastChange2List [expr $lastChange2 + 7201]
lappend lastChange2List [expr $lastChange2 - 3600]
lappend lastChange2List [expr $lastChange2 - 3599]
lappend lastChange2List [expr $lastChange2 - 7200]
lappend lastChange2List [expr $lastChange2 - 7199]
# set xxx [list lastChange2 = $lastChange2 lastChange1 = $lastChange1]
# Store xxx C:/tmp/bbb.txt auto 0 a
# set xxx [list lastChange2List = $lastChange2List lastChange1 = $lastChange1]
# Store xxx C:/tmp/bbb.txt auto 0 a
if {[lsearch $lastChange2List $lastChange1] == -1} {
# modified version
return Modified
} else {
# unchanged version
return Unchanged
}
}
# not used - old code
proc CheckModifiedTime2 {rep seconds {metadataRep none} {versionStamp none}} {
global homePath
# set seconds [DirectoryMTime $homePath/col/$rep/doc 1]
if {$seconds == ""} {
# repository content too big
return Unchecked
}
if {$metadataRep == "none"} {set metadataRep [FindMetadataRep $rep]}
if {$metadataRep == ""} {return Unchecked}
# lastChange1 (in the file system)
set lastChange1 [clock format $seconds -format %Y:%m.%d.%H.%M.%S -gmt 1]
# lastChange2 (registered in the metadata)
if {$versionStamp == "none"} {set versionStamp [GetLastUpdate $metadataRep-0]}
set lastChange2 [lindex $versionStamp 0]
# set xxx [list lastChange2 = $lastChange2 lastChange1 = $lastChange1]
# Store xxx C:/tmp/bbb.txt auto 0 a
if {$lastChange2 != "$lastChange1"} {
# modified version
return Modified
} else {
# unchanged version
return Unchanged
}
}
# CheckModifiedTime - end
# ----------------------------------------------------------------------
# ComputeVersionState
# computes the version state of the currentRep
# if completeDiagnosis is 0
# returns one of the state values:
# Registered Original
# Modified Original
# Copy of an Original
# Modified Copy of an Original
# Unchecked
# Registered Original means that the host collection of currentRep is
# the current local collection and the repository content has not be modified
# if completeDiagnosis is 1 (used by Cover)
# returns one of the state values:
# Registered Original
# Modified Original
# Copy of the Registered Original
## Copy of a Previously Registered Original
# Copy of an Original
# Modified Copy of an Original
# Unchecked
#
# if state is Registered Original
# officialSite contains the serverAddress of the site containing the original
# otherwise officialSite is empty
#
# used in:
# GetMetadataRepositories (utilitiesMirror.tcl)
# CreateSiteEntry (utilitiesMirror.tcl)
# CreateBriefEntry (utilitiesMirror.tcl)
# GetLanguageRepositories (utilitiesMirror.tcl)
# GetURLPropertyList (utilitiesMirror.tcl)
# Cover (used completeDiagnosis == 1)
# siteListRep not used
# deletes download/doc.zip whenever the state value contains the word Modified
proc ComputeVersionState {currentRep {siteListRep {}} {completeDiagnosis 0}} {
# runs with post
global serverAddress
global homePath
global loCoInRep
global defaultAccessIconRepository
global repositoryProperties
set state {Unchecked}
set officialSite {}
set imageURL http://[ReturnHTTPHost]/rep-/$defaultAccessIconRepository
# Store imageURL C:/tmp/bbb auto 0 a
# puts $currentRep
if [info exists repositoryProperties($currentRep,numberoffiles)] {
set numberOfFiles $repositoryProperties($currentRep,numberoffiles)
# puts $numberOfFiles
if {$numberOfFiles > 850} {
# two many files (RepositoryMTime is time consuming)
return [list $state $officialSite $imageURL]
} else {
set seconds [RepositoryMTime $currentRep $homePath 1]
}
} else {
# no number of files
set seconds [RepositoryMTime $currentRep $homePath 1]
}
set metadataRep [FindMetadataRep $currentRep]
if {$metadataRep == ""} {
return [list $state $officialSite $imageURL]
}
# versionStamp
set versionStamp [GetLastUpdate $metadataRep-0]
# set xxx [list command = CheckModifiedTime $currentRep $seconds $metadataRep $versionStamp]
# puts $xxx
# Store xxx C:/tmp/bbb.txt auto 0 a
set check [CheckModifiedTime $currentRep $seconds $metadataRep $versionStamp]
# set xxx [list check = $check]
# puts $xxx
# Store xxx C:/tmp/aaa auto 0 a
if [regexp Unchecked $check] {
return [list $state $officialSite $imageURL]
}
# lastHostCollection
set lastHostCollection [lindex [LoadHostCollection $currentRep] end]
if 0 {
# officialIconRep
set officialIconRep [GetOfficialIconRep]
if {$officialIconRep == ""} {
# the official icon has not been created for this site
set officialIconRep $defaultAccessIconRepository
}
}
# set state {}
if [regexp Modified $check] {
# Modified
if {$lastHostCollection == "$loCoInRep"} {
# the host collection of currentRep is the current local collection
# >>> Modified Original
set state {Modified Original}
} else {
# the host collection of currentRep is not the current local collection
# >>> Modified Copy of an Original
set state {Modified Copy of an Original}
}
} else {
# Unchanged
## Look for official version
if {$lastHostCollection == "$loCoInRep"} {
# the host collection of currentRep is the current local collection
# set state Official
# >>> Registered Original
set state {Registered Original}
set officialSite $serverAddress
if {![TestContentType $currentRep {External Contribution}] \
&& ![TestContentType $currentRep {Copyright}]} {
set officialIconRep [GetOfficialIconRep]
if {$officialIconRep != ""} {
# the official icon has been created for this site
set imageURL http://[ReturnHTTPHost]/rep-/$officialIconRep
}
}
} else {
# the host collection of currentRep is not the current local collection
if $completeDiagnosis {
set officialSite [FindSiteContainingTheOriginal2 $currentRep] ;# with ip
if [string equal {} $officialSite] {
# official site not found
# >>> Copy of an Original
set state {Copy of an Original}
} else {
# official site found
set versionState [Execute $officialSite [list ComputeVersionState $currentRep]]
if [string equal {} $versionState] {
# official site is not returning - (for example when using banon-pc3 with INPE wireless and trying to open an administrator page using Get) - GJFB in 2010-12-06
set state {Copy of an Original}
} else {
foreach {state2 officialSite imageURL} $versionState {break}
if [string equal {Registered Original} $state2] {
# set versionStamp2 [Execute $officialSite [list GetLastUpdate $metadataRep-0]]
if [catch {Execute $officialSite [list GetLastUpdate $metadataRep-0]} versionStamp2] {
# example of error message:
# Execute: communication with server banon-pc3 800 [banon-pc3 800] doesn't start
set state {Copy of an Original}
} else {
if {$versionStamp == "$versionStamp2"} {
# >>> Copy of the Registered Original
set state {Copy of the Registered Original}
} else {
## >>> Copy of a Previously Registered Original
# set state {Copy of a Previously Registered Original}
# >>> Copy of an Original
set state {Copy of an Original}
}
}
} else {
## >>> Copy of a Previously Registered Original
# set state {Copy of a Previously Registered Original}
# >>> Copy of an Original
set state {Copy of an Original}
}
}
}
} else {
# >>> Copy of an Original
set state {Copy of an Original}
}
}
## Look for official version - end
}
array set stateTable {
{Registered Original} {Official}
{Modified Original} {Modified}
{Copy of the Registered Original} {Official}
{Copy of an Original} {Copied}
{Modified Copy of an Original} {Modified}
{Unchecked} {Unchecked}
}
if [string equal {Modified} $stateTable($state)] {
file delete $homePath/col/$currentRep/download/doc.zip ;# added by GJFB in 2012-12-25 - needed because the download/doc.zip is not automatically updated when an UpdateLastUpdate is done (resulting in out-of-date doc.zip)
}
return [list $state $officialSite $imageURL]
}
# ComputeVersionState - end
# ----------------------------------------------------------------------
# GetPermission
# directory value is doc or download
proc GetPermission {directory} {
# runs with post
global environmentArray
regsub {d} $directory {D} directory
return [lindex [split $environmentArray(sp${directory}AccessPermission) \n] end]
}
# GetPermission - end
# ----------------------------------------------------------------------
# Migrate1
# Migrates from Version 1 to Version 2
# Creates a metadata repository if it doesn't exist
proc Migrate1 {rep} {
# runs with post
global homePath
global bib2referRepository
global saveMetadata
global loCoInRep
global tcl_platform
if {$tcl_platform(platform) == "unix" && \
[file isdirectory $homePath/col/$rep/bib] && \
![file isdirectory $homePath/col/$rep/service]} {
# rep is of Version 1
set path1 [eval file join [lrange [file split $rep] 0 2]]
set path2 [lindex [file split $rep] end]
set firstCharacter [string index [exec ls -l $homePath/col/$path1 | grep $path2] 0]
if {$firstCharacter == "d"} {
set metadataRep [FindMetadataRep $rep]
if ![file isdirectory $homePath/col/$metadataRep] {
# UpdateVariables $metadataRep
set metadataRep {}
}
set bibPath [glob $homePath/col/$rep/bib/*/a.bib]
regsub {/a.bib$} $bibPath {} bibPath
if {$metadataRep == {}} {
if ![file isdirectory $homePath/col/$rep/service] {
file mkdir $homePath/col/$rep/auxdoc
file mkdir $homePath/col/$rep/source
file mkdir $homePath/col/$rep/service
# size and numberOfFiles
# set size [ComputeSize $rep]
foreach {size numberOfFiles} [ComputeInfo $rep] {break}
Store size $homePath/col/$rep/service/size
Store numberOfFiles $homePath/col/$rep/service/numberOfFiles
# hostCollection
StoreHostCollection $rep $loCoInRep
# history
# CREATE A NEW VERSION STAMP
set seconds [DirectoryMTime $homePath/col/$rep/doc]
set versionStamp [CreateVersionStamp $seconds]
UpdateHistory $rep $versionStamp
# reference
Load $homePath/col/$rep/.reserved/ref reference
set referenceList1 [split $reference \n]
if {$referenceList1 != {}} {
set referenceList2 {}
foreach ref $referenceList1 {
lappend referenceList2 ../../../../../../col/$ref
}
set reference [join $referenceList2 \n]
Store reference $homePath/col/$rep/service/reference
}
}
# no metadataRep exists
# create a metadata repository
Load $bibPath/a.bib bibTeXEntry
set referEntry [${bib2referRepository}::Bib2Refer $bibTeXEntry]
regsub {(%0[^%]*)} $referEntry "\\1%4 $rep\n" referEntry
set metadataList [LoadMetadata $referEntry] ;# startApacheServer
# AddMetadata $metadataList ;# commented by GJFB in 2020-08-18
AddMetadata2 $metadataList ;# added by GJFB in 2020-08-18
set saveMetadata 1
}
}
return 0
} else {
return 1
}
}
# Migrate1 - end
# ----------------------------------------------------------------------
# Migrate2
# Migrates from Version 1 to Version 2
# Updates the metadata in both versions
# was used in PerformCheck
proc Migrate2 {rep} {
# runs with post
global homePath
global bib2referRepository
if [file isdirectory $homePath/col/$rep/bib] {
# rep is of Version 1
set metadataRep [FindMetadataRep $rep]
if ![file isdirectory $homePath/col/$metadataRep] {
# UpdateVariables $metadataRep
set metadataRep {}
}
set bibPath [glob $homePath/col/$rep/bib/*/a.bib]
regsub {/a.bib$} $bibPath {} bibPath
if {$metadataRep != {}} {
# a metadataRep exists
set seconds1 [DirectoryMTime $bibPath]
set referPath $homePath/col/$metadataRep/doc
set seconds2 [DirectoryMTime $referPath]
if [expr abs($seconds1 - $seconds2) > 10] {
# the versions are different
if {$seconds1 < $seconds2} {
# update Version 1
Load $referPath/@metadata.refer referEntry
set metadataList [ConvertRefer2MetadataList $referEntry $metadataRep 0]
set rep-i $metadataRep-0
set bibTeXEntry { Bibligraphic index {}}
foreach item [CreateBibTeXEntry $metadataList ${rep-i}] {
if [regexp {metadatarepository =| repository =} $item] {continue}
lappend bibTeXEntry $item
}
lappend bibTeXEntry {}
lappend bibTeXEntry {
}
set bibTeXEntry [join $bibTeXEntry \n]
Store bibTeXEntry $bibPath/a.bib
} else {
# update Version 2
Load $bibPath/a.bib bibTeXEntry
set referEntry [${bib2referRepository}::Bib2Refer $bibTeXEntry]
regsub {(%0[^%]*)} $referEntry "\\1%4 $rep\n" referEntry
regsub {(%0[^%]*)} $referEntry "\\1%2 $metadataRep\n" referEntry
}
# store Version 2 anyway
Store referEntry $referPath/@metadata.refer
}
}
}
}
# Migrate2 - end
# ----------------------------------------------------------------------
# BackupRegisteredVersion
# used in MakeDownloadFile
proc BackupRegisteredVersion {rep} {
# runs with post
global col
global repositoryProperties
if [file exists $col/$rep/download/doc.zip] {
if [file exists $col/$rep/download/sample] {
if [file exists $col/$rep/download/time] {
# Backup the old registered version
set history $repositoryProperties($rep,history)
set historyLength [llength $history]
set versionStamp [lindex $history [expr $historyLength - 2]]
regsub -all {[:/]} $versionStamp {=} versionStamp
file mkdir $col/$rep/backup/$versionStamp
file copy $col/$rep/download/doc.zip $col/$rep/backup/$versionStamp/doc.zip
file copy $col/$rep/download/sample $col/$rep/backup/$versionStamp/sample
file copy $col/$rep/download/history $col/$rep/backup/$versionStamp/history
file copy $col/$rep/download/time $col/$rep/backup/$versionStamp/time
# Backup the old registered version - end
}
file delete $col/$rep/download/sample
file delete $col/$rep/download/history
file delete $col/$rep/download/time
}
# file delete $col/$rep/download/doc.zip ;# commented in 2010-07-04
}
}
# BackupRegisteredVersion - end
# ----------------------------------------------------------------------
# MakeDownloadFile
# packEverything value is 0, 1 or 2
# 0 means to pack just doc, agreement, images and part of service
# 1 means to pack everything (i.e., besides doc, agreement, images and part of service, source, backup and not_sent directories)
# 2 means to pack everything except doc, agreement and images
# force value is 0 or 1
# 1 means to execute TestUpdateLastUpdate even for $rep
# backup value is 0 or 1
# 1 means that the current version must be registered and then back it up
# userName used by TestUpdateLastUpdate (called by ComputeRepositoryList) to create the version stamp
## dontMakeIfItExists not used any more after 2020-04
## dontMakeIfItExists value is 0 (default) or 1
## 1 means to don't make the download file if it already exists
## used only in:
## iconet.com.br/banon/2002/02.04.12.37
## iconet.com.br/banon/2002/02.02.20.42
## iconet.com.br/banon/2002/02.02.09.41
# used only in:
# Script (dpi.inpe.br/banon-pc@1905/2005/02.19.00.40) option 14 - Reload last update
# Download called by clicking export
# ExtractURLibService
# UpdateDownloadFile called by UpdateDownloadFilesByAdministrator called by Dialog, PerformCheck and TransferCopyright
# UpdateDownloadFile called in DDOK and StartService
# ImportRepository
# LoadBiblioDB
proc MakeDownloadFile {
rep {packEverything 0} {force 0} {backup 0} {userName {}} {dontMakeIfItExists 0}
} {
# runs with post
global homePath
global pwd
# global referenceTable ;# commented by GJFB in 2015-04-18
global URLibServiceRepository
# global downloadingEnvironmentRepository ;# not used any more after 2020-04
# global samplingRepository
# global repositoryProperties ;# commented by GJFB in 2015-04-18
# global downloadForWindowsRepository ;# not used any more after 2020-04
# global downloadForSunOSRepository ;# not used any more after 2020-04
# global downloadForLinuxRepository ;# not used any more after 2020-04
global zipPath
# global tcl_platform
if {$dontMakeIfItExists && [file exists $homePath/col/$rep/download/doc.zip]} {return}
# set xxx [CallTrace]
# Store xxx C:/tmp/bbb.txt auto 0 a
# puts $packEverything
set currentDownloadPermission [FindCurrentDownloadPermission $rep]
# puts --$currentDownloadPermission--
if {!$backup && [string equal $currentDownloadPermission {deny from all}]} {
file delete $homePath/col/$rep/download/doc.zip
file delete $homePath/col/$rep/download/history
file delete $homePath/col/$rep/download/sample
return
}
file delete $homePath/col/$URLibServiceRepository/doc/core ;# delete core file (if any)
file mkdir $homePath/col/$rep/download
# Compute repositoryList
# set repositoryList [ComputeRepositoryList $rep $force] ;# parent repositories + $rep + metadata repositories
set repositoryList [ComputeRepositoryList $rep $force $userName] ;# parent repositories + $rep + metadata repositories
# puts --$repositoryList--
# Compute repositoryList - end
Store repositoryList $homePath/repositoryList
# if {$tcl_platform(platform) == "unix"} #
# if [file owned $zipPath] {exec chmod 774 $zipPath} ;# must be executable
# #
set command "$zipPath"
set option "-r"
set type zip
# file delete $homePath/col/$rep/download/doc.$type
BackupRegisteredVersion $rep
if {$packEverything != 2} {
file delete $homePath/col/$rep/download/doc.zip
}
# Compute fileList1 and fileList2 (could be one list)
set fileList1 {} ;# just for doc
set fileList2 {} ;# for the rest (except service)
foreach repository $repositoryList {
# lappend fileList1 col/$repository/doc ;# commented by GJFB in 2013-02-09 - see new code below
if [file isdirectory $homePath/col/$repository/agreement] {
lappend fileList1 col/$repository/agreement
}
if [file isdirectory $homePath/col/$repository/images] {
lappend fileList1 col/$repository/images
}
# Preserve the administrator as an advanced user
LoadService $repository userName userName 1 1
if [string equal {administrator} $userName] {
# user name is administrator
set userNamePath {} ;# don't exclude (see below) - useful for administrator pages
} else {
set userNamePath col/$repository/service/userName
}
# Preserve the administrator as an advanced user - end
if 0 {
# commented by GJFB in 2018-09-08 - see below
# Preserve the administrator as a user (authenticated user) - added by GJFB in 2018-06-02
LoadService $repository authenticatedUsers authenticatedUsers 0 1
if [string equal {administrator} $authenticatedUsers] {
# user name is administrator
set authenticatedUsersPath {} ;# don't exclude (see below) - useful for the administrator page
} else {
set authenticatedUsersPath col/$repository/service/authenticatedUsers
}
# Preserve the administrator as an advanced user - end
}
cd $homePath
# if [catch {eval "exec \"$command\" $option \"$homePath/col/$rep/download/doc.$type\" col/$repository/service -x col/$repository/service/registrationPassword $userNamePath col/$repository/service/authenticatedUsers col/$repository/service/accessLog"} message] #
# ZIP (part of service)
# if [catch {eval "exec \"$command\" $option \"$homePath/col/$rep/download/doc.$type\" col/$repository/service -x col/$repository/service/hostCollection col/$repository/service/transferableFlag $userNamePath col/$repository/service/authenticatedUsers col/$repository/service/accessLog"} message] # ;# commented by GJFB in 2018-06-02
# if [catch {eval "exec \"$command\" $option \"$homePath/col/$rep/download/doc.$type\" col/$repository/service -x col/$repository/service/hostCollection col/$repository/service/transferableFlag $userNamePath $authenticatedUsersPath col/$repository/service/accessLog"} message] # ;# added by GJFB in 2018-06-02 - useful for the administrator page - commented by GJFB in 2018-09-08
if [catch {eval "exec \"$command\" $option \"$homePath/col/$rep/download/doc.$type\" col/$repository/service -x col/$repository/service/hostCollection col/$repository/service/transferableFlag $userNamePath col/$repository/service/accessLog"} message] { ;# added by GJFB in 2018-09-08 - it seems convenient not to exclude any members of the reader group
set log "\[[clock format [clock seconds] -format %Y:%m.%d.%H.%M.%S]\] MakeDownloadFile (1): $message\n"
puts $log
Store log $homePath/@errorLog auto 0 a
}
if {$packEverything != 2} {
# ZIP (part of doc) - added by GJFB in 2013-02-09 to exclude doc/tmp - updated by GJFB in 2020-04-18 to exclude doc/progressDir
if [catch {eval "exec \"$command\" $option \"$homePath/col/$rep/download/doc.$type\" col/$repository/doc -x col/$repository/doc/tmp/* col/$URLibServiceRepository/doc/progressDir/*"} message] {
set log "\[[clock format [clock seconds] -format %Y:%m.%d.%H.%M.%S]\] MakeDownloadFile (1): $message\n"
puts $log
Store log $homePath/@errorLog auto 0 a
}
}
cd $pwd
if $packEverything {
if ![TestContentType $rep Metadata] {
if [file isdirectory $homePath/col/$repository/source] {
lappend fileList2 col/$repository/source
}
if [file isdirectory $homePath/col/$repository/backup] {
lappend fileList2 col/$repository/backup
}
if [file isdirectory $homePath/col/$repository/not_sent] {
lappend fileList2 col/$repository/not_sent
}
if [file exists $homePath/col/$repository/download/sample] {
lappend fileList2 col/$repository/download/sample
}
if [file exists $homePath/col/$repository/download/history] {
lappend fileList2 col/$repository/download/history
}
if [file exists $homePath/col/$repository/download/time] {
lappend fileList2 col/$repository/download/time
}
}
}
}
# if {$rep == "$URLibServiceRepository" || \
# $rep == "$downloadForWindowsRepository" || \
# $rep == "$downloadForSunOSRepository" || \
# $rep == "$downloadForLinuxRepository" || \
# $rep == "$downloadingEnvironmentRepository"} #
if {$rep == "$URLibServiceRepository"} {
if [file exists $homePath/newVersion] {lappend fileList2 newVersion}
if [file exists $homePath/start] {lappend fileList2 start} ;# added by GJFB in 2020-05-24
}
# if {$rep == "$downloadForSunOSRepository" || \
# $rep == "$downloadForLinuxRepository" || \
# $rep == "$downloadingEnvironmentRepository"} {
# lappend fileList2 start ;# start script for UNIX
# }
if 0 {
# shortcut cannot be zipped
if {$rep == "$downloadForWindowsRepository"} { ;# added by GJFB in 2017-10-14
lappend fileList2 {"post URLib"} ;# atalho para c:\URLib
lappend fileList2 {"unpost URLib"} ;# atalho para c:\URLib
lappend fileList2 {"start URLib"} ;# atalho para c:\URLib
lappend fileList2 {"update URLib"} ;# atalho para c:\URLib
lappend fileList2 {"reset URLib"} ;# atalho para c:\URLib
}
}
lappend fileList2 packedRepository ;# used by IR
lappend fileList2 packedRepositoryVersion ;# used by IR
lappend fileList2 repositoryList ;# used by IR
# Compute fileList1 and fileList2 - end
# Store packedRepository and packedRepositoryVersion
# must be after ComputeRepositoryList
set packedRepository $rep
Store packedRepository $homePath/packedRepository
# set packedRepositoryVersion [lindex $repositoryProperties($rep,history) end]
# set packedRepositoryVersion [GetVersionStamp $rep] ;# commented by GJFB in 2020-04-22
Load $homePath/col/$rep/service/history history
set packedRepositoryVersion [lindex $history end] ;# added by GJFB in 2020-04-22 - GetVersionStamp cannot be used here because when calling MakeDownloadFile in ExtractURLibService the global variable repositoryProperties (used in GetVersionStamp) is not updated yet
Store packedRepositoryVersion $homePath/packedRepositoryVersion
# Store packedRepository and packedRepositoryVersion - end
cd $homePath
if {$packEverything != 2} {
## ZIP (doc, agreement and images) ;# commented by GJFB in 2013-02-09
# ZIP (agreement and images)
# -x col/$repository/service/hostCollection
if ![string equal {} $fileList1] {
if [catch {eval "exec \"$command\" $option \"$homePath/col/$rep/download/doc.$type\" $fileList1"} message] {
set log "\[[clock format [clock seconds] -format %Y:%m.%d.%H.%M.%S]\] MakeDownloadFile (2): $message\n"
puts $log
Store log $homePath/@errorLog auto 0 a
}
}
}
# ZIP (source and others)
if [catch {eval "exec \"$command\" $option \"$homePath/col/$rep/download/doc.$type\" $fileList2"} message] {
## puts "exec \"$command\" $option \"$homePath/col/$rep/download/doc.$type\" [join $fileList2]"
# if [catch {eval "exec \"$command\" $option \"$homePath/col/$rep/download/doc.$type\" [join $fileList2]"} message] # ;# added by GJFB in 2017-10-14 - {"unpost URLib"} {"post URLib"} -> "unpost URLib" "post URLib"
set log "\[[clock format [clock seconds] -format %Y:%m.%d.%H.%M.%S]\] MakeDownloadFile (3): $message\n"
puts $log
Store log $homePath/@errorLog auto 0 a
}
# puts source
cd $pwd
# set xxx [list $rep done]
# Store xxx C:/tmp/aaa auto 0 a
}
# MakeDownloadFile - end
# ----------------------------------------------------------------------
# ComputeRepositoryList
# includes parent repositories + $rep + metadata repositories
# force value is 0 or 1
# 1 means to execute TestUpdateLastUpdate even for $rep
# userName used by TestUpdateLastUpdate to create the version stamp
# used in MakeDownloadFile only
proc ComputeRepositoryList {rep force {userName {}}} {
# runs with post
global saveMetadata
global col
set repositoryList [CreateCitedRepositoryList $rep] ;# all parent repositories (inclusive parents of parents)
# Exclude non original parents of an original document
# useful when testing the INPE bibliografic mirror in gjfb.home
# in m19 (where is the INPE bibliografic mirror is the original) the parent: dpi.inpe.br/banon/1999/05.03.22.11 is not the original and must be part of the download file for exportation
# added by GJFB in 2015-07-04
if [GetDocumentState $rep] {
# the document is the original
set repositoryList2 {}
foreach rep2 $repositoryList {
if [GetDocumentState $rep2] {
# the document is the original
lappend repositoryList2 $rep2 ;# just append original document
} else {
puts $rep2
}
}
set repositoryList $repositoryList2
}
# Exclude non original parents of an original document - end
lappend repositoryList $rep
if ![info exists saveMetadata] {set saveMetadata 0}
foreach repName $repositoryList {
set metadataRep [FindMetadataRep $repName]
if {$metadataRep != {}} {
set languageVersions [FindAllLanguageVersions $metadataRep]
foreach mRep $languageVersions {
lappend repositoryList $mRep
}
if {$force || ![string equal $rep $repName]} {
# set newer [TestUpdateLastUpdate $repName $metadataRep 1 $userName]
set newer [TestUpdateLastUpdate $repName $metadataRep 1 $userName 0] ;# don't update child last update - added by GJFB in 2010-08-20
set saveMetadata [expr $saveMetadata || $newer]
if {$newer && ![string equal $rep $repName]} {
# set xxx parent
# Store xxx C:/tmp/aaa auto 0 a
# UpdateDownloadFile $repName ;# may set saveMetadata to 1
UpdateDownloadFile $repName 0 0 $userName ;# may set saveMetadata to 1
}
}
}
}
return $repositoryList
}
# ComputeRepositoryList - end
# ----------------------------------------------------------------------
# UpdateCitingItemList
# added by GJFB in 2024-01-04
# updated by GJFB in 2024-01-21
# used in CountOneClick OR DeleteRepository only
# source is the repository of the citing item (source object)
# destination is the repository of the cited item (destination object)
# used by robust hyperlinks
# updateType value is add or remove
proc UpdateCitingItemList {source destination updateType} {
# runs with post of the local collection destination
global homePath
if [file exists $homePath/col/$destination/service/citingItemList] {
source $homePath/col/$destination/service/citingItemList ;# citingArray
set flag [info exists citingArray()] ;# migration 2024-02-08
if $flag { ;# migration 2024-02-08 - clean the empty entry of citingArray that has been added before adding the if command below
unset citingArray()
}
} else {
set flag 0 ;# migration 2024-02-08
}
if [string equal {} $source] {
# added by GJFB in 2024-02-08 - required because of the new citingItem optional argument of PostponeOneClickCount used in AcknowledgeArchive
# return
if !$flag {return} ;# migration 2024-02-08
} else {
if [string equal {add} $updateType] {
# add
incr citingArray($source)
} else {
# remove
if [info exists citingArray($source)] {
unset citingArray($source)
if [string equal {} [array names citingArray]] {
file delete $homePath/col/$destination/service/citingItemList ;# added by GJFB in 2024-04-27
return
}
} else {
set log "citingArray($source) not found"
StoreLog {notice} {UpdateCitingItemList} $log
}
}
}
StoreArray citingArray $homePath/col/$destination/service/citingItemList w array array 1
# Reduce to the 3 most frequent citing
# same code in CreateExtraFields
set citingList {}
foreach {repository frequency} [array get citingArray] {
lappend citingList [list $repository $frequency]
}
set value [lrange [lsort -integer -decreasing -index 1 $citingList] 0 2]
# Reduce to the 3 most frequent citing - end
set metadataRep [FindMetadataRep $destination]
set metadata2List {}
set metadataList {}
UpdateMetadataField $metadataRep citingitemlist $value metadataList metadata2List 1
UpdateMetadata $metadata2List $metadataList
UpdateRepositoryListForPost $destination
}
# UpdateCitingItemList - end
# ----------------------------------------------------------------------
# CountOneClick
# URParts example: dpi.inpe.br banon 1998 08.02.08.56
# citingItem is the repository of the source object in a Robust Hyperlink - added by GJFB in 2024=01-04
proc CountOneClick {URParts clientIPAddress {citingItem {}}} {
# runs with post
global col
global homePath
global URLibServiceRepository
# global serverAddressWithIP
# set xxx [CallTrace]
# Store xxx C:/tmp/bbb.txt auto 0 a
# set x 0; after 3000 {set x 1}; vwait x ;# just for comparing execution time with Get-
set rep [join $URParts /]
if [GetDocumentState $rep] {
# the original document
# Waiting for the completion of other CountOneClick
WaitQueue CountOneClick $rep
# Waiting for the completion of other CountOneClick - end
UpdateCitingItemList $citingItem $rep add ; # added by GJFB in 2024-01-04 to turn persistent hyperlings robust
set day [clock format [clock seconds] -format %Y.%m.%d]
if [file exists $homePath/col/$rep/service/clientIPLog] {
source $homePath/col/$rep/service/clientIPLog ;# set clientIPArray
# array get clientIPArray
# =>
# 2015.05.05 {192.168.1.31} 2015.05.06 {192.168.1.31 192.168.1.32}
}
if [info exists clientIPArray($day)] {
# not the first click of the day
if {[set index [lsearch $clientIPArray($day) $clientIPAddress]] == -1} {
# ip doesn't exist
lappend clientIPArray($day) $clientIPAddress
StoreArray clientIPArray $homePath/col/$rep/service/clientIPLog w list array 1
}
} else {
# first click of the day
set index -1 ;# ip doesn't exist
set clientIPArray($day) $clientIPAddress
StoreArray clientIPArray $homePath/col/$rep/service/clientIPLog w list array 1
}
if {$index == -1} {
# the ip is new for the current day - count on click
## AddCitingItem $citingItem $rep ; # added by GJFB in 2024-01-04 to turn persistent hyperlings robust
# UpdateCitingItemList $citingItem $rep add ; # added by GJFB in 2024-01-04 to turn persistent hyperlings robust
if [file exists $homePath/col/$rep/service/accessLog] {
# not the first click
Load $homePath/col/$rep/service/accessLog fileContent
set lineList [split $fileContent \n]
set lastLine [lindex $lineList end]
if [regexp "^$day" $lastLine] {
# not the first click of the day
regexp {(.*)-(.*)} $lastLine m day numberOfClicks
incr numberOfClicks ;# + 1
set newLastLine $day-$numberOfClicks
set lineList [lreplace $lineList end end $newLastLine]
} else {
# first click of the day
set newLastLine $day-1
lappend lineList $newLastLine
}
set fileContent [join $lineList \n]
} else {
# first click
set fileContent $day-1
}
Store fileContent $homePath/col/$rep/service/accessLog
}
LeaveQueue [pid] $rep
} else {
# not the original document
if 1 {
set siteContainingTheOriginal [FindSiteContainingTheOriginal2 $rep]
# puts --$siteContainingTheOriginal--
# sometimes the serverAddressWithIP of the site containing the original may be 127.0.0.1 in a wrong way
# this already occured after a breakdown (with marte)
# the solution to this problem was included in Execute
# warning: in standalone mode there are no click counts
if ![string equal {} $siteContainingTheOriginal] {
# if {![regexp {127.0.0.1} $siteContainingTheOriginal] && [string equal {} $siteContainingTheOriginal]} #
# if {(![regexp {127.0.0.1} $siteContainingTheOriginal] || [regexp {127.0.0.1} $serverAddressWithIP]) && \
# ![string equal {} $siteContainingTheOriginal]} #
if [catch {Execute $siteContainingTheOriginal [list PostponeOneClickCount $URParts $clientIPAddress]} message] {
set log "\[[clock format [clock seconds] -format %Y:%m.%d.%H.%M.%S]\] CountOneClick:\nthe command: [list PostponeOneClickCount $URParts $clientIPAddress] cannot be executed for the following reason:\n$message\n"
puts $log
Store log $homePath/@errorLog auto 0 a
}
}
}
}
}
# CountOneClick - end
# ----------------------------------------------------------------------
# PostponeOneClickCount
# URParts example: dpi.inpe.br banon 1998 08.02.08.56
# used in CountOneClick, AcknowledgeArchive, CreateMirror and Archive only
# citingItem is the repository of the source object in a Robust Hyperlink - set in AcknowledgeArchive - added by GJFB in 2024=01-04
proc PostponeOneClickCount {URParts clientIPAddress {citingItem {}}} {
return [list $URParts $clientIPAddress $citingItem] ;# {{urlib.net www 2014 03.25.23.20} 192.168.1.31}
}
# PostponeOneClickCount - end
# ----------------------------------------------------------------------
# ReturnSiteContainingTheOriginal
# without ip (ip == 0) is used in Statistics
proc ReturnSiteContainingTheOriginal {rep {ip 1}} {
global serverAddressWithIP
global serverAddress
# puts $serverAddressWithIP
if [GetDocumentState $rep] {
# rep contains the original
if $ip {
# return $serverAddressWithIP
return [list $serverAddressWithIP]
} else {
# return $serverAddress ;# use this line for texting clearing channel (click in statistics) - see also FindSiteContainingTheOriginal
return [list $serverAddress]
}
}
}
# ReturnSiteContainingTheOriginal - end
# ----------------------------------------------------------------------
# StartApacheServerAfterSubmission
# used in ServeLocalCollection
proc StartApacheServerAfterSubmission {} {
}
# StartApacheServerAfterSubmission - end
# ----------------------------------------------------------------------
# ConvertPS2PDF
# used by Submit
proc ConvertPS2PDF {ps2pdfConverterPath repName fileName} {
global homePath
if [catch {exec $ps2pdfConverterPath $homePath/col/$repName/doc/$fileName &} message] {
return $message
}
}
# ConvertPS2PDF - end
# ----------------------------------------------------------------------
# StartPS2PDFConversionAfterSubmission
# used in ServeLocalCollection
# not used
proc StartPS2PDFConversionAfterSubmission {ps2pdfConverterPath repName} {
return [list $ps2pdfConverterPath $repName]
}
# StartPS2PDFConversionAfterSubmission - end
# ----------------------------------------------------------------------
# SaveToDisk
proc SaveToDisk {} {
# runs with post
# global referenceTable
# global repositoryProperties
# StoreArray referenceTable ../auxdoc/.referenceTable.tcl w list
# StoreArray repositoryProperties ../auxdoc/.repositoryProperties.tcl w list
SaveRepositoryProperties
SaveReferenceTable
SaveMetadata
}
# SaveToDisk - end
# ----------------------------------------------------------------------
# PostponeSaveToDisk
proc PostponeSaveToDisk {} {
}
# PostponeSaveToDisk - end
# ----------------------------------------------------------------------
# ReturnTargetFileContent
# used by Copyright (copyright.tcl) only
proc ReturnTargetFileContent {rep} {
global homePath
set targetFile [GetTargetFile $rep]
Load $homePath/col/$rep/doc/$targetFile fileContent
return [split $fileContent \n]
}
# ReturnTargetFileContent - end
# ----------------------------------------------------------------------
# RegisterSampledDocument
proc RegisterSampledDocument {rep lastUpdate sampleC} {
global homePath
global sampledDocumentDBRepository
# docPath
set docPath $homePath/col/$sampledDocumentDBRepository/doc
set URParts [file split $rep]
set year [lindex $URParts 2]
set rest [lreplace $URParts 2 2]
regsub -all { } $rest {=} rest
regsub -all {[:/]} $lastUpdate {=} versionStamp
# directoryPath
set directoryPath $docPath/$year/$rest/$versionStamp
if [file isdirectory $directoryPath] {return} ;# security issue
file mkdir $directoryPath
set sample [binary format c* $sampleC]
Store sample $directoryPath/sample binary 1
# CREATE A NEW VERSION STAMP
set time [CreateVersionStamp [clock seconds]]
Store time $directoryPath/time
return $time
}
# RegisterSampledDocument - end
# ----------------------------------------------------------------------
# ReturnHostCollection
# returns the host collection identifier (i.e., the name of the local collection index repository)
# and the registrationPassword of the repository ($rep)
# if the calling client is the URLib server, otherwise returns empty
# used by RegisterRepositoryName only (but RegisterRepositoryName is not used)
proc ReturnHostCollection {rep} {
# runs with post
upvar addr addr
set urlibServerAddressWithIP [GetURLibServerAddress] ;# ip and port of urlib.net
# puts $urlibServerAddressWithIP ;# 150.163.34.64 800
# foreach {ip urlibPort} [ReturnCommunicationAddress $urlibServerAddressWithIP] {break} ;# commented by GJFB in 2017-12-20
foreach {ip} $urlibServerAddressWithIP {break} ;# added by GJFB in 2017-12-20 to avoid useless call to ReturnCommunicationAddress
# puts [list $addr $ip]
if [string equal $addr $ip] {
# URLib server is calling
set hostCollection [LoadHostCollection $rep]
LoadService $rep registrationPassword registrationPassword 1 1
return [list $hostCollection $registrationPassword]
}
}
# ReturnHostCollection - end
# ----------------------------------------------------------------------
# RegisterRepositoryName
# URLib server side
# returns 0 if registered
# copyright transfer protocol (from A to B) - here A and B are the identifiers of the respective collections
# 1. a repository is created in collection A (hostCollection value is A)
## 2. the repository is registered with copyright to A (A as hostCollection value + a registration password) (see RegisterRepositoryName - RegisterRepositoryName is called by RegisterRepository)
# 2. the repository is registered with copyright to A (hostCollection value is A) (see RegisterRepositoryName - RegisterRepositoryName is called by RegisterRepository)
# 3. collection B allows copyright transfer from A (see @sitesAllowedToTransferCopyright.tcl file in collection B)
# 4. A appends B to the hostCollection value (hostCollection value becomes the list {A B} - done in UpdateHostCollectionFieldValue which is called by TransferCopyright) and changes the transferable flag to zero (it must be one before the transfer beginning) (see TransferCopyright)
# 5. A restricts the doc.zip download access to B (see TransferCopyright)
## 6. A updates doc.zip (including registration password) (see TransferCopyright)
# 6. A updates doc.zip (including host collection) (see TransferCopyright)
# 7. A asks B to capture doc.zip (see TransferCopyright)
# 8. B captures the doc.zip (see CaptureRepository)
# 9. B informs A that the transfer is complete (see CaptureRepository)
# 10. A deletes the hostCollection file (see CaptureRepository)
# if A doesn't return to B the message transferable, transferNotCompleted is created in B for further tentative from the URLibService interface
# 10b. A registers the repository as B (should be done in the future - the transferable flag in B should remain zero until the new repository registration))
# 11. B turns its transferable flag to one - from now on, B could transfer its copyrights to any other local collection
# >>> RegisterRepositoryName need to be updated to include registration of copies (now a copy has an empty host collection value)
# 12. B asks to register the repository as B, displaying the hostCollection value {A B}, the old password and a new password (see CaptureRepository - CaptureRepository calls InstallRepository - InstallRepository calls RegisterRepository)
### 12. B asks to A registering the repository as B, (see CaptureRepository - CaptureRepository calls InstallRepository - InstallRepository calls RegisterRepository)
## 13. the server asks confirmation to A (A must return the new hostCollection value {A B {}} and the old registration password as registered by the server)
# 13. A ask the server to register the repository with copyright to B (hostCollection value becomes {A B})
## 14. the server checks the old registration password displayed by B, it must agree with the old registration password registered by the server (see RegisterRepositoryName)
## 15. the repository is registered (again) but now with the list {A B} as value of hostCollection and with the new registration password displayed by B (see RegisterRepositoryName)
# not in use
# >>> RegisterRepositoryName need to be updated to include registration of copies (now a copy has an empty host collection value)
proc RegisterRepositoryName {rep hostCollection registrationPassword oldRegistrationPasswordInNewHostCollection {url {}}} {
global homePath
global repositoryNameDBRepository
global loBiMiRep
# set xxx [list $rep $hostCollection $registrationPassword]
# Store xxx C:/tmp/bbb auto 0 a
# docPath
set docPath $homePath/col/$repositoryNameDBRepository/doc
set URParts [file split $rep]
set year [lindex $URParts 2]
set rest [lreplace $URParts 2 2]
regsub -all { } $rest {=} rest
# directoryPath
set directoryPath $docPath/$year/$rest ;# doc/2008/dpi.inpe.br=hermes2@80=08.22.00.00
if [file isdirectory $directoryPath] {
# repository name already registered
# check for the new host collection
Load $directoryPath/hostCollection data binary
set data [UnShift $data]
if {[lindex $data 0] != "$rep"} {return 1} ;# corrupted hostCollection
set oldHostCollection [lindex $data end]
# set xxx $oldHostCollection
# Store xxx C:/tmp/bbb auto 0 a
Load $homePath/col/$loBiMiRep/doc/@siteList.txt fileContent
set found 0
foreach line [split $fileContent \n] {
if [string equal $oldHostCollection [lindex $line 1]] {
set oldHostCollectionSite [lindex $line 0]
set found 1 ;# old host collection (A) is still registered
break
}
}
# set xxx $found
# Store xxx C:/tmp/bbb auto 0 a
if $found {
set command [list list ReturnHostCollection $rep]
# set xxx [list $oldHostCollectionSite $command]
# Store xxx C:/tmp/bbb auto 0 a
# MULTIPLE SUBMIT
set collectionPassword [MultipleExecute [list $oldHostCollectionSite] $command]
# set xxx --$collectionPassword--
# Store xxx C:/tmp/bbb auto 0 a
foreach {newHostCollection oldRegistrationPasswordInOldHostCollection} $collectionPassword {break}
if ![string equal $newHostCollection $hostCollection] {return 1} ;# inconsistency
# the site (== $hostCollection) requiring the repository registration is the one which has
# received the copyrights from the site which has transferred them
# in other words, the previoulsy registered host collection A ($oldHostCollection) is
# confirming that B ($hostCollection) is the new host collection
Load $directoryPath/password data binary
set data [UnShift $data]
if {[lindex $data 0] != "$rep"} {return 1} ;# corrupted password
set oldRegistrationPasswordInServer [lindex $data end]
if ![string equal $oldRegistrationPasswordInServer $oldRegistrationPasswordInOldHostCollection] {return 1} ;# different passwords
# the calling site A (the old host collection) knows the old registation password
if ![string equal $oldRegistrationPasswordInServer $oldRegistrationPasswordInNewHostCollection] {return 1} ;# different passwords
# the calling site B (the new host collection) knows the old registation password
} else {return 1} ;# site A not found
} else {
# new repository name to be registered
file mkdir $directoryPath
}
set data [Shift $rep $hostCollection]
Store data $directoryPath/hostCollection binary 1 ;# nonewline
set data [Shift $rep $registrationPassword]
Store data $directoryPath/password binary
return 0 ;# registration done
}
# RegisterRepositoryName - end
# ----------------------------------------------------------------------
# RegisterRepository
# client side
# used by PerformCheck, CreateRepMetadataRep, UpdateRepMetadataRep and InstallRepository (only)
# forceRegistration value is 0 or 1
# 1 means to force registration
# (set to 1 in CaptureRepository (see InstallRepository arguments)
# when called from InstallRepository, the request comes from B
# not in use
# >>> RegisterRepositoryName need to be updated to include registration of copies (now a copy has an empty host collection value)
proc RegisterRepository {rep {forceRegistration 0}} {
# runs with post
global homePath
global loCoInRep
global urlibServerAddress ;# urlib.net and port
if {[GetDocumentState $rep] && \
![TestContentType $rep Metadata] && \
[file exists $homePath/col/$rep/service/size]} {
# contains a non empty original document
if {$forceRegistration || [CheckRegistration $rep]} {
# not registered
# oldRegistrationPassword
if $forceRegistration {
if [file exists $homePath/col/$rep/service/registrationPassword] {
if [LoadService $rep registrationPassword oldRegistrationPassword 1 1] {return} ;# corrupted password
StoreService oldRegistrationPassword $rep oldRegistrationPassword 1 1 ;# because registration may fail
file delete $homePath/col/$rep/service/registrationPassword ;# to force the creation of a new password (see below)
} else {
set oldRegistrationPassword {}
}
} else {
if [file exists $homePath/col/$rep/service/oldRegistrationPassword] {
if [LoadService $rep oldRegistrationPassword oldRegistrationPassword 1 1] {return} ;# corrupted password
} else {
set oldRegistrationPassword {}
}
}
if ![file exists $homePath/col/$rep/service/registrationPassword] {
# registrationPassword file doesn't exist
# CREATE registrationPassword
regsub {0\.} [expr [SortRandomNumber]/double(233280)] {} registrationPassword
StoreService registrationPassword $rep registrationPassword 1 1
} else {
# registrationPassword file already exists
if [LoadService $rep registrationPassword registrationPassword 1 1] {return} ;# corrupted password
}
set command [list list RegisterRepositoryName $rep $loCoInRep $registrationPassword $oldRegistrationPassword]
# MULTIPLE SUBMIT
set flag [MultipleExecute [list $urlibServerAddress] $command 1]
# set xxx --$flag--
# Store xxx C:/tmp/bbb auto 0 a
if [string equal {0} $flag] {
# registered
file delete $homePath/col/$rep/service/notRegistered
file delete $homePath/col/$rep/service/oldRegistrationPassword
} else {
# not registered
set notRegistered {}
Store notRegistered $homePath/col/$rep/service/notRegistered
lappend message "RegisterRepository ([clock format [clock seconds]]):"
lappend message [CallTrace]
lappend message [list flag == --$flag--]
set log [join $message \n]
# puts $log ;# didn't work on mtc-m17.sid.inpe.br
Store log $homePath/@errorLog auto 0 a
}
}
}
}
# RegisterRepository - end
# ----------------------------------------------------------------------
# ImportRepository
# remoteSiteAddress value is the http remote site address (without http://)
# >>> the remote site is the site from which the repository will be imported
# if remoteSiteAddress is empty and repositoryName is the name of the packed repository
# in the current homePath/doc.zip then this repository is installed using this doc.zip
# repositoryName value is the name of the repository to be imported
# returns empty when the importation is made, othewise returns a non-empty error message
# administratorCodedPassword value is the administrator coded password of the site requiring importation
# startApacheServer value is 0 or 1; 1 (default) means to restart the Apache server
# Apache needs to be restarted when the repository contains a CGI script.
# If ImportRepository is called remotly under Unix, then Apache must be restarted outside
# ImportRepository (using the value 0 for startApacheServer) otherwise Submit called
# indirectly inside ImportRepository doesn't return.
# used only in CaptureRepository, SynchronizeRepository and Script (in repository: dpi.inpe.br/banon-pc@1905/2005/02.19.00.40)
# deletes download/doc.zip whenever the state value contains the word Modified (see ComputeVersionState)
proc ImportRepository {remoteSiteAddress repositoryName administratorCodedPassword {startApacheServer 1}} {
# runs with post
global homePath
global loCoInRep
global serveraddr
set message [CheckAdministratorPassword administrator $administratorCodedPassword]
if ![string equal {} $message] {return $message} ;# unfair call - don't import
if ![string equal {} $remoteSiteAddress] {
set remoteServerAddress [GetServerAddressFromHTTPHost $remoteSiteAddress]
# versionState
# set versionState [Execute $remoteSiteAddress [list ComputeVersionState $repositoryName {} 1]] ;# returns empty (unless doing frame reload) communicating from banon-pc3 to plutao
# set versionState [Execute $remoteSiteAddress [list ComputeVersionState $repositoryName {} 1] 0] ;# not async - commented by GJFB in 2015-12-01 - doesn't work with virtual host
set versionState [Execute $remoteServerAddress [list ComputeVersionState $repositoryName {} 1] 0] ;# not async - added by GJFB in 2015-12-01 - add the urlib port
# puts --$versionState-- ;# may contain an error message
# => {Registered Original} {banon-pc3 800} http://banon-pc3/rep-/dpi.inpe.br/banon/1999/12.15.21.29
if [string equal {} $versionState] {
return "the version state of the repository $repositoryName cannot be found"
}
foreach {versionState} $versionState {break}
# puts $versionState
array set stateTable {
{Registered Original} {Official}
{Modified Original} {Modified}
{Copy of an Original} {Copied}
{Modified Copy of an Original} {Modified}
{Unchecked} {Unchecked}
}
if 0 {
# commented by GJFB in 2021-02-21
if [string equal {Modified} $stateTable($versionState)] {
return "the last update in the repository $repositoryName must be reloaded"
}
if ![Execute $remoteServerAddress [list DownloadFileExists $repositoryName] 0] {
Execute $remoteServerAddress [list MakeDownloadFile $repositoryName 0 0 0 administrator] 0 ;# not async - added by GJFB in 2018-01-02 - useful when synchronizing (see SynchronizeRepository) or importing (see administrator page) a repository
}
} else {
# new code by GJFB in 2021-02-21
if [string equal {Modified} $stateTable($versionState)] {
return "the last update in the repository $repositoryName must be reloaded"
} else {
if [Execute $remoteServerAddress [list DownloadFileExists $repositoryName] 0] {
# doc.zip exists
set seconds [Execute $remoteServerAddress [list DownloadFileMtime $repositoryName] 0]
set fileTime [clock format $seconds -format %Y:%m.%d.%H.%M.%S -gmt 1]
set metadataRep [Execute $remoteServerAddress [list FindMetadataRep $repositoryName] 0]
SetFieldValue $remoteServerAddress $metadataRep-0 {metadatalastupdate}
if {[string compare $fileTime $metadatalastupdate] == -1} {
# fileTime < metadatalastupdate - doc.zip out-of-date
Execute $remoteServerAddress [list MakeDownloadFile $repositoryName 0 0 0 administrator] 0 ;# not async - added by GJFB in 2018-01-02 - useful when synchronizing (see SynchronizeRepository) or importing (see administrator page) a repository
}
} else {
# doc.zip doesn't exist
Execute $remoteServerAddress [list MakeDownloadFile $repositoryName 0 0 0 administrator] 0 ;# not async - added by GJFB in 2018-01-02 - useful when synchronizing (see SynchronizeRepository) or importing (see administrator page) a repository
}
}
}
if 0 {
package require http
set fileId [open $homePath/doc.zip w]
set convertedURL [ConvertURLToHexadecimal http://$remoteSiteAddress/col/$repositoryName/download/doc.zip]
if [catch {http::geturl $convertedURL -channel $fileId} token] {
close $fileId
# Store token C:/tmp/bbb auto 0 a
file delete $homePath/doc.zip
return "token = $token" ;# don't import
} else {
close $fileId
# upvar #0 $token state
set ncode [::http::ncode $token]
# if ![string equal {HTTP/1.1 200 OK} $state(http)] #
if ![string equal {200} $ncode] {
# for example 404: HTTP/1.1 404 Not Found
# for example 401: HTTP/1.1 401 Authorization Required
file delete $homePath/doc.zip
if [string equal {401} $ncode] {
return "col/$repositoryName/download/doc.zip at $remoteSiteAddress doesn't have the 'allow from all' permission" ;# don't import
}
# set httpState $state(http)
set code [::http::code $token]
::http::cleanup $token ;# free memory including the array state
return "state(http) = $code" ;# don't import
}
http::cleanup $token
}
} else {
# new code by GJFB in 2015-08-25
set message [StoreURLContent http://$remoteSiteAddress/col/$repositoryName/download/doc.zip doc.zip]
if ![string equal {} $message] {return $message} ;# don't import
}
}
# INSTALL
# set command [InstallRepository 0 1 0 0 1]
# set command [InstallRepository 0 1 1 0 0 $repositoryName $administratorCodedPassword] ;# Apache needs to be restarted when the repository contains a CGI script
set command [InstallRepository 0 1 $startApacheServer 0 0 $repositoryName $administratorCodedPassword] ;# added by GJFB in 2013-12-02 in order to be able to postpone Apache server restarting in col/dpi.inpe.br/banon-pc@1905/2005/02.19.00.40/doc/cgi/script.tcl (see Import repository)
if [string equal {} $command] {
# installation made
# Append repNames to the repositoryListForStart file content
# (used to update keyRepositoryList in SetIndicator)
Load ../auxdoc/repositoryList repositoryList
set repNames [join $repositoryList \n]
Store repNames ../auxdoc/repositoryListForStart auto 0 a
# Append repNames to the repositoryListForStart file content - end
} elseif {[regexp {there is an original document} $command]} {
# already manually captured
return "there is an original document" ;# don't import
} else {
# unexpected repository
return "$command" ;# unexpected repository - don't import
}
}
# ImportRepository - end
# ----------------------------------------------------------------------
# CaptureRepository
# used by PerformCheck and Dialog (Host Collection option)
# return 0 if doc.zip has been captured and an error message otherwise
# >>> runs in the new host collection (B)
# remoteSiteStamp is of the old host collection (which are transferring the copyrights) (A)
# remoteVersionStamp is of the old host collection (which are transferring the copyrights) (A)
# Capture is allowed in accordance with the permissions contained in the file
# @sitesHavingReadPermission.txt
# registrationPassword is the repository registration password (stored in service)
proc CaptureRepository {rep metadataRep remoteSiteStamp registrationPassword remoteVersionStamp} {
# runs with post
global homePath
global loCoInRep
if [file isdirectory $homePath/col/$metadataRep] {
set versionStamp [GetVersionStamp $metadataRep]
if [string equal $remoteVersionStamp $versionStamp] {
# the repository has already be captured
return 0
}
}
# Test if the remote site (A) is allowed to transfer copyright
# redundant code (already tested in Dialog by the host which is transferring the copyright)
set remoteServerAddress [lindex $remoteSiteStamp 0]
# remoteSite
set remoteSite [ReturnHTTPHost $remoteServerAddress]
# remoteHostCollection
set remoteHostCollection [lindex $remoteSiteStamp 1] ;# (A)
# remoteIp
set remoteIp [lindex $remoteSiteStamp 2]
# remoteServerAddressWithIP
foreach {m remoteURLibPort} [ReturnCommunicationAddress $remoteServerAddress] {break}
set remoteServerAddressWithIP [list $remoteIp $remoteURLibPort] ;# server address of the old host collection, ex.: {150.163.2.174 19050}
if [file exists $homePath/col/$loCoInRep/doc/@sitesAllowedToTransferCopyright.tcl] {
source $homePath/col/$loCoInRep/doc/@sitesAllowedToTransferCopyright.tcl
foreach name [array names allowedSitesArray $remoteHostCollection,*] {
regsub {.*,} $name {} name2 ;# ex: docpermission
set allowedSitesArray2($name2) $allowedSitesArray($name)
}
if ![info exists allowedSitesArray2] {return "CaptureRepository: the host collection $remoteHostCollection (A) is not allowed to transfer copyright to the host collection $loCoInRep (B)"}
} else {
return "CaptureRepository: file $homePath/col/$loCoInRep/doc/@sitesAllowedToTransferCopyright.tcl not found"
}
# Test if the remote site (A) is allowed to transfer copyright - end
# the remote site (A) is allowed to transfer copyright to the current site (B)
# i.e., B accepts documents from A
# Waiting for the completion of other repository insertions
WaitQueue
# Waiting for the completion of other repository insertions - end
# IMPORT
# administratorCodedPassword
Load $homePath/col/$loCoInRep/auxdoc/xxx data binary
set data [UnShift $data]
set administratorCodedPassword [lindex $data end]
set command [ImportRepository $remoteSite $rep $administratorCodedPassword]
if [string equal {} $command] {
# importation made
# Process Permission
set allowedSitesList2 [array get allowedSitesArray2]
ProcessPermission $allowedSitesList2 $rep $metadataRep
# Process Permission - end
LeaveQueue
set transferableFlag 0 ;# must remain 0 in A
# Delete the remote host collection field (in A)
# SUBMIT
set message [Execute $remoteServerAddressWithIP [list UpdateHostCollectionFieldValue $rep $registrationPassword {} $transferableFlag]]
# set message [Execute $remoteServerAddressWithIP [list UpdateHostCollectionFieldValue $rep $registrationPassword {} $transferableFlag] 0] ;# not async
# Delete the remote host collection field - end
if [string equal {transferable} $message] {
# copyright can now be transferred again if necessary
set transferableFlag 1 ;# end of transfer; must be 1 in B
StoreService transferableFlag $rep transferableFlag 1 1
set metadataList {}
set metadata2List {}
UpdateMetadataField $metadataRep transferableflag $transferableFlag metadataList metadata2List 1
# AddMetadata $metadataList ;# commented by GJFB in 2020-08-18
AddMetadata2 $metadataList ;# added by GJFB in 2020-08-18
} else {
Store remoteServerAddressWithIP $homePath/col/$rep/service/transferNotCompleted
}
return 0
} elseif {[regexp {there is an original document} $command]} {
# already manually captured
LeaveQueue
return 0
} else {
LeaveQueue
return "CaptureRepository: command = $command"
}
# Capture the download/doc.zip which is in A - end
}
# CaptureRepository - end
# ----------------------------------------------------------------------
# CheckRegistration
# used twice by ControlBCButtonState
# return 0 while the registration process is turned off
## return 0 if the repository has been registered or
## need not be registered (because it contains an empty document or
## there is no domain name) and
## 1 otherwise
proc CheckRegistration {rep} {
global homePath
global environmentArray
return 0 ;# returns 0 while the registration process is turned off - RegisterRepositoryName need to be updated to include registration of copies (now a copy has an empty host collection value)
# return [expr ([file exists $homePath/col/$rep/service/notRegistered] || \
![file exists $homePath/col/$rep/service/registrationPassword]) && \
[file exists $homePath/col/$rep/service/size] && \
![string equal {} $environmentArray(domainName)]]
}
# CheckRegistration - end
# ----------------------------------------------------------------------
# UpdateHostCollectionFieldValue
# security issue
# used by TransferCopyright and cgi/script (in dpi.inpe.br/banon-pc@1905/2005/02.19.00.40)
# registrationPassword is the repository registration password (stored in service)
# newHostCollection is appended to the current hostCollection
# if newHostCollection is empty then service/hostCollection file is deleted (used in CaptureRepository)
# transferableFlag value is 0 or 1
# updates hostCollection value in service/hostCollection and repositoryProperties
proc UpdateHostCollectionFieldValue {rep registrationPassword newHostCollection transferableFlag} {
# runs with post
global homePath
# registrationPassword
if [LoadService $rep registrationPassword currentRegistrationPassword 1 1] {
# corrupted password
set log "UpdateHostCollectionFieldValue: $rep has a corrupted registration password"
puts $log
Store log $homePath/@errorLog auto 0 a
return $log
}
if ![string equal $registrationPassword $currentRegistrationPassword] {
# wrong registration password
set log "UpdateHostCollectionFieldValue: $rep has a wrong registration password"
puts $log
Store log $homePath/@errorLog auto 0 a
return $log
}
if ![file isdirectory $homePath/col/$rep] {return {transferable}} ;# the repository may have been deleted after a transfer - nothing to do
if [string equal {} $newHostCollection] {
file delete $homePath/col/$rep/service/hostCollection
# file delete $homePath/col/$rep/service/transferableFlag
} else {
# CONCAT
set hostCollection [LoadHostCollection $rep]
if [string equal $newHostCollection [lindex $hostCollection end]] {
set hostCollection2 $hostCollection ;# already updated (might occur after an error)
} else {
set hostCollection2 [concat $hostCollection $newHostCollection]
}
StoreHostCollection $rep $hostCollection2
StoreService transferableFlag $rep transferableFlag 1 1
}
UpdateRepositoryProperties $rep hostcollection
# metadataRep
set metadataRep [FindMetadataRep $rep]
# Update the hostcollection of the related metadata repositories
set metadataRepList [FindAllLanguageVersions $metadataRep]
foreach mRep $metadataRepList {
if [string equal {} $newHostCollection] {
file delete $homePath/col/$mRep/service/hostCollection
} else {
StoreHostCollection $mRep $hostCollection2
}
UpdateRepositoryProperties $mRep hostcollection
}
# Update the hostcollection of the related metadata repositories - end
if {$metadataRep != {}} {
set metadataList {}
set metadata2List {}
UpdateField $rep $metadataRep hostcollection metadataList metadata2List
UpdateMetadataField $metadataRep transferableflag $transferableFlag metadataList metadata2List 1
if 0 {
# commented by GJFB in 2020-08-18
RemoveMetadata $metadata2List
AddMetadata $metadataList
} else {
UpdateMetadata $metadata2List $metadataList ;# added by GJFB in 2020-08-18 - uses metadata2List and metadataList
}
}
UpdateRepositoryListForPost [concat $rep $metadataRepList]
return {transferable}
}
# UpdateHostCollectionFieldValue - end
# ----------------------------------------------------------------------
# UpdateOAIRepositoryData
# used in StartService and SPOK
proc UpdateOAIRepositoryData {} {
global OAIProtocolRepository
global loCoInRep
global homePath
# global OAISetSpecification ;# set here and used in CreateBriefEntry
# global referenceTypeList
# set serverAddress [GetServerAddress]
if [file isdirectory $homePath/col/$OAIProtocolRepository] {
# Migration 07/12/2003
if [file isdirectory $homePath/col/$loCoInRep/doc/OAI-PMH] {
file delete -force $homePath/col/$loCoInRep/doc/OAI-PMH
}
# Migration 07/12/2003 - end
file mkdir $homePath/col/$OAIProtocolRepository/auxdoc
if ![file exists $homePath/col/$OAIProtocolRepository/auxdoc/repositoryName.txt] {
set oaiRepositoryName "URLib local collection $loCoInRep"
Store oaiRepositoryName $homePath/col/$OAIProtocolRepository/auxdoc/repositoryName.txt
}
## if ![file exists $homePath/col/$OAIProtocolRepository/auxdoc/setSpecification.txt] {
## set setSpecification {Conference Proceedings
##Thesis}
# set setSpecification [join $referenceTypeList \n]
# Store setSpecification $homePath/col/$OAIProtocolRepository/auxdoc/setSpecification.txt
## }
# Load $homePath/col/$OAIProtocolRepository/auxdoc/setSpecification.txt OAISetSpecification
# set OAISetSpecification [split $OAISetSpecification \n]
# Migration 13/03/05
file delete $homePath/col/$OAIProtocolRepository/auxdoc/setSpecification.txt
# Migration 13/03/05
if ![file exists $homePath/col/$OAIProtocolRepository/auxdoc/siteList.txt] {
set siteList ""
Store siteList $homePath/col/$OAIProtocolRepository/auxdoc/siteList.txt
}
}
}
# UpdateOAIRepositoryData - end
# ----------------------------------------------------------------------
# StoreReadPermission
# used in Dialog, UpdateRepMetadataRep and CreateRepMetadataRep
# upperSuffix value is Permission or RemotePermission
# lowerSuffix value is permission or remotepermission
# title value is Permission or Remote Permission
# argument -> service -> repositoryProperties -> metadataList
# argument -> doc
proc StoreReadPermission {
xxDefaultPermissionName xxDocAccessPermissionName xxDownloadAccessPermissionName
rep metadataRep upperSuffix lowerSuffix secure title metadataListName metadata2ListName
} {
# runs with post and start
global homePath
upvar $xxDefaultPermissionName xxDefaultPermission
upvar $xxDocAccessPermissionName xxDocAccessPermission
upvar $xxDownloadAccessPermissionName xxDownloadAccessPermission
upvar $metadataListName metadataList
upvar $metadata2ListName metadata2List
# puts [CallTrace]
# puts --$xxDocAccessPermission--
# set startApacheServer 0
if $xxDefaultPermission {
file delete $homePath/col/$rep/service/doc$upperSuffix
if [Info exists repositoryProperties($rep,doc$lowerSuffix)] {
Unset repositoryProperties($rep,doc$lowerSuffix)
# set startApacheServer [expr !$secure]
}
file delete $homePath/col/$rep/service/download$upperSuffix
if [Info exists repositoryProperties($rep,download$lowerSuffix)] {
Unset repositoryProperties($rep,download$lowerSuffix)
# set startApacheServer [expr !$secure]
}
if [string equal {Permission} $title] {
if {$metadataRep != {}} {
DeleteMetadataField $metadataRep readpermission \
metadata2List 1
}
}
} else {
# Convert to one host per line
set xxDocAccessPermission [Convert2OneHostPerLine $xxDocAccessPermission]
# Convert to one host per line - end
LoadService $rep doc$upperSuffix oldXXDocAccessPermission $secure 1
StoreService xxDocAccessPermission $rep doc$upperSuffix $secure 1
if {$oldXXDocAccessPermission == {} || \
$oldXXDocAccessPermission != "$xxDocAccessPermission"} {
Eval UpdateRepositoryProperties $rep doc$lowerSuffix
# set startApacheServer [expr !$secure]
}
# Convert to one host per line
set xxDownloadAccessPermission [Convert2OneHostPerLine $xxDownloadAccessPermission]
# Convert to one host per line - end
LoadService $rep download$upperSuffix oldXXDownloadAccessPermission $secure 1
StoreService xxDownloadAccessPermission $rep download$upperSuffix $secure 1
if {$oldXXDownloadAccessPermission == {} || \
$oldXXDownloadAccessPermission != "$xxDownloadAccessPermission"} {
Eval UpdateRepositoryProperties $rep download$lowerSuffix
# set startApacheServer [expr !$secure]
}
if [string equal {Permission} $title] {
if {$metadataRep != {}} {
set xxDocAccessPermission2 [string trim $xxDocAccessPermission \n] ;# added by GJFB in 2011-04-10
regsub -all "\n" $xxDocAccessPermission2 { and } value
UpdateMetadataField $metadataRep readpermission $value metadataList metadata2List 1
}
}
}
# return $startApacheServer
return 0 ;# because of the access file use
}
# StoreReadPermission - end
# ----------------------------------------------------------------------
# UpdateAccessFile
# creates, updates or deletes the .htaccess file
# called in UpdateRepMetadataRep and InstallRepository
# UpdateAccessFile calls ComputeAccess
# ComputeAccess uses repositoryProperties array
# when running InstallRepository
# repositoryProperties array is updated in UpdateRepositoryProperties called in UpdateCollection called in InstallRepository
proc UpdateAccessFile {rep} {
# runs with post and start
global homePath
global environmentArray
# global applicationName
global loCoInRep
# administratorUserName
regsub {@.*$} $environmentArray(spMailEntry) {} administratorUserName
# ipAddress
set ipAddress $environmentArray(ipAddress)
# compute default access
foreach {defaultAuthenticationFlag spDocAccessPermission spDownloadAccessPermission directivesForCGI} [ComputeDefaultAccess $ipAddress 1] {break}
# compute access
foreach {authDirectives docPermission downloadPermission} [Eval ComputeAccess $rep $administratorUserName $defaultAuthenticationFlag $spDocAccessPermission $spDownloadAccessPermission $ipAddress 1] {break}
# puts $rep
# puts [list $authDirectives $docPermission $downloadPermission]
# doc
if {![string equal {} $docPermission] || ![string equal {} $authDirectives]} {
set fileContent "Satisfy any$docPermission$authDirectives"
if [file isdirectory $homePath/col/$rep/doc] {
Store fileContent $homePath/col/$rep/doc/.htaccess
}
} else {
file delete $homePath/col/$rep/doc/.htaccess
}
if ![string equal {} $docPermission] {
set fileContent $docPermission
if [file isdirectory $homePath/col/$rep/doc] {
Store fileContent $homePath/col/$rep/doc/.htaccess2
}
} else {
file delete $homePath/col/$rep/doc/.htaccess2
}
# download
if {![string equal {} $downloadPermission] || ![string equal {} $authDirectives]} {
set fileContent "Satisfy any$downloadPermission$authDirectives"
file mkdir $homePath/col/$rep/download
Store fileContent $homePath/col/$rep/download/.htaccess
} else {
file delete $homePath/col/$rep/download/.htaccess
}
if ![string equal {} $downloadPermission] {
set fileContent $downloadPermission
file mkdir $homePath/col/$rep/download
Store fileContent $homePath/col/$rep/download/.htaccess2
} else {
file delete $homePath/col/$rep/download/.htaccess2
}
# Restrict access to update and review
if 0 {
if {$applicationName == "post"} {
# Info doesn't work when UpdateAccessFile is called from a cgi script (Get or Get-) (with mtc-m19)
global repositoryProperties
set flag [info exists repositoryProperties($rep,username)]
} else {
set flag [Info exists repositoryProperties($rep,username)]
}
} else {
# if is now in Info
set flag [Info exists repositoryProperties($rep,username)]
}
if $flag {
file mkdir $homePath/col/$rep/auxdoc/cgi2
set fileContent \
"
allow from all
"
Store fileContent $homePath/col/$rep/auxdoc/cgi2/.htaccess
set fileContent \
"
allow from all
"
Store fileContent $homePath/col/$rep/auxdoc/cgi2/.htaccess2
} else {
file delete $homePath/col/$rep/auxdoc/cgi2/.htaccess
file delete $homePath/col/$rep/auxdoc/cgi2/.htaccess2
}
if [file exists $homePath/col/$rep/auxdoc/cgi3/review] {
if {![string equal {} $authDirectives] && !$defaultAuthenticationFlag} {
set fileContent \
"
AuthName \"URLib Update Form\"
AuthType Basic
AuthUserFile \"$homePath/col/$loCoInRep/auxdoc/@passwords.txt\"$authDirectives
satisfy any
"
Store fileContent $homePath/col/$rep/auxdoc/cgi3/.htaccess
} else {
# don't display review
file delete $homePath/col/$rep/auxdoc/cgi3/.htaccess
}
}
# Restrict access to update and review - end
}
# UpdateAccessFile - end
# ----------------------------------------------------------------------
# SetAccessPermission
# used in UpdateRepMetadataRep and CreateRepMetadataRep
# doesn't change xxDefaultPermission
# content equivalence for readPermission: ip <==> deny from all and allow from ip
proc SetAccessPermission {
rep readPermission xxDefaultPermissionName
xxDocAccessPermissionName xxDownloadAccessPermissionName
} {
# runs with post and start
global repositoryProperties ;# used when UpdateRepMetadataRep is calling
upvar $xxDefaultPermissionName xxDefaultPermission
upvar $xxDocAccessPermissionName xxDocAccessPermission
upvar $xxDownloadAccessPermissionName xxDownloadAccessPermission
# puts --$readPermission--
if $xxDefaultPermission {
set xxDocAccessPermission {} ;# used in CreateRepMetadataRep - added by GJFB in 2011-06-13 to avoid: can't read "xxDocAccessPermission": no such variable while executing "regexp {deny} $xxDocAccessPermission"
} else {
if [regexp {from} $readPermission] {
regsub -all { and } $readPermission "\n" xxDocAccessPermission
} else {
if [string equal {intranet} $readPermission] {
# runs with post only
# metadataRep
set metadataRep [FindMetadataRep $rep]
# year
set year [GetFieldValue $metadataRep-0 year]
# group
set group [GetFieldValue $metadataRep-0 group]
# ipList
# puts "[list ReturnIntranetConfiguration $year $group]"
if [catch {ReturnIntranetConfiguration $year $group} ipList] {
set xxDocAccessPermission "deny from all"
} else {
if [string equal {} $ipList] {
set xxDocAccessPermission "deny from all"
} else {
set xxDocAccessPermission "deny from all
allow from $ipList"
}
}
} else {
set xxDocAccessPermission "deny from all
allow from $readPermission"
}
}
if [info exists repositoryProperties($rep,downloadpermission)] {
set xxDownloadAccessPermission $repositoryProperties($rep,downloadpermission)
} else {
set xxDownloadAccessPermission "deny from all"
}
if [regexp {^ *deny +from +all *$} $xxDocAccessPermission] {
set xxDownloadAccessPermission "deny from all"
} elseif ![regexp {^ *allow +from +all *$} $xxDocAccessPermission] {
# there are some restrictions
if ![regexp {^ *deny +from +all *$} $xxDownloadAccessPermission] {
set xxDownloadAccessPermission $xxDocAccessPermission
}
}
}
}
# SetAccessPermission - end
# ----------------------------------------------------------------------
# UpdateRepositoryListForPost
# repositoryListForPost contains the list of repositories
# that have been created, updated or deleted during the
# current posting
proc UpdateRepositoryListForPost {repList} {
# runs with post
global repositoryListForPost
global repositoryListForStart
global saveMetadata
if ![info exists repositoryListForPost] {set repositoryListForPost {}}
set repositoryListForPost [concat $repositoryListForPost $repList]
set repositoryListForPost [lsort -unique $repositoryListForPost]
if {[llength $repositoryListForPost] > 200} {
# to speed up the next repository creations
SaveRepositoryProperties 1
SaveReferenceTable 1
set saveMetadata 1
SaveMetadata 1
set repositoryListForStart {}
if [file exists ../auxdoc/.repositoryListForStart.tcl] {
source ../auxdoc/.repositoryListForStart.tcl ;# set the variable repositoryListForStart
}
set repositoryListForStart [concat $repositoryListForPost $repositoryListForStart]
set repositoryListForStart [lsort -unique $repositoryListForStart]
StoreList repositoryListForStart ../auxdoc/.repositoryListForStart.tcl
file delete ../auxdoc/.repositoryListForPost.tcl
unset repositoryListForPost
} else {
StoreList repositoryListForPost ../auxdoc/.repositoryListForPost.tcl
}
# set xxx [CallTrace]
# Store xxx C:/tmp/bbb auto 0 a
}
if 0 {
source utilitiesStart.tcl
UpdateRepositoryListForPost dpi.inpe.br/banon/1998/08.02.08.56
}
# UpdateRepositoryListForPost - end
# ----------------------------------------------------------------------
# TransferCopyright
# >>> runs in the old host collection (A)
# transferts copyright from A to B
# if the information item doesn't exist as a copy in B it is created
# used by Dialog
# rep value is the name of the repository to be transferred
# remoteSiteStamp value is the stamp of the site receiving the copyright (B)
# save value is 0 or 1,
# 1 means to update and save the metadata
# example of @sitesAllowedToTransferCopyright.tcl content (in B - allowedSitesArray contains the sites allowed/accepted to transfert copyright, A must be such a site):
if 0 {
array set allowedSitesArray {
bighost.com.br/banon/2005/05.04.18.04,defaultpermission {0}
bighost.com.br/banon/2005/05.04.18.04,docpermission {{allow from all}}
bighost.com.br/banon/2005/05.04.18.04,downloadpermission {{deny from all} {allow from 127.0.0.1} {allow from 192.168.1.100} {allow from 150.163}}
bighost.com.br/banon/2005/05.04.18.04,mirrorsites {bighost.com.br/banon/2005/05.04.18.04}
bighost.com.br/banon/2005/05.04.18.04,defaultremotepermission {0}
bighost.com.br/banon/2005/05.04.18.04,docremotepermission {{allow from all}}
bighost.com.br/banon/2005/05.04.18.04,downloadremotepermission {{deny from all}}
}
array set allowedSitesArray {
dpi.inpe.br/banon/2001/02.23.19.23,defaultpermission {0}
dpi.inpe.br/banon/2001/02.23.19.23,docpermission {{allow from all}}
dpi.inpe.br/banon/2001/02.23.19.23,downloadpermission {{allow from all}}
dpi.inpe.br/banon/2001/02.23.19.23,mirrorsites {dpi.inpe.br/banon/2001/02.23.19.23}
dpi.inpe.br/banon/2001/02.23.19.23,defaultremotepermission {0}
dpi.inpe.br/banon/2001/02.23.19.23,docremotepermission {{allow from all}}
dpi.inpe.br/banon/2001/02.23.19.23,downloadremotepermission {{deny from all}}
}
}
# The pairs in allowedSitesArray define how (B) decides about the repository permissions in (A) once the transfert was completed
# In the above exemple, (B) decides that the site bighost.com.br/banon/2005/05.04.18.04 (A) becomes a mirror site (~ mirror archive) for the repository whose copyright has been transferred to (B)
# The allowed sites must be in accordance with the permissions contained in the file
# @sitesHavingReadPermission.txt (otherwise CaptureRepository is not executed), that is, allowed sites must be client sites having read permission, A must be such a site
# username must be administrator or the administrator name
# The administrator must have been registered as an advanced user (otherwise CaptureRepository is not executed)
proc TransferCopyright {rep metadataRep remoteSiteStamp userName} {
# runs with post
global homePath
global URLibServiceRepository
global repositoryProperties
global environmentArray
global startApacheServer
global tcl_platform
# administratorUserName
regsub {@.*$} $environmentArray(spMailEntry) {} administratorUserName
if ![string equal administrator $userName] {
if [string equal $administratorUserName $userName] {
# $userName is the administrator
} else {
# $userName is not the administrator
return "TransferCopyright (1): '$userName' is not the administrator"
}
}
set metadataList {}
set metadata2List {}
# remoteHostCollection (B)
set remoteHostCollection [lindex $remoteSiteStamp 1]
if 0 {
if ![GetDocumentState $rep 1] {
# don't transfer - the repository doesn't contain the original document
return {TransferCopyright: the repository doesn't contain the original document}
}
}
if ![file exists $homePath/col/$rep/service/notCaptured] {
if [string equal $repositoryProperties($rep,hostcollection) $remoteHostCollection] {
# don't transfer - the remote host collection is the current one
return {the remote host collection is the current one}
}
}
# Capure @sitesAllowedToTransferCopyright.tcl (in B)
# remoteServerAddress
set remoteServerAddress [lindex $remoteSiteStamp 0] ;# server address of the new host collection (B)
# remoteSite
set remoteSite [ReturnHTTPHost $remoteServerAddress] ;# (B)
# remoteIp
set remoteIp [lindex $remoteSiteStamp 2] ;# (B)
# siteStamp (A)
set siteStamp [lrange [GetSiteStamp] 0 2]
# Store siteStamp C:/tmp/bbb auto 0 a
# localHostCollection (A)
set localHostCollection [lindex $siteStamp 1] ;# == loCoInRep
# set xxx http://$remoteSite/col/$remoteHostCollection/doc/%40sitesAllowedToTransferCopyright.tcl
# Store xxx C:/tmp/bbb auto 0 a
set convertedURL [ConvertURLToHexadecimal http://$remoteSite/col/$remoteHostCollection/doc/@sitesAllowedToTransferCopyright.tcl]
if [catch {http::geturl $convertedURL} token] {
# don't transfer - unknown host collection
# global errorInfo
# return "$token $errorInfo"
return {unknown host}
} else {
upvar #0 $token state
if ![string equal {HTTP/1.1 200 OK} $state(http)] {
# for example: HTTP/1.1 404 Not Found
http::cleanup $token
return {@sitesAllowedToTransferCopyright.tcl not found or permission denied}
}
# the file exists in the remoteSite and can be reached (there no access restriction)
eval [http::data $token] ;# creates allowedSitesArray
http::cleanup $token
}
# allowedSitesArray2
foreach name [array names allowedSitesArray $localHostCollection,*] {
regsub {.*,} $name {} name2 ;# ex: docpermission - used in ProcessPermission
set allowedSitesArray2($name2) $allowedSitesArray($name)
}
# Capure @sitesAllowedToTransferCopyright.tcl - end
if ![info exists allowedSitesArray2] {return {site not allowed to transfer copyright}} ;# (A) is not allowed to transfert copyright to (B)
TestUpdateLastUpdate $rep $metadataRep 0 $administratorUserName ;# must be before the host collection change below
# registrationPassword
if ![file exists $homePath/col/$rep/service/registrationPassword] {
# registrationPassword file doesn't exist
# CREATE registrationPassword
regsub {0\.} [expr [SortRandomNumber]/double(233280)] {} registrationPassword
StoreService registrationPassword $rep registrationPassword 1 1
} else {
# registrationPassword file already exists
if [LoadService $rep registrationPassword registrationPassword 1 1] {
# corrupted password
return "$rep has a corrupted registration password"
}
}
# Update the host collection field value
# A -> A B
set transferableFlag 0 ;# beginning of transfer ; must remain 0 in A for ever and 0 in B as long as the transfer is not completed
# UpdateHostCollectionFieldValue $rep $metadataRep $registrationPassword $remoteHostCollection $transferableFlag
UpdateHostCollectionFieldValue $rep $registrationPassword $remoteHostCollection $transferableFlag ;# updates hostCollection value in service/hostCollection and repositoryProperties
# Update the host collection field value - end
# localIp
set localIp $environmentArray(ipAddress)
# Update permissions
# Process Mirror Sites
if [file exists $homePath/col/$rep/service/mirrorSites] {
file delete $homePath/col/$rep/service/mirrorSites
UpdateRepositoryProperties $rep mirrorsites
if [file exists $homePath/col/$rep/download/doc.zip] {
# doc.zip must exist, otherwise zip returns: zip warning: name not matched: col/iconet.com.br/banon/2003/03.31.16.30/service/mirrorSites
set message [UpdateArchiveFile $rep col/$rep/service/mirrorSites -d]
if ![string equal {} $message] {return "TransferCopyright (2): $message"}
}
}
# Process Mirror Sites - end
# Process Remote Permission
set remotePermission [join [list {deny from all} "allow from $remoteIp" "allow from $localIp"] \n]
LoadService $rep docRemotePermission oldRemotePermission 1 1
if ![string equal $remotePermission $oldRemotePermission] {
StoreService remotePermission $rep docRemotePermission 1 1
UpdateRepositoryProperties $rep docremotepermission
}
LoadService $rep downloadRemotePermission oldRemotePermission 1 1
if ![string equal $remotePermission $oldRemotePermission] {
StoreService remotePermission $rep downloadRemotePermission 1 1
UpdateRepositoryProperties $rep downloadremotepermission
}
# set xxx $repositoryProperties($rep,downloadremotepermission)
# Store xxx C:/tmp/bbb auto 0 a
SaveRepositoryProperties
# Process Remote Permission - end
# set startApacheServer 1
# StartApacheServer ;# doesn't work with solaris - the remote call to the procedure TransferCopyright doesn't finish
if {$tcl_platform(platform) == "unix"} {
# not tested
# if [file owned $homePath/col/$rep/download] {exec chmod 775 $homePath/col/$rep/download}
}
Store remotePermission $homePath/col/$rep/download/.htaccess
# Update permissions - end
## Migration 3/3/03
# file delete $homePath/col/$rep/service/password
## Migration 3/3/03 - end
# Delete userName
if [file exists $homePath/col/$rep/service/userName] {
set userName $repositoryProperties($rep,username)
file delete $homePath/col/$rep/service/userName
UpdateRepositoryProperties $rep username
if [file exists $homePath/col/$rep/download/doc.zip] {
# doc.zip must exist, otherwise zip returns: zip warning: name not matched: col/iconet.com.br/banon/2003/03.31.16.30/service/userName
if [string equal {administrator} $userName] {
# userName is in doc.zip if and only if user name is administrator (see MakeDownloadFile)
set message [UpdateArchiveFile $rep col/$rep/service/userName -d]
if ![string equal {} $message] {return "TransferCopyright (3): $message"}
}
}
}
# Delete userName - end
# Update download files
# UpdateDownloadFilesByAdministrator $rep 1
if ![file exists $homePath/col/$rep/download/doc.zip] {
UpdateDownloadFilesByAdministrator $rep ;# pack doc
}
UpdateDownloadFilesByAdministrator $rep 2 ;# pack everything except doc
# add hostCollection and transferableFlag
if [file exists $homePath/col/$rep/service/hostCollection] {
set message [UpdateArchiveFile $rep [list col/$rep/service/hostCollection col/$rep/service/transferableFlag]]
if ![string equal {} $message] {return "TransferCopyright (4): $message"}
}
set metadataRepList [FindAllLanguageVersions $metadataRep]
foreach mRep $metadataRepList {
if [file exists $homePath/col/$mRep/service/hostCollection] {
set message [UpdateArchiveFile $rep col/$mRep/service/hostCollection]
if ![string equal {} $message] {return "TransferCopyright (5): $message"}
}
}
# Update download files - end
# Ask to capture the repository in this local collection
# (A) asks (B) to capture the repository in (A)
# regexp {:(.*)} $remoteSite m serverPort
# set remoteHostCollectionServerAddress $remoteIp:$serverPort ;# server address of the new host collection, ex.: 150.163.8.245:1905
# Store remoteHostCollectionServerAddress $homePath/col/$rep/service/notRemotelyRegistered
# Store remoteServerAddress $homePath/col/$rep/service/notRemotelyRegistered
foreach {m remoteURLibPort} [ReturnCommunicationAddress $remoteServerAddress] {break}
set remoteServerAddressWithIP [list $remoteIp $remoteURLibPort] ;# server address of the new host collection, ex.: {150.163.2.174 19050}
if [file exists $homePath/col/$rep/service/notCaptured] {
# a copyright transfer may have been done but (A) receives a premature return of CaptureRepository
# because the transfer lasts longer than the MultipleExecute time-out
set versionStamp [GetVersionStamp $metadataRep]
} else {
set versionStamp {}
}
# MULTIPLE SUBMIT
# set command [list list CaptureRepository $rep $metadataRep $siteStamp $registrationPassword]
set command [list list CaptureRepository $rep $metadataRep $siteStamp $registrationPassword $versionStamp]
# set flag [MultipleExecute [list $remoteHostCollectionServerAddress] $command]
# set flag [MultipleExecute [list $remoteServerAddress] $command]
set flag [MultipleExecute [list $remoteServerAddressWithIP] $command]
# puts --$flag--
if [string equal {0} $flag] {
# captured
file delete $homePath/col/$rep/service/notCaptured ;# (A)
if 0 {
# Process Remote Permission
file delete $homePath/col/$rep/service/docRemotePermission
Eval UpdateRepositoryProperties $rep docremotepermission
file delete $homePath/col/$rep/service/downloadRemotePermission
Eval UpdateRepositoryProperties $rep downloadremotepermission
# Process Remote Permission - end
}
} else {
# not captured
# Store remoteHostCollectionServerAddress $homePath/col/$rep/service/notCaptured
# Store remoteServerAddress $homePath/col/$rep/service/notCaptured
# Store remoteServerAddressWithIP $homePath/col/$rep/service/notCaptured
Store remoteSiteStamp $homePath/col/$rep/service/notCaptured ;# (A)
return "TransferCopyright: --$flag--" ;# this message is interpreted in Dialog (utilities2.tcl)
}
# captured
file delete $homePath/col/$rep/download/doc.zip ;# this doc.zip is just for transferring the copyrights
file delete $homePath/col/$rep/download/.htaccess
file delete -force $homePath/col/$rep/auxdoc/cgi2 ;# may contain the update file
# Process Permission
set allowedSitesList2 [array get allowedSitesArray2]
ProcessPermission $allowedSitesList2 $rep $metadataRep
# Process Permission - end
# Ask to capture the repository in this local collection - end
# UpdateRepositoryListForPost [concat $rep $metadataRepList]
UpdateRepositoryListForPost [concat $rep $metadataRep]
# SAVE - end
}
# TransferCopyright - end
# ----------------------------------------------------------------------
# UpdateArchiveFile
# updates the download/doc.zip file within rep
# used in TransferCopyright
# fileNameList is a list of path names (beginning with col) of the files to be updated (or deleted)
# option value is empty or -d (for delete)
# example: UpdateArchiveFile iconet.com.br/banon/2003/03.31.16.30 col/iconet.com.br/banon/2003/03.31.16.30/service/mirrorSites -d
# if done, returns empty, otherwise returns an error message
proc UpdateArchiveFile {rep fileNameList {option {}}} {
global homePath
global zipPath
global pwd
cd $homePath
if [catch {eval "exec \"$zipPath\" $option \"$homePath/col/$rep/download/doc.zip\" $fileNameList"} message] {
cd $pwd
return "UpdateArchiveFile: $message"
}
cd $pwd
}
# UpdateArchiveFile - end
# ----------------------------------------------------------------------
# ProcessPermission
# used in UpdateHostCollectionFieldValue and CaptureRepository only
proc ProcessPermission {allowedSitesList2 rep metadataRep} {
# runs with post
global homePath
array set allowedSitesArray2 $allowedSitesList2
set metadataList {}
set metadata2List {}
set defaultPermission $allowedSitesArray2(defaultpermission)
set docPermission [join $allowedSitesArray2(docpermission) \n]
set downloadPermission [join $allowedSitesArray2(downloadpermission) \n]
StoreReadPermission defaultPermission docPermission downloadPermission \
$rep $metadataRep \
Permission permission 0 Permission metadataList metadata2List
set defaultRemotePermission $allowedSitesArray2(defaultremotepermission)
set docRemotePermission [join $allowedSitesArray2(docremotepermission) \n]
set downloadRemotePermission [join $allowedSitesArray2(downloadremotepermission) \n]
StoreReadPermission defaultRemotePermission docRemotePermission downloadRemotePermission \
$rep $metadataRep \
RemotePermission remotepermission 1 {Remote Permission} metadataList metadata2List
if 0 {
# commented by GJFB in 2020-08-18
RemoveMetadata $metadata2List
AddMetadata $metadataList
} else {
UpdateMetadata $metadata2List $metadataList ;# added by GJFB in 2020-08-18 - uses metadata2List and metadataList
}
# SAVE
set saveMetadata 1
SaveMetadata
# Store read permission - end
# Store mirrorSites
if ![string equal {} $allowedSitesArray2(mirrorsites)] {
if 0 {
set mirrorSites {}
foreach item $allowedSitesArray2(mirrorsites) {
lappend mirrorSites [lindex $item 1]
}
}
set mirrorSites $allowedSitesArray2(mirrorsites)
StoreService mirrorSites $rep mirrorSites 1 1
} else {
file delete $homePath/col/$rep/service/mirrorSites
}
UpdateRepositoryProperties $rep mirrorsites
SaveRepositoryProperties
# Store mirrorSites - end
UpdateAccessFile $rep
}
# ProcessPermission - end
# ----------------------------------------------------------------------
# SetAdvancedUserFromUserGroup
# set an advanced user from the user group
## and update the reader group by concatenating to it the user group
# use as advanced user name the first name
# in the usergroup field which is not administrator
# used only by the cgi script in dpi.inpe.br/banon-pc@1905/2005/02.19.00.40
# password must be coded
proc SetAdvancedUserFromUserGroup {rep userName password} {
# runs with post
global homePath
# metadataRep
set metadataRep [FindMetadataRep $rep]
# userGroup
set userGroup [GetFieldValue $metadataRep-0 usergroup]
# advancedUserName
if ![string equal {} $userGroup] {
foreach user $userGroup {
if ![string equal {administrator} $user] {break}
}
set advancedUserName $user
} else {
return "usergroup is empty"
}
## readerGroup
# set readerGroup [GetFieldValue $metadataRep-0 readergroup]
# set readerGroup [concat $readerGroup $userGroup] ;# add userGroup (useful for 8ICSHMO)
# set readerGroup [lsort -unique $readerGroup]
set return [MakeCgiScript2 $rep $userName $password]
if ![string equal {} $return] {return $return}
# remove
set metadata2List [GetMetadata $metadataRep-0,username]
# set metadata2List [concat $metadata2List [GetMetadata $metadataRep-0,readergroup]]
# add
set metadataList [list $metadataRep-0,username $advancedUserName]
# set metadataList [concat $metadataList [list $metadataRep-0,readergroup $readerGroup]]
LoadService $rep userName oldUserName 1 1
#
# doesn't append the user name to the user group (this is done in Dialog (see utilities2.tcl) not in this procedure)
#
# Update history
# CREATE A NEW VERSION STAMP (for the metadata repository (metadataRep))
set seconds [clock seconds]
if [string equal {} $oldUserName] {set oldUserName administrator}
Load $homePath/col/$metadataRep/doc/@metadata.refer referMetadata
set metadataVersionStamp [CreateVersionStamp $seconds $oldUserName $referMetadata] ;# it is assumed that the administrator acts on behalf of the old user
UpdateHistory $metadataRep $metadataVersionStamp
# Update history - end
# remove
set metadata2List [concat $metadata2List [GetMetadata $metadataRep-0,metadatalastupdate]]
# add
set metadataList [concat $metadataList [list $metadataRep-0,metadatalastupdate $metadataVersionStamp]]
StoreService advancedUserName $rep userName 1 1
# Store readerGroup $homePath/col/$rep/service/authenticatedUsers
UpdateRepositoryProperties $rep username
UpdateRepositoryProperties $rep authenticatedusers
UpdateAccessFile $rep
if 0 {
# commented by GJFB in 2020-08-18
RemoveMetadata $metadata2List
AddMetadata $metadataList
} else {
UpdateMetadata $metadata2List $metadataList ;# added by GJFB in 2020-08-18 - uses metadata2List and metadataList
}
set repositoryList $rep
lappend repositoryList $metadataRep
UpdateRepositoryListForPost $repositoryList
}
# SetAdvancedUserFromUserGroup - end
# ----------------------------------------------------------------------
# ManageLogFile
# Leaves the log file size not greater than 200000 bytes
# absolutePath is the absolute path of the log file
# the log file name must be without file type or with file type .log
# examples:
# ManageLogFile $homePath/@errorLog
# ManageLogFile $homePath/col/dpi.inpe.br/banon-pc@1905/2005/02.19.00.40/auxdoc/@actionLog - added by GJFB in 2017-11-18 - see Administrator page
# ManageLogFile $homePath/col/$URLibServiceRepository/auxdoc/serverDir/logs/access.log
# ManageLogFile $homePath/col/$URLibServiceRepository/auxdoc/serverDir/logs/error.log
proc ManageLogFile {absolutePath} {
global tcl_platform
global errorInfo
global homePath
global loCoInRep
global URLibServiceRepository
# Log migration - 2023-03-16
if [file isdirectory $homePath/col/$loCoInRep/doc/URLibServiceLog] {
if ![file isdirectory $homePath/col/$loCoInRep/auxdoc/URLibServiceLog] {
file mkdir $homePath/col/$loCoInRep/auxdoc/URLibServiceLog
set path $homePath/col/$loCoInRep/doc/URLibServiceLog/@errorLog
foreach item [glob -nocomplain $path*] {
if [regexp "^$path\\d+$" $item] {
file rename $item $homePath/col/$loCoInRep/auxdoc/URLibServiceLog/[file tail $item]
}
}
file delete $homePath/col/$loCoInRep/doc/URLibServiceLog
file delete -force $homePath/col/$loCoInRep/doc/access ;# for old collection
}
}
if [file isdirectory $homePath/col/$loCoInRep/doc/ApacheLog] {
if ![file isdirectory $homePath/col/$loCoInRep/auxdoc/ApacheLog] {
file mkdir $homePath/col/$loCoInRep/auxdoc/ApacheLog
set rootPath $homePath/col/$loCoInRep/doc/ApacheLog/access
foreach item [glob -nocomplain $rootPath*] {
if [regexp "^$rootPath\\d+\\.log$" $item] {
file rename $item $homePath/col/$loCoInRep/auxdoc/ApacheLog/[file tail $item]
}
}
set rootPath $homePath/col/$loCoInRep/doc/ApacheLog/error
foreach item [glob -nocomplain $rootPath*] {
if [regexp "^$rootPath\\d+\\.log$" $item] {
file rename $item $homePath/col/$loCoInRep/auxdoc/ApacheLog/[file tail $item]
}
}
file delete $homePath/col/$loCoInRep/doc/ApacheLog
}
}
# Log migration - 2023-03-16 - end
if ![file isdirectory $homePath/col/$loCoInRep/auxdoc/URLibServiceLog] { ;# added by GJFB in 2020-06-12 - required at installation of a new local collection
file mkdir $homePath/col/$loCoInRep/auxdoc/URLibServiceLog
}
if ![file isdirectory $homePath/col/$loCoInRep/auxdoc/ApacheLog] { ;# added by GJFB in 2020-06-12 - required at installation of a new local collection
file mkdir $homePath/col/$loCoInRep/auxdoc/ApacheLog
}
if [catch {set size [file size $absolutePath]}] {return}
if [expr $size < 200000] {return}
# if [expr $size < 2000] {return} ;# for testing
if [regexp {(.*)\.log$} $absolutePath m rootPath] {
# file type is .log
# ApacheLog
# $homePath/col/$URLibServiceRepository/auxdoc/serverDir/logs/access.log -> $homePath/col/$loCoInRep/auxdoc/ApacheLog/access
set root [file tail $rootPath] ;# access or error
set absolutePath2 $homePath/col/$loCoInRep/auxdoc/ApacheLog/$root ;# destination
set lastLogFile [lindex [lsort -dictionary [glob -nocomplain $absolutePath2*.log]] end]
# fileNumber
if [string equal {} $lastLogFile] {
set fileNumber 0
} else {
regexp "${absolutePath2}(.*).log$" $lastLogFile m fileNumber
}
incr fileNumber
if [catch {file rename $absolutePath $absolutePath2$fileNumber.log}] {
# on Windows one may get a "permission denied" while apache is running
set log "\[[clock format [clock seconds] -format %Y:%m.%d.%H.%M.%S]\] ManageLogFile: the following error has been catched:\n\"$errorInfo\"\n"
puts $log
Store log $homePath/@errorLog auto 0 a
}
} else {
# file type is not .log
# URLibServiceLog
# $homePath/@errorLog -> $homePath/col/$loCoInRep/auxdoc/URLibServiceLog/@errorLog
# set absolutePath2 $homePath/col/$loCoInRep/auxdoc/URLibServiceLog/@errorLog ;# destination - commented by GJFB in 2017-11-18
set root [file tail $absolutePath] ;# @errorLog or @actionLog - added by GJFB in 2017-11-18
set absolutePath2 $homePath/col/$loCoInRep/auxdoc/URLibServiceLog/$root ;# destination - added by GJFB in 2017-11-18
set lastLogFile [lindex [lsort -dictionary [glob -nocomplain $absolutePath2*]] end]
# fileNumber
if [string equal {} $lastLogFile] {
set fileNumber 0
} else {
regexp "${absolutePath2}(.*)$" $lastLogFile m fileNumber
}
incr fileNumber
file rename $absolutePath $absolutePath2$fileNumber
if {$tcl_platform(platform) == "unix"} {
set log {}
Store log $absolutePath
exec chmod g+w $absolutePath ;# needed by some cgi scripts writing in @errorLog
}
}
}
# ManageLogFile - end
# ----------------------------------------------------------------------
# ListIntersection
# used in Search
proc ListIntersection {list1Name list2Name} {
upvar $list1Name list1
upvar $list2Name list2
set list {}
foreach element $list1 {
if {[lsearch -exact $list2 $element] >= 0} {
lappend list $element
}
}
return $list
}
# ListIntersection - end
# ----------------------------------------------------------------------
# ListNegatedImplication
# used in Script within dpi.inpe.br/banon-pc@1905/2005/02.19.00.40 (administrator page)
## used in RemoveMetadata and AddMetadata
# used in UpdateMetadata
# not (list1 -> list2) == (list1 and not list2) == (list1 - list2)
# >>> list1Name and list2Name must not be lists of lists (because of split/join)
proc ListNegatedImplication {list1Name list2Name} {
upvar $list1Name list1
upvar $list2Name list2
if [string equal {} $list2] {return $list1} ;# added by GJFB in 2010-12-10
set list {}
# split and join below solves error like list element in quotes followed by "," instead of space
# example:
# split {data "aaa", were}
# => data {"aaa",} were
# join {data {"aaa",} were}
# => data "aaa", were
foreach element [split $list1] {
if {[lsearch -exact [split $list2] $element] < 0} {
lappend list $element
}
}
return [join $list]
}
if 0 {
set list1 {a b c d}
set list2 {a c e f}
ListNegatedImplication list1 list2
# => b d
set list1 {a b c a}
set list2 {a b c d}
ListNegatedImplication list1 list2
# => {}
}
# ListNegatedImplication - end
# ----------------------------------------------------------------------
# ListNegatedImplication2
# added by GJFB in 2022-10-08
# used in UpdateContentDescriptionFile only
# not (list1 -> list2) == (list1 and not list2) == (list1 - list2)
# >>> must be used when list1Name and list2Name might be lists of lists (for example when an image name contains white spaces like 'WhatsApp Image 2022-08-31 at 14.10.26.jpeg')
proc ListNegatedImplication2 {list1Name list2Name} {
upvar $list1Name list1
upvar $list2Name list2
if [string equal {} $list2] {return $list1} ;# added by GJFB in 2010-12-10
set list {}
foreach element1 $list1 {
set foundFlag 0
foreach element2 $list2 {
if [string equal $element1 $element2] {
set foundFlag 1
break
}
}
if !$foundFlag {lappend list $element1}
}
return $list
}
if 0 {
set list1 {a b c d}
set list2 {a c e f}
ListNegatedImplication2 list1 list2
# => b d
set list1 {a b c a}
set list2 {a b c d}
ListNegatedImplication2 list1 list2
# => {}
}
# ListNegatedImplication2 - end
# ----------------------------------------------------------------------