Defining Application module

I need to get the exact points on how to define the Application Module.
I feel AM as the definition for initializing or grouping set of EOs VOs etc.
So what are the points in doing this grouping?
In some cases common EOs and VOs are used for different functionality.
Is such cases what is the best way of defining AM, define several AMs or do all functions in one AM?
Is there a big performance issue too on this decision?
Please explain.
Thanks.

Hi,
I suggest you begin by reading chapters 9 and 10 from the Developer's Guide:
"Implementing Business Services with Application Modules" http://download.oracle.com/docs/cd/E17904_01/web.1111/b31974/bcservices.htm
"Sharing Application Module View Instances" http://download.oracle.com/docs/cd/E17904_01/web.1111/b31974/bclookups.htm

Similar Messages

  • Defining one application module for several DBs

    Hi,
    Is it possible to define one application module that serves two different DBs?
    In other words:
    If I need to use two DBs in my application, how many application module should I define?
    Thanks in advance

    Shalom Moran,
    So you only need to connect to one DB at time - but to different DBs at different times right?
    If we are talking about changing this at development time then simply simply change the configuration of your application module to connect to a different DB. (right click on the AM in JDeveloper and choose preferences). You can also change this in a file somewhere (don't remember the name of the top of my head).
    The other option is to have your AM use the application server's data-sources and you can change the parameters of the data-source in your application server configuration file.
    Hope this helps.
    Shay

  • Defining bc4j.xcfg for Webservice from ADF Application Module

    Hi all,
    I've already posted my previous question in JBO30003 while executing ADF Application Module WebService
    but no replies at all :)
    after thorough inspection, i found that why my client can connect to ADF AM and why my WebService Invocation is failed with JBO 300003. My J2EE Client application is connected to ADF AppModule with some configuration in CPX file.
    <JboProject
       id="DataBindings"
       xmlns="http://xmlns.oracle.com/adfm/application"
       version="10.1.2.18.73"
       SeparateXMLFiles="false"
       Package=""
       ClientType="JClient" >
       <Contents >
          <DataControl
             id="AppModuleDataControl"
             SubType="DCBC4J"
             SupportsFindMode="true"
             SupportsTransactions="true"
             Package="package"
             FactoryClass="FactoryImpl"
             Configuration="AppModuleEmbeddedAS" >
             <Parameters >
                <Parameter
                   name="Sync"
                   value="Immediate" >
                </Parameter>
             </Parameters>
          </DataControl>
    and so forththis CPX file define that this client connect to Application Module on my AppServer with "AppModuleEmbeddedAS" configuration, as stated in my BC4J.XCFG.
    <AppModuleConfig name="AppModuleEmbeddedAS">
             <AppModuleJndiName>AppModuleBean</AppModuleJndiName>
             <java.naming.security.credentials>welcome</java.naming.security.credentials>
             <DeployPlatform>EjbIas</DeployPlatform>
             <java.naming.security.principal>admin</java.naming.security.principal>
             <jbo.internal.embedded>true</jbo.internal.embedded>
             <HostName>localhost</HostName>
             <jbo.ampool.dynamicjdbccredentials>false</jbo.ampool.dynamicjdbccredentials>
             <ApplicationName>AppModule</ApplicationName>
             <jbo.ampool.doampooling>false</jbo.ampool.doampooling>
             <java.naming.security.authentication>simple</java.naming.security.authentication>
             <java.naming.factory.initial>oracle.jbo.common.JboInitialContextFactory</java.naming.factory.initial>
             <ConnectionPort>23891</ConnectionPort>
             <JDBCDataSource>jdbc/DBGEBPOC_on_LOCALHOSTDS</JDBCDataSource>
             <java.naming.provider.url>ormi://localhost:23791/current-workspace-app</java.naming.provider.url>
             <jbo.server.internal_connection>jdbc/DBGEBPOC_on_LOCALHOSTCoreDS</jbo.server.internal_connection>
             <jbo.dofailover>false</jbo.dofailover>
             <ApplicationPath>current-workspace-app</ApplicationPath>
             <jbo.ampool.resetnontransactionalstate>false</jbo.ampool.resetnontransactionalstate>
          </AppModuleConfig>Now, how could I define configuration like my J2EE Client in my web service? as we know that web service's client is web browser. Does it mean that we can't define any CPX file?
    FYI, My webservice's End Point pages is successly shown up. but when i invoke the method, it returns XML with faultmessage Error JBO30003.

    Hi,
    You can directly edit the bc4j.xcfg file. Note that the WebService binding is not created from the Am directly but from the deployed WSDL file.
    Frank

  • Best Practice to use a single root Application Module?

    I was reading in another thread that it may be a good idea to have all application modules nested within a single root application module (AM) so that there is only 1 session maintained for the root AM, versus an individual session for each AM. Is this a best practice? If yes, should the root AM be a skeleton AM (minimal customer service methods), or, should you select the most heavily used AM and nest the other AM's underneath of it?
    In my case, I currenlty have 2 AM's (and will have 3 AM's in the future) each representing a different set of use cases withn the application (i.e., one supports users searches / shopping cart-like functionality, and the second supports an enrollment process.) It could be the case that a user only accesses pages on the web site to do searches (first AM), or only to do enrollment (2nd AM), or, they may access pages of the site that access both AM's. Right now I have 2 separate AM's that are not nested. Should I nest the AM's and define a root AM?
    thanks

    Hi javaX
    The main physical effect of having 2 separate AMs is that they have their own transactions with the database, and presumably sit in the application module pool as their own instances consuming connections from the connection pool. Alternatively a single root AM with 2 nested AMs share a single transaction through the root AM; only the root AM controls the transaction in this scenario.
    As such it's a question of do you need separate transactions or will one suffice?
    How you group your EOs/VOs etc within the AMs is up to you, but usually falls into logical groups such as you have done. If a single transaction is fine, instead of creating multiple AMs, you could instead just create logical package structures instead. Neither method is right or wrong, they're just different ways of structuring your application.
    When you create a nested AM structure, within your ViewController project in the Data Control Palette you'll actually see 3 data controls mapped to each AM. In addition expanding the root AM data control, you'll see the nested AMs again. Create a dummy project with a nested AM structure and you'll see what I mean.
    If you base your page definitions on anything from the root AM and it's children in the Data Control Palette, this will work on the root AM's transaction.
    If you base your page definitions on something from one of the other AM data controls that isn't inside the main root AM in the Data Control Palette, instead of using the root AM's transaction, the separate child AM will be treated as root AM and will have its own transaction.
    The thing to care of when developing web pages is to consistently use the AM and it's nested AMs, or the child AMs directly with their separate transactions, otherwise it might cause a bit of a nightmare debugging situation later on when the same application is locking and blocking on the same records from 2 separate AM transactions.
    Hope this helps.
    CM.

  • Error when generating Web Services Proxy for SCA Application Module

    Hello,
    I'm trying to create Web Services for a simple Application Module with JDeveloper 11g (11.1.1.3.0).
    I start a new ADF Project, I create an Application Module as simple as possible : it contains only a simple View Object on the DEPT Entity.
    On my Application Module, I choose "Service Interface" and I add my View Object in the service interface.
    I test my Web Service in the Embedded Weblogic Server, it works well. (I succeed in using the Get operation, for example).
    But when I try to generate a Web Service proxy (right-click on the WSDL File -> Generate Web Service Proxy), It always fail with such errors :
    oracle.jdeveloper.webservices.tools.WsdlValidationException: Error creating model from wsdl "file:/C:/JDeveloper/mywork/ApplicationAppelServiceSCA/Model/src/model/common/AppModuleService.wsdl": 'unset' is already defined'Bytes' is already defined'ref' is already defined'Duration' is already defined'Types' is already defined'Character' is already defined'type' is already defined'Day' is already defined'nestedInterfaces' is already defined'Date' is already defined'datagraph' is already defined'Type' is already defined'Integer' is already defined'ModelsType' is already defined'ChangeSummaryType' is already defined'instanceClass' is already defined'Month' is already defined'DataObject' is already defined'javaClass' is already defined'LongObject' is already defined'DateTime' is already defined'dataObject' is already defined'YearMonth' is already defined'ShortObject' is already defined'Long' is already defined'types' is already defined'JavaInfo' is already defined'IntObject' is already defined'Boolean' is already defined'DoubleObject' is already defi...
    Can someone help me to understand this error ?
    i never manually edited the WSDL File, so I don't understand why the generated WSDL or XSD files might contain errors.
    Thanks for your Help,
    Laurent

    We have the same problem, and the problem was in the xsd import:
    The wdsl import a schema that import other schema, the second import use a relative path, that was wrong.
    So check the xsd import sequence....

  • View Objects in the shared application module is not refreshing

    Hi ,
    I have view objects defined shared apps module. This view objects are used for creating lovs which won't change very frequently. I have set the AutoRefresh=true for this view objects. I do have a UI to update the underline table for these lovs. The view objects defined in the shared application module is not getting reflected even I add a new value in the database. Is there any way to refresh these lovs as soon as its added to db?
    Thanks
    Suneesh

    I will explain my scenario ;
    I have a view object(ViewA) where I have defined many LOVs for different attributes. Thes LOVs are using the shared application module's view object (shared_view1,shared_view2...etc) as List DataSource. Where exactly I need to set the auto refresh property=true. Currently I have set all of my shared apps view objects's(shared_view1,shared_view2...etc) autorefresh property=true.Do I need to use the autorefresh =true in the ViewA ?
    What is the concept of autorefresh=true ? Wiill it refresh automatically the view object nexttime i am accessing the page after the db inserts ? Is there any time delay there ? if there is it something configurable ?
    Thanks
    Suneesh

  • Making LOV off of an exposed method from second application module

    Hello,
    I am on JDev 11.1.1.4.0.
    My ADF project worked fine until the spec changed on how Lookups are going to be handled. Previuosly, all the lookup tables were in the same database as other tables. Change is that FND Lookups will be created in the "Oracle" and my ADF project should connect to "Oracle" to get appropriate lookup values to build LOVs while maintaining the main database connection intact.
    After some research, I now have 2 Application Modules, one my project and the other for Lookups to create LOVs. I went to Application Module configuration wizard to edit JDBC setting to point to "Oracle" database and created a read only view with the following SQL:
    SELECT LOOKUP_CODE, MEANING, DESCRIPTION FROM FND_LOOKUP_VALUES  
    WHERE LOOKUP_TYPE = 'MY_LOOKUP'
    AND ENABLED_FLAG = 'Y'
    AND LANGUAGE = 'US'I can run both AMs via "Oracle Business Component Browser" fine. However, I somehow have to set the lookup view object as data source to create LOV on the main updatable view object's attribute. If I set it the way I used to do treating the lookup view as a view object residing in the same AM I am getting "table or view does not exist" error. I guess it is something to do with the lookup view object, but I cannot seem to make any kind of progress on this.
    Any help would be greatly appreciated.
    Thank you
    Bones Jones
    Edited by: Bones Jones on May 19, 2011 10:40 AM

    Well, I think I have found a solution which I didn't have to write a single line of code. My mistake was to think that I have to write code to achieve this.
    Here is what I did:
    *I already have the main AM and View Objects created for my project.  The following steps are done on top of that to bring LOV to life
    1. Create a new, pretty empty AM, named LovAM.
    1.1 Right click on the newly created AM and select 'Configurations'
    1.2 Click JDBC Name value and click 'Edit'
    1.3 Select the second database source where Lookup is defined. If not listed, go back out and create a new Database connection and come back.
    2. Create a View Object with the following SQL:
    SELECT
        TO_NUMBER(LOOKUP_CODE) ID,
        MEANING NAME,
        DESCRIPTION
    FROM
        FND_LOOKUP_VALUES
    WHERE
        LOOKUP_TYPE = 'MY_LOOKUP' AND ENABLED_FLAG = 'Y' AND LANGUAGE = 'US'3. Notice you now have LovAMDataControl
    4. Create a jspx page and create a table with the main data control's binding (This was a part of the requirements).
    5. I create a read-only table with LovAMDataControl.LovLookUp1 binding (I think this creates/exposes correct binding in the pageDef).
    6. Now I drag-and-drop an attribute that I have been wanting to display LOV from the main binding.
    7. Selected single select listbox. You will be presented with 'Edit zlist Binding' screen.
    8. Base Data Source is the main data control binding.
    9. Select Dynamic List
    10. Select LovAM data control binding as List Data Source.
    11. (optional) Selected 'Name' as Display Attribute.
    11.1. (optional) I don't want to see the table created in step 5. On the jspx page, go to Source tab and delete the table from there. I think this keeps binding in pageDef while the UI component is deleted from the page.
    12. Save and Run
    Now, I didn't have to create Root Application Module in the code, but still achieved what I wanted.
    Thanks
    Bones Jones

  • No local string defined -- Inconsistent Module State

    I am trying to deploy an Enterprise Application and during compilation I get the following error.
    Any idea?
    I am using Sun Java System Application Server 8.1 and jdk1.5.0_08,
    javax.enterprise.system.tools.deployment|_ThreadID=14;|Se produjo una excepci�n en la fase de J2EEC
    com.sun.enterprise.deployment.backend.IASDeploymentException: No local string defined -- Inconsistent Module State
         at com.sun.enterprise.security.SecurityUtil.linkPolicyFile(SecurityUtil.java:321)
         at com.sun.enterprise.deployment.backend.AppDeployerBase.generatePolicy(AppDeployerBase.java:377)
         at com.sun.enterprise.deployment.backend.AppDeployer.doRequestFinish(AppDeployer.java:108)
         at com.sun.enterprise.deployment.phasing.J2EECPhase.runPhase(J2EECPhase.java:146)
         at com.sun.enterprise.deployment.phasing.DeploymentPhase.executePhase(DeploymentPhase.java:71)
         at com.sun.enterprise.deployment.phasing.PEDeploymentService.executePhases(PEDeploymentService.java:633)
         at com.sun.enterprise.deployment.phasing.PEDeploymentService.deploy(PEDeploymentService.java:188)
         at com.sun.enterprise.deployment.phasing.PEDeploymentService.deploy(PEDeploymentService.java:520)
         at com.sun.enterprise.management.deploy.DeployThread.deploy(DeployThread.java:143)
         at com.sun.enterprise.management.deploy.DeployThread.run(DeployThread.java:172)

    solved.
    1. do a search for everything under domain1 with the given app name
    2. delete those files
    3. bounce the application server

  • JAAS Authorization - Application Module

    I created a project based on the BC4J technology. The application module is configured for using the security : jbo.security.enforce=Must. This application module is also configured to deploy the user/password.
    When I used this application through a web application, I don't meet any problem.
    If I create a POJO class in the same project as BC4J in which I instantiate an instance in the application module pool, I receive the following message :
    oracle.jbo.JboException: JBO-29000: Unexpected exception caught: oracle.jbo.JboException, msg=JBO-33021: Failed authenticate user null.
    The java class in charge of instantiating the application module pool and get an instance of it works without any problem as soon as the security is not implemented.
    Hereafter you can find the method used :
    public ApplicationModule getApplicationModule()
    try{
    PoolMgr poolMgr = PoolMgr.getInstance();
    this.lg_ApplPool = poolMgr.findPool( this.lg_configPackage + "." + this.lg_configName, // name of the pool
    this.lg_configPackage, // name of the package
    this.lg_configName, // name of the configuration
    null);
    // SessionCookie Creation
    String timeStamp = (new java.util.Date()).toString();
    // for web application, replace timeStamp by ip address of the client
    this.lg_Cookie = lg_ApplPool.createSessionCookie(this.lg_applicationId,timeStamp,null);
    CordaEnvInfoProvider lEnvInfoProvider = new CordaEnvInfoProvider ("xxx","xxx");
    // this.lg_Cookie = lg_ApplPool.createSessionCookie(this.lg_applicationId,timeStamp,null);
    this.lg_Cookie.setEnvInfoProvider(lEnvInfoProvider);
    ApplicationModule lAM = this.lg_Cookie.useApplicationModule();
    return lAM;
    catch(Exception e)
    System.out.println("_CrdAppModulePoolMgr - exception : " + e.getMessage());
    e.printStackTrace();
    return null;
    After Having search quite a long time to find a solution, I have no more idea. The only thing I see now is to forget about Jaas if the application module has not to be used by a Java client not being a JClient (Swing) or a Web application.
    Could you let me know if
    1. jaas works with java client not being Swing or web application
    2. if so, could you give me more information about how to work with BC4J application module and security enforce to Must ?
    N.B.
    POJO Client :
    public class TestAppModulePoolMgr
    private ApplicationModule lg_Am = null;
    private CrdAppModulePoolMgr  lgCrdAppModulePoolMgr = null;
    private ApplicationPool lg_ApplPool = null;
    private SessionCookie lg_Cookie = null;
    public TestAppModulePoolMgr()
    this.lg_CrdAppModulePoolMgr = _CrdAppModulePoolMgr.getCrdAppModulePoolMgr();
    this.lg_CrdAppModulePoolMgr.setApplicationId("CrdGenerationAppModuleId");
    this.lg_CrdAppModulePoolMgr.setConfigName("_CrdGenerationAppModuleLocal");
    this.lg_CrdAppModulePoolMgr.setConfigPackage("CORDA_BSV");
    this.lg_Am = lg_CrdAppModulePoolMgr.getApplicationModule();
    this.lg_ApplPool = lg_CrdAppModulePoolMgr.getApplicationPool();
    this.lg_Cookie = lg_CrdAppModulePoolMgr.getApplicationSessionCookie();
    * @param args
    public static void main(String[] args)
    TestAppModulePoolMgr testAppModulePoolMgr = new TestAppModulePoolMgr();
    }

    Thank you.
    I use SSO authentication to test my application so have no users defined.
    Can I use the test-all user? If so, what is the password?

  • Commit on one application module also commits the other

    Jdev 11.1.1.4
    I have a fusion ADF application where I have defined two Data Controls.
    One is called AppModuleDatacontrol and the other AppModuleWSDataControl.
    I do this in order to be able to commit DML made on one Data Control independently of the other.
    The problem is that when a do something like:
    AppModuleWSImpl am=(AppModuleWSImpl)Util.getApplicationModule("AppModuleWSDataControl");
    am.getTransaction().commit();
    Errors on VO of AppModuleDataControl are raised. They were not expected to be raised !
    I have activated ADF logs and just after executing
    AppModuleWSImpl am=(AppModuleWSImpl)Util.getApplicationModule("AppModuleWSDataControl");
    and before executing the commit I get:
    <BindingContext> <findDataControl> [4147] INFO: no refreshRegion, skipping cpx codebase lookup on AppModuleWSDataControl
    <BindingContext> <put> [4148] BindingContext.put( AppModuleWSDataControl@edu_esade_view_DataBindings_cpx, oracle.jbo.uicli.binding.JUApplication )
    <PropertyManager> <loadProperty> [4149] WARNING: Property jbo.maxpoolcookieageset to null
    <PropertyManager> <loadProperty> [4150] Skipping empty Property jbo.maxpoolcookieage from null
    <BindingContext> <put> [4151] BindingContext.put( AppModuleWSDataControl@edu_esade_view_DataBindings_cpx, oracle.jbo.uicli.binding.JUApplication )
    <BindingContext> <put> [4152] BindingContext.put( AppModuleWSDataControl@edu_esade_view_DataBindings_cpx, oracle.jbo.uicli.binding.JUApplication )
    <DebugDiagnostic> <print> [4153] DBG: DataControl:Looking for :_adf_dc_user_params_key_
    <DebugDiagnostic> <print> [4154] DBG: DataControl:Looking for :_adf_dc_user_params_key_
    <ADFLogger> <begin> Create nested Application Module
    I don't know if "Create nested Application Module" is important but I don't want this AppModule to be nested of the other. I want them to be completly independent in order to achieve independance of the commit actions.
    Any help ?

    "1.Defining all BTF as "No controller transaction" I can assume both AppModule will always work with different transactions "
    As long as they're defined as separate root AMs and you've used the <No Controller Transaction> option they will work with different db connections, therefore different transactions too.
    "and one transaction in one AppModule will persist trough pages"
    Within scope of one BTF yes. In scope of chained BTFs that's dependent on the BTF data control scope option. If you set that to isolated, each instance of a BTF will spawn a new instance of the AM in question (and new connections/transactions with the database). If you use shared, 1 instance of the AM will be shared (1 connection/transaction).
    "2.What impact can have this in reusing BTF ? I have a jsf page reusing the same task flow in two regions. The taskflow performs some initialization. Will the regions undesirably interact one with the other ?"
    That depends on the data control scope option as specified above. If you want them to be independent, use the isolated data control scope options on the BTF.
    Consider reading the ADF Task Flow Transaction Fundamentals paper on this website for more information: http://www.oracle.com/technetwork/developer-tools/adf/learnmore/adfarchitect-1639592.html
    CM.

  • Access Application Module by SessionCookie

    Hi!
    I have created ApplicationModule in Model project of FusionWebApplication. The ApplicationModule is statefull and is successfully used in adf web page (defined in ViewController project).
    I have configured ADF Security over Fusion Web Application, so WebService cannot be accessed without providing security credentials os SessionCookie.
    In ViewController project I have created WebServicee base od POJO class. Inside its implementation method I want to access data via ApplicationModule.
    This can be done by writing this code:
    ApplicationModule am = Configuration.createRootApplicationModule("com.oracle.apps.hr.personnel.HiringModule",  "HiringModuleLocal");
    I have configured ADF Security over Fusion Web Application, so WebService cannot be accessed without providing security credentials os SessionCookie (I cannot access webservice with SessionCookie if it is defined in Model, so creating web service from ApplicationModule is out of option).
    Now my question is: I have read that ADF WebPage finds appropriate ApplicationModule of some user via DataBinding layer by SessionCookie. Is it possible to somehow simulate this way programatically - to somehow tell Configuration class to find/Create ApplicationModule via SessionCookie?
    Currently I am using Soap webservice, but we are planning to use REST the same way - define access point in ViewController and invoke ApplicationModule via Configuration class.
    Thnaks for help!

    Yvonne,
    I am using JDev 10.1.3.3.0.4157 (build 4157 I guess)
    Yes, createRootApplicationModule is called from the doGet method in my servlet.
    I have this running for a few days now and everything seems to work ok.
    But it doesn’t sit right with me that I have to use a configuration with no security.
    I also noticed the application Module tester does not work with jazn security.
    It gives around the same error:
    oracle.jbo.JboException: JBO-29000: Unexpected exception caught:
    oracle.jbo.JboException, msg=JBO-33021: Failed authenticate user testAlthough this seems to catch atleast the username, which is something I didn’t get.
    Anton

  • Non-void return type for Application Module Clients Interface

    Hello, can anyone guide me on how will I solve my problem.
    first of all, I'm using JDeveloper 10.1.3, I use JSF, ADF Faces, ADF Model, ADF Business Components.
    I made a web page that has a Transactional Capabilities, all is going smoothly, all data's can be saved to oracle database. I created a Custom Method in my Application Module and can be used in Clients Interface, that method is for saving data's to database.
    My problem is I dont know how to create a custom method that returns a value in my Application Module. Which means if I set it to non-void return type, it is not visible to Client Interface. If you're going to ask me why I need it to return a value? Well since that method is for saving data's, if there's an Error Occured, I can return the Error Message and show it to my user interface.
    Please help. thanks

    If you want to return your own type then simply define it as serializable and you will find that it will appear in the Client Interface dialog of your AM.
    eg, you could return this type from your application module to progagate a meaningful message to your UI:
    package com.delexian.model;
    import java.io.Serializable;
    public class MyMessage implements Serializable {
        private String _severity;
        private String _message;
        public MyMessage() {
        public void setSeverity(String severity) {
            this._severity = severity;
        public String getSeverity() {
            return _severity;
        public void setMessage(String message) {
            this._message = message;
        public String getMessage() {
            return _message;
    }regards,
    Brenden

  • Calling PL SQL Procedure in Application Module Method

    Hi Experts,
    I want to know how can i call a plsql procedure in Application Module and get the value of the OUT parameter of procedure . if possible please provide some example
    Thanks in advance.

    Have a look at this sample code from one of our projects:
        CallableStatement cstmt = this.getDBTransaction().createCallableStatement(
          "{ call Expand_Message( ?, ?, ? )}", DBTransaction.DEFAULT);
        try
          cstmt.setString(1, arg1 );
          cstmt.setString(2, arg2 );
          cstmt.registerOutParameter(3, Types.VARCHAR);     
          cstmt.execute();
          result = cstmt.getString(3);
        catch (SQLException e) {
          // Process eventual SQL exception here
        finally {
          try {
            cstmt.close(); }
          catch (Exception e) {;}
        }This code is part of a method in a custom ApplicationModuleImpl class (defined for one of the ApplicationModules) and the 3rd parameter of the Expand_Message procedure is an OUT-parameter.
    Dimitar

  • Is it proper for an application module has 300 views in the data model?

    Based on my understanding, all view object instances are initialized at the same time as the application module.
    It follows that when an application module is associated with a user session, the queries of each view object in the data model are executed.
    ie. if the data model has 325 view object instances, 325 queries will be executed.
    This doesn't seem efficient:
    1. As each user session only need to access a subset of the view objects (for examples 35 views), the rest of view objects need not be instantiated for that session.
    2. Performance may be slow on executing all 325 queries at one time, even worse when some queries are complex queries.
    Am I correct on this?
    In this case, will it be better to instantiate the view objects using the view object definition at runtime instead of adding all of them to the application module at design time?

    No, that's not the default behaviour.
    Assuming you're talking JDev 11, the AM on it's General tab as a Tuning option where you can set the loading of the VOs to Lazy or Non-Lazy, Lazy is the default. In turn each VO on their General tab also has a Tuning option of similar nature.
    Online documentation says:
    Lazy LoadingSelect to choose lazy loading. In this case, the application module instance is created without any of its components. Your view object and nested application module instances will not load until the first time they are used. For example, when lazy loading is enabled, a view object is instantiated only when the application accesses it. This will make start-up time faster.
    Non-lazy Loading
    Select to choose non-lazy loading. Your view object and nested application module instances will load when the application starts up. For example, suppose the application module you are editing defines three view objects and two nested application modules (which appear in the Application Module Instance section of the Data Model page over the application module overview editor). When lazy loading is disabled, the application module instance is created together with all three view objects and both nested application modules.>
    So in essence as you describe for each session, if we're using the Lazy setting, even though you have 325 VOs within an AM, if the user within the session only visits 35 queries, only 35 queries should fire.
    Does this help?
    CM.

  • How to access application module from ActionForm Execute?

    I've got a very simple ADF/UIX/Struts application where I'm trying to create a simple Login function. I have a /loginAction data action pointing to a login.uix page forward. The login.uix page has a <struts:form> on it with a user and a password field. There is a LoginBean with the corresponding get/set values. I have an ADF model created with a boolean login(String username, String password) function exposed as a client method.
    Eventually, when I have this basic part working, then I'll actually be using an ActionForward mapping to dispatch to different home pages, based on the particular login account (the name of the forward will be stored in the authentication table).
    I've tried overriding Execute(), since that is where you can return the appropriate ActionForward mapping, but that does not have a DataActionContext passed in -- so I can't get to the application module.
    I've also looked at processComponentEvents, but that doesn't have any ActionForward results nor a way to pass back ActionErrors (in case the login fails).
    How do I call my login client method when a user has entered a username/password and pressed the Submit button?

    Here is another solution as provided by Oracle Support in response to a TAR that I opened:
    I had described my need to access a login() function defined in my Application Module, returning true/false if the login succeeds/fails. Here is the reply, posted with permission:
    I have gotten the following information back from one of the development folks pertaining to the question you asked.
    His suggestions are as follows:
    1) Expose the method as a client method on the App module
    2) On the pageflow create a new DataAction
    3) Drag and drop the logon method from the AppModule operations node and drop it onto the new data Action
    3) Edit the set-property values that are created in the Struts metadata for this new DataAction to use the correct expressions to get the logon info to pass to the middle tier.
    e.g.
    <action path="/authenticateUser" className="oracle.adf.controller.struts.actions.DataActionMapping" type="AuthenticateUserAction" name="DataForm"
    unknown="false">
    <set-property property="modelReference" value="authenticateUserUIModel"/>
    <set-property property="methodName" value="authenticateUserUIModel.authenticateUser"/>
    <set-property property="resultLocation" value="${requestScope.methodResult}"/>
    <set-property property="numParams" value="2"/>
    <set-property property="paramNames[0]" value="${param.logonUsername}"/>
    <set-property property="paramNames[1]" value="${param.logonPassword}"/>
    <forward name="fail" path="/logon.do"/>
    <forward name="success" path="/menu.do"/>
    </action>
    So in this case the values of the logonUsername and logonPassword fields in the form that submitted to this DataAction are passed as the two parameters that my authenticateUser method on the AppModule requires.
    I have also overriden the data action class to customise the findForward() method to route the user depending on if the method call worked or not.
    And here's the code for the customized FindForward in the DataAction:
    protected void findForward(DataActionContext actionContext) throws Exception
    HttpServletRequest request = actionContext.getHttpServletRequest();
    HttpSession session = request.getSession();
    String target = "fail";
    //Get the result of the Model Method call
    JUCtrlActionBinding method = actionContext.getCustomMethod();
    boolean successfulLogon = ((Boolean)method.getResult()).booleanValue();
    if (!successfulLogon)
    // If the logon fails we need to do the following
    // 1. Increament the counter once this exceeds 3 any logon will fail
    // 2. Create an error message to display on the logon screen
    // note this is a non specific error to prevent hackers from
    // knowing that they at least got the username right or from
    // knowing that there is a Max attempts value if they are trying
    // an automated attack
    Integer attempts = (Integer)session.getAttribute("logonAttempts");
    int intAttempts = 0;
    if (attempts != null)
    intAttempts = attempts.intValue();
    session.setAttribute("logonAttempts", new Integer(++intAttempts));
    //The error message comes out of the ApplicationResources.properties file.
    actionContext.getActionErrors().add("general",new ActionError("logon.error.logonFailed"));
    this.saveErrors(actionContext.getHttpServletRequest(),
    actionContext.getActionErrors());
    else
    //If connection was OK do we need to save the username in a cookie?
    String remember = (String)request.getParameter("logonRemember");
    int cookieLife = 0; //Expire
    if ( remember != null && remember.length()>0 )
    cookieLife = 2592000;
    String name = (String)request.getParameter("logonUsername");
    Cookie userCookie = new Cookie("CARA_USER_COOKIE",name);
    userCookie.setMaxAge(cookieLife);
    actionContext.getHttpServletResponse().addCookie(userCookie);
    target = "success";
    actionContext.setActionForward(target);
    I hope this helps anyone looking to implement something similar. It also illustrates the "preferred" way of executing a client method and working with the result.

Maybe you are looking for