Updated bbb-lti to fix issues with grails 2.3.6

This commit is contained in:
Jesus Federico 2014-08-28 10:13:40 -04:00
parent 1d26b39ed5
commit 6f9fbe9f0f
17 changed files with 440 additions and 431 deletions

View File

@ -1,85 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src/java"/>
<classpathentry kind="src" path="src/groovy"/>
<classpathentry kind="src" path="grails-app/conf"/>
<classpathentry kind="src" path="grails-app/controllers"/>
<classpathentry kind="src" path="grails-app/domain"/>
<classpathentry kind="src" path="grails-app/services"/>
<classpathentry kind="src" path="grails-app/taglib"/>
<classpathentry kind="src" path="test/integration"/>
<classpathentry kind="src" path="test/unit"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="var" path="GRAILS_HOME/ant/lib/ant.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/commons-el-1.0.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/spring-test-2.5.6.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/oro-2.0.8.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/log4j-1.2.15.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/jsr107cache-1.0.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/commons-fileupload-1.2.1.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/ant-trax.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/commons-collections-3.2.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/commons-lang-2.4.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/spring-webmvc-2.5.6.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/hsqldb-1.8.0.5.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/ant-1.7.0.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/jcl-over-slf4j-1.5.6.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/backport-util-concurrent-3.0.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/jasper-compiler-5.5.15.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/commons-validator-1.3.0.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/jsp-api-2.0.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/jetty-naming-6.1.14.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/jetty-util-6.1.14.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/slf4j-api-1.5.6.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/start.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/servlet-api-2.5-6.1.14.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/ognl-2.6.9.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/commons-dbcp-1.2.1.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/cglib-nodep-2.1_3.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/jline-0.9.91.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/jasper-compiler-jdt-5.5.15.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/standard-2.4.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/org.springframework.binding-2.0.3.RELEASE.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/standard-2.3.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/ejb3-persistence-3.3.0.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/commons-io-1.4.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/jetty-6.1.14.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/spring-2.5.6.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/jstl-2.3.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/jetty-plus-6.1.14.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/jstl-2.4.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/xpp3_min-1.1.3.4.O.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/commons-codec-1.3.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/commons-pool-1.2.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/sitemesh-2.4.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/org.springframework.webflow-2.0.3.RELEASE.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/junit-3.8.2.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/commons-beanutils-1.7.0.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/oscache-2.4.1.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/jta-1.1.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/ehcache-1.5.0.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/serializer.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/ant-nodeps-1.7.0.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/groovy-all-1.6.3.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/gant_groovy1.6-1.6.0.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/svnkit-1.2.0.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/slf4j-log4j12-1.5.6.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/jsp-api-2.1.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/jasper-runtime-5.5.15.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/ant-junit-1.7.0.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/ant-launcher-1.7.0.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/commons-cli-1.0.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/ivy-2.0.0.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/antlr-2.7.6.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/lib/org.springframework.js-2.0.3.RELEASE.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/dist/grails-scripts-1.1.1.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/dist/grails-gorm-1.1.1.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/dist/grails-webflow-1.1.1.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/dist/grails-bootstrap-1.1.1.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/dist/grails-resources-1.1.1.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/dist/grails-crud-1.1.1.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/dist/grails-core-1.1.1.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/dist/grails-spring-1.1.1.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/dist/grails-web-1.1.1.jar"/>
<classpathentry kind="var" path="GRAILS_HOME/dist/grails-test-1.1.1.jar"/>
</classpath>

View File

@ -1,5 +1,5 @@
#Grails Metadata file
#Thu Mar 20 10:48:08 PDT 2014
#Wed Aug 27 13:06:23 PDT 2014
app.grails.version=2.3.6
app.name=lti
app.version=0.1.2
app.version=0.2

View File

