Copied: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java (from r1739846, openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/RecordingResourceReference.java) URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java?p2=openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java&p1=openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/RecordingResourceReference.java&r1=1739846&r2=1739871&rev=1739871&view=diff ============================================================================== --- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/RecordingResourceReference.java (original) +++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java Tue Apr 19 08:58:04 2016 @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.openmeetings.web.util; +package org.apache.openmeetings.web.user.record; import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; import static org.apache.openmeetings.web.app.Application.getBean; @@ -25,26 +25,19 @@ import static org.apache.openmeetings.we import static org.apache.openmeetings.web.app.WebSession.getUserId; import static org.red5.logging.Red5LoggerFactory.getLogger; -import java.io.File; -import java.io.IOException; - -import javax.servlet.http.HttpServletResponse; - import org.apache.openmeetings.db.dao.record.RecordingDao; import org.apache.openmeetings.db.dao.user.GroupUserDao; import org.apache.openmeetings.db.dao.user.UserDao; import org.apache.openmeetings.db.entity.record.Recording; import org.apache.openmeetings.db.entity.user.User; import org.apache.openmeetings.web.app.WebSession; +import org.apache.openmeetings.web.util.FileItemResourceReference; import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.request.resource.IResource; import org.apache.wicket.request.resource.IResource.Attributes; -import org.apache.wicket.resource.FileSystemResource; -import org.apache.wicket.resource.FileSystemResourceReference; import org.apache.wicket.util.string.StringValue; import org.slf4j.Logger; -public abstract class RecordingResourceReference extends FileSystemResourceReference { +public abstract class RecordingResourceReference extends FileItemResourceReference<Recording> { private static final long serialVersionUID = 1L; private static final Logger log = getLogger(RecordingResourceReference.class, webAppRootKey); @@ -53,36 +46,27 @@ public abstract class RecordingResourceR } @Override - public IResource getResource() { - return new FileSystemResource() { - private static final long serialVersionUID = 1L; - private File file; - - @Override - protected String getMimeType() throws IOException { - return RecordingResourceReference.this.getMimeType(); - } - - @Override - protected ResourceResponse newResourceResponse(Attributes attributes) { - Recording r = getRecording(attributes); - if (r != null) { - file = getFile(r); - return createResourceResponse(file.toPath()); - } else { - log.debug("No recording was found"); - ResourceResponse rr = new ResourceResponse(); - rr.setError(HttpServletResponse.SC_NOT_FOUND); - return rr; - } + protected Recording getFileItem(Attributes attributes) { + PageParameters params = attributes.getParameters(); + StringValue _id = params.get("id"); + Long id = null; + try { + id = _id.toOptionalLong(); + } catch (NumberFormatException e) { + //no-op expected + } + WebSession ws = WebSession.get(); + if (id != null && ws.isSignedIn()) { + return getRecording(id); + } else { + ws.invalidate(); + if (ws.signIn(_id.toString(), true)) { + return getRecording(getRecordingId()); } - }; + } + return null; } - abstract String getMimeType(); - abstract String getFileName(Recording r); - abstract File getFile(Recording r); - private static Recording getRecording(Long id) { Recording r = getBean(RecordingDao.class).get(id); // TODO should we process public? @@ -99,32 +83,12 @@ public abstract class RecordingResourceR //TODO external group check was added for plugin recording download String extType = getExternalType(); if (extType != null) { + log.debug("External recording requested: " + extType); User creator = getBean(UserDao.class).get(r.getInsertedBy()); if (extType.equals(creator.getExternalType())) { return r; } } return null; - } - - private static Recording getRecording(Attributes attributes) { - PageParameters params = attributes.getParameters(); - StringValue _id = params.get("id"); - Long id = null; - try { - id = _id.toOptionalLong(); - } catch (NumberFormatException e) { - //no-op expected - } - WebSession ws = WebSession.get(); - if (id != null && ws.isSignedIn()) { - return getRecording(id); - } else { - ws.invalidate(); - if (ws.signIn(_id.toString(), true)) { - return getRecording(getRecordingId()); - } - } - return null; } }
Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoPlayer.java URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoPlayer.java?rev=1739871&r1=1739870&r2=1739871&view=diff ============================================================================== --- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoPlayer.java (original) +++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoPlayer.java Tue Apr 19 08:58:04 2016 @@ -21,8 +21,6 @@ package org.apache.openmeetings.web.user import static org.apache.openmeetings.util.OmFileHelper.getMp4Recording; import org.apache.openmeetings.db.entity.record.Recording; -import org.apache.openmeetings.web.util.Mp4RecordingResourceReference; -import org.apache.openmeetings.web.util.OggRecordingResourceReference; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.media.Source; Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/BootstrapFileUploadBehavior.java URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/BootstrapFileUploadBehavior.java?rev=1739871&r1=1739870&r2=1739871&view=diff ============================================================================== --- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/BootstrapFileUploadBehavior.java (original) +++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/BootstrapFileUploadBehavior.java Tue Apr 19 08:58:04 2016 @@ -25,13 +25,14 @@ import org.apache.wicket.markup.head.IHe import org.apache.wicket.markup.head.JavaScriptHeaderItem; import org.apache.wicket.request.resource.CssResourceReference; import org.apache.wicket.request.resource.JavaScriptResourceReference; +import org.apache.wicket.request.resource.ResourceReference; public class BootstrapFileUploadBehavior extends Behavior { private static final long serialVersionUID = 1L; - private final static JavaScriptResourceReference BOOTSTRAP_FILEUPLOAD_JS_REFERENCE - = new JavaScriptResourceReference(BootstrapFileUploadBehavior.class, "bootstrap-fileupload.js"); - private final static CssResourceReference BOOTSTRAP_FILEUPLOAD_CSS_REFERENCE - = new CssResourceReference(BootstrapFileUploadBehavior.class, "bootstrap-fileupload.css"); + private final static ResourceReference BOOTSTRAP_FILEINPUT_JS_REFERENCE + = new JavaScriptResourceReference(BootstrapFileUploadBehavior.class, "fileinput.js"); + private final static ResourceReference BOOTSTRAP_FILEINPUT_CSS_REFERENCE + = new CssResourceReference(BootstrapFileUploadBehavior.class, "fileinput.css"); public final static BootstrapFileUploadBehavior INSTANCE = new BootstrapFileUploadBehavior(); private BootstrapFileUploadBehavior() { @@ -40,7 +41,7 @@ public class BootstrapFileUploadBehavior @Override public void renderHead(Component component, IHeaderResponse response) { super.renderHead(component, response); - response.render(JavaScriptHeaderItem.forReference(BOOTSTRAP_FILEUPLOAD_JS_REFERENCE)); - response.render(CssHeaderItem.forReference(BOOTSTRAP_FILEUPLOAD_CSS_REFERENCE)); + response.render(JavaScriptHeaderItem.forReference(BOOTSTRAP_FILEINPUT_JS_REFERENCE)); + response.render(CssHeaderItem.forReference(BOOTSTRAP_FILEINPUT_CSS_REFERENCE)); } } Added: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FileItemResourceReference.java URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FileItemResourceReference.java?rev=1739871&view=auto ============================================================================== --- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FileItemResourceReference.java (added) +++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FileItemResourceReference.java Tue Apr 19 08:58:04 2016 @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License") + you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.openmeetings.web.util; + +import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; +import static org.red5.logging.Red5LoggerFactory.getLogger; + +import java.io.File; +import java.io.IOException; + +import javax.servlet.http.HttpServletResponse; + +import org.apache.openmeetings.db.entity.file.FileItem; +import org.apache.wicket.request.resource.IResource; +import org.apache.wicket.request.resource.IResource.Attributes; +import org.apache.wicket.resource.FileSystemResource; +import org.apache.wicket.resource.FileSystemResourceReference; +import org.slf4j.Logger; + +public abstract class FileItemResourceReference<T extends FileItem> extends FileSystemResourceReference { + private static final long serialVersionUID = 1L; + private static final Logger log = getLogger(FileItemResourceReference.class, webAppRootKey); + + public FileItemResourceReference(String name) { + super(name); + } + + @Override + public IResource getResource() { + return new FileSystemResource() { + private static final long serialVersionUID = 1L; + private File file; + + @Override + protected String getMimeType() throws IOException { + return FileItemResourceReference.this.getMimeType(); + } + + @Override + protected ResourceResponse newResourceResponse(Attributes attributes) { + T r = getFileItem(attributes); + if (r != null) { + file = getFile(r); + ResourceResponse rr = createResourceResponse(file.toPath()); + rr.setFileName(getFileName(r)); + return rr; + } else { + log.debug("No file item was found"); + ResourceResponse rr = new ResourceResponse(); + rr.setError(HttpServletResponse.SC_NOT_FOUND); + return rr; + } + } + }; + } + + protected abstract String getMimeType(); + protected abstract String getFileName(T r); + protected abstract File getFile(T r); + protected abstract T getFileItem(Attributes attributes); +} Copied: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.css (from r1739846, openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/bootstrap-fileupload.css) URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.css?p2=openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.css&p1=openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/bootstrap-fileupload.css&r1=1739846&r2=1739871&rev=1739871&view=diff ============================================================================== --- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/bootstrap-fileupload.css (original) +++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.css Tue Apr 19 08:58:04 2016 @@ -1,124 +1,234 @@ /*! - * Bootstrap v2.3.1 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. + * Jasny Bootstrap v3.1.0 (http://jasny.github.com/bootstrap) + * Copyright 2011-2014 Arnold Daniels. + * Licensed under the Apache License, Version 2.0 (the "License"); (https://github.com/jasny/bootstrap/blob/master/LICENSE) */ -.btn-file { - position: relative; - overflow: hidden; - vertical-align: middle; -} - -.btn-file>input { - position: absolute; - top: 0; - right: 0; - margin: 0; - font-size: 23px; - cursor: pointer; - opacity: 0; - filter: alpha(opacity = 0); - transform: translate(-300px, 0) scale(4); - direction: ltr; -} - -.fileupload { - margin-bottom: 9px; -} - -.fileupload .uneditable-input { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - cursor: text; -} - -.fileupload .thumbnail { - display: inline-block; - margin-bottom: 5px; - overflow: hidden; - text-align: center; - vertical-align: middle; -} - -.fileupload .thumbnail>img { - display: inline-block; - max-height: 100%; - vertical-align: middle; -} - -.fileupload .btn { - vertical-align: middle; -} - -.fileupload-exists .fileupload-new,.fileupload-new .fileupload-exists { - display: none; -} - -.fileupload-inline .fileupload-controls { - display: inline; -} -.fileupload-new .input-append .btn-file { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; +.btn-labeled { + padding-top: 0; + padding-bottom: 0; +} +.btn-label { + position: relative; + background: transparent; + background: rgba(0, 0, 0, 0.15); + display: inline-block; + padding: 6px 12px; + left: -12px; + border-radius: 3px 0 0 3px; +} +.btn-label.btn-label-right { + left: auto; + right: -12px; + border-radius: 0 3px 3px 0; +} +.btn-lg .btn-label { + padding: 10px 16px; + left: -16px; + border-radius: 5px 0 0 5px; +} +.btn-lg .btn-label.btn-label-right { + left: auto; + right: -16px; + border-radius: 0 5px 5px 0; +} +.btn-sm .btn-label { + padding: 5px 10px; + left: -10px; + border-radius: 2px 0 0 2px; +} +.btn-sm .btn-label.btn-label-right { + left: auto; + right: -10px; + border-radius: 0 2px 2px 0; +} +.btn-xs .btn-label { + padding: 1px 5px; + left: -5px; + border-radius: 2px 0 0 2px; +} +.btn-xs .btn-label.btn-label-right { + left: auto; + right: -5px; + border-radius: 0 2px 2px 0; +} +.nav-tabs-bottom { + border-bottom: 0; + border-top: 1px solid #dddddd; +} +.nav-tabs-bottom > li { + margin-bottom: 0; + margin-top: -1px; +} +.nav-tabs-bottom > li > a { + border-radius: 0 0 4px 4px; +} +.nav-tabs-bottom > li > a:hover, +.nav-tabs-bottom > li > a:focus, +.nav-tabs-bottom > li.active > a, +.nav-tabs-bottom > li.active > a:hover, +.nav-tabs-bottom > li.active > a:focus { + border: 1px solid #dddddd; + border-top-color: transparent; +} +.nav-tabs-left { + border-bottom: 0; + border-right: 1px solid #dddddd; +} +.nav-tabs-left > li { + margin-bottom: 0; + margin-right: -1px; + float: none; +} +.nav-tabs-left > li > a { + border-radius: 4px 0 0 4px; + margin-right: 0; + margin-bottom: 2px; +} +.nav-tabs-left > li > a:hover, +.nav-tabs-left > li > a:focus, +.nav-tabs-left > li.active > a, +.nav-tabs-left > li.active > a:hover, +.nav-tabs-left > li.active > a:focus { + border: 1px solid #dddddd; + border-right-color: transparent; +} +.row > .nav-tabs-left { + padding-right: 0; + padding-left: 15px; + margin-right: -1px; + position: relative; + z-index: 1; +} +.row > .nav-tabs-left + .tab-content { + border-left: 1px solid #dddddd; +} +.nav-tabs-right { + border-bottom: 0; + border-left: 1px solid #dddddd; +} +.nav-tabs-right > li { + margin-bottom: 0; + margin-left: -1px; + float: none; +} +.nav-tabs-right > li > a { + border-radius: 0 4px 4px 0; + margin-left: 0; + margin-bottom: 2px; +} +.nav-tabs-right > li > a:hover, +.nav-tabs-right > li > a:focus, +.nav-tabs-right > li.active > a, +.nav-tabs-right > li.active > a:hover, +.nav-tabs-right > li.active > a:focus { + border: 1px solid #dddddd; + border-left-color: transparent; +} +.row > .nav-tabs-right { + padding-left: 0; + padding-right: 15px; } - -.thumbnail-borderless .thumbnail { - padding: 0; - border: none; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -.fileupload-new.thumbnail-borderless .thumbnail { - border: 1px solid #ddd; -} - -.control-group.warning .fileupload .uneditable-input { - color: #a47e3c; - border-color: #a47e3c; -} - -.control-group.warning .fileupload .fileupload-preview { - color: #a47e3c; -} - -.control-group.warning .fileupload .thumbnail { - border-color: #a47e3c; +.btn-file { + overflow: hidden; + position: relative; + vertical-align: middle; +} +.btn-file > input { + position: absolute; + top: 0; + right: 0; + margin: 0; + opacity: 0; + filter: alpha(opacity=0); + font-size: 23px; + height: 100%; + width: 100%; + direction: ltr; + cursor: pointer; +} +.fileinput { + margin-bottom: 9px; + display: inline-block; +} +.fileinput .form-control { + padding-top: 7px; + padding-bottom: 5px; + display: inline-block; + margin-bottom: 0px; + vertical-align: middle; + cursor: text; +} +.fileinput .thumbnail { + overflow: hidden; + display: inline-block; + margin-bottom: 5px; + vertical-align: middle; + text-align: center; +} +.fileinput .thumbnail > img { + max-height: 100%; +} +.fileinput .btn { + vertical-align: middle; +} +.fileinput-exists .fileinput-new, +.fileinput-new .fileinput-exists { + display: none; +} +.fileinput-inline .fileinput-controls { + display: inline; +} +.fileinput-filename { + vertical-align: middle; + display: inline-block; + overflow: hidden; +} +.form-control .fileinput-filename { + vertical-align: bottom; +} +.fileinput.input-group { + display: table; +} +.fileinput.input-group > * { + position: relative; + z-index: 2; +} +.fileinput.input-group > .btn-file { + z-index: 1; +} +.fileinput-new.input-group .btn-file, +.fileinput-new .input-group .btn-file { + border-radius: 0 4px 4px 0; +} +.fileinput-new.input-group .btn-file.btn-xs, +.fileinput-new .input-group .btn-file.btn-xs, +.fileinput-new.input-group .btn-file.btn-sm, +.fileinput-new .input-group .btn-file.btn-sm { + border-radius: 0 3px 3px 0; +} +.fileinput-new.input-group .btn-file.btn-lg, +.fileinput-new .input-group .btn-file.btn-lg { + border-radius: 0 6px 6px 0; +} +.form-group.has-warning .fileinput .fileinput-preview { + color: #8a6d3b; +} +.form-group.has-warning .fileinput .thumbnail { + border-color: #faebcc; +} +.form-group.has-error .fileinput .fileinput-preview { + color: #a94442; +} +.form-group.has-error .fileinput .thumbnail { + border-color: #ebccd1; } - -.control-group.error .fileupload .uneditable-input { - color: #b94a48; - border-color: #b94a48; +.form-group.has-success .fileinput .fileinput-preview { + color: #3c763d; } - -.control-group.error .fileupload .fileupload-preview { - color: #b94a48; +.form-group.has-success .fileinput .thumbnail { + border-color: #d6e9c6; } - -.control-group.error .fileupload .thumbnail { - border-color: #b94a48; +.input-group-addon:not(:first-child) { + border-left: 0; } - -.control-group.success .fileupload .uneditable-input { - color: #468847; - border-color: #468847; -} - -.control-group.success .fileupload .fileupload-preview { - color: #468847; -} - -.control-group.success .fileupload .thumbnail { - border-color: #468847; -} \ No newline at end of file Copied: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.js (from r1739729, openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/bootstrap-fileupload.js) URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.js?p2=openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.js&p1=openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/bootstrap-fileupload.js&r1=1739729&r2=1739871&rev=1739871&view=diff ============================================================================== --- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/bootstrap-fileupload.js (original) +++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.js Tue Apr 19 08:58:04 2016 @@ -1,8 +1,8 @@ /* =========================================================== - * bootstrap-fileupload.js j2 - * http://jasny.github.com/bootstrap/javascript.html#fileupload + * Bootstrap: fileinput.js v3.1.3 + * http://jasny.github.com/bootstrap/javascript/#fileinput * =========================================================== - * Copyright 2012 Jasny BV, Netherlands. + * Copyright 2012-2014 Arnold Daniels * * Licensed under the Apache License, Version 2.0 (the "License") * you may not use this file except in compliance with the License. @@ -17,152 +17,181 @@ * limitations under the License. * ========================================================== */ -!function ($) { ++function ($) { "use strict"; - "use strict"; // jshint ;_ + var isIE = window.navigator.appName == 'Microsoft Internet Explorer' - /* FILEUPLOAD PUBLIC CLASS DEFINITION - * ================================= */ + // FILEUPLOAD PUBLIC CLASS DEFINITION + // ================================= - var Fileupload = function (element, options) { + var Fileinput = function (element, options) { this.$element = $(element) - this.type = this.$element.data('uploadtype') || (this.$element.find('.thumbnail').length > 0 ? "image" : "file") - + this.$input = this.$element.find(':file') if (this.$input.length === 0) return this.name = this.$input.attr('name') || options.name - this.$hidden = this.$element.find('input[type=hidden][name="'+this.name+'"]') + this.$hidden = this.$element.find('input[type=hidden][name="' + this.name + '"]') if (this.$hidden.length === 0) { - this.$hidden = $('<input type="hidden" />') - this.$element.prepend(this.$hidden) + this.$hidden = $('<input type="hidden">').insertBefore(this.$input) } - this.$preview = this.$element.find('.fileupload-preview') + this.$preview = this.$element.find('.fileinput-preview') var height = this.$preview.css('height') - if (this.$preview.css('display') != 'inline' && height != '0px' && height != 'none') this.$preview.css('line-height', height) - + if (this.$preview.css('display') !== 'inline' && height !== '0px' && height !== 'none') { + this.$preview.css('line-height', height) + } + this.original = { - 'exists': this.$element.hasClass('fileupload-exists'), - 'preview': this.$preview.html(), - 'hiddenVal': this.$hidden.val() + exists: this.$element.hasClass('fileinput-exists'), + preview: this.$preview.html(), + hiddenVal: this.$hidden.val() } - this.$remove = this.$element.find('[data-dismiss="fileupload"]') - - this.$element.find('[data-trigger="fileupload"]').on('click.fileupload', $.proxy(this.trigger, this)) - this.listen() } - Fileupload.prototype = { + Fileinput.prototype.listen = function() { + this.$input.on('change.bs.fileinput', $.proxy(this.change, this)) + $(this.$input[0].form).on('reset.bs.fileinput', $.proxy(this.reset, this)) - listen: function() { - this.$input.on('change.fileupload', $.proxy(this.change, this)) - $(this.$input[0].form).on('reset.fileupload', $.proxy(this.reset, this)) - if (this.$remove) this.$remove.on('click.fileupload', $.proxy(this.clear, this)) - }, + this.$element.find('[data-trigger="fileinput"]').on('click.bs.fileinput', $.proxy(this.trigger, this)) + this.$element.find('[data-dismiss="fileinput"]').on('click.bs.fileinput', $.proxy(this.clear, this)) + }, + + Fileinput.prototype.change = function(e) { + var files = e.target.files === undefined ? (e.target && e.target.value ? [{ name: e.target.value.replace(/^.+\\/, '')}] : []) : e.target.files - change: function(e, invoked) { - if (invoked === 'clear') return - - var file = e.target.files !== undefined ? e.target.files[0] : (e.target.value ? { name: e.target.value.replace(/^.+\\/, '') } : null) - - if (!file) { - this.clear() - return - } - - this.$hidden.val('') - this.$hidden.attr('name', '') - this.$input.attr('name', this.name) - - if (this.type === "image" && this.$preview.length > 0 && (typeof file.type !== "undefined" ? file.type.match('image.*') : file.name.match(/\.(gif|png|jpe?g)$/i)) && typeof FileReader !== "undefined") { - var reader = new FileReader() - var preview = this.$preview - var element = this.$element - - reader.onload = function(e) { - preview.html('<img src="' + e.target.result + '" ' + (preview.css('max-height') != 'none' ? 'style="max-height: ' + preview.css('max-height') + ';"' : '') + ' />') - element.addClass('fileupload-exists').removeClass('fileupload-new') - } - - reader.readAsDataURL(file) - } else { - this.$preview.text(file.name) - this.$element.addClass('fileupload-exists').removeClass('fileupload-new') - } - }, + e.stopPropagation() - clear: function(e) { - this.$hidden.val('') - this.$hidden.attr('name', this.name) - this.$input.attr('name', '') - - //ie8+ doesn't support changing the value of input with type=file so clone instead - if (navigator.userAgent.match(/msie/i)){ - var inputClone = this.$input.clone(true); - this.$input.after(inputClone); - this.$input.remove(); - this.$input = inputClone; - }else{ - this.$input.val('') - } + if (files.length === 0) { + this.clear() + return + } - this.$preview.html('') - this.$element.addClass('fileupload-new').removeClass('fileupload-exists') + this.$hidden.val('') + this.$hidden.attr('name', '') + this.$input.attr('name', this.name) + + var file = files[0] + + if (this.$preview.length > 0 && (typeof file.type !== "undefined" ? file.type.match(/^image\/(gif|png|jpeg)$/) : file.name.match(/\.(gif|png|jpe?g)$/i)) && typeof FileReader !== "undefined") { + var reader = new FileReader() + var preview = this.$preview + var element = this.$element + + reader.onload = function(re) { + var $img = $('<img>') + $img[0].src = re.target.result + files[0].result = re.target.result + + element.find('.fileinput-filename').text(file.name) + + // if parent has max-height, using `(max-)height: 100%` on child doesn't take padding and border into account + if (preview.css('max-height') != 'none') $img.css('max-height', parseInt(preview.css('max-height'), 10) - parseInt(preview.css('padding-top'), 10) - parseInt(preview.css('padding-bottom'), 10) - parseInt(preview.css('border-top'), 10) - parseInt(preview.css('border-bottom'), 10)) + + preview.html($img) + element.addClass('fileinput-exists').removeClass('fileinput-new') - if (e) { - this.$input.trigger('change', [ 'clear' ]) - e.preventDefault() + element.trigger('change.bs.fileinput', files) } - }, - - reset: function(e) { - this.clear() + + reader.readAsDataURL(file) + } else { + this.$element.find('.fileinput-filename').text(file.name) + this.$preview.text(file.name) - this.$hidden.val(this.original.hiddenVal) - this.$preview.html(this.original.preview) + this.$element.addClass('fileinput-exists').removeClass('fileinput-new') - if (this.original.exists) this.$element.addClass('fileupload-exists').removeClass('fileupload-new') - else this.$element.addClass('fileupload-new').removeClass('fileupload-exists') - }, + this.$element.trigger('change.bs.fileinput') + } + }, + + Fileinput.prototype.clear = function(e) { + if (e) e.preventDefault() - trigger: function(e) { - this.$input.trigger('click') - e.preventDefault() + this.$hidden.val('') + this.$hidden.attr('name', this.name) + this.$input.attr('name', '') + + //ie8+ doesn't support changing the value of input with type=file so clone instead + if (isIE) { + var inputClone = this.$input.clone(true); + this.$input.after(inputClone); + this.$input.remove(); + this.$input = inputClone; + } else { + this.$input.val('') } + + this.$preview.html('') + this.$element.find('.fileinput-filename').text('') + this.$element.addClass('fileinput-new').removeClass('fileinput-exists') + + if (e !== undefined) { + this.$input.trigger('change') + this.$element.trigger('clear.bs.fileinput') + } + }, + + Fileinput.prototype.reset = function() { + this.clear() + + this.$hidden.val(this.original.hiddenVal) + this.$preview.html(this.original.preview) + this.$element.find('.fileinput-filename').text('') + + if (this.original.exists) this.$element.addClass('fileinput-exists').removeClass('fileinput-new') + else this.$element.addClass('fileinput-new').removeClass('fileinput-exists') + + this.$element.trigger('reset.bs.fileinput') + }, + + Fileinput.prototype.trigger = function(e) { + this.$input.trigger('click') + e.preventDefault() } - /* FILEUPLOAD PLUGIN DEFINITION - * =========================== */ + // FILEUPLOAD PLUGIN DEFINITION + // =========================== - $.fn.fileupload = function (options) { + var old = $.fn.fileinput + + $.fn.fileinput = function (options) { return this.each(function () { - var $this = $(this) - , data = $this.data('fileupload') - if (!data) $this.data('fileupload', (data = new Fileupload(this, options))) + var $this = $(this), + data = $this.data('bs.fileinput') + if (!data) $this.data('bs.fileinput', (data = new Fileinput(this, options))) if (typeof options == 'string') data[options]() }) } - $.fn.fileupload.Constructor = Fileupload + $.fn.fileinput.Constructor = Fileinput + + + // FILEINPUT NO CONFLICT + // ==================== + + $.fn.fileinput.noConflict = function () { + $.fn.fileinput = old + return this + } - /* FILEUPLOAD DATA-API - * ================== */ + // FILEUPLOAD DATA-API + // ================== - $(document).on('click.fileupload.data-api', '[data-provides="fileupload"]', function (e) { + $(document).on('click.fileinput.data-api', '[data-provides="fileinput"]', function (e) { var $this = $(this) - if ($this.data('fileupload')) return - $this.fileupload($this.data()) + if ($this.data('bs.fileinput')) return + $this.fileinput($this.data()) - var $target = $(e.target).closest('[data-dismiss="fileupload"],[data-trigger="fileupload"]'); + var $target = $(e.target).closest('[data-dismiss="fileinput"],[data-trigger="fileinput"]'); if ($target.length > 0) { - $target.trigger('click.fileupload') e.preventDefault() + $target.trigger('click.bs.fileinput') } }) Added: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.min.css URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.min.css?rev=1739871&view=auto ============================================================================== --- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.min.css (added) +++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.min.css Tue Apr 19 08:58:04 2016 @@ -0,0 +1,7 @@ +/*! + * Jasny Bootstrap v3.1.0 (http://jasny.github.com/bootstrap) + * Copyright 2011-2014 Arnold Daniels. + * Licensed under the Apache License, Version 2.0 (the "License"); (https://github.com/jasny/bootstrap/blob/master/LICENSE) + */ + +.btn-labeled{padding-top:0;padding-bottom:0}.btn-label{position:relative;background:transparent;background:rgba(0,0,0,0.15);display:inline-block;padding:6px 12px;left:-12px;border-radius:3px 0 0 3px}.btn-label.btn-label-right{left:auto;right:-12px;border-radius:0 3px 3px 0}.btn-lg .btn-label{padding:10px 16px;left:-16px;border-radius:5px 0 0 5px}.btn-lg .btn-label.btn-label-right{left:auto;right:-16px;border-radius:0 5px 5px 0}.btn-sm .btn-label{padding:5px 10px;left:-10px;border-radius:2px 0 0 2px}.btn-sm .btn-label.btn-label-right{left:auto;right:-10px;border-radius:0 2px 2px 0}.btn-xs .btn-label{padding:1px 5px;left:-5px;border-radius:2px 0 0 2px}.btn-xs .btn-label.btn-label-right{left:auto;right:-5px;border-radius:0 2px 2px 0}.nav-tabs-bottom{border-bottom:0;border-top:1px solid #ddd}.nav-tabs-bottom>li{margin-bottom:0;margin-top:-1px}.nav-tabs-bottom>li>a{border-radius:0 0 4px 4px}.nav-tabs-bottom>li>a:hover,.nav-tabs-bottom>li>a:focus,.nav-tabs-bottom>li.active>a,.nav-tabs-bot tom>li.active>a:hover,.nav-tabs-bottom>li.active>a:focus{border:1px solid #ddd;border-top-color:transparent}.nav-tabs-left{border-bottom:0;border-right:1px solid #ddd}.nav-tabs-left>li{margin-bottom:0;margin-right:-1px;float:none}.nav-tabs-left>li>a{border-radius:4px 0 0 4px;margin-right:0;margin-bottom:2px}.nav-tabs-left>li>a:hover,.nav-tabs-left>li>a:focus,.nav-tabs-left>li.active>a,.nav-tabs-left>li.active>a:hover,.nav-tabs-left>li.active>a:focus{border:1px solid #ddd;border-right-color:transparent}.row>.nav-tabs-left{padding-right:0;padding-left:15px;margin-right:-1px;position:relative;z-index:1}.row>.nav-tabs-left+.tab-content{border-left:1px solid #ddd}.nav-tabs-right{border-bottom:0;border-left:1px solid #ddd}.nav-tabs-right>li{margin-bottom:0;margin-left:-1px;float:none}.nav-tabs-right>li>a{border-radius:0 4px 4px 0;margin-left:0;margin-bottom:2px}.nav-tabs-right>li>a:hover,.nav-tabs-right>li>a:focus,.nav-tabs-right>li.active>a,.nav-tabs-right>li.active>a:hover,.nav-tabs-rig ht>li.active>a:focus{border:1px solid #ddd;border-left-color:transparent}.row>.nav-tabs-right{padding-left:0;padding-right:15px}.btn-file{overflow:hidden;position:relative;vertical-align:middle}.btn-file>input{position:absolute;top:0;right:0;margin:0;opacity:0;filter:alpha(opacity=0);font-size:23px;height:100%;width:100%;direction:ltr;cursor:pointer}.fileinput{margin-bottom:9px;display:inline-block}.fileinput .form-control{padding-top:7px;padding-bottom:5px;display:inline-block;margin-bottom:0px;vertical-align:middle;cursor:text}.fileinput .thumbnail{overflow:hidden;display:inline-block;margin-bottom:5px;vertical-align:middle;text-align:center}.fileinput .thumbnail>img{max-height:100%}.fileinput .btn{vertical-align:middle}.fileinput-exists .fileinput-new,.fileinput-new .fileinput-exists{display:none}.fileinput-inline .fileinput-controls{display:inline}.fileinput-filename{vertical-align:middle;display:inline-block;overflow:hidden}.form-control .fileinput-filename{vertical-align:botto m}.fileinput.input-group{display:table}.fileinput.input-group>*{position:relative;z-index:2}.fileinput.input-group>.btn-file{z-index:1}.fileinput-new.input-group .btn-file,.fileinput-new .input-group .btn-file{border-radius:0 4px 4px 0}.fileinput-new.input-group .btn-file.btn-xs,.fileinput-new .input-group .btn-file.btn-xs,.fileinput-new.input-group .btn-file.btn-sm,.fileinput-new .input-group .btn-file.btn-sm{border-radius:0 3px 3px 0}.fileinput-new.input-group .btn-file.btn-lg,.fileinput-new .input-group .btn-file.btn-lg{border-radius:0 6px 6px 0}.form-group.has-warning .fileinput .fileinput-preview{color:#8a6d3b}.form-group.has-warning .fileinput .thumbnail{border-color:#faebcc}.form-group.has-error .fileinput .fileinput-preview{color:#a94442}.form-group.has-error .fileinput .thumbnail{border-color:#ebccd1}.form-group.has-success .fileinput .fileinput-preview{color:#3c763d}.form-group.has-success .fileinput .thumbnail{border-color:#d6e9c6}.input-group-addon:not(:first-child){bord er-left:0} Added: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.min.js URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.min.js?rev=1739871&view=auto ============================================================================== --- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.min.js (added) +++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.min.js Tue Apr 19 08:58:04 2016 @@ -0,0 +1,7 @@ +/*! + * Jasny Bootstrap v3.1.0 (http://jasny.github.com/bootstrap) + * Copyright 2011-2014 Arnold Daniels. + * Licensed under the Apache License, Version 2.0 (the "License"); (https://github.com/jasny/bootstrap/blob/master/LICENSE) + */ + ++function(a){"use strict";var b=window.navigator.appName=="Microsoft Internet Explorer",c=function(b,c){this.$element=a(b),this.$input=this.$element.find(":file");if(this.$input.length===0)return;this.name=this.$input.attr("name")||c.name,this.$hidden=this.$element.find('input[type=hidden][name="'+this.name+'"]'),this.$hidden.length===0&&(this.$hidden=a('<input type="hidden">').insertBefore(this.$input)),this.$preview=this.$element.find(".fileinput-preview");var d=this.$preview.css("height");this.$preview.css("display")!=="inline"&&d!=="0px"&&d!=="none"&&this.$preview.css("line-height",d),this.original={exists:this.$element.hasClass("fileinput-exists"),preview:this.$preview.html(),hiddenVal:this.$hidden.val()},this.listen()};c.prototype.listen=function(){this.$input.on("change.bs.fileinput",a.proxy(this.change,this)),a(this.$input[0].form).on("reset.bs.fileinput",a.proxy(this.reset,this)),this.$element.find('[data-trigger="fileinput"]').on("click.bs.fileinput",a.proxy(this.trigger,t his)),this.$element.find('[data-dismiss="fileinput"]').on("click.bs.fileinput",a.proxy(this.clear,this))},c.prototype.change=function(b){var c=b.target.files===undefined?b.target&&b.target.value?[{name:b.target.value.replace(/^.+\\/,"")}]:[]:b.target.files;b.stopPropagation();if(c.length===0){this.clear();return}this.$hidden.val(""),this.$hidden.attr("name",""),this.$input.attr("name",this.name);var d=c[0];if(this.$preview.length>0&&(typeof d.type!="undefined"?d.type.match(/^image\/(gif|png|jpeg)$/):d.name.match(/\.(gif|png|jpe?g)$/i))&&typeof FileReader!="undefined"){var e=new FileReader,f=this.$preview,g=this.$element;e.onload=function(b){var e=a("<img>");e[0].src=b.target.result,c[0].result=b.target.result,g.find(".fileinput-filename").text(d.name),f.css("max-height")!="none"&&e.css("max-height",parseInt(f.css("max-height"),10)-parseInt(f.css("padding-top"),10)-parseInt(f.css("padding-bottom"),10)-parseInt(f.css("border-top"),10)-parseInt(f.css("border-bottom"),10)),f.html(e),g.a ddClass("fileinput-exists").removeClass("fileinput-new"),g.trigger("change.bs.fileinput",c)},e.readAsDataURL(d)}else this.$element.find(".fileinput-filename").text(d.name),this.$preview.text(d.name),this.$element.addClass("fileinput-exists").removeClass("fileinput-new"),this.$element.trigger("change.bs.fileinput")},c.prototype.clear=function(a){a&&a.preventDefault(),this.$hidden.val(""),this.$hidden.attr("name",this.name),this.$input.attr("name","");if(b){var c=this.$input.clone(!0);this.$input.after(c),this.$input.remove(),this.$input=c}else this.$input.val("");this.$preview.html(""),this.$element.find(".fileinput-filename").text(""),this.$element.addClass("fileinput-new").removeClass("fileinput-exists"),a!==undefined&&(this.$input.trigger("change"),this.$element.trigger("clear.bs.fileinput"))},c.prototype.reset=function(){this.clear(),this.$hidden.val(this.original.hiddenVal),this.$preview.html(this.original.preview),this.$element.find(".fileinput-filename").text(""),this.original .exists?this.$element.addClass("fileinput-exists").removeClass("fileinput-new"):this.$element.addClass("fileinput-new").removeClass("fileinput-exists"),this.$element.trigger("reset.bs.fileinput")},c.prototype.trigger=function(a){this.$input.trigger("click"),a.preventDefault()};var d=a.fn.fileinput;a.fn.fileinput=function(b){return this.each(function(){var d=a(this),e=d.data("bs.fileinput");e||d.data("bs.fileinput",e=new c(this,b)),typeof b=="string"&&e[b]()})},a.fn.fileinput.Constructor=c,a.fn.fileinput.noConflict=function(){return a.fn.fileinput=d,this},a(document).on("click.fileinput.data-api",'[data-provides="fileinput"]',function(b){var c=a(this);if(c.data("bs.fileinput"))return;c.fileinput(c.data());var d=a(b.target).closest('[data-dismiss="fileinput"],[data-trigger="fileinput"]');d.length>0&&(b.preventDefault(),d.trigger("click.bs.fileinput"))})}(window.jQuery) Modified: openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/FileProcessor.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/FileProcessor.java?rev=1739871&r1=1739870&r2=1739871&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/FileProcessor.java (original) +++ openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/FileProcessor.java Tue Apr 19 08:58:04 2016 @@ -26,8 +26,8 @@ import static org.apache.openmeetings.ut import java.io.File; import java.io.InputStream; -import java.util.Date; import java.util.List; +import java.util.UUID; import org.apache.commons.transaction.util.FileHelper; import org.apache.openmeetings.core.converter.FlvExplorerConverter; @@ -38,7 +38,6 @@ import org.apache.openmeetings.db.dao.fi import org.apache.openmeetings.db.entity.file.FileExplorerItem; import org.apache.openmeetings.db.entity.file.FileItem.Type; import org.apache.openmeetings.util.StoredFile; -import org.apache.openmeetings.util.crypt.MD5; import org.apache.openmeetings.util.process.ConverterProcessResult; import org.apache.openmeetings.util.process.ConverterProcessResultList; import org.red5.logging.Red5LoggerFactory; @@ -60,18 +59,21 @@ public class FileProcessor { @Autowired private GeneratePDF generatePDF; + public static String getExt(FileExplorerItem f) { + int dotidx = f.getName().lastIndexOf('.'); + return dotidx < 0 ? "" : f.getName().substring(dotidx + 1).toLowerCase(); + } + //FIXME TODO this method need to be refactored to throw exceptions public ConverterProcessResultList processFile(Long userId, FileExplorerItem f, InputStream is) throws Exception { ConverterProcessResultList returnError = new ConverterProcessResultList(); - int dotidx = f.getName().lastIndexOf('.'); - // Generate a random string to prevent any problems with // foreign characters and duplicates - String newName = MD5.checksum("FILE_" + new Date().getTime()); + String newName = UUID.randomUUID().toString(); - String extDot = f.getName().substring(dotidx, f.getName().length()).toLowerCase(); - String ext = extDot.substring(1); + String ext = getExt(f); + String extDot = String.format(".%s", ext); log.debug("file extension: " + ext); StoredFile storedFile = new StoredFile(newName, ext); @@ -145,7 +147,7 @@ public class FileProcessor { // has to happen at the end, otherwise it will be overwritten //cause the variable is new initialized returnError.setCompleteName(completeName.getName()); - returnError.setFileExplorerItemId(f.getId()); + returnError.setFileItemId(f.getId()); return returnError; } Modified: openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteBoardObjectSyncManager.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteBoardObjectSyncManager.java?rev=1739871&r1=1739870&r2=1739871&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteBoardObjectSyncManager.java (original) +++ openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteBoardObjectSyncManager.java Tue Apr 19 08:58:04 2016 @@ -18,12 +18,12 @@ */ package org.apache.openmeetings.core.data.whiteboard; -import java.util.HashMap; +import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; + import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.apache.openmeetings.db.dto.room.WhiteboardSyncLockObject; -import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; import org.red5.logging.Red5LoggerFactory; import org.slf4j.Logger; @@ -50,7 +50,7 @@ public class WhiteBoardObjectSyncManager if (whiteBoardSyncList.containsKey(roomId)) { return whiteBoardSyncList.get(roomId); } else { - return new HashMap<String, WhiteboardSyncLockObject>(); + return new ConcurrentHashMap<>(); } } @@ -75,7 +75,7 @@ public class WhiteBoardObjectSyncManager if (whiteBoardObjectSyncList.containsKey(roomId)) { return whiteBoardObjectSyncList.get(roomId); } else { - return new HashMap<String, Map<String, WhiteboardSyncLockObject>>(); + return new ConcurrentHashMap<>(); } } @@ -91,7 +91,7 @@ public class WhiteBoardObjectSyncManager } Map<String, WhiteboardSyncLockObject> imageSyncList = roomList.get(objectId); if (imageSyncList == null) { - imageSyncList = new HashMap<String, WhiteboardSyncLockObject>(); + imageSyncList = new ConcurrentHashMap<>(); } return imageSyncList; } Modified: openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardManager.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardManager.java?rev=1739871&r1=1739870&r2=1739871&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardManager.java (original) +++ openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardManager.java Tue Apr 19 08:58:04 2016 @@ -20,10 +20,10 @@ package org.apache.openmeetings.core.dat import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.concurrent.ConcurrentHashMap; import org.apache.openmeetings.db.dto.room.WhiteboardObject; import org.red5.logging.Red5LoggerFactory; @@ -70,7 +70,7 @@ public class WhiteboardManager { } } else if (action.equals("clear")) { WhiteboardObject whiteboardObject = wbListManagerById.getWhiteBoardObjectListByRoomIdAndWhiteboard(roomId, whiteBoardId); - whiteboardObject.setRoomItems(new HashMap<String, List>()); + whiteboardObject.setRoomItems(new ConcurrentHashMap<String, List>()); wbListManagerById.setWhiteBoardObjectListRoomObjAndWhiteboardId(roomId, whiteboardObject, whiteBoardId); } else if (action.equals("delete") || action.equals("undo")) { WhiteboardObject whiteboardObject = wbListManagerById.getWhiteBoardObjectListByRoomIdAndWhiteboard(roomId, whiteBoardId); Modified: openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/WhiteboardObject.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/WhiteboardObject.java?rev=1739871&r1=1739870&r2=1739871&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/WhiteboardObject.java (original) +++ openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/WhiteboardObject.java Tue Apr 19 08:58:04 2016 @@ -19,9 +19,9 @@ package org.apache.openmeetings.db.dto.room; import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; public class WhiteboardObject { @@ -31,7 +31,7 @@ public class WhiteboardObject { private Integer zoom = 100; private Boolean fullFit = true; @SuppressWarnings("rawtypes") - private Map<String, List> roomItems = new HashMap<String, List>(); + private Map<String, List> roomItems = new ConcurrentHashMap<>(); private Date created = new Date(); public WhiteboardObject() {} Modified: openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/StoredFile.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/StoredFile.java?rev=1739871&r1=1739870&r2=1739871&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/StoredFile.java (original) +++ openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/StoredFile.java Tue Apr 19 08:58:04 2016 @@ -20,105 +20,101 @@ package org.apache.openmeetings.util; import java.util.Arrays; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.Set; +import org.apache.commons.lang3.StringUtils; + public class StoredFile { - private static final Set<String> convertExtensions = new HashSet<String>( - Arrays.asList(new String[] { "ppt", "odp", "odt", "sxw", "wpd", - "doc", "rtf", "txt", "ods", "sxc", "xls", "sxi", "pptx", - "docx", "xlsx" })); - - private static final Set<String> pdfExtensions = new HashSet<String>( - Arrays.asList(new String[] { "pdf", "ps" })); - - private static final Set<String> imageExtensions = new HashSet<String>( - Arrays.asList(new String[] { "png", "gif", "svg", "dpx", "exr", - "pcd", // PhotoCD - "pcds", // PhotoCD - "psd", // Adobe Photoshop - "tiff", // Tagged Image File Format - "ttf", // TrueType font - "xcf", // GIMP image - "wpg", // Word Perfect Graphics - "bmp", "ico", // Microsoft Icon - "tga", // Truevision Targa - "jpg", "jpeg" })); - - private static final Set<String> chartExtensions = new HashSet<String>( - Arrays.asList(new String[] { "xchart" })); + private static final Set<String> convertExtensions = new HashSet<>( + Arrays.asList("ppt", "odp", "odt", "sxw", "wpd", "doc", "rtf", "txt", "ods", "sxc", "xls", "sxi", "pptx", "docx", "xlsx")); + + private static final Set<String> pdfExtensions = new HashSet<>(Arrays.asList("pdf", "ps")); + + private static final Set<String> imageExtensions = new HashSet<>(Arrays.asList("png", "gif", "svg", "dpx", "exr", + "pcd", // PhotoCD + "pcds", // PhotoCD + "psd", // Adobe Photoshop + "tiff", // Tagged Image File Format + "ttf", // TrueType font + "xcf", // GIMP image + "wpg", // Word Perfect Graphics + "bmp", "ico", // Microsoft Icon + "tga", // Truevision Targa + "jpg", "jpeg")); + + private static final Set<String> chartExtensions = new HashSet<>(Arrays.asList("xchart")); - private static final Set<String> videoExtensions = new HashSet<String>( - Arrays.asList(new String[] { "avi", "mov", "flv", "mp4" })); + private static final Set<String> videoExtensions = new HashSet<>(Arrays.asList("avi", "mov", "flv", "mp4")); - private static final Set<String> asIsExtensions = new HashSet<String>( - Arrays.asList(new String[] { "jpg", "xchart" })); + private static final Set<String> asIsExtensions = new HashSet<>(Arrays.asList("jpg", "xchart")); - private final String name; + private final String name; private final String ext; - public StoredFile(String fullname) { - int idx = fullname.lastIndexOf('.'); - name = idx < 0 ? fullname : fullname.substring(0, idx); - ext = idx < 0 ? "" : fullname.substring(idx + 1).toLowerCase(); - } - - public StoredFile(String name, String ext) { - this.name = name; - this.ext = ext != null ? ext.toLowerCase() : ""; - } - - public static String[] getExtensions(){ - - Set<String> extensions = new HashSet<String>(); - extensions.addAll(convertExtensions); - extensions.addAll(pdfExtensions); - extensions.addAll(imageExtensions); - extensions.addAll(chartExtensions); - extensions.addAll(videoExtensions); - extensions.addAll(asIsExtensions); - - Object[] returnObj = extensions.toArray(); - - String[] returnStr = new String[returnObj.length]; - - int i=0; - for (Object obj : returnObj) { - returnStr[i] = obj.toString(); - i++; - } - - return returnStr; - } - - public boolean isConvertable() { - return convertExtensions.contains(ext); - } - - public boolean isPresentation() { - return isConvertable() || isPdf(); - } - - public boolean isPdf() { - return pdfExtensions.contains(ext); - } - - public boolean isImage() { - return imageExtensions.contains(ext); - } - - public boolean isVideo() { - return videoExtensions.contains(ext); - } - - public boolean isChart() { - return chartExtensions.contains(ext); - } - - public boolean isAsIs() { - return asIsExtensions.contains(ext); - } + public StoredFile(String fullname) { + int idx = fullname.lastIndexOf('.'); + name = idx < 0 ? fullname : fullname.substring(0, idx); + ext = idx < 0 ? "" : fullname.substring(idx + 1).toLowerCase(); + } + + public StoredFile(String name, String ext) { + this.name = name; + this.ext = ext != null ? ext.toLowerCase() : ""; + } + + public static String[] getExtensions() { + Set<String> extensions = new HashSet<>(); + extensions.addAll(convertExtensions); + extensions.addAll(pdfExtensions); + extensions.addAll(imageExtensions); + extensions.addAll(chartExtensions); + extensions.addAll(videoExtensions); + extensions.addAll(asIsExtensions); + + return extensions.toArray(new String[extensions.size()]); + } + + public static String getAcceptAttr() { + Set<String> ext = new LinkedHashSet<>(); + ext.addAll(convertExtensions); + ext.addAll(pdfExtensions); + ext.addAll(chartExtensions); + StringBuilder sb = new StringBuilder("video/*,image/*,."); // TODO add audio/*, + sb.append(StringUtils.join(ext, ",.")); + // TODO java8 String.join("|.", ext); + return sb.toString(); + } + + public boolean isConvertable() { + return convertExtensions.contains(ext); + } + + public boolean isPresentation() { + return isConvertable() || isPdf(); + } + + public boolean isPdf() { + return pdfExtensions.contains(ext); + } + + public boolean isImage() { + return imageExtensions.contains(ext); + } + + public boolean isVideo() { + return videoExtensions.contains(ext); + } + + public boolean isChart() { + return chartExtensions.contains(ext); + } + + public boolean isAsIs() { + return asIsExtensions.contains(ext); + } - public String getName() { + public String getName() { return name; } } Modified: openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ConverterProcessResultList.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ConverterProcessResultList.java?rev=1739871&r1=1739870&r2=1739871&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ConverterProcessResultList.java (original) +++ openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ConverterProcessResultList.java Tue Apr 19 08:58:04 2016 @@ -21,7 +21,7 @@ package org.apache.openmeetings.util.pro import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; import static org.red5.logging.Red5LoggerFactory.getLogger; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; @@ -37,17 +37,17 @@ import org.slf4j.Logger; public class ConverterProcessResultList { private static final Logger log = getLogger(ConverterProcessResultList.class, webAppRootKey); - private Map<String, ConverterProcessResult> jobslist = new HashMap<String, ConverterProcessResult>(); + private Map<String, ConverterProcessResult> jobslist = new LinkedHashMap<>(); - private Long fileExplorerItemId; + private Long fileItemId; private String completeName; - public Long getFileExplorerItemId() { - return fileExplorerItemId; + public Long getFileItemId() { + return fileItemId; } - public void setFileExplorerItemId(Long fileExplorerItemId) { - this.fileExplorerItemId = fileExplorerItemId; + public void setFileItemId(Long fileItemId) { + this.fileItemId = fileItemId; } public String getCompleteName() { @@ -58,8 +58,7 @@ public class ConverterProcessResultList this.completeName = completeName; } - public ConverterProcessResult addItem(String name, - ConverterProcessResult processResult) { + public ConverterProcessResult addItem(String name, ConverterProcessResult processResult) { if (jobslist.containsKey(name)) { log.error("Duplicate key in jobslist"); return null; @@ -74,7 +73,7 @@ public class ConverterProcessResultList */ public boolean hasError() { for (Entry<String, ConverterProcessResult> entry : jobslist.entrySet()) { - if (entry.getValue().getExitValue().equals("-1")) { + if ("-1".equals(entry.getValue().getExitValue())) { return true; } } @@ -97,32 +96,6 @@ public class ConverterProcessResultList return logMessage.toString(); } - /** - * Axis need Objects or array of objects, Map won't work - * - * @return - */ - public FileImportError[] convertToFileImportErrors() { - FileImportError[] errors = new FileImportError[jobslist.size()]; - - int i = 0; - // Axis need Objects or array of objects, Map won't work - for (Map.Entry<String, ConverterProcessResult> me : jobslist.entrySet()) { - - ConverterProcessResult result = me.getValue(); - - errors[i] = new FileImportError(); - errors[i].setCommand((result.getCommand() != null) ? result.getCommand().toString() : ""); - errors[i].setError((result.getError() != null) ? result.getError().toString() : ""); - errors[i].setExitValue((result.getExitValue() != null) ? Integer.valueOf(result.getExitValue().toString()) : 0); - errors[i].setProcess((result.getProcess() != null) ? result.getProcess().toString() : ""); - - i++; - } - - return errors; - } - public int size() { return jobslist.size(); } Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.html URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.html?rev=1739871&r1=1739870&r2=1739871&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.html (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/backup/BackupPanel.html Tue Apr 19 08:58:04 2016 @@ -25,33 +25,33 @@ <fieldset class="ui-widget-content"> <legend class="ui-widget-header"><wicket:message key="1066" /></legend> <div class="formelement"> - <div class="info-text"><wicket:message key="1065" /></div> - </div> - <div class="formelement"> - <label><wicket:message key="1537" /></label> <input type="checkbox" wicket:id="includeFilesInBackup" /> - </div> - <div class="formelement"> - <span wicket:id="progress"></span> - <div wicket:id="dprogress"></div> - </div> - <div class="formelement"> - <!-- Perform Download --> + <div class="info-text"><wicket:message key="1065" /></div> + </div> + <div class="formelement"> + <label><wicket:message key="1537" /></label> <input type="checkbox" wicket:id="includeFilesInBackup" /> + </div> + <div class="formelement"> + <span wicket:id="progress"></span> + <div wicket:id="dprogress"></div> + </div> + <div class="formelement"> + <!-- Perform Download --> <div wicket:id="download" class="btn"><wicket:message key="1066"/></div> <!-- Perform Upload --> - <div class="fileupload fileupload-new" data-provides="fileupload" style="margin: 0; display: inline-block;"> + <div class="fileinput fileinput-new" data-provides="fileinput" style="margin: 0; display: inline-block;"> <span class="btn btn-file ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"><span class="ui-button-text"><wicket:message key="1536"/></span><input class="uploadFileField" wicket:id="fileInput" type="file"/></span> </div> - </div> - <div class="formelement"> - <!-- Max upload size --> - <wicket:message key="1491" /> <span wicket:id="MaxUploadSize" /><span>MB</span> - </div> - <div class="formelement"> - <!-- Backup CLI import information --> - <div class="info-text" wicket:id="cmdLineDesc"></div> - </div> - </fieldset> + </div> + <div class="formelement"> + <!-- Max upload size --> + <wicket:message key="1491" /> <span wicket:id="MaxUploadSize" /><span>MB</span> + </div> + <div class="formelement"> + <!-- Backup CLI import information --> + <div class="info-text" wicket:id="cmdLineDesc"></div> + </div> + </fieldset> </form> </wicket:panel> </html> Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.html URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.html?rev=1739871&r1=1739870&r2=1739871&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.html (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.html Tue Apr 19 08:58:04 2016 @@ -52,7 +52,7 @@ <span wicket:id="export" class="btn"><wicket:message key="360"/></span> </td> <td> - <div class="fileupload fileupload-new" data-provides="fileupload" style="margin: 0;"> + <div class="fileinput fileinput-new" data-provides="fileinput" style="margin: 0;"> <span class="btn btn-file ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"><span class="ui-button-text"><wicket:message key="387"/></span><input type="file" accept="text/xml" wicket:id="fileInput"/></span> </div> <span wicket:id="progress">[progressbar]</span> Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java?rev=1739871&r1=1739870&r2=1739871&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java Tue Apr 19 08:58:04 2016 @@ -57,16 +57,17 @@ import org.apache.openmeetings.web.pages import org.apache.openmeetings.web.pages.SwfPage; import org.apache.openmeetings.web.pages.auth.SignInPage; import org.apache.openmeetings.web.pages.install.InstallWizardPage; +import org.apache.openmeetings.web.room.RoomSwfResourceReference; import org.apache.openmeetings.web.user.dashboard.MyRoomsWidgetDescriptor; import org.apache.openmeetings.web.user.dashboard.RssWidgetDescriptor; import org.apache.openmeetings.web.user.dashboard.StartWidgetDescriptor; import org.apache.openmeetings.web.user.dashboard.WelcomeWidgetDescriptor; import org.apache.openmeetings.web.user.dashboard.admin.AdminWidgetDescriptor; -import org.apache.openmeetings.web.util.AviRecordingResourceReference; -import org.apache.openmeetings.web.util.FlvRecordingResourceReference; -import org.apache.openmeetings.web.util.JpgRecordingResourceReference; -import org.apache.openmeetings.web.util.Mp4RecordingResourceReference; -import org.apache.openmeetings.web.util.OggRecordingResourceReference; +import org.apache.openmeetings.web.user.record.AviRecordingResourceReference; +import org.apache.openmeetings.web.user.record.FlvRecordingResourceReference; +import org.apache.openmeetings.web.user.record.JpgRecordingResourceReference; +import org.apache.openmeetings.web.user.record.Mp4RecordingResourceReference; +import org.apache.openmeetings.web.user.record.OggRecordingResourceReference; import org.apache.openmeetings.web.util.ProfileImageResourceReference; import org.apache.openmeetings.web.util.UserDashboardPersister; import org.apache.wicket.Localizer; @@ -154,7 +155,8 @@ public class Application extends Authent mountResource("/recordings/mp4/${id}", new Mp4RecordingResourceReference()); mountResource("/recordings/ogg/${id}", new OggRecordingResourceReference()); mountResource("/recordings/jpg/${id}", new JpgRecordingResourceReference()); //should be in sync with VideoPlayer - mountResource("/profile/${id}", new ProfileImageResourceReference()); //should be in sync with VideoPlayer + mountResource("/room/swf/${id}", new RoomSwfResourceReference()); + mountResource("/profile/${id}", new ProfileImageResourceReference()); } private static class NoVersionMapper extends MountedMapper { @@ -218,6 +220,10 @@ public class Application extends Authent } } + public static boolean isUserOnline(String uid) { + return ONLINE_USERS.containsKey(uid); + } + public static boolean isUserOnline(Long userId) { boolean isUserOnline = false; for (Map.Entry<String, Client> e : ONLINE_USERS.entrySet()) { Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/UploadableProfileImagePanel.html URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/UploadableProfileImagePanel.html?rev=1739871&r1=1739870&r2=1739871&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/UploadableProfileImagePanel.html (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/UploadableProfileImagePanel.html Tue Apr 19 08:58:04 2016 @@ -21,7 +21,7 @@ <html xmlns:wicket="http://wicket.apache.org"> <wicket:extend> <form wicket:id="form"><div - class="fileupload fileupload-new" data-provides="fileupload" style="margin: 0;"><span + class="fileinput fileinput-new" data-provides="fileinput" style="margin: 0;"><span class="btn btn-file ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" style="width: 120px;"><span class="ui-button-text"><wicket:message key="379"/></span><input type="file" accept="image/*" wicket:id="image"/></span></div><span wicket:id="progress">[progressbar]</span></form> Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java?rev=1739871&r1=1739870&r2=1739871&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java Tue Apr 19 08:58:04 2016 @@ -179,6 +179,10 @@ public abstract class FileTreePanel exte public abstract void updateSizes(); + public FileItem getSelectedFile() { + return selectedFile.getObject(); + } + @Override protected void onDetach() { selectedFile.detach(); Added: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomFileResourceReference.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomFileResourceReference.java?rev=1739871&view=auto ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomFileResourceReference.java (added) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomFileResourceReference.java Tue Apr 19 08:58:04 2016 @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License") + you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.openmeetings.web.room; + +import java.io.File; + +import org.apache.openmeetings.core.data.file.FileProcessor; +import org.apache.openmeetings.db.entity.file.FileExplorerItem; + +public class RoomFileResourceReference extends RoomResourceReference { + private static final long serialVersionUID = 1L; + + public RoomFileResourceReference() { + super("original-room-file"); + } + + @Override + protected String getMimeType() { + return "application/octet-stream"; + } + + @Override + protected String getFileName(FileExplorerItem r) { + return r.getName(); + } + + @Override + protected File getFile(FileExplorerItem r) { + return getFile(r, FileProcessor.getExt(r)); + } +} Added: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPdfResourceReference.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPdfResourceReference.java?rev=1739871&view=auto ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPdfResourceReference.java (added) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPdfResourceReference.java Tue Apr 19 08:58:04 2016 @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License") + you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.openmeetings.web.room; + +import java.io.File; + +import org.apache.openmeetings.db.entity.file.FileExplorerItem; + +public class RoomPdfResourceReference extends RoomResourceReference { + private static final long serialVersionUID = 1L; + + public RoomPdfResourceReference() { + super("pdf-room-file"); + } + + @Override + protected String getMimeType() { + return "application/pdf"; + } + + @Override + protected String getFileName(FileExplorerItem r) { + return r.getName(); + } + + @Override + protected File getFile(FileExplorerItem r) { + return getFile(r, "pdf"); + } +} Added: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomResourceReference.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomResourceReference.java?rev=1739871&view=auto ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomResourceReference.java (added) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomResourceReference.java Tue Apr 19 08:58:04 2016 @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License") + you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.openmeetings.web.room; + +import static org.apache.openmeetings.web.app.Application.getBean; +import static org.apache.openmeetings.web.app.Application.isUserOnline; + +import java.io.File; + +import org.apache.openmeetings.db.dao.file.FileExplorerItemDao; +import org.apache.openmeetings.db.entity.file.FileExplorerItem; +import org.apache.openmeetings.util.OmFileHelper; +import org.apache.openmeetings.web.app.WebSession; +import org.apache.openmeetings.web.util.FileItemResourceReference; +import org.apache.wicket.request.mapper.parameter.PageParameters; +import org.apache.wicket.request.resource.IResource.Attributes; +import org.apache.wicket.util.string.StringValue; +import org.apache.wicket.util.string.Strings; + +public abstract class RoomResourceReference extends FileItemResourceReference<FileExplorerItem> { + private static final long serialVersionUID = 1L; + + public RoomResourceReference(String name) { + super(name); + } + + @Override + protected FileExplorerItem getFileItem(Attributes attributes) { + PageParameters params = attributes.getParameters(); + StringValue _id = params.get("id"); + String uid = params.get("uid").toString(); + Long id = null; + try { + id = _id.toOptionalLong(); + } catch (NumberFormatException e) { + //no-op expected + } + WebSession ws = WebSession.get(); + if (id != null && ws.isSignedIn() && !Strings.isEmpty(uid) && isUserOnline(uid)) { + //TODO ADDITIONALLY CHECK Rights !! and room !! + return getBean(FileExplorerItemDao.class).get(id); + } + return null; + } + + protected File getFile(FileExplorerItem r, String ext) { + File d = new File(OmFileHelper.getUploadFilesDir(), r.getHash()); + return new File(d, String.format("%s.%s", r.getHash(), ext)); + } +} Added: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomSwfResourceReference.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomSwfResourceReference.java?rev=1739871&view=auto ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomSwfResourceReference.java (added) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomSwfResourceReference.java Tue Apr 19 08:58:04 2016 @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License") + you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.openmeetings.web.room; + +import java.io.File; + +import org.apache.openmeetings.db.entity.file.FileExplorerItem; + +public class RoomSwfResourceReference extends RoomResourceReference { + private static final long serialVersionUID = 1L; + + public RoomSwfResourceReference() { + super("swf-room-file"); + } + + @Override + protected String getMimeType() { + return "application/x-shockwave-flash"; + } + + @Override + protected String getFileName(FileExplorerItem r) { + return r.getName(); + } + + @Override + protected File getFile(FileExplorerItem r) { + return getFile(r, "swf"); + } +} Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java?rev=1739871&r1=1739870&r2=1739871&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java Tue Apr 19 08:58:04 2016 @@ -186,7 +186,14 @@ public class RoomMenuPanel extends Panel exitMenuItem.setTop(true); menu.add(exitMenuItem); - filesMenu.getItems().add(new RoomMenuItem(Application.getString(15), Application.getString(1479))); + filesMenu.getItems().add(new RoomMenuItem(Application.getString(15), Application.getString(1479)) { + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget target) { + room.getSidebar().showUpload(target); + } + }); filesMenu.setTop(true); menu.add(filesMenu); Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java?rev=1739871&r1=1739870&r2=1739871&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java Tue Apr 19 08:58:04 2016 @@ -39,7 +39,9 @@ import org.apache.openmeetings.web.commo import org.apache.openmeetings.web.common.tree.FileTreePanel; import org.apache.openmeetings.web.common.tree.MyRecordingTreeProvider; import org.apache.openmeetings.web.common.tree.PublicRecordingTreeProvider; +import org.apache.openmeetings.web.room.RoomPanel; import org.apache.wicket.Component; +import org.apache.wicket.ajax.AjaxEventBehavior; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.extensions.markup.html.repeater.tree.ITreeProvider; import org.apache.wicket.model.IModel; @@ -47,11 +49,11 @@ import org.apache.wicket.model.Model; public class RoomFilePanel extends FileTreePanel { private static final long serialVersionUID = 1L; - private final long roomId; + private final RoomPanel room; - public RoomFilePanel(String id, final long roomId) { + public RoomFilePanel(String id, RoomPanel room) { super(id); - this.roomId = roomId; + this.room = room; } @Override @@ -70,6 +72,14 @@ public class RoomFilePanel extends FileT protected Component getUpload(String id) { Component u = super.getUpload(id); u.setVisible(true); + u.add(new AjaxEventBehavior("click") { + private static final long serialVersionUID = 1L; + + @Override + protected void onEvent(AjaxRequestTarget target) { + room.getSidebar().showUpload(target); + } + }); return u; } @@ -79,7 +89,7 @@ public class RoomFilePanel extends FileT f.setOwnerId(getUserId()); selectedFile.setObject(f); treesView.add(selected = new FileItemTree<FileExplorerItem>(treesView.newChildId(), this, new FilesTreeProvider(null))); - treesView.add(new FileItemTree<FileExplorerItem>(treesView.newChildId(), this, new FilesTreeProvider(roomId))); + treesView.add(new FileItemTree<FileExplorerItem>(treesView.newChildId(), this, new FilesTreeProvider(room.getRoom().getId()))); treesView.add(new FileItemTree<Recording>(treesView.newChildId(), this, new MyRecordingTreeProvider())); treesView.add(new FileItemTree<Recording>(treesView.newChildId(), this, new PublicRecordingTreeProvider(null, null))); for (GroupUser ou : getBean(UserDao.class).get(getUserId()).getGroupUsers()) { Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html?rev=1739871&r1=1739870&r2=1739871&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.html Tue Apr 19 08:58:04 2016 @@ -38,5 +38,6 @@ <wicket:fragment wicket:id="file-panel"> <div class="file list" wicket:id="tree"></div> </wicket:fragment> + <div wicket:id="upload"></div> </wicket:panel> </html> Modified: openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java?rev=1739871&r1=1739870&r2=1739871&view=diff ============================================================================== --- openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java (original) +++ openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java Tue Apr 19 08:58:04 2016 @@ -53,6 +53,8 @@ public class RoomSidebar extends Panel { private final TabbedPanel tabs; private final ITab userTab; private final ITab fileTab; + private final UploadDialog upload; + private final RoomFilePanel roomFiles; private boolean showFiles; private final ListView<RoomClient> users = new ListView<RoomClient>("user", new ArrayList<RoomClient>()) { private static final long serialVersionUID = 1L; @@ -121,6 +123,8 @@ public class RoomSidebar extends Panel { } }; add(tabs = new TabbedPanel("tabs", Arrays.asList(userTab, fileTab)).setActiveTab(room.getRoom().isFilesOpened() ? 1 : 0)); + roomFiles = new RoomFilePanel("tree", room); + add(upload = new UploadDialog("upload", room, roomFiles)); } public class UserFragment extends Fragment { @@ -137,7 +141,7 @@ public class RoomSidebar extends Panel { public FileFragment(String id, String markupId) { super(id, markupId, RoomSidebar.this); - add(new RoomFilePanel("tree", room.getRoom().getId())); + add(roomFiles); } } @@ -173,4 +177,8 @@ public class RoomSidebar extends Panel { public boolean isShowFiles() { return showFiles; } + + public void showUpload(IPartialPageRequestHandler handler) { + upload.open(handler); + } }
