# S290DEV.def: Collects Oracle Developer Information # $Id: S290DEV.def,v 1.46 2009/08/06 10:20:58 mschenke Exp $ # ARCS: $Header: /u02/webapps/workbench/cvs/RDA_4/src/scripting/lib/modules/S290DEV.def,v 1.46 2009/08/06 10:20:58 mschenke Exp $ # # Change History # 20090805 DEM Extend functionality. =head1 NAME S290DEV - Collects Oracle Forms and Reports Information =head1 DESCRIPTION This module collects the reports and forms information from Forms/Reports 6.0.x, Forms/Reports 9.0.x, Forms/Reports 10.1.x, Forms/Reports 11.1.x, and Apps 11.5.x. Produced reports are regrouped under C. =cut echo tput('bold'),'Processing Forms/Reports module ...',tput('off') # Initialization var $ORACLE_HOME = getSetting('ORACLE_HOME') var $TAIL = getSetting('RDA_TAIL',1000) var $DEV_BIN = catDir($ORACLE_HOME,'bin') var $FORMS_HOME = catDir($ORACLE_HOME,'forms') var $REPORTS_HOME = catDir($ORACLE_HOME,'reports') var $PS_EF var %ENV var $DEV_VER = undef var $IAS_VER = undef var $IAS_ALONE = 'unknown' var $IAS_HOME = undef var $APPS_INST = undef var $OAH_TOP = undef var $OH = quote($ORACLE_HOME) var $OH1 = concat('^',$OH,'[\\\/]') var $OH2 = concat('^',$OH,'\b') var $MNU = '1:Oracle Forms/Reports' var $TOC = '%TOC%' var $TOP = '[[#Top][Back to top]]' # Collect the Developer information if or(getSetting('ASIT_IN_USE'),testDir('d',catDir($ORACLE_HOME,'rcu'))) {# Abort collection when merged if getSetting('ASIT_MERGE',true) {echo "DEV collection performed by the ASIT module" return } # Load the common macros var ($CNT,%DUP) = (0) run DEVr11() # Collect generic information pretoc $MNU pretoc '1+:Oracle Home' run DEVinfo(\%ENV,\$PS_EF,\$DEV_VER,\$IAS_VER,\$IAS_ALONE,\$IAS_HOME,\ \$APPS_INST,\$OAH_TOP) call collect_dev_generic() unpretoc # Collect the data for each instance var $hom = catDir(getSetting('ASIT_INSTANCE_HOME','')) var %cmp loop $ins (get_instances($hom,'ASIT_INSTANCES')) {# Get the instance name and its associated components var $dir = catDir($hom,$ins) var $OI = quote($dir) var $OI1 = concat('^',$OI,'[\\\/]') var $OI2 = concat('^',$OI,'\b') var $dsc = get_components(\%cmp,$dir,$ins,\ '^(DeJvmRuntimeInfo|FormsRuntimeInfo|ReportsServerComponent)$') # Skip instances without relevant components next !keys(%cmp) # Treat relevant components debug ' Inside DEV module, analyzing instance ',$dsc if isTocCreated(true) pretoc '%SPLIT%' else pretoc $MNU pretoc "1+:'",$dsc,"' Instance" call collect_dev_instance($dsc,$dir,\%cmp) call collect_forms_instance($dsc,$dir,\%cmp) call collect_reports_instance($dsc,$dir,\%cmp) unpretoc 2 } } else {# Load the common macros run DEVlib() run library() pretoc $MNU run DEVinfo(\%ENV,\$PS_EF,\$DEV_VER,\$IAS_VER,\$IAS_ALONE,\$IAS_HOME,\ \$APPS_INST,\$OAH_TOP) =head1 ITEMS COMMON TO BOTH REPORTS AND FORMS =head2 For Forms/Reports 9.0.x and later, Collects all general Application Server startup scripts and Forms/Reports installation files. =cut # Determine if this is an iAS R2 installation if match($DEV_VER,'^(9i|10g)$') {# For iAS R2, get startup scripts debug ' Inside DEV module, getting startup scripts' pretoc '2:Startup Scripts' call search_files($DEV_BIN,'\.(sh|bat)$',0) unpretoc # Get Forms/Reports 9.0.x or later install files debug ' Inside DEV module, getting Forms/Reports 9.0.x or later install files' pretoc '2:Installation Files' var $dir = catDir($ORACLE_HOME,'inventory','Components21') call get_install($dir,'oracle.developer.','reports.iasconfig') call get_install($dir,'oracle.developer.','reports.builder') call get_install($dir,'oracle.developer.','forms.iasconfig') call get_install($dir,'oracle.developer.','forms.builder') unpretoc } =head2 Toolkit files Collects the toolkit files (such as F, F, and F). =cut debug ' Inside DEV module, getting toolkit files' pretoc '2:Toolkit' macro find_file {loop $fil (@arg) {if testFile('r',$fil) {call get_file($fil,0,'tk_') return $fil } } return undef } call find_file(\ catFile($ORACLE_HOME,'guicommon6','tk6','admin','uiprint.txt'),\ catFile($ORACLE_HOME,'guicommon6','tk60','admin','uiprint.txt'),\ catFile($ORACLE_HOME,'guicommon9','tk90','admin','uiprint.txt'),\ catFile($ORACLE_HOME,'guicommon','tk','admin','uiprint.txt'),\ catFile($ORACLE_HOME,'tools','common','uiprint.txt'),\ catFile($ORACLE_HOME,'tools','common90','uiprint.txt')) var $uif = find_file(\ catFile($ORACLE_HOME,'guicommon6','tk6','admin','uifont.ali'),\ catFile($ORACLE_HOME,'guicommon6','tk60','admin','uifont.ali'),\ catFile($ORACLE_HOME,'guicommon9','tk90','admin','uifont.ali'),\ catFile($ORACLE_HOME,'guicommon','tk','admin','uifont.ali'),\ catFile($ORACLE_HOME,'tools','common','uifont.ali'),\ catFile($ORACLE_HOME,'tools','common90','uifont.ali')) call find_file(\ catFile($ORACLE_HOME,'guicommon','tk','admin','uiscreenprint.txt')) call find_file(\ catFile($ORACLE_HOME,'guicommon6','tk6','admin','Tk2Motif.rgb'),\ catFile($ORACLE_HOME,'guicommon6','tk60','admin','Tk2Motif.rgb'),\ catFile($ORACLE_HOME,'guicommon9','tk90','admin','Tk2Motif.rgb'),\ catFile($ORACLE_HOME,'tools','common','Tk2Motif.rgb'),\ catFile($ORACLE_HOME,'tools','common90','Tk2Motif.rgb')) var $cnt = 0 loop $fil (grepDir(catDir($ORACLE_HOME,'guicommon','tk','admin'),\ 'Tk2Motif.rgb','r',1)) {incr $cnt call get_file($fil,0,sprintf('tk_d%02d_',$cnt)) } call find_file(\ catFile($ORACLE_HOME,'guicommon','tk','admin','PPD','default.ppd')) call find_file(\ catFile($ORACLE_HOME,'guicommon','tk','admin','PPD','datap462.ppd')) call find_file(\ catFile($ORACLE_HOME,'guicommon','tk','admin','PPD','screenprinter.ppd')) unpretoc =head2 uifont - Syntax Integrity of uifont.ali Checks for the integrity of the font mapping file F using F command on UNIX and F command on Windows. =cut if $uif {if isUnix() var $cmd = catFile($ORACLE_HOME,'bin','mfontchk') elsif isWindows() var $cmd = catFile($ORACLE_HOME,'bin','fnchk.exe') else var $cmd = undef if testFile('fx',$cmd) {var $cmd = concat(quote($cmd,'x'),' ',quote($uif,'x'),' 2>&1') report uifont prefix {write '---+!! Syntax Integrity of uifont.ali' write '---## Using: ',encode($cmd) } call writeCommand($cmd) if isCreated(true) toc '2:[[',getFile(),'][rda_report][Syntax Integrity of uifont.ali]]' } } =head2 versions - Versions Reports on versions. =cut debug ' Inside DEV module, reporting on versions' report versions write '---+!! Versions' write $TOC write '%BR%' write '' write 'ORACLE_HOME=',$ORACLE_HOME write 'This install is part of ',$IAS_ALONE if compare('eq',$APPS_INST,'11i') write 'This installation is part of a Apps 11i install' write '' # Get Reports runtime version var $bin = catDir($ORACLE_HOME,'bin') if grepDir($bin,'^rwrun60(\.exe)?$','ip') var ($cmd) = last elsif grepDir($bin,'^rwrun(\.bat|\.sh)?$','ip') var ($cmd) = last else var $cmd = undef if $cmd {write '---+ Current runtime version of reports' call loadCommand(concat(quote($cmd,'x'),' \?')) call writeLastFile(0,1) write $TOP } # Get AR reports runtime version if compare('eq',$APPS_INST,'11i') {write '---+ Current Character runtime version of AR reports' call loadCommand('ar60run \?') call writeLastFile(0,1) write $TOP write '---+ Current Bitmap runtime version of AR reports' call loadCommand('ar60runb \?') call writeLastFile(0,1) write $TOP } # Get Forms runtime version if grepDir($bin,'^f60runm(\.exe)?$','ip') var ($cmd) = last elsif grepDir($bin,'^f90genm(\.bat|\.sh)?$','ip') var ($cmd) = last elsif grepDir($bin,'^frmcmp_batch(\.bat|\.sh)?$','ip') var ($cmd) = last else var $cmd = undef if $cmd {write '---+ Current runtime version of forms' call loadCommand(concat(quote($cmd,'x'),' \?')) call writeLastFile(0,1) write $TOP } # Determine latest patch applied var $dir = catDir($ORACLE_HOME,'lib') if compare('eq',$DEV_VER,'6i') var @tbl = grepDir($dir,'^librw60','inr') elsif grepDir($dir,'^librw90','inr') var @tbl = last else var @tbl = grepDir($dir,'^librw\.','inr') prefix write '---+ List of librw60.a, librw90.a or librw.a files to see \ PRE_patch suffix' call statFile('b',reverse(@tbl)) if hasOutput(true) write $TOP # Determine base installed version prefix write '---+ Installed Version' if compare('eq',$DEV_VER,'6i') {var $fil = catFile($ORACLE_HOME,'orainst','unix.rgs') if testFile('r',$fil) {write '---## Use unix.rgs file to determine base installed version' write '---+++!! Reports' write field('\s+',4,grepFile($fil,'Reports Server','f')) write '---+++!! Forms' write field('\s+',4,grepFile($fil,'Forms Server','f')) write } } elsif match($DEV_VER,'^(9i|10g)$') {var $dir = catDir($ORACLE_HOME,'inventory','Components21') loop $nam ('oracle.developer.reports.iasconfig',\ 'oracle.developer.reports.builder') {var $cmp = catDir($dir,$nam) next !testDir('d',$cmp) write '---## Using $ORACLE_HOME/inventory/Components21/',$nam,\ ' to determine initialy installed version' call statDir('n',$cmp) break } loop $nam ('oracle.developer.forms.iasconfig',\ 'oracle.developer.forms.builder') {var $cmp = catDir($dir,$nam) next !testDir('d',$cmp) write '---## Using $ORACLE_HOME/inventory/Components21/',$nam,\ ' to determine initialy installed version' call statDir('n',$cmp) break } } if hasOutput(true) write $TOP toc '2:[[',getFile(),'][rda_report][Versions]]' =head2 Forms/Reports Install Logs For Forms/Reports 6.0.x, collects install logs (such as F, F, F, F, and F) =cut if compare('eq',$DEV_VER,'6i') {debug ' Inside DEV module, getting Forms/Reports 6.0.x install logs' toc '2:Install Logs (6.0.x)' call get_file(catFile($ORACLE_HOME,'unix.prd'),0,'inst_') call get_file(catFile($ORACLE_HOME,'orainst','install.log'),0,'inst_') call get_file(catFile($ORACLE_HOME,'orainst','make.log'),0,'inst_') call get_file(catFile($ORACLE_HOME,'orainst','os.log'),0,'inst_') call get_file(catFile($ORACLE_HOME,'orainst','sql.log'),0,'inst_') } =head1 ITEMS SPECIFIC TO ORACLE REPORTS On UNIX, it lists all active Oracle Reports processes. =cut ## List active reports processes if $DEV_VER toc '2:Oracle Reports' debug ' Inside DEV module, getting active reports processes' report rpt_processes prefix {write '---+ Active RW Processes' write '' } loop $lin (grepCommand($PS_EF,'rw','i')) write $lin if isCreated(true) {write '' toc '3:[[',getFile(),'][rda_report][Active RW Processes]]' } ## Pull information about the server setup and configuration if or(compare('eq',$IAS_VER,'R1'),\ compare('eq',$DEV_VER,'6i')) {# Forms/Reports 6i debug ' Inside DEV module, getting reports 6.0.x information' =head2 For Reports 6.0.x, Collects standalone scripts (such as F, F, and F). Collects a streaming dump of F and all the C<.ora> and C<.log> files from the Reports server. Determines if F and F exist. =cut # Pull iAS R1 or Forms/Reports 6.0.x stand alone scripts call get_file(catFile($ORACLE_HOME,'reports60.sh'),0,'oh_') call get_file(catFile($ORACLE_HOME,'reports60.csh'),0,'oh_') call get_file(catFile($ORACLE_HOME,'reports60_server'),0,'oh_') # Get Reports server files pretoc '2:Reports Server Files' var $dir = catDir($ORACLE_HOME,'reports60','server') call search_files($dir,'\.ora$',0) call search_files($dir,'\.log$',$TAIL) call get_file(catFile($dir,'cgicmd.dat'),0) unpretoc # Get Reports web files pretoc '3:Reports Web Files' call get_file(catFile($ORACLE_HOME,'orainst','reports6iconfig.txt'),0) call get_file(catFile($ORACLE_HOME,'reports60','java','RWServlet.class'),0) call get_file(catFile($ORACLE_HOME,'conf','6iserver.conf'),0) unpretoc } if !or(compare('eq',$IAS_VER,'R1'),\ compare('eq',$DEV_VER,'6i')) {# For 9iAS r2, debug ' Inside DEV module, getting reports 9.0.x or later information' =head2 For Reports 9.0.x and later, Collects all general Application Server information for Oracle Reports from the Reports conf, logs and server sub directories. =cut if !$DEV_VER pretoc '2:Oracle Reports Server' var $dir = catDir($ORACLE_HOME,'reports','conf') if testFile('r',catFile($dir,'cgicmd.dat')) {# Get reports/conf directory contents var $dir = catDir($ORACLE_HOME,'reports','conf') call search_files($dir,'\.conf$',0) call search_files($dir,'\.log$',0) call search_files($dir,'^(cgicmd.dat|distribution.xsl|proxyinfo.xml|\ rwserver.install|rwserver.template|rwservlet.properties)$') # Get reports/logs directory contents var $dir = catDir($ORACLE_HOME,'reports','logs') call search_files($dir,'\.log$',0) call search_files($dir,'\.trc$',0) # Get reports/server directory contents call search_files(catDir($ORACLE_HOME,'reports','server'),'\.dat$',0) } =head2 repsvrfile - $OH/reports/server Files Gets the list of files in F<$ORACLE_HOME/reports/server> directory. =cut report repsvrfile prefix write '---+!! List of Files in $OH/reports/server directory' call statDir('at',catDir($ORACLE_HOME,'reports','server')) if isCreated(true) toc '3:[[',getFile(),'][rda_report][$OH/reports/server Files]]' =head2 rwdiag - Reports Diagnostic Tool Results Collects the Reports Diagnostic Tool results. =cut report rwdiag var $bin = catDir($ORACLE_HOME,'bin') var ($cmd) = grepDir($bin,'^rwdiag(\.bat|\.sh)?$','ip') if $cmd {prefix {write '---+ Reports Diagnostic Tool Results' write '---## Using: ',encode($cmd),' -findAll 2>&1' } call writeCommand(concat(quote($cmd,'x'),' -findAll 2>&1')) if isCreated(true) toc '3:[[',getFile(),'][rda_report][Reports Diagnostic Tool Results]]' } if !$DEV_VER unpretoc } =head1 ITEMS SPECIFIC TO ORACLE FORMS =cut if $DEV_VER toc '2:Oracle Forms' if or(compare('eq',$DEV_VER,'6i'),\ compare('eq',$IAS_VER,'R1')) {# Items specific for Forms 6i debug ' Inside DEV module, getting Forms 6.0.x information' =head2 For Forms 6.0.x, On UNIX, it lists active Oracle Forms processes. Collects Forms files (such as F, F, F, and F). Collects the Forms server files (such as F, F, F, F, F, Oracle Jinitiator version, and F). =cut # Get active processes report frm_processes prefix {write '---+ Active Forms Processes' write '' } loop $lin (grepCommand($PS_EF,'f60','i')) write $lin if isCreated(true) {write '' toc '3:[[',getFile(),'][rda_report][Active Forms Processes]]' } # Get Forms files pretoc '3:Forms Files (6.0.x)' call get_file(catFile($ORACLE_HOME,'forms60.sh'),0,'oh_') call get_file(catFile($ORACLE_HOME,'forms60.csh'),0,'oh_') call get_file(catFile($ORACLE_HOME,'forms60_server'),0,'oh_') call get_file(catFile($ORACLE_HOME,'forms60','admin','resource','US',\ 'fmrweb.res'),0,'res_') unpretoc # Get Forms server files pretoc '3:Forms Server Files' call search_files(catDir($ORACLE_HOME,'forms60','server'),\ '(\.cfg$|\.conf$|\.env$|\.htm$|\.properties$|\.xml)') call get_file(catFile($ORACLE_HOME,'forms60','java','oracle','forms',\ 'registry','Registry.dat'),0) call get_file(catFile($ORACLE_HOME,'jinit','doc','us','jinit-version.txt'),0) unpretoc } elsif $DEV_VER {# Items specific for Forms 9i and later debug ' Inside DEV module, getting Forms 9.0.x or later information' =head2 For Forms 9.0.x and later, On UNIX, it lists active Forms processes (available only for 9.0.x). Collects Forms files (such as F). Collects the Forms server files (such as Oracle Jinitiator version, and F). =cut # Get active processes report frm_processes prefix {write '---+ Active Forms Processes' write '' } loop $lin (grepCommand($PS_EF,'f90','i')) write $lin if isCreated(true) {write '' toc '3:[[',getFile(),'][rda_report][Active Forms Processes]]' } # Get Forms files pretoc '3:Forms Files' call get_file(catFile($ORACLE_HOME,'forms','admin','resource','US',\ 'fmrweb.res'),0,'res_') call get_file(catFile($ORACLE_HOME,'forms90','admin','resource','US',\ 'fmrweb.res'),0,'res_') unpretoc # Get Forms server files pretoc '3:Forms Server Files' call get_file(catFile($ORACLE_HOME,'jinit','us','jinit-version.ini'),0) call get_file(catFile($ORACLE_HOME,'forms','java','oracle','forms',\ 'registry','Registry.dat'),0) call get_file(catFile($ORACLE_HOME,'forms90','java','oracle','forms',\ 'registry','Registry.dat'),0) unpretoc } if !or(compare('eq',$DEV_VER,'6i'),\ compare('eq',$IAS_VER,'R1')) {# Items specific for 9iAS and later debug ' Inside DEV module, getting AS information about Forms' =head2 Application Server Information about Forms Collects the OC4J demos (available only for 9.0.x and 10.1.x). Collects Forms config, trace, and server sub directory contents. Lists Forms Java sub directory. =cut # Get all general Application Server information about Forms pretoc '2:Oracle Forms Server' # Get J2EE OC4J demos var $dir = catDir($ORACLE_HOME,'j2ee','OC4J_Demos','applications',\ 'reportsDemo','web','examples','Tools') if testDir('r',$dir) {call search_files($dir,'\.html$',0) call search_files($dir,'\.jsp$',0) } # Get configuration and trace files loop $nam ('forms','forms90') {var $frm = catDir($ORACLE_HOME,$nam) next !testDir('d',$frm) # Get forms90/config or forms/config directory contents call search_files(catDir($frm,'config'),'\.properties$',0) # List forms90/java or forms/java directory contents call get_forms_java_directory($frm) # Get forms90/server or forms/server directory contents call search_files(catDir($frm,'server'),\ '(\.cfg$|\.conf$|\.env$|\.htm$|\.properties$|\.xml)') # Get forms90/trace or forms/trace directory contents var $dir = catDir($frm,'trace') call search_files($dir,'^[^\.]',0,'irt') # Stop on first directory found break } unpretoc } =head1 ITEMS SPECIFIC TO APPS 11.5.X INSTALLS If this is an Applications install, it stores the appropriate environment settings and pulls startup scripts. =cut if compare('eq',$APPS_INST,'11i') {toc '2:Applications Specific files' debug ' Inside DEV module, getting Applications specific information' macro apps_setting {var ($key,$dir,$suf) = @arg prefix {import $TTL if $TTL {write $TTL var $TTL = undef } write '' } loop $fil (grepDir($dir,$suf,'inp')) {loop $lin (grepFile($fil,$key)) write $fil,':',$lin } if hasOutput(true) write '' } # Get the environment setting report apps11_env write '---+ $OAH_TOP' write 'OAH_TOP=',$OAH_TOP,\ '%BR%This means that this is an Applications install' toc '3:[[',getFile(),'][rda_report][Applications $OAH_TOP]]' # Get the reports server startup script in Applications debug ' Inside DEV module, getting Applications Reports startup scripts' var $adr = catFile($OAH_TOP,'admin','scripts','adrepctl.sh') report apps11_reports_startup prefix {write '---+ Applications Reports Server Startup Script' write '---## Information Taken from ',encode($adr) } call writeFile($adr) if isCreated(true) toc '3:[[',getFile(),'][rda_report][Reports Startup Script]]' # Determine the action reports server name var ($nam) = grepFile($adr,'REPSRV_NAME\=','f') var $nam = replace($nam,'^.*REPSRV_NAME\=') var $nam = replace($nam,'\;.*$') var $nam = trim($nam,"[\0x22\0x27]") if $nam {report apps11_reports_server write '---+ Reports Server Name' write $nam if isCreated(true) toc '3:[[',getFile(),'][rda_report][Report Server]]' } # List any DISPLAY overrides in the startup scripts in Apps debug ' Inside DEV module, getting DISPLAY settings' report apps11_DISPLAY_overrides var $TTL = '---+ List of DISPLAY settings in Apps startup scripts' call apps_setting('\bDISPLAY\b',catDir($OAH_TOP,'admin','scripts'),'\.sh$') call apps_setting('\bDISPLAY\b',$APPL_TOP,'\.env$') call apps_setting('\bDISPLAY\b',$ORACLE_HOME,'\.env$') if isCreated() toc '3:[[',getFile(),'][rda_report][DISPLAY settings]]' # List any NLS_LANG overrides in the startup scripts in Apps debug ' Inside DEV module, getting NLS_LANG settings' report apps11_NLS_overrides var $TTL = '---+ List of NLS_LANG settings in Apps startup scripts' call apps_setting('\bNLS_LANG\b',catDir($OAH_TOP,'admin','scripts'),'\.sh$') call apps_setting('\bNLS_LANG\b',$APPL_TOP,'\.env$') call apps_setting('\bNLS_LANG\b',$ORACLE_HOME,'\.env$') if isCreated() toc '3:[[',getFile(),'][rda_report][DISPLAY settings]]' # Get Forms server startup script in Apps debug ' Inside DEV module, getting Applications Forms server startup script' report apps11_forms_startup var $TTL = '---+ Applications Forms Server Startup Script' prefix {write $TTL write '---## Information Taken from ',lastFile() } call writeFile(catFile($OAH_TOP,'admin','scripts','adfrmctl.sh')) prefix {if !isCreated() write $TTL write '---## Information Taken from ',lastFile() } call writeFile(catFile($IAS_HOME,'Apache','Apache','conf','apps.conf')) if isCreated(true) toc '3:[[',getFile(),'][rda_report][Forms Startup Script]]' } } # Restore the initial environment loop $key (keys(%ENV)) call setEnv($key,$ENV{$key}) =head1 WARNING A complete collection of Oracle Forms and Reports in Application Server 11g requires setup of the instance home. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L =begin credits =over 10 =item RDA 4.0: Michael Ferrante. =item RDA 4.1: John Bartee, Michael Ferrante, Yukari Oba. =item RDA 4.2: Michael Ferrante. =item RDA 4.12: Wes Root. =item RDA 4.13: Roelof Van Suilichem. =item RDA 4.16: Adriana Dominguez. =item RDA 4.17: Adriana Dominguez, Roelof Van Suilichem. =back =end credits =head1 COPYRIGHT NOTICE Copyright (c) 2002-2009, Oracle. All rights reserved. =head1 TRADEMARK NOTICE Oracle, JD Edwards, PeopleSoft, and Siebel are registered trademarks of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. =cut