@ -15,7 +15,6 @@
You should have received a copy of the GNU Lesser General Public License along
with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
*/
modules = {
application {
resource url:'js/application.js'

View File

@ -15,8 +15,7 @@
You should have received a copy of the GNU Lesser General Public License along
with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
*/
grails.servlet.version = "3.0"
grails.servlet.version = "3.0" // Change depending on target container compliance (2.5 or 3.0)
grails.project.class.dir = "target/classes"
grails.project.test.class.dir = "target/test-classes"
grails.project.test.reports.dir = "target/test-reports"
@ -26,48 +25,76 @@ grails.project.source.level = 1.6
//grails.project.war.file = "target/${appName}-${appVersion}.war"
grails.project.fork = [
// configure settings for compilation JVM, note that if you alter the Groovy version forked compilation is required
// compile: [maxMemory: 256, minMemory: 64, debug: false, maxPerm: 256, daemon:true],
// configure settings for the test-app JVM, uses the daemon by default
test: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, daemon:true],
// configure settings for the run-app JVM
run: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, forkReserve:false],
// configure settings for the run-war JVM
war: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, forkReserve:false],
// configure settings for the Console UI JVM
console: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256]
]
grails.project.dependency.resolver = "maven" // or ivy
grails.project.dependency.resolution = {
// inherit Grails' default dependencies
inherits("global") {
// specify dependency exclusions here; for example, uncomment this to disable ehcache:
// excludes 'ehcache'
}
log "error"
checksums true
legacyResolve false
log "error" // log level of Ivy resolver, either 'error', 'warn', 'info', 'debug' or 'verbose'
checksums true // Whether to verify checksums on resolve
legacyResolve false // whether to do a secondary resolve on plugin installation, not advised and here for backwards compatibility
repositories {
inherits true
inherits true // Whether to inherit repository definitions from plugins
grailsPlugins()
grailsHome()
mavenLocal()
grailsCentral()
mavenCentral()
mavenRepo "http://snapshots.repository.codehaus.org"
mavenRepo "http://repository.codehaus.org"
mavenRepo "http://download.java.net/maven/2/"
mavenRepo "http://repository.jboss.com/maven2/"
//mavenRepo "https://raw.github.com/blindsidenetworks/oauth/mvn-repo/"
// uncomment these (or add new ones) to enable remote dependency resolution from public Maven repositories
//mavenRepo "http://repository.codehaus.org"
//mavenRepo "http://download.java.net/maven/2/"
//mavenRepo "http://repository.jboss.com/maven2/"
}
dependencies {
//runtime "commons-net:commons-net:3.0.1"
//runtime "net.oauth:oauth:1.0.1"
// specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes e.g.
// runtime 'mysql:mysql-connector-java:5.1.27'
// runtime 'org.postgresql:postgresql:9.3-1100-jdbc41'
}
plugins {
// plugins for the build system only
build ":tomcat:7.0.50.1"
// plugins for the compile step
compile ":scaffolding:2.0.2"
compile ':cache:1.1.1'
// plugins needed at runtime but not for compilation
runtime ":hibernate:3.6.10.8" // or ":hibernate4:4.3.1.1"
runtime ":database-migration:1.3.8"
runtime ":jquery:1.11.0"
runtime ":resources:1.2.1"
// Uncomment these (or add new ones) to enable additional resources capabilities
//runtime ":zipped-resources:1.0.1"
//runtime ":cached-resources:1.1"
//runtime ":yui-minify-resources:0.1.5"
runtime ':twitter-bootstrap:3.1.1'
// An alternative to the default resources plugin is the asset-pipeline plugin
//compile ":asset-pipeline:1.5.0"
// Uncomment these to enable additional asset-pipeline capabilities
//compile ":sass-asset-pipeline:1.5.1"
//compile ":less-asset-pipeline:1.5.0"
//compile ":coffee-asset-pipeline:1.5.0"
//compile ":handlebars-asset-pipeline:1.0.0.3"
}
}

View File

