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);
+       }
 }



Reply via email to