GUI of OAF vs. Apex

Hi,
OAF and Apex are both developed to build web-based applications for Oracle E-Business Suite, I think.
Now my question is which of them has the more user friendly GUI.
Which is easier to use for the staff of the company and which needs reguarly more time at user inputs or user interactions?!
thx

I think it were you only who have posted for the similar discussions earlier and the overall response was that OAF is seamlessly integrated with EBS and is only meant for EBS whereas no such default provisions for Apex.
Now all this talks of GUI and user friendliness depends on exact screens required and how it is developed. Also now that you have enough of theoretical material ready with you, i will suggest to do some hands on with the short listed tools of your choice and get a first hand feeling yourself.
--Shiv                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           

Similar Messages

  • OAF vs APEX

    Hi Guys
    Can you please compare OAF and APEX
    Thanks
    Subramanian

    These two are completely two different technologies. Though both are used for web application designing. But the basic difference is - OAF is Java based and used 3 tier architecture while APEX is the based on MOD PL/SQL technology which uses 2-tier architecture and client directly interact with the database. Web application designing using APEX is very fast but it is having its own limitations.
    Arvind

  • Web development between OAF & APEX

    Hi Gurus,
    I got a question or dilema here, I use to develop in OAF a few months ago, but I got an APEX new project very close, so I read some articles in APEX main page and I could't see any considerable difference between OAF and APEX, maybe because I don't have the expertice of you guys, but could you please tell me if there is a big difference between those frameworks?
    In oracle page says that APEX its more simple and austere than OAF, but in wich aspect?
    Thanks a lot for your time, and I'll appreciate a lot your answer.
    Best Regards,
    Mentor

    I think you should also include the licensing issues in application development/deployment plans. As you might know, Forms requires iDS (for development) and iAS EE (for deployment) licenses. For JDeveloper and ADF, the development platform is free and the iAS Java version is much cheaper compared to the iAS EE license. When it comes to APEX licensing, it is free as long as the database server is properly licensed. For a small size company, APEX and the JDeveloper + ADF and iAS Java version makes perfect sense. Because Forms Services is only a part of the EE version of the iAS server, it might be an expensive option for a small scale application. On the other hand iAS EE is very capable and scaleable framework and you can deploy both J2EE, Forms, Reports, Discoverer, Portal applications from a single platform.
    Hope this proves useful.
    Zafer

  • Do migrated forms still interact with EBS database?

    Once you have completed a EBS forms conversion into APEX, are you able to have the new APEX applications forms read/write from the EBS database?
    For instance ,say your wanting to take currently used forms XYZ out of EBS and put them into APEX so you can create a better UI and such for them or just give the users better use of the data. Can the EBS users then use those forms rather then the EBS ones to do their same day to day functions?
    I'm just not seeing anything regarding how the APEX forms would interact with the EBS data tables, but i could be overlooking something.
    A simple Yes/No would be great, a yes w/ some pointers or tags to documentation would get ya some bonus points!
    Thanks,
    Jeremy

    A good example could be a custom form for some module that you built using Oracle Forms for the 11i stack. Maybe it maintains data in a custom table that you use for reporting or extension purposes.
    You know that although R12 supports Forms in the techs tack, its going to be de-supported in the future in favor of ADF/Fusion/Next Java technology. You don't have a lot of java experience in your shop and want to retain the pl/sql developers you have, so you decide you will use Apex for your custom form development from now on instead of forms or OAF.
    Apex is really no different than any other framework (no matter what anyone will lead you to believe). Its great for interactive applications, forms, read-only..etc. So if you can do it in java, you can do it in Apex. I completely agree that you absolutely do not want to modify the EBS forms in any way - in fact by doing so you are pretty much de-supporting yourself as support won't touch anything that didnt come from Oracle directly.

  • Disadvantages of Oracle Forms

    Hello,
    I am searching for any disadvantages of Oracle Forms. Until now I have found that it is very old and the support for it will finish in 2013. Are there any other? thx

    I do a comparison and have enough positive facts (but
    if there are any others I would take them, too). I
    compare .NET, Forms, OAF and APEX with Pros and Cons,
    so I need the Cons of Forms ;-)Your comparison logic is incorrect. (sorry to say it, but I couldn't help my self).
    you are trying to compare a peanut with an apple and a cucumber and a water melon, they cannot be compared.
    so are these products, each of them is under seperate category, and if you want to choose one, you need to think what your business needs are.
    Is it for a small business, what are the transaction types? do you need OLAP? how many users? integration? platform? interface...... (you want me to continue :-) ???? )
    .NET, try to deploy an application written in .NET against a database other than ACCESS or SQL server.....
    APEX it's complete different technology than forms, the requirement needs can't be applied on both.
    Tony

  • Disadvantages of Oracle RDF Store

    Hello all,
    what are in your opinion the main disadvantages of the Oracle RDF Store? What are the disadvantages compared to other repository systems (e.g. Fedora Commons)?
    It would be great to get some feedback from anyone who has experienc in daily work and development with Oracle RDF Store?
    Thanks in advance and
    best wishes,
    Oliver

    I do a comparison and have enough positive facts (but
    if there are any others I would take them, too). I
    compare .NET, Forms, OAF and APEX with Pros and Cons,
    so I need the Cons of Forms ;-)Your comparison logic is incorrect. (sorry to say it, but I couldn't help my self).
    you are trying to compare a peanut with an apple and a cucumber and a water melon, they cannot be compared.
    so are these products, each of them is under seperate category, and if you want to choose one, you need to think what your business needs are.
    Is it for a small business, what are the transaction types? do you need OLAP? how many users? integration? platform? interface...... (you want me to continue :-) ???? )
    .NET, try to deploy an application written in .NET against a database other than ACCESS or SQL server.....
    APEX it's complete different technology than forms, the requirement needs can't be applied on both.
    Tony

  • New Install XE

    Can i do follow (with XE Lizense)
    Install XE Linux with the script create_xe.sh
    Install htmldb2.0 Standard
    Config the DBMS_EPG Gateway ?
    Or have you a German Language Pack for XE with 8 bit Charset.

    Hi,
    what are you trying to accomplish?
    Do you want to use the German GUI for Apex (formerly HTML DB) and not an Unicode characterset?
    I don't think you will get Apex 2.0 to work together with the XE GUI.
    The XE GUI is itself an Apex 2.1 application. I don't think it is possible to run both 2.0 and 2.1 at the same time in the same instance.
    ~Dietmar.

  • How to call APEX form from OAF

    Hi
    WE upgraded from 11i to R12. In 11i we have Apex Forms hanging off Customer forms. The customer forms in R12 became self service/OAF.
    We now need to figure out how to call the old APEX form from new selfservice Customer form
    Can some one help me with this?
    thank you

    Please review https://blogs.oracle.com/stevenChan/entry/new_whitepaper_extending_e_business which will hopefully answer your questions
    regards
    Mike

  • After upgrading to APEX 4.1 the database management GUI has been removed

    I've succesfully upgrated to APEX 4.1 on my database 10gXE
    The only problem is that now the database management GUI (Usage Monitor section) has been removed from APEX and I'd like to keep on dealing with DBA activities as before. How is it possibile? Now can I handle DBA activities only by using SQL*Plus and SQL Developer?
    Thanks!

    Hello Mark,
    unfortunately, that management GUI is an XE specific application build into the APEX version that shipped with XE. So basically, what you experience is correct: After an APEX upgrade, you can't use it anymore, because the "generic" APEX versions are not branded for XE.
    There is a theoretic possibility of using the command line exporter to export that management application from the old APEX instance before upgrading (or using a different XE instance that still has it) and import it to the upgraded APEX instance. But I would not recommend to do that, as APEX itself has changed a lot from the 2.2-branch that XE 10.2 shipped with to the 4.1 you use now. This can cause severe issues when using that application in 4.1, especially concerning the APEX management part of that application.
    Now can I handle DBA activities only by using SQL*Plus and SQL Developer?I'd recommend that. And I really think SQL Developer has become very handy for that purpose compared with the version that was out when XE 10.2 was released...
    -Udo

  • "apex/apex" URL problem with accessing admin GUI

    Hi,
    I've been searching the forums for answers to why I can't access my XE admin GUI, including a post today on this forum discussing a 404 error, but with no success so far. I've followed all the suggestions but to no avail. THIS WAS WORKING fine up until recently which is very frustrating.
    The symptom is, when I try load the admin page using the following URL...
    http://127.0.0.1:8080/apex OR http://my_machine_hostname:8080/apex
    ... the URL gets redirected to http://127.0.0.1:8080/apex/apex and the page won't load.
    I've tried an ./oracle-xe force-reload to no avail and when I check for the tns listener all looks fine as follows:
    [root@gwydlvm2 scripts]# lsnrctl status
    LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 25-AUG-2009 02:04:45
    Copyright (c) 1991, 2005, Oracle. All rights reserved.
    Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_FOR_XE)))
    STATUS of the LISTENER
    Alias LISTENER
    Version TNSLSNR for Linux: Version 10.2.0.1.0 - Production
    Start Date 25-AUG-2009 01:39:26
    Uptime 0 days 0 hr. 25 min. 18 sec
    Trace Level off
    Security ON: Local OS Authentication
    SNMP OFF
    Default Service XE
    Listener Parameter File /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/network/admin/listener.ora
    Listener Log File /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/network/log/listener.log
    Listening Endpoints Summary...
    (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC_FOR_XE)))
    (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=gwydlvm2.cisco.com)(PORT=1521)))
    (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=gwydlvm2.cisco.com)(PORT=8080))(Presentation=HTTP)(Session=RAW))
    Services Summary...
    Service "PLSExtProc" has 1 instance(s).
    Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
    Service "XE" has 1 instance(s).
    Instance "XE", status READY, has 1 handler(s) for this service...
    Service "XEXDB" has 1 instance(s).
    Instance "XE", status READY, has 1 handler(s) for this service...
    Service "XE_XPT" has 1 instance(s).
    Instance "XE", status READY, has 1 handler(s) for this service...
    The command completed successfully
    The listener.ora file is as follows:
    # listener.ora Network Configuration File:
    SID_LIST_LISTENER =
    (SID_LIST =
    (SID_DESC =
    (SID_NAME = PLSExtProc)
    (ORACLE_HOME = /usr/lib/oracle/xe/app/oracle/product/10.2.0/server)
    (PROGRAM = extproc)
    LISTENER =
    (DESCRIPTION_LIST =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
    (ADDRESS = (PROTOCOL = TCP)(HOST = gwydlvm2.cisco.com)(PORT = 1521))
    DEFAULT_SERVICE_LISTENER = (XE)
    It looks like all services that I need are up and the listener. I can do sqlplus queries from the command line.
    Any suggestions would be very welcome!
    Thanks,
    Liam.

    I ran through the commands as advised in the last post but the bahaviour is the same. The listener.log file shows the following:
    I notice that the HOST parameter value is set to fqdn in some cases and just hostname in other cases, but I'd guess that this isn't the issue. I can't see any errors in the logfiles for this restart.
    Started with pid=27987
    Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC_FOR_XE)))
    Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=gwydlvm2.cisco.com)(PORT=1521)))
    Listener completed notification to CRS on start
    TIMESTAMP * CONNECT DATA [* PROTOCOL INFO] * EVENT [* SID] * RETURN CODE
    25-AUG-2009 16:03:09 * (CONNECT_DATA=(CID=(PROGRAM=)(HOST=gwydlvm2)(USER=oracle))(COMMAND=status)(ARGUMENTS=64)(SERVICE=LISTENER)(VERSION=169869568)) * status * 0
    25-AUG-2009 16:03:21 * (CONNECT_DATA=(CID=(PROGRAM=)(HOST=gwydlvm2)(USER=oracle))(COMMAND=status)(ARGUMENTS=64)(SERVICE=LISTENER)(VERSION=169869568)) * status * 0
    Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=gwydlvm2.cisco.com)(PORT=8080))(Presentation=HTTP)(Session=RAW))
    25-AUG-2009 16:03:31 * service_register * XE * 0
    25-AUG-2009 16:13:31 * service_update * XE * 0
    25-AUG-2009 16:23:32 * service_update * XE * 0

  • [APEX 3.1.1.00.09] APEXExport, GUI, classes12.jar, and P_PLUG_CACHING

    Hello:
    Thanks to everyone who has put out information on the use of APEXExport. I now have a couple of questions:
    If I do an export from within the APEXExport using applicationid, I see the following set of columns or a subset of them within a report region:
    p_plug_caching=> 'CACHED',
    p_plug_caching_session_state => '',
    p_plug_caching_max_age_in_sec => 600,
    p_plug_cache_when_cond_type => '0',
    p_plug_cache_when_condition_e1 => '',
    p_plug_cache_when_condition_e2 => '',
    I do not see these when I perform an export using APEXEXport and workspaceid parameter or with the APEX GUI. Is this a problem that
    I should be concerned with? If it is, then perhaps the next question will answer why. Perhaps I should stick with applicationid for now.
    Looking for the JDBC driver page, I am assuming that
    http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc_10201.html,
    is the correct version of this driver for:
    APEX 3.1.1
    Oracle Database 10g Enterprise Edition Release 10.2.0.4.0
    Is there any correspondence for the parameters within the APEX GUI and a corresponding one for APEXExport. Some of the
    developers want debug on and comments off for instance.
    Thanks, John
    Edited by: user652743 on May 8, 2009 6:11 AM

    Hello:
    Thanks to everyone who has put out information on the use of APEXExport. I now have a couple of questions:
    If I do an export from within the APEXExport using applicationid, I see the following set of columns or a subset of them within a report region:
    p_plug_caching=> 'CACHED',
    p_plug_caching_session_state => '',
    p_plug_caching_max_age_in_sec => 600,
    p_plug_cache_when_cond_type => '0',
    p_plug_cache_when_condition_e1 => '',
    p_plug_cache_when_condition_e2 => '',
    I do not see these when I perform an export using APEXEXport and workspaceid parameter or with the APEX GUI. Is this a problem that
    I should be concerned with? If it is, then perhaps the next question will answer why. Perhaps I should stick with applicationid for now.
    Looking for the JDBC driver page, I am assuming that
    http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc_10201.html,
    is the correct version of this driver for:
    APEX 3.1.1
    Oracle Database 10g Enterprise Edition Release 10.2.0.4.0
    Is there any correspondence for the parameters within the APEX GUI and a corresponding one for APEXExport. Some of the
    developers want debug on and comments off for instance.
    Thanks, John
    Edited by: user652743 on May 8, 2009 6:11 AM

  • Tools Survey: GUI Development for E-Business Suite

    Hi,
    I choose four different tools that are able to create graphical user interfaces which are working in the Oracle E-Business Suite. Now I have to judge all the tools and take one 'winner'. For this I made some criteria list:
    1. Development
    1.1 Rapidness
    1.2 EBS Integration
    2. Application
    2.1 Performance
    2.2 GUI
    3. Miscellaneous
    3.1 Support of Oracle
    3.2 Community (-Size)
    3.3 Costs
    Now the four tools are:
    A Oracle Forms
    B Oracle APEX
    C Oracle Application Framework
    D Microsoft .NET Framework
    I just want to ask if some users that have experience with one or more of that tools give me some judgements or hints. I want to give every tool 1 to 5 points and in the end I have a 'winner'. So it would be great if many users participate and give points for one or more tools (if possible with some small comments)... thx

    Now that depends on what you want to achieve.
    If you want to extend or customize a standard EBS screen, then the best way is to use OAF and Forms.
    If you want to create new applications using new tables, etc that can integrate with EBS well that depends on your current skills. You can use all the 4 tools you mentioned, however using OAF and Forms (template.fmb) is recommended because it inherits Oracle EBS features as well internal libraries also it is created specifically for EBS so you can use EBS like feature like personalization or custom.pll.
    However I've seen companies use other tools to create new applications, just that you might need to give more effort IMHO.

  • Need to Programmatically Set IRR Filter on Date Field Due to APEX 4.1 Bug

    There may be another work around but, here is the problem that we are encountering...
    We have a huge table that is partitioned on a DATE field and an IRR that reports on this table. By default, we want to show the most recent 3 days of data. There is a built-in filter for "is in the last 3 Days." Sounds Great! Unfortunately APEX generates the code using TIMESTAMP rather than DATE functions. As a result of this, the query does not perform partition pruning and, as a consequence, it is doing a full table scan which takes forever. Note the use of the "LOCALTIMESTAMP" function in the query that is generated by APEX for this filter:
    SELECT   "BUSINESS_DATE",
             COUNT ( * ) OVER () AS apxws_row_cnt
      FROM   (SELECT   *
                FROM   (SELECT   *
                          FROM   position_delta_his p) r
               WHERE   ("BUSINESS_DATE" BETWEEN *LOCALTIMESTAMP*
                                                - NUMTOYMINTERVAL (:APXWS_EXPR_1,
                                                                   'year')
                                            AND  *LOCALTIMESTAMP*)) r
    WHERE   ROWNUM <= TO_NUMBER (:APXWS_MAX_ROW_CNT)If, instead, APEX used the SYSDATE function, as the underlying column is a DATE, this returns instantly, after partition pruning.
    SELECT   "BUSINESS_DATE",
             COUNT ( * ) OVER () AS apxws_row_cnt
      FROM   (SELECT   *
                FROM   (SELECT   *
                          FROM   position_delta_his p) r
               WHERE   ("BUSINESS_DATE" BETWEEN *SYSDATE*
                                                - NUMTOYMINTERVAL (:APXWS_EXPR_1,
                                                                   'year')
                                            AND  *SYSDATE*)) r
    WHERE   ROWNUM <= TO_NUMBER (:APXWS_MAX_ROW_CNT)
    The bug is that APEX should base the underlying function on the data type of the filtered column.
    As a work around, if we create a filter where BUSINESS_DATE >= '4/13/2012' (three business days ago), again, this returns instantaneously. The issue is that we can only set this filter by using the APEX GUI. We need to be able to:
    1. Determine the date for 3 business days ago
    2. Set this as the default filter.
    I tried creating a BEFORE HEADER PL/SQL page process but, it does not appear to be having any effect. Here is that code:
    DECLARE
        ldt_Filter DATE;
        CURSOR lcsr_GetMaxBusinessDate IS
            SELECT Max(BUSINESS_DATE)
            FROM POSITION_DELTA_HIS;
        DAYS_AGO CONSTANT NUMBER := 3;       
    BEGIN
        APEX_UTIL.IR_CLEAR( :APP_PAGE_ID );
        OPEN lcsr_GetMaxBusinessDate;
        FETCH lcsr_GetMaxBusinessDate INTO ldt_Filter;
        CLOSE lcsr_GetMaxBusinessDate;
        ldt_Filter := ( Trunc( ldt_Filter ) - 3 );
        APEX_UTIL.IR_FILTER( p_page_id       => :APP_PAGE_ID,
                             p_report_column => 'BUSINESS_DATE',
                             p_operator_abbr =>'GTE',
                             p_filter_value  => TO_CHAR( ldt_Filter, 'YYYYMMDDHH24MISS' ) );
    END;Can anyone tell me:
    1. How to set this filter programmatically (also needs to be displayed on the page so the user can see the current filter...as if it were created via the GUI) ***OR***
    2. Some other work around for this issue..
    Thanks,
    -Joe

    Actually, now that I look further, I don't think it is going to work to simply set the filter programmatically. The end user can still click the column heading where they are only given the choice of the LOCALTIMESTAMP based filters. If they pick one, the page is going to be out to lunch for them.
    We really need some other fix. We really need a way to actually address the underlying issue.
    -Joe

  • Application Import broken in Apex 3.2.1.00.10?

    Hiya, trying to import my app into a new installation of Apex. I choose the file type, choose the encoding (utf-8), choose the file, click "next" and it says:
    *1 error has occurred*
    File must be selected to upload.
    (also, I cannot login using Internet Explorer as it always returns to the login screen without any error messages, but Firefox and Chrome I can login in, just that the import will not work. )
    What's up?

    Hi, I don't know the DAD (we're using mod_owa to boot so..)
    But it appears that there is a 32 kb limitation in file uploads in mod_owa, and that's causing it. I don't know for sure since I do not administer the server and have no access to it in any way other than the apex web gui.
    But I assume it is also possible to run the application import script through sqlplus?
    As for the IE login problem, that was caused by the host name having an underscore. IE would not accept the cookie :)

  • How to SCAN uploaded files for VIRUS in APEX

    part 1:
    Goal:
    Do a virus scan of the uploaded file from APEX application prior to storing the file in custom tables.
    The process:
    Followed the document from www.developer.com:
    Implementing an Anti-Virus File Scan in JEE Applications
    By Vlad Kofman
    Go to page: 1 2 3 Next
    This article will discuss one of the ways to implement antivirus file scanning in Java, particular in the JEE applications. Viruses, Trojan Horses, and different malware and spyware are a real problem for current computer environments, and especially for the Windows operating system. If you are designing any application in Java that has a requirement to be able to upload external files, you have a potential security risk. By uploading, I mean any way to get the external file inside of the corporate firewall be it via HTTP protocol or any other means. It is quite common to have this type of requirement in an enterprise application and with Java being one of the most popular web development platforms, it is unfortunate that this type of gaping security risk is quite often overlooked.
    Java's Development Kit (JDK) does not have any means to do the antivirus scan right out of the box. This is primarily because Java is a programming language, and does not have any virus scanning packages. Furthermore, anti-virus software is not Sun's area of expertise or business model. Developing this type of software (or Java package), and more importantly maintaining it, would be a huge task for Sun. Mainly because viruses are constantly evolving and keeping virus definitions up-to-date is a daunting task. Large companies such as McAffee, Symantec, or Zone Labs develop virus detecting and combating products and spend a lot of resources to maintain them.
    Application Environment
    To implement a virus file scan in Java, a third-party package needs to be used. For the purposes of this article, I will use Symantec Scan Engine (SSE) package, which comes with Java APIs. This package is an application that serves as a TCP/IP server and has a programming interface and enables Java applications to incorporate support for content scanning technologies. For this article, I used Symantec Scan Engine 5.1, which is available as a Unix or Windows install.
    If you are using an anti-virus package from the different vendor, you will need to investigate what kind of APIs are available; however, the general approach should be similar. Also, note that my implementation can be used with JEE technology and any modern MVC framework such as Struts or Spring.
    The architecture is as follows: A server machine needs to have SSE running at all times. This can be the same machine that hosts your Application Server, but in an enterprise environment this should be a different machine. The Default Port needs to be open through the firewall to allow communication with the scan engine. All JEE applications that need to do file scanning can talk to the SSE server machine through a default port. Also, multiple applications running on different application servers can re-use the same scanning server. For more information, you should refer to the Symantec Scan Engine (SSE) Installation Guide, available on the Symantec web site.
    When an external file that needs to be scanned is sent to the SSE via its programming interface (Java APIs using the default port), before any other operation on the file is performed, the SSE returns a result code. For instance, a file is uploaded by an external user into the web email type application as an attachment; then, the SSE API is invoked by the application and the return code of pass or fail determines the outcome of the upload and whether that email can actually be sent. If you have an account on Yahoo mail, you probably have seen that Yahoo is using Norton Antivirus to scan all attachments, although no Java.
    Click here for a larger image.
    Figure 1: Screen shot from Yahoo
    For details on the Scan Engine Server Installationm please see the Symantec Scan Engine (SSE) Implementation Guide from Symantec.
    Here are some key things to remember about SSE:
    •     Java 2 SE Runtime (JRE) 5.0 Update 6.0 or later must be installed on the server before the SSE installation is done.
    •     After installation, verify that the Symantec Scan Engine daemon is running. At the Unix command prompt (if it's a Unix install), type the following command:
    ps –ea | grep sym.
    A list of processes similar to the following should appear:
    o     5358 ? 0:00 symscan
    o     5359 ? 0:00 symscan
    If nothing is displayed the SSE process did not start.
    If the SSE process did not start, type the following command to restart SSE:
    /etc/init.d/symscan restart
    •     Keeping the virus definition up to date is the most important task and if new updates are not installed, the whole scan becomes ineffective. Symantec automatically downloads the most current file definitions through LiveUpdate. Please make sure that firewall rules are in place to allow the host server to connect to the Symantec update service.
    Project Setup
    For the purposes of this article, I included a wrapper for the Symantec SSE APIs, av.jar, which has Symantec Java APIs and serves as a client to the SSE server and takes care of all communications with the server. Please refer to the download source section. The av.jar should be included in the Java CLASSPATH to work with the SSE. This jar contains a class called AVClient that takes care of actually sending the files to SSE as byte arrays and returning the result.
    In my project setting, I added three variables to be accessed via the System.getProperty mechanism. For example:
    AV_SERVER_HOST=192.168.1.150
    AV_SERVER_PORT=1344
    AV_SERVER_MODE=SCAN
    The AV_SERVER_HOST is the host name or IP of the machine where Scan Engine is installed.
    The AV_SERVER_PORT is the port where Scan Engine listens for incoming files.
    The AV_SERVER_MODE is the scan mode which can be:
    •     NOSCAN: No scanning will be done (any keyword that does not start with "SCAN" will result in ignoring the call to the Scan Engine and no files will be transferred for scanning).
    •     SCAN: Files or the byte stream will be scanned, but the scan engine will not try to repair infections.
    •     SCANREPAIR: Files will be scanned, the scan engine will try to repair infections, but nothing else will be done.
    •     SCANREPAIRDELETE: Files will be scanned, the scan engine will try to repair infections, and irreparable files will be deleted.
    Note: For the file stream (byte array) scanning, the only meaning full values are "SCAN" and "NOSCAN".
    Using the SSE Scanning Java APIs
    In any class where scan is required, call the scanning API provided in the AVClient object located in the av.jar. The AVClient object will establish connection to the Scan Engine server and has the following APIs:
    Figure 2: The significant APIs for the communication with to the Scan Engine Server.
    If scanning a file on the file system, in SCAN only mode, use the call that accepts filename only.
    If scanning a file on the file system, with SCANREPAIR or SCANREPAIRDELETE, use the call that accepts input and output file names.
    If scanning an in-memory file (byte array), use the call accepting byte array.
    For example:
    import com.av.*;
    Initialize setup parameters:
    static String avMode =
    (System.getProperty("AV_SERVER_MODE") != null)
    ? (String) System.getProperty("AV_SERVER_MODE") : "NOSCAN";
    static boolean scan = avMode.startsWith("SCAN");
    static String avServer =
    (String) System.getProperty("AV_SERVER_HOST");
    static int avPort =
    Integer.parseInt( (String) System.getProperty("AV_SERVER_PORT"));
    Scan check example for an in-memory file byte array:
    public void scanFile(byte[] fileBytes, String fileName)
    throws IOException, Exception {
    if (scan) {
    AVClient avc = new AVClient(avServer, avPort, avMode);
    if (avc.scanfile(fileName, fileBytes) == -1) {
    throw new VirusException("WARNING: A virus was detected in
    your attachment: " + fileName + "<br>Please scan
    your system with the latest antivirus software with
    updated virus definitions and try again.");
    Note that if you are using this code inside of the MVC handler, you can throw a custom VirusException and check for it in the calling method and perform any necessary cleanup. I have included the class in the AV Jar as well.
    For example:
    catch (Exception ex) {
    logger.error(ex);
    if (ex instanceof VirusException) {
    // do something here
    else {
    // there was some other error – handle it
    For more details on the Scan Engine Client API, please see Symantec Scan Engine Software Developers Guide.
    Continuation in part2

    part 4:
    c)     Clienttester.java – This is the gui app set to test if the configuration is working or not. This gui uses the method scanfile(inputfile, outputfile) as you can see the result in the outputpane of the jframe.
    * clienttester.java
    * Created on April 12, 2005, 2:37 PM
    * @author george_maculley
    package com.av;
    import java.io.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    public class clienttester
    implements ActionListener {
    // private String ipaddress = "127.0.0.1";
    private String ipaddress = "199.209.150.58";
    //private String ipaddress = "192.168.0.55";
    static JFrame frame;
    JFileChooser chooser = new JFileChooser();
    TextField pathtofile = new TextField(System.getProperty("user.home"), 30);
    // TextField pathtooutfile= new TextField(System.getProperty("user.home"),30);
    private int port = 1344;
    JButton filechooser = new JButton("Browse to file"); ;
    private String originalfilename;
    private String outputfilename;
    JButton scanbutton = new JButton("Scan");
    TextArea outputarea = new TextArea(20, 40);
    TextField iptext = new TextField("127.0.0.1", 16);
    TextField porttext = new TextField("1344", 5);
    AVClient mine;
    JRadioButton choosescan = new JRadioButton("SCAN");
    // JRadioButton choosedelete= new JRadioButton("SCANREPAIRDELETE");
    /** Creates a new instance of gui */
    public clienttester() {
    public clienttester(java.lang.String ip, java.lang.String infile, java.lang.String outfile, int port) {
    this.ipaddress = ip;
    this.port = port;
    this.originalfilename = infile;
    this.outputfilename = outfile;
    boolean setValues(java.lang.String ip, java.lang.String infile, java.lang.String outfile, int port) {
    this.ipaddress = ip;
    this.port = port;
    this.originalfilename = infile;
    this.outputfilename = outfile;
    return (true);
    public void actionPerformed(java.awt.event.ActionEvent actionEvent) {
    JComponent c = (JComponent) actionEvent.getSource();
    if (c == filechooser) {
    int retval = chooser.showDialog(frame, null);
    if (retval == JFileChooser.APPROVE_OPTION) {
    File theFile = chooser.getSelectedFile();
    if (theFile != null) {
    pathtofile.setText(theFile.getPath());
    // pathtooutfile.setText(theFile.getPath());
    JOptionPane.showMessageDialog(frame, "You chose this file: " + theFile.getPath());
    if (c == scanbutton) {
    //return object that can be passed to AVClient
    String policy;
    int thisport;
    int scanresult;
    String thisip;
    String inputfile;
    String outputfile;
    outputarea.append("Server: " + iptext.getText() + "\r\n");
    if (choosescan.isSelected()) {
    policy = "SCAN";
    else {
    policy = "SCANREPAIRDELETE";
    thisport = new Integer(porttext.getText()).intValue();
    thisip = iptext.getText();
    //mine= new AVClient(iptext.getText(),porttext.getText(),policy);
    mine = new AVClient(iptext.getText(), thisport, policy);
    if (mine.test() == 1) {
    outputarea.append("Sorry. Incorrect parameters specified.\r\n");
    System.exit(1);
    else {
    outputarea.append("Connection to SAVSE initialized.\r\n");
    inputfile = pathtofile.getText();
    // outputfile=pathtooutfile.getText();
    outputfile = "/tmp";
    outputarea.append("Scanning file " + inputfile + " \r\n");
    if (policy == "SCAN") {
    scanresult = mine.scanfile(inputfile);
    else {
    scanresult = mine.scanfile(inputfile, outputfile);
    if (scanresult == 0) {
    outputarea.append("File is clean.\r\n");
    else if (scanresult == -1) {
    outputarea.append("File is infected. \r\n");
    else {
    outputarea.append("Scan error.\r\n");
    void display() {
    Frame f = new Frame("SAVSE JAVA ICAP Client");
    f.setLayout(new GridLayout(1, 2));
    JPanel lpanel = new JPanel(new GridLayout(7, 1));
    JPanel ippanel = new JPanel();
    JPanel portpanel = new JPanel();
    JPanel rpanel = new JPanel();
    JPanel outputpanel = new JPanel();
    JPanel buttonpanel = new JPanel();
    JPanel pathpanel = new JPanel();
    // JPanel outpathpanel= new JPanel();
    JPanel policypanel = new JPanel();
    ButtonGroup policygroup = new ButtonGroup();
    filechooser.addActionListener(this);
    scanbutton.addActionListener(this);
    choosescan.setSelected(true);
    policygroup.add(choosescan);
    // policygroup.add(choosedelete);
    buttonpanel.setBorder(BorderFactory.createTitledBorder("Scan Policy"));
    buttonpanel.add(choosescan);
    // buttonpanel.add(choosedelete);
    pathpanel.setBorder(BorderFactory.createTitledBorder("Path to File"));
    pathpanel.add(pathtofile);
    f.setSize(new Dimension(650, 400));
    f.setBackground(Color.white);
    f.setResizable(true);
    ippanel.setBorder(BorderFactory.createTitledBorder("SAVSE IP Address"));
    ippanel.add(iptext);
    outputpanel.setBorder(BorderFactory.createTitledBorder("OUTPUT"));
    outputpanel.add(outputarea);
    portpanel.setBorder(BorderFactory.createTitledBorder("ICAP Port"));
    portpanel.add(porttext);
    // outpathpanel.setBorder(BorderFactory.createTitledBorder("Path to Repair File"));
    // outpathpanel.add(pathtooutfile);
    lpanel.add(ippanel);
    rpanel.add(outputpanel);
    lpanel.add(portpanel);
    lpanel.add(buttonpanel);
    lpanel.add(pathpanel);
    // lpanel.add(outpathpanel);
    lpanel.add(filechooser);
    lpanel.add(scanbutton);
    f.add(lpanel);
    f.add(rpanel);
    f.setVisible(true);
    public static void main(String[] args) {
    clienttester g = new clienttester();
    g.display();
    d)     my2.java – This is the class file I wrote to test that I am able to send a file and scan it and see the output in the JDEVELOPER. In this case the file is stored on the filesystem of the client machine. JDEVELOPER should be able to see the file.
    NOTE:
    “EICAR.com” is the test file downloaded from Symantec site to test a non malicious virus file. I n order to be able to test it like this, the Antivirus program running on your machine should be disabled, or else Antivirus will kick in and delete the file. In the first place you will not be able to download the test virus file either with anti virus running on the machine you are downloading to.
    package com.av;
    import java.io.*;
    public class my2 {
    static int my_return = 0;
    * @param fileBytes
    * @param fileName
    * @return
    public static int scanfile(String fileName){
    String avMode = "SCAN";
    boolean scan = avMode.startsWith("SCAN");
    String avServer = "xx";--avserver ip address
    int avPort = 1344;
    int the_return = 0;
    if (scan) {
    AVClient avc = new AVClient(avServer,avPort,avMode);
    the_return = avc.scanfile(fileName);
    if (the_return == -1) {
    return (the_return);
    } else
    return (the_return);
    //my_return = the_return;
    return (the_return);
    public static void main(String[] args) throws Exception {
    System.out.println("Hi there in Main");
    byte[] b1 = new byte[4];
    b1[1] = 68;
    my_return = scanfile("c:\\eicar.com");
    System.out.println(my_return);
    e)     Then finally we have my1.JAVA, which takes the filename, and it’s contents in the bytes form and scans the file. The reason for this method is we are not storing the file on the filesystem, it is read into the memory and only if it is clean, it is put into the database or else notify the user.
    package com.av;
    import java.io.*;
    public class my1 {
    static int my_return = 0;
    static int a_length = 0;
    * @param fileBytes
    * @param fileName
    * @return
    public static int scanfile(String fileName,byte[] fileBytes) throws IOException {
    String avMode = "SCAN";
    boolean scan = avMode.startsWith("SCAN");
    String avServer = "xxx";--avserver’s ip address
    int avPort = 1344;
    int the_return = 0;
    if (scan) {
    AVClient avc = new AVClient(avServer,avPort,avMode);
    // File file = new File(fileName) ;
    //byte[] fBytes = getBytesFromFile(file);
    the_return = avc.scanfile(fileName, fileBytes);
    if (the_return == -1) {
    return (the_return);
    } else
    {return (the_return);}
    my_return = the_return;
    return (the_return);
    // Returns the contents of the file in a byte array.
    * @param file
    * @return
    * @throws IOException
    public static byte[] getBytesFromFile(File file) throws IOException {
    InputStream is = new FileInputStream(file);
    // Get the size of the file
    long length = file.length();
    // You cannot create an array using a long type.
    // It needs to be an int type.
    // Before converting to an int type, check
    // to ensure that file is not larger than Integer.MAX_VALUE.
    if (length > Integer.MAX_VALUE) {
    // File is too large
    // Create the byte array to hold the data
    byte[] bytes = new byte[(int)length];
    // Read in the bytes
    int offset = 0;
    int numRead = 0;
    while (offset < bytes.length
    && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
    offset += numRead;
    // Ensure all the bytes have been read in
    if (offset < bytes.length) {
    throw new IOException("Could not completely read file "+file.getName());
    // Close the input stream and return bytes
    is.close();
    return bytes;
    // public static void main(String[] args) throws Exception {
    //System.out.println("Hi there in Main");
    // File file = new File() ;
    // byte[] b1 = getBytesFromFile(file);
    //System.out.println(b1);
    // my_return = scanfile(,b1);
    //System.out.println(my_return); }
    Finally , you have the exceptions file,
    e) package com.av;
    public class VirusException
    extends Exception {
    public VirusException() {
    super();
    public VirusException(String text) {
    super(text);
    Once you have all these classes, you can use JDEVELOPER , to load these classes into the database: This is as follows:
    Right click on the project, which has all these classes.
    NEW -> deployment profiles -> load java and stored procedures.
    When you are created deployment profile, you have to specify,
    Loadjava options.
    -f, -v (check the check boxes)
    Under privileges:
    -s – specify database schema these classes are loaded into
    -s – create sysnonym check box
    -g – grant to public or any specific users per your policy.
    Under Resolver,
    -r and –o (check the check boxes)
    I accepted the default name storedproc1. Then you right click on the storedproc1.deploy, deploy to whichever database connection you created.
    And then, In order to access this java class we need a pl/sql wrapper as follows:
    create or replace package my1 is
    function mycheck (pfilename in varchar2, psize in number)
    return number;
    end my1;
    create or replace package body my1 is
         function mycheck (pfilename in varchar2, psize in number)
    return number is
    language java
         name 'com.av.my1.scanfile(java.lang.String, byte[]) return int';
         end my1;
    And the code is invoked from sql plus as follows:
    Select my1.mycheck(“filename”, “filebytes”) from dual;
    One important catch in the above method is to send the filename and filecontents in bytes form. In order to send the file contents as filebytes, you will need another java class and load into the data base as described above.
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    * This program demonstrates how to read a file into a byte array. This method
    * reads the entire contents of the file into a byte array.
    * @version 1.0
    * @author Jeffrey M. Hunter ([email protected])
    * @author http://www.idevelopment.info
    public class ReadFileIntoByteArray {
    * method to convert a byte to a hex string.
    * @param data the byte to convert
    * @return String the converted byte
    public static String byteToHex(byte data) {
    StringBuffer buf = new StringBuffer();
    buf.append(toHexChar((data >>> 4) & 0x0F));
    buf.append(toHexChar(data & 0x0F));
    return buf.toString();
    * Convenience method to convert an int to a hex char.
    * @param i the int to convert
    * @return char the converted char
    public static char toHexChar(int i) {
    if ((0 <= i) && (i <= 9)) {
    return (char) ('0' + i);
    } else {
    return (char) ('a' + (i - 10));
    * Returns the contents of the file in a byte array
    * @param file File this method should read
    * @return byte[] Returns a byte[] array of the contents of the file
    private static byte[] getBytesFromFile(File file) throws IOException {
    InputStream is = new FileInputStream(file);
    System.out.println("\nDEBUG: FileInputStream is " + file);
    // Get the size of the file
    long length = file.length();
    System.out.println("DEBUG: Length of " + file + " is " + length + "\n");
    * You cannot create an array using a long type. It needs to be an int
    * type. Before converting to an int type, check to ensure that file is
    * not loarger than Integer.MAX_VALUE;
    if (length > Integer.MAX_VALUE) {
    System.out.println("File is too large to process");
    return null;
    // Create the byte array to hold the data
    byte[] bytes = new byte[(int)length];
    // Read in the bytes
    int offset = 0;
    int numRead = 0;
    while ( (offset < bytes.length)
    ( (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) ) {
    offset += numRead;
    // Ensure all the bytes have been read in
    if (offset < bytes.length) {
    throw new IOException("Could not completely read file " + file.getName());
    is.close();
    return bytes;
    * @param filename
    public static byte[] chk_file(String filename) {
    byte[] fileArray = null;
    try {
    fileArray = getBytesFromFile(new File( filename));
    } catch (IOException e) {
    e.printStackTrace();
    if (fileArray != null) {
    for (int i=0; i<fileArray.length; i++) {
    System.out.println(
    "fileArray[" + i + "] = " +
    ((int)fileArray[i] < 9 ? " " : "") +
    ( ((int)fileArray[i] > 9 && (int)fileArray[i] <= 99) ? " " : "") +
    fileArray[i] + " : " +
    " HEX=(0x" + byteToHex(fileArray) + ") : " +
    " charValue=(" + (char)fileArray[i] + ")");
    return fileArray;
    * Sole entry point to the class and application.
    * @param args Array of String arguments.
    public static void main(String[] args) {
    byte[] fileArray = null;
    try {
    fileArray = getBytesFromFile(new File("c:\\eicar.com"));
    } catch (IOException e) {
    e.printStackTrace();
    if (fileArray != null) {
    for (int i=0; i<fileArray.length; i++) {
    System.out.println(
    "fileArray[" + i + "] = " +
    ((int)fileArray[i] < 9 ? " " : "") +
    ( ((int)fileArray[i] > 9 && (int)fileArray[i] <= 99) ? " " : "") +
    fileArray[i] + " : " +
    " HEX=(0x" + byteToHex(fileArray[i]) + ") : " +
    " charValue=(" + (char)fileArray[i] + ")");
    Having main method helps you to run the file in JDEVELOPER or using JAVA.
    DO not forget to load this class into the database.
    And you create the pl/sql wrapper again as follows:
    create or replace FUNCTION TOBY (pfilename in varchar2) RETURN VARCHAR2 iS
    language java name
    'ReadFileIntoByteArray.chk_file(java.lang.String) return byte[]';
    And you call the function from sqlplus as follows:
    Sql>Set serveroutput on size 20000;
    Sql> call dbms_java.set_output(20000);
    Sql> Select toby(“filename”) from dual; --
    this file should be accessible, I mean you will not be able to send a file on your pc, from sql plus as sql/plus is running on your db server.
    You will be able to see the output in sql plus:
    If you are running it from the APEX:
    When we use file browser widget from APEX, the file is stored in APEX_APPLICATION_FILES table. And we retrieve that into a variable and pass this variable to the function as follows:
    DECLARE
    scan_failed EXCEPTION;
    x varchar2(400);
    z number;
    BEGIN
    select filename into x from wwv_flow_files where name = :P1_FILE_NAME;
    select my1.mycheck(x,toby(x)) into z from dual;
    if z = 0 then
    :P1_SUBJECT:= 'PASSED';
    else
    :P1_SUBJECT:= 'FAILED';
    end if;
    :P1_SCAN_RESULT := '** Scanning File **';
    IF UPPER(:P1_SUBJECT) = 'PASSED' THEN
    BEGIN
    :P1_SCAN_FLAG := 'PASSED';
    :P1_SCAN_RESULT := :P1_SCAN_RESULT || ' ** File passed scan **';
    END;
    ELSIF UPPER(:P1_SUBJECT) = 'FAILED' THEN
    BEGIN
    :P1_SCAN_FLAG := 'FAILED';
    :P1_SCAN_RESULT := :P1_SCAN_RESULT || ' ** File failed scan **';
    END;
    ELSE
    BEGIN
    :P1_SCAN_FLAG := 'UNKNOWN';
    :P1_SCAN_RESULT := :P1_SCAN_RESULT || ' ** Scan Is Not Conclussive **';
    END;
    END IF;
    --IF :P1_SCAN_FLAG = 'FAILED'
    -- THEN RAISE scan_failed;
    --END IF;
    EXCEPTION
    WHEN OTHERS THEN
    DELETE from APEX_APPLICATION_FILES WHERE name = :P1_FILE_NAME;
    RAISE_APPLICATION_ERROR (-20000, 'seb OTHERS error encountered - file upload not allowed. Possible virus detected !');
    raise;
    END;
    ACKNOWLEDMENTS:
    1) JOHN SCOTT – who suggested this ICAP API in one of the threads which is my initial starting point in this direction.
    2) VLAD KOFMAN who wrote the article on WWW.DEVELOPER.com
    3) Mr. KIRAN –One of the engineers from Metalink, who helped me at every step of getting this java programs and pl/sql wrappers working. But for him, I would have not completed my project.

Maybe you are looking for

  • German smart quotes on English UI

    Hi, I need to write German letters on my MacBook Air, whose language settings are set to English (US). The problem is that even when spell check is set to German, the smart quotes still appear as the should in the English language. I originally was a

  • Can I get Apps for my Ipod version 3.1.3

    Hello I have looked for apps for music like garage band, music recording related, then I thought I would just settle for a Uchre game.  I have a very old ipod version 3.1.3 (7E18) .   Thanks TR@aim4you

  • Can you retrieve purchased items from iTunes if wiped from comp memory?

    My iTunes account was wiped when I changed computers due to last one's logic board dying. Can I retrieve purchased tracks back from iTunes shop. I wasn't able to upload to iCloud before I lost access to comp.

  • PLEASE HELP!!!!! IMAQdx issues

    Hi! I'm trying to use IMAQdx to acquire images from a camera with a firewire connection. The camera shows up fine in MAX and I can grab images etc. But when I try to run a very simple program in Labview just to Snap an image the Error 1074360311 come

  • Kenel panic

    My powerbook g4 12" 1.33Ghz has a kernel panic! jnl: open: journal checksum is bad jnl: open: jhdr start looks bad hfs: late jnl init: Failed to open/create the journal nfs_boot: networking is not initialized panic(cpu caller ...): nfsbootinit failed