@ -32,8 +32,6 @@ grails.config.locations = [ "classpath:lti.properties"]
grails.project.groupId = appName // change this to alter the default package name and Maven publishing destination
grails.mime.file.extensions = true // enables the parsing of file extensions from URLs into the request format
grails.mime.use.accept.header = false
// The ACCEPT header will not be used for content negotiation for user agents containing the following strings (defaults to the 4 major rendering engines)
grails.mime.disable.accept.header.userAgents = ['Gecko', 'WebKit', 'Presto', 'Trident']
grails.mime.types = [ // the first one is the default format
@ -110,17 +108,17 @@ environments {
}
production {
grails.logging.jul.usebridge = false
// TODO: grails.serverURL = "http://www.changeme.com"
}
}
// log4j configuration
log4j = {
appenders {
rollingFile name:"logfile", maxFileSize:1000000, file:"/var/log/bigbluebutton/bbb-lti.log", layout:pattern(conversionPattern: '%d{[dd.MM.yy HH:mm:ss.SSS]} %-5p %c %x - %m%n')
console name:'console', layout:pattern(conversionPattern: '%d{[dd.MM.yy HH:mm:ss.SSS]} %-5p %c %x - %m%n')
'null' name:'stacktrace'
}
debug logfile:"grails.app"
// Example of changing the log pattern for the default console appender:
//
//appenders {
// console name:'stdout', layout:pattern(conversionPattern: '%c{2} %m%n')
//}
error 'org.codehaus.groovy.grails.web.servlet', // controllers
'org.codehaus.groovy.grails.web.pages', // GSP
@ -133,7 +131,4 @@ log4j = {
'org.springframework',
'org.hibernate',
'net.sf.ehcache.hibernate'
warn 'org.mortbay.log'
}

View File

@ -15,7 +15,6 @@
You should have received a copy of the GNU Lesser General Public License along
with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
*/
dataSource {
pooled = true
jmxExport = true

View File

@ -15,11 +15,10 @@
You should have received a copy of the GNU Lesser General Public License along
with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
*/
class UrlMappings {
static mappings = {
"/$controller/$action?/$id"{
"/$controller/$action?/$id?(.$format)?"{
constraints {
// apply constraints here
}

View File

@ -21,8 +21,10 @@
# BigBlueButton integration information
#----------------------------------------------------
# This URL is where the BBB client is accessible.
#bigbluebuttonURL=http://test-install.blindsidenetworks.com/bigbluebutton
bigbluebuttonURL=http://localhost/bigbluebutton
# Salt which is used by 3rd-party apps to authenticate api calls
#bigbluebuttonSalt=8cd8ef52e8e101574e400365b55e11a6
bigbluebuttonSalt=bbb_salt
# LTI basic information

View File

@ -15,6 +15,7 @@
You should have received a copy of the GNU Lesser General Public License along
with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
*/
package org.bigbluebutton
import java.util.ArrayList
import java.util.HashMap
@ -29,9 +30,6 @@ import net.oauth.signature.OAuthSignatureMethod
import net.oauth.signature.HMAC_SHA1
import org.bigbluebutton.lti.Parameter
import BigbluebuttonService
import LtiService
class ToolController {
private static final String CONTROLLER_NAME = 'ToolController'
private static final String RESP_CODE_SUCCESS = 'SUCCESS'
@ -41,7 +39,12 @@ class ToolController {
LtiService ltiService
BigbluebuttonService bigbluebuttonService
def index = {
def test() {
ltiService.logParameters(params)
render(text: "<xml></xml>", contentType: "text/xml", encoding: "UTF-8")
}
def index() {
if( ltiService.consumerMap == null) ltiService.initConsumerMap()
log.debug CONTROLLER_NAME + "#index"
@ -121,7 +124,7 @@ class ToolController {
}
}
def join = {
def join() {
if( ltiService.consumerMap == null) ltiService.initConsumerMap()
log.debug CONTROLLER_NAME + "#join"
Map<String, String> result
@ -145,7 +148,7 @@ class ToolController {
}
def publish = {
def publish() {
log.debug CONTROLLER_NAME + "#publish"
Map<String, String> result
@ -189,7 +192,7 @@ class ToolController {
}
def delete = {
def delete() {
log.debug CONTROLLER_NAME + "#delete"
Map<String, String> result
@ -266,7 +269,9 @@ class ToolController {
}
if ( Integer.parseInt(params.get(Parameter.CUSTOM_DURATION)) > 0 ) {
welcome += "<br><b>" + message(code: "bigbluebutton.welcome.duration", args: [params.get(Parameter.CUSTOM_DURATION)]) + "</b><br>"
welcome += "<br><b>" + message(code: "bigbluebutton.welcome.duration", args: [
params.get(Parameter.CUSTOM_DURATION)
]) + "</b><br>"
log.debug "Adding duration warning to welcome message, welcome is now: [" + welcome + "]"
}
@ -388,8 +393,5 @@ class ToolController {
'</cartridge_basiclti_link>'
return cartridge
}
}

View File

@ -15,39 +15,41 @@
You should have received a copy of the GNU Lesser General Public License along
with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
*/
package org.bigbluebutton
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.io.BufferedReader
import java.io.IOException
import java.io.InputStreamReader
import java.io.StringReader
import java.net.HttpURLConnection
import java.net.URL
import java.text.MessageFormat
import java.util.ArrayList
import java.util.HashMap
import java.util.List
import java.util.Map
import java.util.Random
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.DocumentBuilder
import javax.xml.parsers.DocumentBuilderFactory
import javax.xml.parsers.ParserConfigurationException
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.w3c.dom.Document
import org.w3c.dom.Node
import org.w3c.dom.NodeList
import org.xml.sax.InputSource
import org.xml.sax.SAXException
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.codec.digest.DigestUtils
import org.bigbluebutton.api.Proxy
import org.bigbluebutton.lti.Role
import org.bigbluebutton.lti.Parameter
class BigbluebuttonService {
import grails.transaction.Transactional
boolean transactional = false
@Transactional
class BigbluebuttonService {
def url = "http://test-install.blindsidenetworks.com/bigbluebutton"
def salt = "8cd8ef52e8e101574e400365b55e11a6"
@ -116,7 +118,6 @@ class BigbluebuttonService {
}
return joinURL
}
public Object getRecordings(params){
@ -304,10 +305,12 @@ class BigbluebuttonService {
line = reader.readLine();
}
} finally {
if (reader != null)
reader.close();
if (isr != null)
isr.close();
if ( reader != null ) {
reader.close()
}
if ( isr != null ) {
isr.close()
}
}
httpConnection.disconnect();
@ -384,5 +387,4 @@ class BigbluebuttonService {
}
return map;
}
}

View File

@ -15,17 +15,17 @@
You should have received a copy of the GNU Lesser General Public License along
with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
*/
package org.bigbluebutton
import java.util.Map;
import grails.transaction.Transactional
import java.util.Map
import javax.crypto.spec.SecretKeySpec
import javax.crypto.Mac
import org.apache.commons.codec.binary.Base64
@Transactional
class LtiService {
boolean transactional = false
def endPoint = "http://localhost/lti/tool"
def consumers = "demo:welcome"
def mode = "simple"
@ -45,7 +45,7 @@ class LtiService {
if( this.consumerMap.containsKey(consumerId) ){
consumer = new HashMap<String, String>()
consumer.put("key", consumerId);
consumer.put("key", consumerId)
consumer.put("secret", this.consumerMap.get(consumerId))
}
@ -63,25 +63,22 @@ class LtiService {
this.consumerMap.put(consumer[0], consumer[1])
}
}
}
public String sign(String sharedSecret, String data) throws Exception
{
public String sign(String sharedSecret, String data) throws Exception {
Mac mac = setKey(sharedSecret)
// Signed String must be BASE64 encoded.
byte[] signBytes = mac.doFinal(data.getBytes("UTF8"));
String signature = encodeBase64(signBytes);
byte[] signBytes = mac.doFinal(data.getBytes("UTF8"))
String signature = encodeBase64(signBytes)
return signature;
}
private Mac setKey(String sharedSecret) throws Exception
{
Mac mac = Mac.getInstance("HmacSHA1");
byte[] keyBytes = sharedSecret.getBytes("UTF8");
SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA1");
mac.init(signingKey);
private Mac setKey(String sharedSecret) throws Exception {
Mac mac = Mac.getInstance("HmacSHA1")
byte[] keyBytes = sharedSecret.getBytes("UTF8")
SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA1")
mac.init(signingKey)
return mac
}

View File

@ -81,7 +81,6 @@
</style>
</head>
<body>
<!-- index -->
<a href="#page-body" class="skip"><g:message code="default.link.skip.label" default="Skip to content&hellip;"/></a>
<div id="status" role="complementary">
<h1>Application Status</h1>

View File

@ -7,7 +7,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title><g:message code="tool.view.title" /></title>
<title><g:layoutTitle default="Grails"/></title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="${resource(dir: 'images', file: 'favicon.ico')}" type="image/x-icon">
<link rel="apple-touch-icon" href="${resource(dir: 'images', file: 'apple-touch-icon.png')}">
@ -19,12 +19,8 @@
<r:layoutResources />
</head>
<body>
<div id="spinner" class="spinner" style="display:none;">
<img src="${resource(dir:'images',file:'spinner.gif')}" alt="Spinner" />
</div>
<div class="logo" id="logo" role="banner"><img src="${resource(dir: 'images', file: 'bbb_logo.jpg')}" alt="<g:message code="tool.view.app" />" /></div>
<div id="grailsLogo" role="banner"><a href="http://grails.org"><img src="${resource(dir: 'images', file: 'grails_logo.png')}" alt="Grails"/></a></div>
<g:layoutBody/>
<div class="footer" role="contentinfo"></div>
<div id="spinner" class="spinner" style="display:none;"><g:message code="spinner.alt" default="Loading&hellip;"/></div>
<r:layoutResources />

View File

@ -0,0 +1,20 @@
package org.bigbluebutton
import grails.test.mixin.TestFor
import spock.lang.Specification
/**
* See the API for {@link grails.test.mixin.services.ServiceUnitTestMixin} for usage instructions
*/
@TestFor(BigbluebuttonService)
class BigbluebuttonServiceSpec extends Specification {
def setup() {
}
def cleanup() {
}
void "test something"() {
}
}

View File

@ -0,0 +1,20 @@
package org.bigbluebutton
import grails.test.mixin.TestFor
import spock.lang.Specification
/**
* See the API for {@link grails.test.mixin.services.ServiceUnitTestMixin} for usage instructions
*/
@TestFor(LtiService)
class LtiServiceSpec extends Specification {
def setup() {
}
def cleanup() {
}
void "test something"() {
}
}

View File

@ -0,0 +1,20 @@
package org.bigbluebutton
import grails.test.mixin.TestFor
import spock.lang.Specification
/**
* See the API for {@link grails.test.mixin.web.ControllerUnitTestMixin} for usage instructions
*/
@TestFor(ToolController)
class ToolControllerSpec extends Specification {
def setup() {
}
def cleanup() {
}
void "test something"() {
}
}

View File

@ -1,3 +1,20 @@
/*
BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
This program is free software; you can redistribute it and/or modify it under the
terms of the GNU Lesser General Public License as published by the Free Software
Foundation; either version 3.0 of the License, or (at your option) any later
version.
BigBlueButton 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 Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along
with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
*/
if (typeof jQuery !== 'undefined') {
(function($) {
$('#spinner').ajaxStart(function() {