You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2016/04/19 10:58:05 UTC

svn commit: r1739871 [2/3] - in /openmeetings/application: branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/ branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/ branches/3.2....

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