Code Repository and Standards
OSCAR’s code repository is here on Bitbucket
The production branch is stable
Please make multiple changes into one branch and then submit a pull request to merge that branch into stable (it is easier to see and review the multiple changes that way), and tag Peter H-C as a reviewer.
OSCAR depends on the browser locale to signal which language to serve labels. Thus OSCAR is extensively i18n tagged with keys kept in resource files based on the language. For English we use oscarResources_en.properties to keep the key and its value. Both new and reworked code should avoid English UI labels and instead add values to the English language resource file.
UI Look and Feel
UI we try to keep it consistent with an older Bootstrap. You will note that the blue raised buttons for indicating the primary button class=”btn btn-primary” is a convention used throughout OSCAR to make the interface more intuitive.
Font awesome should be used for icons and they are already in OSCAR
The icons are black and can be styled whatever colour and size you want
Treat them as fonts for CSS
To link Bootstrap and Font awesome in an OSCAR JSP to use, add the following:
<link href="<%=request.getContextPath() %>/css/bootstrap.css" rel="stylesheet" type="text/css"> <link href="<%=request.getContextPath() %>/css/datepicker.css" rel="stylesheet" type="text/css"> <link href="<%=request.getContextPath() %>/css/DT_bootstrap.css" rel="stylesheet" type="text/css"> <link href="<%=request.getContextPath() %>/css/bootstrap-responsive.css" rel="stylesheet" type="text/css"> <link rel="stylesheet" href="<%=request.getContextPath() %>/css/font-awesome.min.css"> <link rel="stylesheet" href="../css/helpdetails.css" type="text/css">
When possible entertain using Data-tables (also embedded in OSCAR) for displaying tabular output.
Don’t assume that the end user of OSCAR is benign or can’t be tricked to save malicious content into the database. Even with the login data is transfered to OSCAR potentially to be displayed (with malicious code being run) when a log file is displayed. You must assume that the database has untrustable content and escape it. OSCAR is using the OWASP library to prevent arbitrary injection.
document.forms.notes.value = "<%= apptObj.getNotes() %>";
Include the library in the JSP and escape the content
<%@page import="org.owasp.encoder.Encode" %> .... document.forms.notes.value = "<%= Encode.forHtmlAttribute(apptObj.getNotes()) %>";
TIP: do this at the last step before it becomes visible in the browser. If you don’t you risk missing bits or double encoding.
Try to compile your code without unit testing to have the stylecheck plugin examine your code. Certain forms and approaches are deprecated (eg Vectors) to ensure consistency.
Everything from Angular to Jquery to Bootstrap to Apache Commons libraries moves through a series of versions. For ease of maintenance please use EXISTING libraries in OSCAR unless they don’t work or are insecure.
Linking Master Record in Developed JSP
TIP: use<%=request.getContextPath() %> to link various items in OSCAR in a developed JSP.
<%=request.getContextPath() %> is the oscar folder: /var/lib/tomcat9/webapps/oscar
Copyright Copy Paste Block for JSP
<%-- Copyright (c) 2001-2002. Department of Family Medicine, McMaster University. All Rights Reserved. This software is published under the GPL GNU General Public License. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. This software was written for the Department of Family Medicine McMaster University Hamilton Ontario, Canada --%>
The database schema has not changed radically from version to version. The following section should document some of the more ‘interesting’ parts of the database. This can be very useful if you are converting from another EMR or older version of Oscar.
Many of the tables are part of the CAISI project. I don’t know if CAISI is still being developed. Most of the CAISI specific tables MUST exist, even if they are empty.
Note: This section is currently (as at May 2022) being slowly updated.
program_id: is a unique number to identify your Oscar site. This is a CAISI feature. Normally, it is 10016, but any value can be used. Use the following query to determine the program_id for your installation.
select id from program where name = 'oscar'
demographic_no is the unique patient/demographic record. It can be defined as
demographiccust: is an optional table for additional demographic info.
cust1 contains the nurse provider_no,
cust2 contains the resident provider_no,
cust3 contains the patient alert,
cust4 contains the midwife provider_no,
content contains the patient note.
demographicExt : uses pairs of
value for additional demographic info.
key_val can be aboriginal, area, cytolNum, demo_cell, EmploymentStatus, ethnicity, fNationCom, given_consent, HasPrimaryCarePhysician, hPhoneExt, informedConsent, paper_chart_archived, paper_chart_archived_date, paper_chart_archived_program, phoneComment, PHU, primaryEMR, privacyConsent, rxInteractionWarningLevel, statusNum, usSigned, wPhoneExt
admission: is a parallel table with demographic. If an admission record is missing, the demographic will ‘disappear’ from the GUI. The client_id is the demographic_no. Note: this table can be truncated and rebuilt from the demographic table. That’s usually easier than finding and adding missing records. Make sure you are using the correct program_id (see ‘Special columns’) ! The example uses a default provider if it does not exist in the provider table.
TRUNCATE TABLE oscar_15.admission ;
INSERT INTO oscar_15.admission
( client_id, program_id, provider_no, admission_date, admission_from_transfer, admission_notes, discharge_from_transfer,
admission_status, team_id, temporary_admission_flag, automatic_discharge, lastUpdateDate )
demographic_no , '10016' , IFNULL(provider_no, '999910') , curdate() , 0 , '', 0 ,
'current', NULL , 0 , 0, curdate()
FROM oscar_15.demographic ORDER BY demographic_no ) ;
document: 1 record per document. Note: There is no demographic_no in this table. See
module = ‘demographic’
ctl_document: links documents to other tables.
module specifies the related table [ demographic / provider ].
module_id is the demographic_no OR provider_no OR 2147483647 (what is that?)
casemgmt_note_link: links an encounter note with a document. The
casemgmt_note_link.table_name specifies the link [1=? / 2=drugs / 3=? / 4=? / 5=documents / 6=eform_data.fdid / 10 =? ]
regional_identifier is defaulted as NULL. It is the medication DIN number. If it is NULL, the screen will crash.