Configure Oracle Reports 12c (12.2.x) for destype=file
Posted by Dirk Nachbar on Friday, September 29, 2017
I currently had in a project a request, that Oracle Reports should be generated with the option destype=file to a specific location on the server which is hosting the Oracle Forms & Reports 12c environment.
Since Oracle Forms & Reports 12c, the so called "File System Access Control" is enabled by default, so any request like http://<server>:<Port_of_ManagedServer_Reports>/reports/rwservlet?report=test.rdf&userid=test/test@db1&destype=file&desformat=pdf&desname=/u00/app/oracle/demo_app/rep_output/test.pdf&server=rep_server1 will fail:
When you check the corresponding log files for your Reports Server you will find following:
You simply have to edit your rwserver.conf of your Reports Server and add the required folderAccess option within your engine. The required folderAccess option looks like that:
Example:
After the above changes, you need to stop and start your Reports Server
Now you can re-run the URL request http://<server>:<Port_of_ManagedServer_Reports>/reports/rwservlet?report=test.rdf&userid=test/test@db1&destype=file&desformat=pdf&desname=/u00/app/oracle/demo_app/rep_output/test.pdf&server=rep_server1 and your PDF named test.pdf will be generated under your target directory you defined in the URL with parameter desname.
Now, lets take the stuff one level upper :-) in some case you will have different sub directories below in which you want to generate your Reports. To list them all by semi-colon separated under the folderAccess parameter is not really my personal goal, so lets try it with wildcard:
In my corresponding rwserver.conf it would look like that:
After the above changes, restart your Reports Server once again in order to catch the changed rwserver.conf changes.
Under the target directory /u00/app/oracle/demo_app/rep_output I have 2 sub directories called out1 and out2. So lets try to set the desname parameter in the URL call to desname=/u00/app/oracle/demo_app/rep_output/out1/test.pdf
The result will be:
:-( but no worries, just download the patch 22334822 https://updates.oracle.com/download/22334822.html. The patch is available for following Releases:
Simply apply this patch to your Oracle Forms & Reports installation:
Now, just startup your complete Oracle Forms & Reports Environment and you can even use the wildcard option with the folderAccess parameter.
In case you are already on Oracle Forms & Reports 12.2.1.3.0, you are lucky the patch 22334822 is already included and you can use directly the wildcard option :-)
Since Oracle Forms & Reports 12c, the so called "File System Access Control" is enabled by default, so any request like http://<server>:<Port_of_ManagedServer_Reports>/reports/rwservlet?report=test.rdf&userid=test/test@db1&destype=file&desformat=pdf&desname=/u00/app/oracle/demo_app/rep_output/test.pdf&server=rep_server1 will fail:
When you check the corresponding log files for your Reports Server you will find following:
cd $DOMAIN_HOME/servers/<ReportsServerName>/logs
vi rwEng-0_diagnostic.log
[2017-09-29T10:27:14.058+02:00] [reports] [INCIDENT_ERROR] [REP-69] [oracle.reports.engine] [tid: 12] [ecid: 0000LvCjcD33n3WjLxjO8A1PnW5h000008,0:1:100000001] [EngineName: rwEng-0] REP-69 : An internal error occurred[[
REP-56133: Access is denied to write to the specified location.
oracle.reports.RWException: IDL:oracle/reports/RWException:1.0
at oracle.reports.engine.EngineImpl.run(EngineImpl.java:553)
at oracle.reports.engine.EngineClassPOA._invoke(EngineClassPOA.java:104)
at com.sun.corba.se.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:654)
at com.sun.corba.se.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:205)
at com.sun.corba.se.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1700)
at com.sun.corba.se.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1558)
at com.sun.corba.se.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:940)
at com.sun.corba.se.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:198)
at com.sun.corba.se.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:712)
at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.dispatch(SocketOrChannelConnectionImpl.java:471)
at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.doWork(SocketOrChannelConnectionImpl.java:1230)
at com.sun.corba.se.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:490)
at com.sun.corba.se.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:519)
]]
[2017-09-29T10:27:14.058+02:00] [reports] [NOTIFICATION] [] [oracle.reports.engine] [tid: 12] [ecid: 0000LvCjcD33n3WjLxjO8A1PnW5h000008,0:1:100000001] [EngineName: rwEng-0] EngineImpl:run oracle.reports.RWException: IDL:oracle/reports/RWException:1.0
You simply have to edit your rwserver.conf of your Reports Server and add the required folderAccess option within your engine. The required folderAccess option looks like that:
# Single Target Directory
<folderAccess>
<write>Target_Directory</write>
</folderAccess>
# Multiple Target Directories are separated with semi-colon
<folderAccess>
<write>Target_Directory1;Target_Directory2</write>
</folderAccess>
Example:
cd $DOMAIN_HOME/config/fmwconfig/components/ReportsServerComponent/<ReportsServerName>
vi rwserver.conf
<?xml version = '1.0' encoding = 'ISO-8859-1'?>
<server
xmlns="http://xmlns.oracle.com/reports/server"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
<cache class="oracle.reports.cache.RWCache">
<property name="cacheSize" value="50"/>
<property name="cacheDir" value="/u00/app/oracle/demo_app/tmp"/>
<!--property name="maxCacheFileNumber" value="max number of cache files"/-->
</cache>
<!--Please do not change the id for reports engine.-->
<!--The class specifies below is subclass of _EngineClassImplBase and implements EngineInterface.-->
<engine id="rwEng" class="oracle.reports.engine.EngineImpl" maxEngine="5" minEngine="2" engLife="50" >
<property name="sourceDir" value="/u00/app/oracle/demo_app/reports"/>
<property name="tempDir" value="/u00/app/oracle/demo_app/tmp"/>
<!--property name="keepConnection" value="yes"/-->
<folderAccess>
<write>/u00/app/oracle/demo_app/rep_output</write>
</folderAccess>
</engine>
<engine id="rwURLEng" class="oracle.reports.urlengine.URLEngineImpl" maxEngine="1" minEngine="0" engLife="50" />
<security id="rwJaznSec" class="oracle.reports.server.RWJAZNSecurity"/>
. . .
. . .
After the above changes, you need to stop and start your Reports Server
cd $DOMAIN_HOME/bin ./stopComponent.sh <ReportsServerName> ./startComponent.sh <ReportsServerName> # e.g.: ./stopComponent.sh rep_server1 ./startComponent.sh rep_server1
Now you can re-run the URL request http://<server>:<Port_of_ManagedServer_Reports>/reports/rwservlet?report=test.rdf&userid=test/test@db1&destype=file&desformat=pdf&desname=/u00/app/oracle/demo_app/rep_output/test.pdf&server=rep_server1 and your PDF named test.pdf will be generated under your target directory you defined in the URL with parameter desname.
Now, lets take the stuff one level upper :-) in some case you will have different sub directories below in which you want to generate your Reports. To list them all by semi-colon separated under the folderAccess parameter is not really my personal goal, so lets try it with wildcard:
# Target Directory with wildcard for sub directories
<folderAccess>
<write>Target_Directory/*</write>
</folderAccess>
In my corresponding rwserver.conf it would look like that:
<?xml version = '1.0' encoding = 'ISO-8859-1'?>
<server
xmlns="http://xmlns.oracle.com/reports/server"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
<cache class="oracle.reports.cache.RWCache">
<property name="cacheSize" value="50"/>
<property name="cacheDir" value="/u00/app/oracle/demo_app/tmp"/>
<!--property name="maxCacheFileNumber" value="max number of cache files"/-->
</cache>
<!--Please do not change the id for reports engine.-->
<!--The class specifies below is subclass of _EngineClassImplBase and implements EngineInterface.-->
<engine id="rwEng" class="oracle.reports.engine.EngineImpl" maxEngine="5" minEngine="2" engLife="50" >
<property name="sourceDir" value="/u00/app/oracle/demo_app/reports"/>
<property name="tempDir" value="/u00/app/oracle/demo_app/tmp"/>
<!--property name="keepConnection" value="yes"/-->
<folderAccess>
<write>/u00/app/oracle/demo_app/rep_output/*</write>
</folderAccess>
</engine>
<engine id="rwURLEng" class="oracle.reports.urlengine.URLEngineImpl" maxEngine="1" minEngine="0" engLife="50" />
<security id="rwJaznSec" class="oracle.reports.server.RWJAZNSecurity"/>
. . .
. . .
After the above changes, restart your Reports Server once again in order to catch the changed rwserver.conf changes.
Under the target directory /u00/app/oracle/demo_app/rep_output I have 2 sub directories called out1 and out2. So lets try to set the desname parameter in the URL call to desname=/u00/app/oracle/demo_app/rep_output/out1/test.pdf
The result will be:
:-( but no worries, just download the patch 22334822 https://updates.oracle.com/download/22334822.html. The patch is available for following Releases:
- Oracle Reports 12.2.1.0.0
- Oracle Reports 12.2.1.1.0
- Oracle Reports 12.2.1.2.0
Simply apply this patch to your Oracle Forms & Reports installation:
# Stop your complete Oracle Forms & Reports Environment
# All Reports Servers, Oracle HTTP Server (OHS), Managed Servers, Admin Server and Node Manager
# unzip the patch and navigate to the sub directory 22334822
unzip p22334822_122120_Generic.zip
cd 22334822
$ORACLE_HOME/OPatch/opatch apply
Oracle Interim Patch Installer version 13.9.1.0.0
Copyright (c) 2017, Oracle Corporation. All rights reserved.
Oracle Home : /u00/app/oracle/product/fmw-fr-12.2.1.2.0
Central Inventory : /u00/app/oraInventory
from : /u00/app/oracle/product/fmw-fr-12.2.1.2.0/oraInst.loc
OPatch version : 13.9.1.0.0
OUI version : 13.9.1.0.0
Log file location : /u00/app/oracle/product/fmw-fr-12.2.1.2.0/cfgtoollogs/opatch/opatch2017-09-29_14-50-57PM_1.log
OPatch detects the Middleware Home as "/u00/app/oracle/product/fmw-fr-12.2.1.2.0"
Verifying environment and performing prerequisite checks...
OPatch continues with these patches: 22334822
Do you want to proceed? [y|n]
y
User Responded with: Y
All checks passed.
Please shutdown Oracle instances running out of this ORACLE_HOME on the local system.
(Oracle Home = '/u00/app/oracle/product/fmw-fr-12.2.1.2.0')
Is the local system ready for patching? [y|n]
y
User Responded with: Y
Backing up files...
Applying interim patch '22334822' to OH '/u00/app/oracle/product/fmw-fr-12.2.1.2.0'
Patching component oracle.reports.core, 12.2.1.2.0...
Patch 22334822 successfully applied.
Log file location: /u00/app/oracle/product/fmw-fr-12.2.1.2.0/cfgtoollogs/opatch/opatch2017-09-29_14-50-57PM_1.log
OPatch succeeded.
# Afterwards validate that the patch is applied
$ORACLE_HOME/OPatch/opatch lsinventory
Oracle Interim Patch Installer version 13.9.1.0.0
Copyright (c) 2017, Oracle Corporation. All rights reserved.
. . .
. . .
Interim patches (9) :
Patch 22334822 : applied on Fri Sep 29 14:51:09 CEST 2017
Unique Patch ID: 20728353
Patch description: "One-off"
Created on 1 Nov 2016, 01:05:08 hrs PST8PDT
Bugs fixed:
22334822
. . .
. . .
Now, just startup your complete Oracle Forms & Reports Environment and you can even use the wildcard option with the folderAccess parameter.
In case you are already on Oracle Forms & Reports 12.2.1.3.0, you are lucky the patch 22334822 is already included and you can use directly the wildcard option :-)
Categories: Oracle Reports 12c, Oracle WebLogic Server 12c



