Restrict F4 display-- Standard T-codes

Hello Experts,
We want to restrict display through f4 help.
here is the example of what we want to achieve.
In t-code CRQ3, there are 2 input fields plant and work center.
we want to restrict user from viewing work centers from other plant on which they don't have authorization.
Thanks
Harshavardhan Wankhade

Hi,
You can use a search help exit to put in additional validation.  There is more info here:
http://help.sap.com/erp2005_ehp_04/helpdata/EN/cf/21ee52446011d189700000e8322d00/frameset.htm
Your ABAP team will be able to help with this.

Similar Messages

  • How to restrict values displayed using a select-options

    Can someone please tell me how to restrict values displayed using a select-options.
    Example- in my table I have 100 entries. However when the user will click on the required field- I want to be display only 25 options based on a given value of another field in the table.
    Thanks,
    Mahesh.

    get the screen value for the selectd field  using the fm
    DYNP_VALUES_READ.
    for that value filter the internal table values and pass the table to f4 help of the field.
    below code will help u
    write the f4 help for the field.
    At Selection Screen on value request                                *
    F4 help for Corporate
    AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_CORP.
    Get Corporates for selected division
      PERFORM GET_CORP.
      PERFORM F4HELP_CORP.
    *&      Form  GET_CORP
    Get the corporates for the selected division
    There are no interface parameters to be passed to this routine
    FORM GET_CORP .
    Table for conglomerate
      DATA:
        LT_CONG      LIKE STANDARD TABLE OF FS_CORP,
    Fields of current screen
        LFS_DYNPREAD TYPE DYNPREAD,
    Table for current Screen fields
        LT_DYNPREAD  LIKE STANDARD TABLE OF LFS_DYNPREAD.
      LFS_DYNPREAD-FIELDNAME = 'P_DIV'.
      APPEND LFS_DYNPREAD TO LT_DYNPREAD.
    Get selection screen value for division
      CALL FUNCTION 'DYNP_VALUES_READ'
        EXPORTING
          DYNAME               = SY-REPID
          DYNUMB               = SY-DYNNR
        TABLES
          DYNPFIELDS           = LT_DYNPREAD
        EXCEPTIONS
          INVALID_ABAPWORKAREA = 1
          INVALID_DYNPROFIELD  = 2
          INVALID_DYNPRONAME   = 3
          INVALID_DYNPRONUMMER = 4
          INVALID_REQUEST      = 5
          NO_FIELDDESCRIPTION  = 6
          INVALID_PARAMETER    = 7
          UNDEFIND_ERROR       = 8
          DOUBLE_CONVERSION    = 9
          STEPL_NOT_FOUND      = 10
          OTHERS               = 11.
      IF SY-SUBRC EQ 0.
        READ TABLE LT_DYNPREAD INTO LFS_DYNPREAD INDEX 1.
        IF SY-SUBRC EQ 0.
          P_DIV = LFS_DYNPREAD-FIELDVALUE.
        ENDIF.                             " IF SY-SUBRC EQ 0
      ENDIF.                               " IF SY-SUBRC EQ 0
      REFRESH T_CORP.
    Get the conglomerate for the selected division
      SELECT KUNNR                         " Conglomerate
        FROM KNVH
        INTO TABLE  LT_CONG
       WHERE HITYP  EQ C_HITYP
         AND VKORG  EQ C_VKORG
         AND VTWEG  EQ C_VTWEG
         AND SPART  EQ P_DIV
         AND DATAB  LE SY-DATUM
         AND DATBI  GE SY-DATUM
         AND HKUNNR EQ SPACE.
      IF SY-SUBRC EQ 0.
        SORT LT_CONG BY KUNNR.
        DELETE ADJACENT DUPLICATES FROM LT_CONG
                        COMPARING KUNNR.
    Get the corporates for the selected conglomerates
        SELECT KUNNR                       " Customer Number
          FROM KNVH
          INTO TABLE  T_CORP
           FOR ALL ENTRIES IN LT_CONG
         WHERE HITYP  EQ C_HITYP
           AND VKORG  EQ C_VKORG
           AND VTWEG  EQ C_VTWEG
           AND SPART  EQ P_DIV
           AND DATAB  LE SY-DATUM
           AND DATBI  GE SY-DATUM
           AND HKUNNR EQ LT_CONG-KUNNR.
        IF SY-SUBRC NE 0.
          CLEAR: SSCRFIELDS.
          MESSAGE I531(0U) WITH TEXT-005.
          STOP.
        ENDIF.                             " IF SY-SUBRC NE 0
      ELSE.
        CLEAR: SSCRFIELDS.
        MESSAGE I531(0U) WITH TEXT-004.
        STOP.
      ENDIF.                               " IF SY-SUBRC EQ 0
    ENDFORM.                               " GET_CORP
    *&      Form  F4HELP_CORP
    F4 help for corporate
    There are no interface parameters to be passed to this routine
    FORM F4HELP_CORP .
    F4 help for corporate
      CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
        EXPORTING
          RETFIELD        = 'KUNNR'
          DYNPPROG        = 'Z_EXCESS_USAGE'
          DYNPNR          = '1000'
          DYNPROFIELD     = 'P_CORP'
          VALUE_ORG       = 'S'
        TABLES
          VALUE_TAB       = T_CORP
        EXCEPTIONS
          PARAMETER_ERROR = 1
          NO_VALUES_FOUND = 2
          OTHERS          = 3.
      IF SY-SUBRC EQ 0.
    Do nothing
      ENDIF.                               " IF SY-SUBRC EQ 0
    ENDFORM.                               " F4HELP_CORP

  • Posting limit restriction ( UpTO 10000) for T Code FB60 - for specific GL

    Dear All,
    Posting limit restriction ( UpTO 10000) for T Code FB60 - for specific GL
    Is it Possibal ?
    Any other way to stop Posting Amt more than Rs 10000 ( Ten Thousand)
    In specific T Code FB60
    Required urgent Help,
    Your early reply / solution is expected
    Regards,
    S Kulkarni

    Hi,
    Just go to OB28, define a validation (if you do not use one already), define one step, define the prerequisites on BSEG level of the account and define the check.
    For example, you can use the validation for the following situation: You want to make sure that postings to the expense account "Telephone costs" can only be posted to the services cost center "Telephone". You can carry out the checks needed for this by using the validation.
    Activities
    If you want to define new validations, go through the following activities:
    1. Place the cursor on a line in which company code and callup point are entered (you can enter company code and validation callup point via Edit -> New entries).
    2. Afterwards select Environment -> Validation. You reach the first screen for maintaining a validation.
    3. Select Validation -> Create. Enter the required name. After pressing ENTER, you come to an overview screen of the validation activities belonging to the validation.
    4. Select Insert entry. On the next screen you can describe a new validation activity. You describe the check requirements and the actual check for this. The syntax to be used for this is described in the online help (F1 help) for the input fields for Requirements and Check. You can also define a message (warning or error message) which is sent if the check is not successful.
    If you want to change validations which already exist, proceed as follows:
    1. Place the cursor on an already existing entry and select Goto -> Validation.
    2. On the next screen select Validation -> Display or Validation -> Change. After pressing ENTER, you get to the overview screen of the validation activities belonging to the validation. If you select Insert entry, you can carry out changes if necessary.
    Regards,
    Eli

  • Background job for Standard (T-code F.80) and Background Job via Submit (for same standard program) provides separate spool layout

    Hello Experts,
    I am using SUBMIT Program to execute a standard T-code (F.80).
            SUBMIT sapf080 WITH SELECTION-TABLE rspar
                                         AND RETURN.
    When I execute the program in background and compare it with F.80 and execute it in background too, spool layout for both are different.
    For F.80, It is more detailed with every info like doc number, company code and fiscal year with messages, but for my program only messages are displayed in the spool which is getting unconvinient as I don't know for which document number that message was generated.
    Can you please suggest why am I getting 2 different spool layouts for the same program executed in 2 different ways.
    Thanks,
    Ankit Khanna

    Hello,
    Thanks for your replies.
    I have added a list option along with SUBMIT statement to get similar spool layouts.
    Below piece of code will solve the issue.
              DATA list_tab TYPE TABLE OF abaplist.
            SUBMIT sapf080 WITH SELECTION-TABLE rspar EXPORTING LIST TO MEMORY
                          AND RETURN.
            CALL FUNCTION 'LIST_FROM_MEMORY'
              TABLES
                listobject = list_tab
              EXCEPTIONS
                not_found  = 1
                OTHERS     = 2.
            IF sy-subrc = 0.
              CALL FUNCTION 'WRITE_LIST'
                TABLES
                  listobject = list_tab.
            ENDIF.

  • What is Tcode for display standard order.

    HI all,
    What is Tcode for display standard order.
    thanks

    hi,
    VA03 is the T-code for display of standard sales order.
      ME23n is the T-code for display of purchase order.
    Regards,
    Veeresh

  • To display standard text in purchase requistion item text.

    Hi,
    My requirement is display standard text in purchase requisition item text(text type 02).  Please let me know where should i write the code and what it the code?
    Thanks
    Alka
    Moderator message: please work yourself first on your requirement, if necessary return with specific problems that have not been frequently solved before, remember these forums are not a replacement for ABAP training.
    Edited by: Thomas Zloch on Dec 1, 2010 11:52 AM

    Hi Kiran,
    As you stated its correct that the deletion indicator has to be set only after the document is closed. But your case is different, how did that deletion indicator got set for that "Purchase Requisitions".
    As per my knowledge is that the deletion flag ca be changed, but not the deletion indicator. In case if I get soem thing I will respond to you.
    Also I got this from SAP:
    Set the indicator if you wish to archive documents using the one-step procedure.
    Do not set the indicator if you wish to carry out your archiving using the two-step procedure.
    --Thanks
    Pankaj.K.S

  • Change in Standard T.code

    Hi,
    Can anybody tell me example about changing the standard t.code CO01...
    Like where i can do changes in exists.....
    I tell u wat i do.....
    I find the exits name for this t.code and click on its include....
    Now i change here....in coding.....
    i code in it.......like LOOP AT SCREEN.....
    LOOP AT SCREEN.
    IF SCREEN-NAME = 'SAPLCOMK'.
    SCREEN-INVISIBLE = 0.
    ENDIF.
    MODIFY SCREEN.
    ENDLOOP.
    But it not work.....
    Tell me wat can i write here.........or anywhere...........
    Plz suggest...
    <b>Anil Kumar</b>

    hi Anil
    STATTEXT            Modification exit for formatting status text lines
    CCOWB001            Customer exit for modifying menu entries
    COIB0001            Customer Exit for As-Built Assignment Tool
    COZF0001            Change purchase req. for externally processed operation
    COZF0002            Change purchase req. for externally procured component
    PPCO0001            Application development: PP orders
    PPCO0002            Check exit for setting delete mark / deletion indicator
    PPCO0003            Check exit for order changes from sales order
    PPCO0004            Sort and processing exit: Mass processing orders
    PPCO0005            Storage location/backflushing when order is created
    PPCO0006            Enhancement to specify defaults for fields in order hea
    PPCO0007            Exit when saving production order
    PPCO0008            Enhancement in the adding and changing of components
    PPCO0009            Enhancement in goods movements for prod. process order
    PPCO0010            Enhancement in make-to-order production - Unit of measu
    PPCO0012            Production Order: Display/Change Order Header Data
    PPCO0013            Change priorities of selection crit. for batch determin
    PPCO0015            Additional check for document links from BOMs
    PPCO0016            Additional check for document links from master data
    PPCO0017            Additional check for online processing of document link
    PPCO0018            Check for changes to production order header
    PPCO0019            Checks for changes to order operations
    PPCO0021            Release Control for Automatic Batch Determination
    PPCO0022            Determination of Production Memo
    PPCO0023            Checks Changes to Order Components
    check which one ill suit ur req

  • Last Modified Layout For the Standard  T-code

    Hi,
        Please let me  know last layout modified for any standard T-Code  by which user & Layout Name . . .
    Regards
    ASHOK K

    Hi Ravi,
    I have checked it by creating a transaction variant.
    My requirement is all fields other than storage bin field should be display only.
    if u have any document transaction varient plz send me.
    Thank u
    Nani

  • Restrict Message display

    Hi,
    I have created 5 views and 1 window in my Webdynpro component.
    View Names:
    zView1
    zview2
    zview3
    zview4
    zMainview
    Window Name:
    zmainwindow
    In zmainview i have created 4 viewcontainerUI elements to embed the others views.
    In ZmainWindow i have embedded the zmainview and inside the 4 viewcontainersUI elements i have embedded the 4 views.
    All the 4 views contain messagearea ui elements, so that messages for the corresponding view can be displayed.
    All the 4 views will be visible inside the zmainview. My requirement is if any error message is returned from Function Modules i need to display messages in the corresponing view message area UI element.
    So when reporting error message i am using the view name where the message need to be displayed.
    Eg Code:
    CALL METHOD wd_this->lo_message_manager->report_error_message
              EXPORTING
                message_text = 'Constant data not maintained'
                view         = 'ZVIEW1'.
    I am mentioning the view name in the report_error_message method so that message will be displayed in the corresponing view message area, but the same message is displayed in all the embedded views messagearea.
    zMainView layout:
    Eligibility(Header)
    ViewContinainerUI1(embedded zview1 in the viewcontainer ui element)
    Enrollment(Header)
    ViewContinainerUI2(embedded zview2 in the viewcontainer ui element)
    Education Details(Header)
    ViewContinainerUI3(embedded zview3 in the viewcontainer ui element)
    Job Description(Header)
    ViewContinainerUI4(embedded zview4 in the viewcontainer ui element)
    Help me how to restrict the message from getting displayed in other views.
    Regards,
    Bala Baskaran.S

    >All the 4 views contain messagearea ui elements, so that messages for the corresponding view can be displayed.
    This is not a correct approach.  You should only have one Message Area per Window (even if there are multiple inner views or components).
    From the online help:
    With components that you want to use in several applications you should never use the MessageArea UI element, since each window is allowed to contain only one visible MessageArea at the most.
    http://help.sap.com/saphelp_nw70ehp1/helpdata/en/48/b37974eb5c6200e10000000a421937/frameset.htm

  • Automatic categorization for Standard Industry Codes

    I am trying to build a numbers sheet that will automatically convert standard industry codes from my .qfx files from my online banking into the (text) category these codes represent.
    The .qfx files I download have a cell which categorize each transaction or business into a category which is a 4 digit code. For example supermarkets are 5411. If I could have that code be referenced by another cell in that row which would display that category then I could have my taxes etc. categorized automatically!! The category lists are on various websites, here for example:
    http://www.sec.gov/info/edgar/siccodes.htm
    I would be most grateful for any suggestions.
    Many thanks
    Felix

    Table 'SIC codes' contains the downloaded table of codes.
    In its column D I entered the formula =A
    so that the numerical codes are replicated to be able to use VLOOKUP().
    In table 'main 1', I assumes that you are entering the numerical codes and want to display the linked string.
    In column B, the formula is:
    =VLOOKUP(A,SIC codes :: A:C,3,0)
    In table 'main 2', I assumes that you are entering the text strings and want to display the linked numerical code.
    In column B, the formula is:
    =VLOOKUP(A,SIC codes :: C:D,2,0)
    It's for this late formula that I replicated the column of numeric codes.
    Without that I would be forced to use LOOKUP() which doesn't offer the ability to display the red triangle when there is no exact match.
    All of that is clearly described in the PDF User Guide which every user may reach and download from the menu:
    Help > Numbers User Guide.
    Yvan KOENIG (from FRANCE vendredi 20 février 2009 16:55:51)

  • How to get the last wbs which is displayed  in transaction code cj03?

    Dear Experts,
       I want to get the last wbs which are displayed in  transaction code cj03, i have written below program,but i found it is incorrect. because the sort of wbs  in cj03 is not equal to table prps. the last wbs in cj03  is not equal to table prps.
    who can tell me how to get last wbs which is displayed in cj03?
      SELECT
         PRPS~STUFE
         PRPS~POSID
         PROJ~POST1
         INTO CORRESPONDING FIELDS OF TABLE WA_PRPS_TEMP FROM PRPS INNER JOIN PROJ ON PROJPSPNR = PRPSPSPHI
         WHERE PROJ~PSPID EQ P_PROJECT.
      WA_TLINE = LINES( WA_PRPS_TEMP ).
      READ TABLE WA_PRPS_TEMP INDEX WA_TLINE.
      IF WA_PRPS_TEMP-POSID = P_lastWBS.
        P_LAST = 1
    endif.
    Best Regards,
    Merry

    Hi Merry  ,
      The WBS elements are stored in the table PRPS , so please try using the conversion exit and use the data in internal format then use it in the IF condition.
    Check the FM CONVERSION_EXIT_ABPSN_INPUT and CONVERSION_EXIT_ABPSN_OUTPUT
    Regards,
    Arun

  • Standard T Code to release list of sales orders in 'Delivery Block'

    Dear All,
    Is there any standard transaction code in SAP which provides the facility to release list of sales orders in 'Delivery Block'. (Additional information - List of sales orders in 'Delivery block' is available in V.14,however it does not have release facility).
    For example, VKM3 gives the list of sales orders in 'Credit block' with release facility.On the same lines, is there any standard T code or any other facility in standard SAP which provides the facility to release list of sales orders in 'Delivery Block'.
    Thanks and Regards,
    Zahid

    As already suggested, if you execute VA14L you can see all sale orders that are blocked at
    -  header level
    -  item level
    -  credit check
    Wherever you see "X" under the tab Header level, double click on the respective sale order, so that system will take you to sale order in change mode.  You can remove the header level delivery block and save.
    thanks
    G. Lakshmipathi

  • How to know where the user exits or enhancement used in standard sap code?

    Hi
    I m pretty new to abap.
    How can I know where the user exits or enhancement used in standard sap code?
    As i have to add some functionality to the standard sap code. I m looking to search the enhancement or user exits used in this standard code wher i can add my functionality.
    thanks in advance.
    Moderator message : Search for available information, thread locked.
    Edited by: Vinod Kumar on Oct 19, 2011 2:38 PM

    Hi Henry,
    I don't think this is the easiest way to look at the code around a particular field on the screen. Debugging standard programs also can be very tedious, if not impossbile. So, instead of this question, I would like to find out exactly what you want to do if you know the code.
    If you are in a transaction and you want to know where the code of a particular field is, the fastest way to get to it is by pressing the F1 key on the field and then press the Technical info button on the help screen. In here you will typically see the same kind of information but it is very specific to the field you selected.
    PROGRAM(SCREEN) tells you which program is manipulating the main screen, in which your field is embedded. Remember your field may be included in a sub-screen and that subscreen may be the one included in the main screen.
    PROGRAM(SUB SCREEN) tells you which program is directly responsible for the field on the subscreen it is included in. This is where you should find the code most appropriate for the field, but not necessarily.
    PROGRAM(GUI) controls how your push buttons and the menu options in the screen behave and controlled.
    Srinivas

  • How to restrict the display of report variants

    Hello All,
    I want t know how to restrict the display of report variants.
    I mean, when a user saves a variant for his/her purpuse on some report program, only he/she can refer the variant while other users cannot.
    I know that by setting the attribute of the variant ("Protect Variant ", "Only Display in Catalog"), this would be possible, but I want to know another way, without this setting.
    Thank you for your help in advance.
    Regards,

    Hi,
    Can you just try this
    DATA:it_varid TYPE TABLE OF varid.
    DATA:wa_varid TYPE varid.
    INITIALIZATION.
      SELECT * FROM varid INTO TABLE it_varid
          WHERE report = sy-repid
          and ename = sy-uname.
      IF sy-subrc = 0.
        LOOP AT it_varid INTO wa_varid .
          CALL FUNCTION 'RS_SUPPORT_SELECTIONS'
            EXPORTING
              report               = sy-repid
              variant              = wa_varid-variant
            EXCEPTIONS
              variant_not_existent = 1
              variant_obsolete     = 2
              OTHERS               = 3.
          IF sy-subrc <> 0.
            MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
          ENDIF.
        ENDLOOP.
      ENDIF.

  • How to display the source code for this friggin' file.

    Below is a rather lengthy bit of code that provides the behavior and attributes of a web server for OpenCyc. I need to know if I can enter some java to have the HTML source code displayed in a separate text file whenever this class returns some resulting webpage. If you have any ideas it will be greatly appreciated.
    -"Will code for foo."
    package org.opencyc.webserver;
    * Class WebServer is simple multithreaded HTTP server
    * with CGI limited to a Cyc connection on default port 3600.
    * <p>
    import java.net.*;
    import java.io.*;
    import java.util.*;
    import java.util.jar.*;
    import java.text.*;
    import org.opencyc.util.*;
    public class WebServer extends Thread {
         * Singleton WebServer instance.
        public static WebServer current;
         * Default HTTP port.
        protected static int DEFAULT_PORT = 80;
         * Default Cyc base port.
        protected static int DEFAULT_CYC_PORT = 3600;
         * Default directory to serve files from on non-Windows OS.
        protected static String DEFAULT_DIR = "/";
         * Default directory to serve files from on Windows.
        //protected static String DEFAULT_WIN_DIR = "C:\\";
        protected static String DEFAULT_WIN_DIR = "k:\\opencyc\\run\\httpd\\htdocs";
         * File cache capacity.
        protected static final int CACHE_CAPACITY = 100;
         * File cache to improve file serving performance.
        protected static Hashtable fileCache = new Hashtable(CACHE_CAPACITY);
         * Number of files served from this web server.
        protected static long nbrFilesServed = 0;
         * Number of files served from this web server that were found in the cache.
        protected static long nbrCacheHits = 0;
         * Server socket for accepting connections.
        protected ServerSocket server;
         * Directories to serve files from.
        protected ArrayList dirs;
         * Map from String (jar root) to JarFile[] (jar class path).
        protected HashMap map;
         * Webserver HTTP port.
        protected int port;
         * Cyc HTML host.
        protected String cycHost = "localhost";
         * Cyc HTML port.
        protected int cycPort;
         * Expand jar tress.
        protected boolean trees;
         * Requests flag.
        protected boolean traceRequests;
         * Constructs a WebServer object.
         * @param port the port to use
         * @param directories the directory to serve files from
         * @param trees true if files within jar files should be served up
         * @param traceRequests true if client's request text should be logged.
         * @exception IOException if the listening socket cannot be opened, or problem opening jar files.
        public WebServer() throws IOException {
            getProperties();
            server = new ServerSocket(port);
            processDirectories();
         * Class Task processes a single HTTP request.
        protected class Task extends Thread {
             * Socket for the incoming request.
            protected Socket sock;
             * Client socket to the Cyc KB HTML server.
            protected Socket cycHtmlSocket;
             * Output tcp stream.
            protected DataOutputStream out;
             * Contains the file request path for a not-found error message.
            protected String notFoundPath;
             * Contains the first line of a request message.
            protected String methodLine;
             * Contains the body of a POST method.
            protected String bodyLine;
             * Constructs a Task object.
             * @param sock the socket assigned for this request.
            public Task(Socket sock) {
                this.sock = sock;
             * Processes the HTTP request.
            public void run() {
                if (traceRequests)
                    Log.current.println("connection accepted from " + sock.getInetAddress());
                notFoundPath = "";
                try {
                    out = new DataOutputStream(sock.getOutputStream());
                    try {
                        getBytes();
                    catch (Exception e) {
                        Log.current.println("file not found: " + notFoundPath);
                        try {
                            out.writeBytes("HTTP/1.1 404 Not Found\r\n");
                            out.writeBytes("Server: Cyc WebServer\r\n");
                            out.writeBytes("Connection: close\r\n");
                            out.writeBytes("Content-Type: text/html\r\n\r\n");
                            out.writeBytes("<HTML><HEAD>\n");
                            out.writeBytes("<TITLE>404 Not Found</TITLE>\n");
                            out.writeBytes("</HEAD><BODY>\n");
                            out.writeBytes("<H1>404 - Not Found</H1>\n");
                            out.writeBytes("</BODY></HTML>");
                            out.flush();
                        catch (SocketException se) {
                catch (Exception e) {
                    Log.current.printStackTrace(e);
                finally {
                    try {
                        sock.close();
                    catch (IOException e) {
             * Reads the HTTP request and obtains the response.
             * @exception IOException when HTTP request has an invalid format.
            private void getBytes() throws IOException {
                // Below logic is complex because web browsers do not close the
                // socket after sending the request, so must parse message to find
                // the end.
                BufferedReader in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
                ArrayList inBytes = new ArrayList(200);
                int ch = 0;
                boolean postMethod;
                methodLine = in.readLine();
                //if (traceRequests)
                //    Log.current.println("methodLine=" + methodLine);
                bodyLine = "";
                if (methodLine.startsWith("POST /"))
                    postMethod = true;
                else
                    postMethod = false;
                //if (traceRequests)
                //    Log.current.println("postMethod=" + postMethod);
                int ch1 = -1;
                int ch2 = -1;
                int ch3 = -1;
                int ch4 = -1;
                // Read the HTTP request headers.
                while (true) {
                    ch = in.read();
                    inBytes.add(new Integer(ch));
                    ch1 = ch2;
                    ch2 = ch3;
                    ch3 = ch4;
                    ch4 = ch;
                    if (ch1 == '\r' && ch2 == '\n' && ch3 == '\r' && ch4 == '\n')
                        break;
                    if ((! postMethod) &&
                        (! in.ready()) &&
                        ch1 == -1 &&
                        ch2 == -1 &&
                        ch3 == '\r' &&
                        ch4 == '\n') {
                        inBytes.add(new Integer('\r'));
                        inBytes.add(new Integer('\n'));
                        break;
                byte[] byteArray = new byte[inBytes.size()];
                for (int i = 0; i < inBytes.size(); i++) {
                    Integer ich = (Integer) inBytes.get(i);
                    byteArray[i] = ich.byteValue();
                String headers = new String(byteArray);
                if (postMethod) {
                    String lcHeaders = headers.toLowerCase();
                    int i = lcHeaders.indexOf("content-length: ");
                    String contentLength = lcHeaders.substring(i + 16);
                    int j = contentLength.indexOf("\r\n");
                    contentLength = contentLength.substring(0, j);
                    int bodyLen = (new Integer(contentLength)).intValue();
                    for (int k = 0; k < bodyLen; k++) {
                        bodyLine = bodyLine + (new Character((char) in.read())).toString();
                String line = methodLine + "\r\n" + headers + bodyLine;
                if (traceRequests)
                    Log.current.println(line);
                if (postMethod)
                    processHttpPost();
                else
                    if (line.startsWith("GET /"))
                        processHttpGet(line.substring(4));
                    else {
                        Log.current.println("Invalid request = " + line);
                        throw new IOException();
             * Processes an HTTP GET method.
             * @param httpGetPath the path of the file to get.
             * @exception IOException if the file is not found.
            private void processHttpGet(String httpGetPath) throws IOException {
                int i = httpGetPath.indexOf(' ');
                if (i > 0)
                    httpGetPath = httpGetPath.substring(0, i);
                Log.current.println(methodLine + " from " + sock.getInetAddress().getHostName());
                i = httpGetPath.indexOf("cg?");
                if (i > 0) {
                    cycHtmlRequest(httpGetPath.substring(i + 3));
                    return;
                notFoundPath = httpGetPath;
                i = httpGetPath.indexOf('/');
                if (i < 0 || map == null) {
                    if (map == null || httpGetPath.endsWith(".jar")) {
                        for (int j = 0; j < dirs.size(); j++) {
                            String dir = (String) dirs.get(j);
                            String nativePath = dir + httpGetPath;
                            nativePath = nativePath.replace('/', File.separatorChar);
                            if (fileCache.containsKey(nativePath)) {
                                writeDataBytes((byte[]) fileCache.get(nativePath));
                                Log.current.println("...cached");
                                nbrCacheHits++;
                                nbrFilesServed++;
                                return;
                            try {
                                File f = new File(nativePath);
                                byte[] fileBytes = getBytes(new FileInputStream(f), f.length());
                                writeDataBytes(fileBytes);
                                if (fileCache.size() >= CACHE_CAPACITY)
                                    fileCache.clear();
                                fileCache.put(nativePath, fileBytes);
                                Log.current.println("...from " + nativePath);
                                nbrFilesServed++;
                                return;
                            catch (IOException e) {
                    throw new IOException();
                String jar = httpGetPath.substring(0, i);
                httpGetPath = httpGetPath.substring(i + 1);
                JarFile[] jfs = (JarFile[]) map.get(jar);
                if (jfs == null)
                    throw new IOException();
                for (i = 0; i < jfs.length; i++) {
                    JarEntry je = jfs.getJarEntry(httpGetPath);
    if (je == null)
    continue;
    writeDataBytes(getBytes(jfs[i].getInputStream(je), je.getSize()));
    nbrFilesServed++;
    return;
    throw new IOException();
    * Processes an HTTP POST method.
    * @exception IOException if the file is not found.
    private void processHttpPost() throws IOException {
    Log.current.println("POST " + bodyLine + " from " + sock.getInetAddress().getHostName());
    cycHtmlRequest(bodyLine);
    * Reads the specified number of bytes and always close the stream.
    * @param in the file to be read for subsequent downloading.
    * @param length the number of bytes to read from the file.
    * @return An array of bytes from the file.
    * @exception IOException if an error occurs when processing the file.
    private byte[] getBytes(InputStream in, long length) throws IOException {
    DataInputStream din = new DataInputStream(in);
    byte[] bytes = new byte[ (int) length];
    try {
    din.readFully(bytes);
    finally {
    din.close();
    return bytes;
    * Sends the HTML request to Cyc.
    * @param cycPath the portion of the URL which is given to the Cyc HTML server.
    private void cycHtmlRequest(String cycPath) {
    String request = sock.getInetAddress().getHostName() + "&" + cycPath + "#";
    System.out.println("request=" + request);
    ArrayList bytes = new ArrayList(10000);
    try {
    cycHtmlSocket = new Socket(cycHost, cycPort);
    System.out.println("cycHost=" + cycHost + " cycPort=" + cycPort);
    BufferedReader cycIn = new BufferedReader(new InputStreamReader(cycHtmlSocket.getInputStream()));
    PrintWriter cycOut = new PrintWriter(cycHtmlSocket.getOutputStream(), true);
    cycOut.println(request);
    cycOut.flush();
    int ch = 0;
    while (ch >= 0) {
    ch = cycIn.read();
    bytes.add(new Integer(ch));
    catch (Exception e) {
    Log.current.printStackTrace(e);
    byte[] byteArray = new byte[bytes.size()];
    for (int i = 0; i < bytes.size() - 1; i++) {
    Integer ich = (Integer) bytes.get(i);
    byteArray[i] = ich.byteValue();
    try {
    writeTextBytes(byteArray);
    catch (Exception e) {
    Log.current.println(e.getMessage());
    * Responds to the HTTP client with data content from the requested URL.
    * @param bytes the array of bytes from the URL.
    * @exception IOException if there is an error writing to the HTTP client.
    public void writeDataBytes(byte[] bytes) throws IOException {
    out.writeBytes("HTTP/1.1 200 OK\r\n");
    out.writeBytes("Server: Cyc WebServer\r\n");
    out.writeBytes("Connection: close\r\n");
    out.writeBytes("Content-Length: " + bytes.length + "\r\n");
    String prefix = (new String(bytes)).toLowerCase();
    if (prefix.indexOf("<html>") > -1)
    out.writeBytes("Content-Type: text/html\r\n\r\n");
    else
    out.writeBytes("Content-Type: application/java\r\n\r\n");
    out.write(bytes);
    out.flush();
    * Respond to the HTTP client with text content from the requested URL.
    * @param bytes the array of bytes from the URL.
    * @exception IOException if there is an error writing to the HTTP client.
    public void writeTextBytes(byte[] bytes) throws IOException {
    out.writeBytes("HTTP/1.1 200 OK\r\n");
    out.writeBytes("Server: Cyc WebServer\r\n");
    out.writeBytes("Connection: close\r\n");
    out.writeBytes("Content-Length: " + bytes.length + "\r\n");
    out.writeBytes("Content-Type: text/html\r\n\r\n");
    out.write(bytes);
    out.flush();
    * Gets properties governing the web server's behavior.
    private void getProperties() {
    port = DEFAULT_PORT;
    String portProperty = System.getProperty("org.opencyc.webserver.port", "");
    if (! portProperty.equalsIgnoreCase(""))
    port = (new Integer(portProperty)).intValue();
    Log.current.println("Listening on port " + port);
    cycPort = DEFAULT_CYC_PORT;
    String cycPortProperty = System.getProperty("org.opencyc.webserver.cycPort", "");
    if (! cycPortProperty.equalsIgnoreCase(""))
    cycPort = (new Integer(cycPortProperty)).intValue();
    Log.current.println("Cyc connections directed to port " + cycPort);
    String dirsProperty = System.getProperty("org.opencyc.webserver.dirs", "");
    dirs = new ArrayList(3);
    StringTokenizer st = new StringTokenizer(dirsProperty, ";", false);
    while (st.hasMoreTokens()) {
    String dir = st.nextToken();
    dirs.add(dir);
    trees = false;
    String treesProperty = System.getProperty("org.opencyc.webserver.trees", "");
    if (! treesProperty.equalsIgnoreCase(""))
    trees = true;
    traceRequests = false;
    String traceRequestsProperty = System.getProperty("org.opencyc.webserver.traceRequests", "");
    if (! traceRequestsProperty.equalsIgnoreCase("")) {
    traceRequests = true;
    Log.current.println("tracing requests");
    * Adds transitive Class-Path jars to jfs.
    * @param jar the jar file
    * @param jfs the list of jar files to serve.
    * @param dir the jar file directory.
    * @exception IOException if an I/O error has occurred with the jar file.
    private void addJar(String jar, ArrayList jfs, String dir) throws IOException {
    Log.current.println("Serving jar files from: " + dir + jar);
    JarFile jf = new JarFile(dir + jar);
    jfs.add(jf);
    Manifest man = jf.getManifest();
    if (man == null)
    return;
    Attributes attrs = man.getMainAttributes();
    if (attrs == null)
    return;
    String val = attrs.getValue(Attributes.Name.CLASS_PATH);
    if (val == null)
    return;
    dir = dir + jar.substring(0, jar.lastIndexOf(File.separatorChar) + 1);
    StringTokenizer st = new StringTokenizer(val);
    while (st.hasMoreTokens()) {
    addJar(st.nextToken().replace('/', File.separatorChar), jfs, dir);
    * Administrative accessor method that obtains list of directories from which files are served.
    public ArrayList getDirs() {
    return dirs;
    * Administrative method that updates the list of directories from which files are served.
    public synchronized void setDirs(ArrayList dirs) throws IOException {
    this.dirs = dirs;
    fileCache.clear();
    processDirectories();
    * Administrative accessor method that obtains number of files served.
    * @return The number of files served.
    public long getNbrFilesServed() {
    return nbrFilesServed;
    * Administrative accessor method that obtains number of files served from cache.
    * @return The number of files served from the cache.
    public long getNbrCacheHits() {
    return nbrCacheHits;
    * Administrative method that clears the file cache.
    public synchronized void clearFileCache() {
    Log.current.println("Clearing file cache");
    fileCache.clear();
    nbrFilesServed = 0;
    nbrCacheHits = 0;
    * Processes the directories from which files are served, expanding jar trees if
    * directed.
    * @exception IOException if problem occurs while processing the jar files.
    private void processDirectories() throws IOException {
    if (dirs.size() == 0)
    if (File.separatorChar == '\\')
    dirs.add(DEFAULT_WIN_DIR);
    else
    dirs.add(DEFAULT_DIR);
    Iterator directories = dirs.iterator();
    while (directories.hasNext())
    Log.current.println("Serving from " + directories.next());
    if (trees) {
    map = new HashMap();
    for (int j = 0; j < dirs.size(); j++) {
    String dir = (String) dirs.get(j);
    String[] files = new File(dir).list();
    for (int i = 0; i < files.length; i++) {
    String jar = files[i];
    if (!jar.endsWith(".jar"))
    continue;
    ArrayList jfs = new ArrayList(1);
    addJar(jar, jfs, dir);
    map.put(jar.substring(0, jar.length() - 4), jfs.toArray(new JarFile[jfs.size()]));
    * Provides the command line interface for creating an HTTP server.
    * The properties are:
    * <pre>
    * org.opencyc.webserver.port=<HTTP listening port>
    * </pre>
    * which defaults to 80.
    * <pre>
    * org.opencyc.webserver.cycPort=<Cyc connection port>
    * </pre>
    * which defaults to 3600.
    * <pre>
    * org.opencyc.webserver.dirs=<path>;<path> ... ;<path>
    * </pre>
    * with the argument enclosed in quotes if any path contains an
    * embedded space.
    * The default directory on Windows is C:
    * and the default on other systems is / the default
    * can be overridden with this property. By default, all files
    * under this directory (including all subdirectories) are served
    * up via HTTP. If the pathname of a file is <var>path</var> relative
    * to the top-level directory, then the file can be downloaded using
    * the URL
    * <pre>
    * http://<var>host</var>:<var>port</var>/<var>path</var>
    * </pre>
    * Caching of file contents is performed.
    * <pre>
    * org.opencyc.util.log=all
    * </pre>
    * If the all value is given, then all attempts to download files
    * are output.
    * <pre>
    * org.opencyc.webserver.traceRequests
    * </pre>
    * If this property has any value, then the client HTTP requests are
    * output.<p>
    * <pre>
    * org.opencyc.webserver.trees
    * </pre>
    * This property can be used to serve up individual files stored
    * within jar files in addition to the files that are served up by
    * default. If the property has any value, the server finds all jar files
    * in the top-level directory (not in subdirectories). For each
    * jar file, if the name of the jar file is <var>name</var>.jar, then any
    * individual file named <var>file</var> within that jar file (or within
    * the jar or zip files referenced transitively in the Class-Path manifest
    * attribute, can be downloaded using a URL of the form:
    * <pre>
    * http://<var>host</var>:<var>port</var>/<var>name</var>/<var>file</var>
    * </pre>
    * When this property has any value, an open file descriptor and cached
    * information are held for each jar file, for the life of the process.
    * @param args an unused array of command line arguments.
    public static void main(String[] args) {
    Log.makeLog();
    System.out.println("OpenCyc Web Server");
    try {
    // Launch thread to accept HTTP connections.
    current = new WebServer();
    current.start();
    catch (IOException e) {
    e.printStackTrace();
    * Just keep looping, spawning a new thread for each incoming request.
    public void run() {
    try {
    while (true) {
    // Launch thread to process one HTTP request.
    new Task(server.accept()).start();
    catch (IOException e) {
    e.printStackTrace();

    JLundan,
    I want to thank you for responding to the thread I started on the forum at java.sun.com. Your solution to my problem of needing to print the code of the html pages that the file I included generates was just what I was looking for. However, I have some further questions to ask, if you don't mind. To clarify my task I should say that your rephrasing of the problem is accurate: "You wan't to display the contents of the HTML file that the web server produces in response of client's request?"
    Yes, this is what I need to do, but also it needs to display the source code of that html file that the server produces in response to the client's request. Also, in this case, I am the client requesting that the server return some html file, and I'm not sure where the server is. But the webserver.java file that I shared on the forum is on my local machine. I was wondering if I could modify this webserver.java file at my home so that any html file the server returns to me would automatically display the source code. This is a school project of mine and I am stuck on this one thing here.
    Further, where would I put the "foo.html" file so it can be written to?
    FileOuputStream fos = new FileOutputStream("foo.html");
    fos.write(bytes);
    fos.close();
    Thanks so much for your help. I look forward to your response, at your convenience.
    Regards

Maybe you are looking for