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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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:
1 2 3 4 5 6 7 8 9 | # 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | cd $DOMAIN_HOME /config/fmwconfig/components/ReportsServerComponent/ <ReportsServerName> vi rwserver.conf <?xml version = '1.0' encoding = 'ISO-8859-1' ?> <server > <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
1 2 3 4 5 6 7 | 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:
1 2 3 4 | # Target Directory with wildcard for sub directories <folderAccess> <write>Target_Directory/*< /write > < /folderAccess > |
In my corresponding rwserver.conf it would look like that:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <?xml version = '1.0' encoding = 'ISO-8859-1' ?> <server > <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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | # 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