# Crossing the Borders: Re-Use of Smart Learning Objects in Advanced Content Access Systems
## 4 Materials and Methods
### Integrating ACOS Visualizations and Exercises into OpenDSA  
While the integration of OpenDSA and CodeWorkout was done using a standard protocol, it was not a complete test of the new approach since both tools were developed in the same institution. To explore our approach accross institutional borders, we moved to integrated ACOS server content into OpenDSA textbooks. The integration of OpenDSA and ACOS became possible because OpenDSA works as both a tool consumer and a tool provider, as explained above.  
OpenDSA acts as a tool provider to Canvas to serve textbooks and within those books, OpenDSA calls other tools such as CodeWorkout to serve various coding exercises. We added ACOS as a new tool within OpenDSA to serve the Python exercises and animated examples for Java and Python. To do so, first we made minor modifications to the OpenDSA external tools script which allows instructors or content developers to add various exercises through external tools in their books. This script is called  
Figure 8: A CodeWorkout exercise embedded within an OpenDSA module, displayed through Canvas.  
Figure 7: OpenDSA New Architecture.  
during the book compilation process if external tools are used and it simply generates an HTML div element with data attributes that store information about the external tool exercise, including the ID assigned to the exercise by OpenDSA. We then added references to Parsons problems, Java animations and Python animations, respectively, into the OpenDSA database as LTI tool providers.  
When an OpenDSA module that contains content from one or more of these tools is loaded in a user's browser, the OpenDSA front-end framework retrieves the ID of the exercise from a data attribute on the exercise's div element. The front-end framework then replaces the div element with an iframe whose target URL points to an endpoint on the OpenDSA server, with the URL containing the ID of the exercise as a parameter. When the iframe is rendered by the browser it results in a GET request being sent to the iframe's target URL. The OpenDSA server receives the request and retrieves the information for the tool associated with the exercise from the database, including the LTI launch URL of the tool. OpenDSA then generates the standard LTI launch request parameters, signs the request with OAuth using the key and secret that were stored with the tool information, then generates an HTML page containing a form with all of the LTI and OAuth parameters as fields. When this page is rendered by the user's browser, a single line of JavaScript automatically submits the form, which results in a POST request being sent to the tool's launch URL. The tool (e.g., ACOS) receives the request and delivers the exercise or animation which is displayed inside an iframe in the OpenDSA module.  
The integration enabled 34 Parsons problems to be be added to various OpenDSA books. These are graded exercises, so when OpenDSA sends a request to ACOS, it expects a score back from it once a student finishes the exercise. These scores are then passed on to Canvas and are shown in the Canvas gradebook. Figure 9 shows an example of a Parsons problem served through Canvas via the OpenDSA eTextbook.  
Figure 10 shows an example of Python function animation served through Canvas via the OpenDSA eTextbook. Currently, 56 Python and 53 Java animations can be added to OpenDSA books.  
Figure 9: A Parsons problem (served by ACOS) made available within an OpenDSA eTextbook, delivered via Canvas.