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 2017/05/01 06:08:49 UTC

[03/50] [abbrv] openmeetings git commit: [OPENMEETINGS-1601] drop recordings to WB seems to work

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a5d2b138/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/WhiteboardObject.java
----------------------------------------------------------------------
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/WhiteboardObject.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/WhiteboardObject.java
deleted file mode 100644
index 8657a24..0000000
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/WhiteboardObject.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * 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.db.dto.room;
-
-import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
-
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.red5.logging.Red5LoggerFactory;
-import org.slf4j.Logger;
-
-public class WhiteboardObject {
-	private static final Logger log = Red5LoggerFactory.getLogger(WhiteboardObject.class, webAppRootKey);
-	private long whiteBoardId;
-	private Integer x = 0;
-	private Integer y = 0;
-	private Integer zoom = 100;
-	private Boolean fullFit = true;
-	private Map<String, List<Object>> roomItems = new ConcurrentHashMap<>();
-	private Date created = new Date();
-	private int zIndex = 1;
-	private String name;
-
-	public WhiteboardObject() {}
-
-	public WhiteboardObject(String name) {
-		this.name = name;
-	}
-
-	public long getWhiteBoardId() {
-		return whiteBoardId;
-	}
-
-	public void setWhiteBoardId(long whiteBoardId) {
-		this.whiteBoardId = whiteBoardId;
-	}
-
-	public Integer getX() {
-		return x;
-	}
-
-	public void setX(Integer x) {
-		this.x = x;
-	}
-
-	public Integer getY() {
-		return y;
-	}
-
-	public void setY(Integer y) {
-		this.y = y;
-	}
-
-	public Date getCreated() {
-		return created;
-	}
-
-	public void setCreated(Date created) {
-		this.created = created;
-	}
-
-	public Integer getZoom() {
-		return zoom;
-	}
-
-	public void setZoom(Integer zoom) {
-		this.zoom = zoom;
-	}
-
-	public Boolean getFullFit() {
-		return fullFit;
-	}
-
-	public void setFullFit(Boolean fullFit) {
-		this.fullFit = fullFit;
-	}
-
-	public void clear() {
-		roomItems.clear();
-		zIndex = 1;
-	}
-
-	//getter is required, otherwise roomItems are not available in red5
-	public Map<String, List<Object>> getRoomItems() {
-		return roomItems;
-	}
-
-	public void add(String oid, List<Object> actionObject) {
-		Object type = actionObject.size() > 0 ? actionObject.get(0) : "";
-		if (actionObject.size() > 8 && ("swf".equals(type) || "image".equals(type) || "flv".equals(type))) {
-			Integer zInd = (Integer)actionObject.get(actionObject.size() - 8);
-			if (zInd == null || zInd == 0 || zInd < zIndex) {
-				actionObject.set(actionObject.size() - 8, zIndex++);
-			}
-		}
-		roomItems.put(oid, actionObject);
-	}
-
-	public List<Object> get(String oid) {
-		return roomItems.get(oid);
-	}
-
-	public Set<Entry<String, List<Object>>> entrySet() {
-		return roomItems.entrySet();
-	}
-
-	public void remove(Object oid) {
-		roomItems.remove(oid);
-	}
-
-	public void remove(List<Object> actionObject) {
-		String oid = actionObject.get(actionObject.size() - 1).toString();
-		String type = actionObject.get(0).toString();
-		log.debug("Removal of object: oid = {}, type = {} ", oid, type);
-
-		/* I believe this is redundant
-		// Re-Index all items in its zIndex
-		if (type.equals("ellipse")
-				|| type.equals("drawarrow")
-				|| type.equals("line")
-				|| type.equals("paint")
-				|| type.equals("rectangle")
-				|| type.equals("uline")
-				|| type.equals("image")
-				|| type.equals("letter")
-				|| type.equals("clipart")
-				|| type.equals("swf")
-				|| type.equals("mindmapnode")
-				|| type.equals("flv")) {
-
-			Integer zIndex = Integer.valueOf(actionObject.get(actionObject.size() - 8).toString());
-
-			log.debug("1|zIndex " + zIndex);
-			log.debug("2|zIndex " + actionObject.get(actionObject.size() - 8).toString());
-			log.debug("3|zIndex " + actionObject.get(actionObject.size() - 8));
-
-			int l = 0;
-			for (Object o : actionObject) {
-				log.debug("4|zIndex " + l + " -- " + o);
-				l++;
-			}
-
-			for (Entry<String, List<Object>> e : roomItems.entrySet()) {
-				List<Object> actionObjectStored = e.getValue();
-
-				Integer zIndexStored = Integer.valueOf(actionObjectStored.get(actionObjectStored.size() - 8).toString());
-
-				log.debug("zIndexStored|zIndex " + zIndexStored + "|" + zIndex);
-
-				if (zIndexStored >= zIndex) {
-					zIndexStored -= 1;
-					log.debug("new-zIndex " + zIndexStored);
-				}
-				actionObjectStored.set(actionObjectStored.size() - 8, zIndexStored);
-			}
-		}
-		*/
-		roomItems.remove(oid);
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a5d2b138/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/WhiteboardObjectList.java
----------------------------------------------------------------------
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/WhiteboardObjectList.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/WhiteboardObjectList.java
deleted file mode 100644
index 1858512..0000000
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/WhiteboardObjectList.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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.db.dto.room;
-
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-public class WhiteboardObjectList {
-	private Long roomId;
-	private Map<Long, WhiteboardObject> whiteboardObjects = new ConcurrentHashMap<>();
-
-	public WhiteboardObjectList() {}
-
-	public Long getRoomId() {
-		return roomId;
-	}
-
-	public void setRoomId(Long roomId) {
-		this.roomId = roomId;
-	}
-
-	public Map<Long, WhiteboardObject> getWhiteboardObjects() {
-		return whiteboardObjects;
-	}
-
-	public void setWhiteboardObjects(Map<Long, WhiteboardObject> whiteboardObjects) {
-		this.whiteboardObjects = whiteboardObjects;
-	}
-}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a5d2b138/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboards.java
----------------------------------------------------------------------
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboards.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboards.java
new file mode 100644
index 0000000..5d14211
--- /dev/null
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboards.java
@@ -0,0 +1,51 @@
+/*
+ * 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.db.dto.room;
+
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class Whiteboards {
+	private Long roomId;
+	private final String uid = UUID.randomUUID().toString();
+	private Map<Long, Whiteboard> whiteboards = new ConcurrentHashMap<>();
+
+	public Whiteboards() {}
+
+	public Long getRoomId() {
+		return roomId;
+	}
+
+	public void setRoomId(Long roomId) {
+		this.roomId = roomId;
+	}
+
+	public Map<Long, Whiteboard> getWhiteboards() {
+		return whiteboards;
+	}
+
+	public void setWhiteboards(Map<Long, Whiteboard> whiteboards) {
+		this.whiteboards = whiteboards;
+	}
+
+	public String getUid() {
+		return uid;
+	}
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a5d2b138/openmeetings-flash/src/main/swf/modules/conference/whiteboard/base/baseDrawObject.lzx
----------------------------------------------------------------------
diff --git a/openmeetings-flash/src/main/swf/modules/conference/whiteboard/base/baseDrawObject.lzx b/openmeetings-flash/src/main/swf/modules/conference/whiteboard/base/baseDrawObject.lzx
index 434b755..271a536 100644
--- a/openmeetings-flash/src/main/swf/modules/conference/whiteboard/base/baseDrawObject.lzx
+++ b/openmeetings-flash/src/main/swf/modules/conference/whiteboard/base/baseDrawObject.lzx
@@ -7,16 +7,16 @@
   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.
-  
+
 -->
 <library>
 
@@ -25,7 +25,7 @@
 	<attribute name="newSlideNumber" value="1" type="number" />
 	<attribute name="fullFit" value="true" type="boolean" />
 
-	<!-- 
+	<!--
 		Invoked by the Library directly
 		Loads a SWFPresenation to the whiteBoard
 	 -->
@@ -48,17 +48,17 @@
 	<method name="setCurrentScaleByFullFit" args="scaleFactor">
 	<![CDATA[
 		var tScale = Math.round(scaleFactor*100);
-		
+
 		this.getDisplayObject().scaleX = scaleFactor;
 		this.getDisplayObject().scaleY = scaleFactor;
-		
+
 		this.setAttribute("x",0);
 		this.setAttribute("y",0);
-		
+
 		//Already send by x,y change
 		//this.onupdateScale.sendEvent(null);
 		if ($debug) Debug.write("setCurrentScaleByFullFit -1- ",tScale);
-		
+
 		parent.parent.zoombox.setCurrentScaleByFullFit(tScale);
 	]]>
 	</method>
@@ -67,37 +67,37 @@
 	<![CDATA[
 		if (canvas.ismoderator) {
 			if ($debug) Debug.write("doUpdateFullFit ",fullFit,zoom);
-		
+
 			var actionObject = new Array();
 			actionObject.push("whiteboardObj");
 			actionObject.push(fullFit);
-			
+
 			this.doFullFit(fullFit);
-			
+
 			actionObject.push(this.getDisplayObject().scaleX * 100);
-			
+
 			if ($debug) Debug.write("doUpdateFullFit ",fullFit,this.getDisplayObject().scaleX);
 			this.onsharedMessage('whiteboardObj',actionObject);
-		}	
+		}
 	]]>
 	</method>
 
 	<method name="doUpdateZoom" args="fullFit,zoom">
 	<![CDATA[
 		if ($debug) Debug.write("doUpdateZoom ",this.fullFit,zoom);
-		
+
 		this.getDisplayObject().scaleX = zoom / 100;
 		this.getDisplayObject().scaleY = zoom / 100;
-		
+
 		if ($debug) Debug.write("doUpdateZoom is moderator ", canvas.ismoderator);
 		if (canvas.ismoderator) {
 			var actionObject = new Array();
 			actionObject.push("whiteboardObj");
 			actionObject.push(fullFit);
 			actionObject.push(zoom);
-		
+
 			this.onupdateScale.sendEvent(null);
-			this.onsharedMessage('whiteboardObj',actionObject);	
+			this.onsharedMessage('whiteboardObj',actionObject);
 		}
 	]]>
 	</method>
@@ -108,7 +108,7 @@
 		if ($debug) Debug.write("doUpdateFullFitAndZoomRemote ",actionObject[1],actionObject[2]);
 
 		this.doFullFit(actionObject[1]);
-		
+
 		if (!actionObject[1]) {
 			this.getDisplayObject().scaleX = actionObject[2] / 100;
 			this.getDisplayObject().scaleY = actionObject[2] / 100;
@@ -120,9 +120,9 @@
 	<method name="doFullFit" args="v">
 	<![CDATA[
 		if ($debug) Debug.write("Do Full Fit ? doFullFit: ", v, this.ObjectByName);
-	
+
 		this.fullFit = v;
-		if (!!this.ObjectByName && this.ObjectByName.typeOfObject == "swf") {	
+		if (!!this.ObjectByName && this.ObjectByName.typeOfObject == "swf") {
 			if (v) {
 				if ($debug) Debug.write("Do Full Fit ! ", (!!this.ObjectByName._swfView));
 				if (!!this.ObjectByName._swfView) {
@@ -145,23 +145,23 @@
 				this.doDocumentAction('setSlideNumber');
 				return true;
 			}
-		} 
+		}
 		return false;
 	]]>
 	</method>
 
 	<!--
 		alterModus => this is added by the mod not remotely
-		
+
 		adds the SWF-Object to the Layer
 	 -->
 	<method name="addPresentationToLayer" args="obj,urlName,nameing,posx,posy,width,height,alterModus,baseurl,fileName,moduleName,parentPath,room,domain,slideNumber,currentzoom,innerwidth,innerheight,innerx,innery,uniqueObjectSyncName,standardFileName,fullFit">
 	<![CDATA[
 		if ($debug) Debug.write("addPresentationToLayer", standardFileName);
-		
-		var downloadurl = canvas.getUrl() + urlName + "?uid=" + canvas.publicSID;
+
+		var downloadurl = canvas.getUrl() + urlName + "&uid=" + canvas.publicSID;
 		if ($debug) Debug.write("addPresentationToLayer:: downloadurl=", downloadurl);
-		
+
 		this.currentlayer = new lz.swfResourceView(obj,{refObj:this,name:nameing,
 			x:posx,y:posy,alterModus:alterModus,
 			baseurl:baseurl,fileName:fileName,moduleName:moduleName,parentPath:parentPath,
@@ -190,7 +190,7 @@
 			actionObject[17],actionObject[18],actionObject[19]);
 	</method>
 
-	<!-- 
+	<!--
 		Invoked by the remote Host, see sendWatchObject in baseDraw.lzx
 	 -->
 	<method name="addSWFToLayerHistorySynced" args="actionObject,refObj">
@@ -207,8 +207,8 @@
 			actionObject[9],actionObject[10],actionObject[17],actionObject[18],actionObject[19]);
 	</method>
 
-	<!--- 
-		invoke by the initial Loading process in remoteWhiteboard.lzx, 
+	<!---
+		invoke by the initial Loading process in remoteWhiteboard.lzx,
 		does not invoke any Update Handler
 		once this object is loaded, it will throw an Update event of kind
 		addSWFToLayerHistoryToLocalLoaded
@@ -336,22 +336,22 @@
 			} else if (action=="doc_last"){
 				this.ObjectByName._swfView.setAttribute('frame',(this.ObjectByName._swfView.totalframes));
 			} else if (action=="doc_zoom_minus"){
-				
+
 				if ($debug) Debug.write("doc_zoom_minus ");
 				return;
-				
-				this.ObjectByName.currentzoomFactor-=this.ObjectByName.zoomlevel;	   
+
+				this.ObjectByName.currentzoomFactor-=this.ObjectByName.zoomlevel;
 				var newwidth = (this.ObjectByName.initwidth/100)*this.ObjectByName.currentzoomFactor;
 				var newheight = (this.ObjectByName.initheight/100)*this.ObjectByName.currentzoomFactor;
 				this.ObjectByName._swfView.setAttribute('width',newwidth);
 				this.ObjectByName._swfView.setAttribute('height',newheight);
 				this.boundingref.doSetInnerObjectsBounds(newwidth,newheight);
 			} else if (action=="doc_zoom_plus"){
-				
+
 				if ($debug) Debug.write("doc_zoom_plus ");
 				return;
-				
-				this.ObjectByName.currentzoomFactor+=this.ObjectByName.zoomlevel;	   
+
+				this.ObjectByName.currentzoomFactor+=this.ObjectByName.zoomlevel;
 				//Debug.write("doc_zoom_plus 1",this.ObjectByName.currentzoomFactor,this.ObjectByName.zoomlevel);
 				var newwidth = (this.ObjectByName.initwidth/100)*this.ObjectByName.currentzoomFactor;
 				var newheight = (this.ObjectByName.initheight/100)*this.ObjectByName.currentzoomFactor;
@@ -370,9 +370,9 @@
 			}
 			this.ObjectByName.slideNumber =  this.ObjectByName._swfView.frame;
 			this.doUpdateDocumentToolBar();
-			
+
 			if ($debug) Debug.info("doDocumentAction :2: sendCurrentSWFObject");
-			
+
 			this.sendCurrentSWFObject(this.ObjectByName);
 		}
 	]]>
@@ -419,7 +419,7 @@
 	<![CDATA[
 		var p = 0, t = 0;
 		if (this["ObjectByName"] && this.ObjectByName != null && this.ObjectByName._swfView) {
-			if ($debug) Debug.warn("doUpdateDocumentToolBar ", this.ObjectByName.fullFit);
+			//if ($debug) Debug.warn("doUpdateDocumentToolBar ", this.ObjectByName.fullFit);
 			p = this.ObjectByName._swfView.frame;
 			t = this.ObjectByName._swfView.totalframes;
 		}
@@ -467,21 +467,21 @@
 				this.baseactionobjectList[eg][16] = objRef.currentzoomFactor;
 				this.baseactionobjectList[eg][19] = objRef.fullFit;
 				var newA = this.baseactionobjectList[eg];
-				if (newA[0]=='paint') newA[1] = new Array();				
-				this.onsharedMessage('swf',newA);	
+				if (newA[0]=='paint') newA[1] = new Array();
+				this.onsharedMessage('swf',newA);
 				if (sendSlideObjectUpdate) {
 					this.updateObjectsToSlideNumber(this.baseactionobjectList[eg]);
 				}
 				break;
 			}
-		}	
+		}
 	]]>
 	</method>
 
 	<method name="remoteObjectUpdate" args="lastactionObject">
 	<![CDATA[
 		var obj = this.getObjectByName(lastactionObject[lastactionObject.length-1]);
-		
+
 		if ($debug) Debug.write("remoteObjectUpdate :: ",obj.fullFit);
 		obj._swfView.doSendChangeValue = false;
 		var sendSlideObjectUpdate = false;
@@ -494,21 +494,21 @@
 		obj._swfView.setAttribute('width',lastactionObject[11]);
 		obj._swfView.setAttribute('height',lastactionObject[12]);
 		obj.fullFit = lastactionObject[19];
-		
+
 		if ($debug) Debug.write("DO initialLoadFullFit ?? ",obj.fullFit);
-		
+
 		if (obj.fullFit) {
 			if ($debug) Debug.write("DO initialLoadFullFit !! ");
 			obj._swfView.initialLoadFullFit();
 		}
-		
+
 		obj._swfView.setAttribute('frame',obj.slideNumber);
 		obj._swfView.doSendChangeValue = true;
-		
+
 		this.doUpdateDocumentToolBarByParticipant(obj.name);
-		
+
 		this.remoteUpdateBaseObjectList(lastactionObject);
-		
+
 		if (sendSlideObjectUpdate) {
 			this.updateObjectsToSlideNumber(lastactionObject);
 		}
@@ -523,14 +523,14 @@
 				this.baseactionobjectList[eg] = actionObject;
 				break;
 			}
-		}	
+		}
 	]]>
 	</method>
 
 	<method name="playVideoSynced" args="fileId,fileName,flv_width,flv_height">
 	<![CDATA[
 		if ($debug) Debug.write("playVideoSynced : ", fileId,fileName,flv_width,flv_height);
-	
+
 		var tName = 'flv'+this.getCounter();
 		this.currentlayer = new lz.whiteboardVideoPlayer(this,{
 										name:tName,
@@ -540,14 +540,14 @@
 										flv_width:flv_width,
 										flv_height:flv_height
 									});
-		this.layers.push(this.currentlayer);  
+		this.layers.push(this.currentlayer);
 	]]>
 	</method>
 
 	<method name="sendNewVideoRemote" args="refObj">
 	<![CDATA[
 		if ($debug) Debug.write("sendNewVideoRemote : ",refObj.fileId,refObj.title);
-	
+
 		this.flvregisterFinal(refObj.name,refObj.x,refObj.y,refObj.width,refObj.height,
 											refObj.fileId,refObj.title,
 											false, //isPlaying
@@ -579,20 +579,18 @@
 
 	<method name="drawFlvToHistory" args="lastActionObject,parentView">
 	<![CDATA[
-		if ($debug) Debug.write("drawFlvToHistory PLAY :: ",lastActionObject[3]);
-	
+		//if ($debug) Debug.write("drawFlvToHistory POSTER :: ", lastActionObject[3]);
+
 		this.currentlayer = new lz.whiteboardVideoPlayer(this,{
 										name:lastActionObject[lastActionObject.length-1],
 										fileId:lastActionObject[1],
-										title:lastActionObject[2],
+										title: lastActionObject[2],
+										posterUrl: lastActionObject[3],
 										flv_width:lastActionObject[4],
 										flv_height:lastActionObject[5],
 										hash:lastActionObject[7]
 									});
-		if (lastActionObject[3]) {
-			this.currentlayer.playRemote();
-		}
-		this.layers.push(this.currentlayer);  
+		this.layers.push(this.currentlayer);
 	]]>
 	</method>
 
@@ -601,10 +599,10 @@
 		for (var eg=0;eg<this.baseactionobjectList.length;eg++){
 			if (this.baseactionobjectList[eg][this.baseactionobjectList[eg].length-1]==refObj.name) {
 				this.baseactionobjectList[eg][3] = play;
-				
+
 				if ($debug) Debug.write("playFLV :: ",this.baseactionobjectList[eg]);
 				this.onsharedMessage('flv',this.baseactionobjectList[eg]);
-				
+
 				break;
 			}
 		}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a5d2b138/openmeetings-flash/src/main/swf/modules/conference/whiteboard/base/whiteboardVideoPlayer.lzx
----------------------------------------------------------------------
diff --git a/openmeetings-flash/src/main/swf/modules/conference/whiteboard/base/whiteboardVideoPlayer.lzx b/openmeetings-flash/src/main/swf/modules/conference/whiteboard/base/whiteboardVideoPlayer.lzx
index 413d1fb..9ccfa26 100644
--- a/openmeetings-flash/src/main/swf/modules/conference/whiteboard/base/whiteboardVideoPlayer.lzx
+++ b/openmeetings-flash/src/main/swf/modules/conference/whiteboard/base/whiteboardVideoPlayer.lzx
@@ -7,110 +7,98 @@
   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.
-  
+
 -->
 <library>
 
-<class name="whiteboardVideoPlayer" extends="labelExplorerBox" allowDragging="false" 
-		docking="false" resizeable="false" closable="false" 
+<class name="whiteboardVideoPlayer" extends="labelExplorerBox" allowDragging="false"
+		docking="false" resizeable="false" closable="false"
 		x="0" y="0" width="${ parent.width }" height="${ parent.height - 10 }">
-	
+
 	<attribute name="fileId" value="0" type="number" />
 	<attribute name="timerDelegateStarted" value="false" type="boolean" />
 	<attribute name="deltaInSeconds" value="0" type="number" />
-	<attribute name="currentTime" value="0" type="number" /> 	
+	<attribute name="currentTime" value="0" type="number" />
 	<attribute name="recordingName" value="" type="string" />
 	<attribute name="hash" value="" type="string" />
+	<attribute name="posterUrl" value="" type="string" />
 	<attribute name="isLoaded" value="false" type="boolean" />
 	<attribute name="sendInit" value="false" type="boolean" />
-	<attribute name="flv_width" value="0" type="number" /> 
-	<attribute name="flv_height" value="0" type="number" /> 
+	<attribute name="flv_width" value="0" type="number" />
+	<attribute name="flv_height" value="0" type="number" />
 	<attribute name="isPaused" value="true" type="boolean" />
 	<handler name="oninit">
+	<![CDATA[
 		if ($debug) Debug.write("whiteboardVideoPlayer :: ",this.fileId);
-		
+
 		this.recordingName = hash + ".mp4";
 		calcVideoWidthHeight();
-		this.copyFileToCurrentRoom.doCall();
+
+		this.isLoaded = true;
+
+		this._content._preview.imagePreview.setAttribute("src", canvas.getUrl() + posterUrl
+				 + '&uid=' + canvas.publicSID);
+		this._content._preview.bringToFront();
+
+		if (this.sendInit) {
+			parent.sendNewVideoRemote(this);
+		}
+	]]>
 	</handler>
-	
+
 	<handler name="prepareForDelete" args="tRef">
 		if ($debug) Debug.write("--- prepareForDelete ");
 		this.stopStream();
 	</handler>
-	
+
 	<handler name="onclose">
 		this.stopStreamPlay();
 	</handler>
-	
+
 	<handler name="onwidth" args="w">
 		calcVideoWidthHeight();
 	</handler>
-	
+
 	<handler name="onheight" args="h">
 		calcVideoWidthHeight();
 	</handler>
-	
-	<!--
-	public Long copyFileToCurrentRoom(String SID, Long flvFileExplorerId)
-	 -->
-	<netRemoteCallHib name="copyFileToCurrentRoom" funcname="fileservice.copyFileToCurrentRoom" 
-		remotecontext="$once{ canvas.thishib }" > 
-		<netparam><method name="getValue">return canvas.sessionId;</method></netparam>
-		<netparam><method name="getValue">return parent.parent.fileId;</method></netparam>
-		<handler name="ondata" args="value">
-		<![CDATA[	
-			if ($debug) Debug.write("deleteFileOrFolder: ",value);
-			parent.isLoaded = true;
-			
-			var downloadurl = canvas.getUrl() + 'room/file/' + parent.fileId + '?uid='
-				+ canvas.publicSID + '&preview=true';
-			parent._content._preview.imagePreview.setAttribute("src", downloadurl)
-			parent._content._preview.bringToFront();
-
-			if (parent.sendInit) {
-				parent.parent.sendNewVideoRemote(parent);
-			}
-		]]>
-		</handler>
-	</netRemoteCallHib>
-	
+
 	<method name="startStreamPlay">
 		parent.playFLV(this,true);
 	</method>
-	
+
 	<method name="stopStreamPlay">
 		parent.playFLV(this,false);
 		this.stopStream();
 	</method>
-	
+
 	<method name="playRemote">
 		this.startStream();
 	</method>
-	
+
 	<method name="stopRemote">
 		this.stopStream();
 	</method>
-	
+
 	<method name="startStream">
 	<![CDATA[
 		if (!this.isLoaded) {
 			return;
 		}
 		if ($debug) Debug.write("startStream ", this.recordingName);
-		
+
 		if (this.recordingName != "") {
 			this.isPaused = false;
-			
+
 			if (!this.timerDelegateStarted) {
 				this.timerDelegateStarted = true;
 			}
@@ -122,53 +110,53 @@
 		}
 	]]>
 	</method>
-	
+
 	<!---
-		calculates the new x, y, width and height of the video so that it is 100% 
+		calculates the new x, y, width and height of the video so that it is 100%
 		visible in the container
 	 -->
 	<method name="calcVideoWidthHeight">
 	<![CDATA[
 		if ($debug) Debug.write("calcVideoWidthHeight ", this.flv_width, this.flv_height);
-	
+
 		var ratio = this.flv_width / this.flv_height;
 		var t = {};
 		var area = {height: parent.height - 62, width: parent.width - 1}
-		
+
 		//max height of container is new height of video;
 		//calc new width and x-position of video
 		t.height = area.height;
-		t.width = ratio * t.height; 
+		t.width = ratio * t.height;
 		t.x = (area.width - t.width) / 2;
 		t.y = 0;
-		
+
 		if ($debug) Debug.write("calcVideoWidthHeight", area, t);
-	 
+
 		if (t.width > area.width) {
 			t.width = area.width;
 			t.height = t.width / ratio;
 			t.x = 0;
 			t.y = (area.height - t.height) / 2;
 		}
-		t.width = Math.round(t.width); 
+		t.width = Math.round(t.width);
 		t.height = Math.round(t.height);
 		t.x = Math.round(t.x);
 		t.y = Math.round(t.y);
-		
+
 		if ($debug) Debug.write("t", t);
-		
+
 		this._content.setAttribute("x", t.x + 1);
 		this._content.setAttribute("y", t.y + 22);
 		this._content.setAttribute("width", t.width);
 		this._content.setAttribute("height", t.height);
-		
+
 		this._content._preview.setAttribute("width", t.width);
 		this._content._preview.setAttribute("height", t.height);
-		
+
 		return t;
 	]]>
 	</method>
-	
+
 	<method name="setDuration">
 	<![CDATA[
 		if ($debug) Debug.write("setDuration ",this.deltaInSeconds);
@@ -183,7 +171,7 @@
 		this._progress._progressbar._duration.setAttribute("text",tString);
 	]]>
 	</method>
-	
+
 	<method name="calcProgressBar">
 	<![CDATA[
 		if ($debug) Debug.write("calcProgressBar ", this.currentTime);
@@ -200,8 +188,8 @@
 		this._progress._progressbar._time.setAttribute("text", tString);
 		this._progress._progressbar._pointer.setAttribute("x", tNewX);
 	]]>
-	</method> 
-	
+	</method>
+
 	<method name="stopStream">
 		if (this.timerDelegateStarted) {
 			this.timerDelegateStarted = false;
@@ -212,33 +200,33 @@
 		this._content._preview.setAttribute('visible', true);
 		this.isPaused = true;
 	</method>
-	
+
 	<method name="toggleStream">
 		if (canvas.ismoderator &amp;&amp; this.isPaused) {
 				this.startStreamPlay();
 		}
 	</method>
-	
+
 	<baseVideoStream name="_content" height="${ parent.height - 62 }" bgcolor="0x000000" y="22" x="1" width="${ parent.width-1 }">
 		<attribute name="timerDelegate" value="null"/>
 		<attribute name="timerDelegateStarted" value="false" type="boolean"/>
-		
+
 		<handler name="oninit">
 			this.timerDelegate = new LzDelegate(this, "calcProgressBar");
 		</handler>
-		
+
 		<method name="playVideoStream" args="streamName, delay">
 			this.playStream(streamName, delay);
 			this.timerDelegateStarted = true;
 			lz.Timer.addTimer(this.timerDelegate , 1000);
 		</method>
-		
+
 		<method name="stopVideo">
 			this._stop();
 			lz.Timer.removeTimer(this.timerDelegate);
 			this.timerDelegateStarted = false;
 		</method>
-		
+
 		<handler name="onNetStatus" args="info">
 			//if ($debug) Debug.write("onNetStatus ",info);
 			if (info.code ==  "NetStream.Play.Stop" ) {
@@ -252,7 +240,7 @@
 			parent.deltaInSeconds = Number(info.duration);
 			parent.setDuration();
 		</handler>
-		
+
 		<method name="calcProgressBar" args="tObjRef">
 			if ($debug) Debug.write("calcProgressBar:: updateRecordingStreamTime", this.timerDelegateStarted, this._ns.time)
 			parent.currentTime = this._ns.time;
@@ -288,23 +276,23 @@
 			</handler>
 			<labelTooltip labelid="875" />
 		</view>
-		
+
 		<view name="_progressbar" x="16" width="${ parent.width - 32 }" y="1" height="16" bgcolor="$once{ canvas.getThemeColor('baseMouseOvercolorizer') }">
-			<view x="0" width="${ parent.width }" y="0" height="16" bgcolor="0xFFFFFF" opacity="0.5" /> 
-			
+			<view x="0" width="${ parent.width }" y="0" height="16" bgcolor="0xFFFFFF" opacity="0.5" />
+
 			<handler name="onclick">
 				//parent.parent.seekStream(this.getMouse("x"));
 			</handler>
-			
+
 			<view name="_pointer" resource="flv_progress_pointer_rsc" visibility="hidden" />
-			
+
 			<text name="_time" resize="true" fontsize="10" />
-			
+
 			<text name="_duration" align="right" resize="true" fontsize="10" />
 		</view>
-		
+
 		<view resource="flv_recorder_stop_small_rsc" align="right" y="1" height="16" width="16"
-			  bgcolor="$once{ canvas.getThemeColor('baseMouseOvercolorizer') }">
+				bgcolor="$once{ canvas.getThemeColor('baseMouseOvercolorizer') }">
 			<handler name="onmouseover">
 				this.setAttribute("bgcolor",0xFFFFFF);
 			</handler>
@@ -318,8 +306,8 @@
 			</handler>
 			<labelTooltip labelid="876" />
 		</view>
-	</view>	
-	
+	</view>
+
 	<simpleLabelButton labelid="85" width="100" x="${ parent.width-118 }" y="${ parent.height-20 }" >
 		<handler name="onclick">
 			if (canvas.ismoderator) {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a5d2b138/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java
----------------------------------------------------------------------
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java
index 28b6172..344a0c1 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java
@@ -29,11 +29,11 @@ import java.util.Map;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.math.NumberUtils;
-import org.apache.openmeetings.core.data.whiteboard.WhiteBoardObjectListManagerById;
+import org.apache.openmeetings.core.data.whiteboard.WhiteboardCache;
 import org.apache.openmeetings.core.session.SessionManager;
 import org.apache.openmeetings.db.dao.server.SessiondataDao;
-import org.apache.openmeetings.db.dto.room.WhiteboardObject;
-import org.apache.openmeetings.db.dto.room.WhiteboardObjectList;
+import org.apache.openmeetings.db.dto.room.Whiteboard;
+import org.apache.openmeetings.db.dto.room.Whiteboards;
 import org.apache.openmeetings.util.InitializationContainer;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
@@ -50,7 +50,7 @@ public class CleanupJob extends AbstractJob {
 	@Autowired
 	private SessionManager sessionManager;
 	@Autowired
-	private WhiteBoardObjectListManagerById wbManager;
+	private WhiteboardCache wbManager;
 
 	public long getSessionTimeout() {
 		return sessionTimeout;
@@ -122,8 +122,8 @@ public class CleanupJob extends AbstractJob {
 					Long roomId = null;
 					if (NumberUtils.isCreatable(folder.getName())) {
 						roomId = Long.valueOf(folder.getName());
-						WhiteboardObjectList wbList = wbManager.getWhiteBoardObjectListByRoomId(roomId);
-						for (Map.Entry<Long, WhiteboardObject> e : wbList.getWhiteboardObjects().entrySet()) {
+						Whiteboards wbList = wbManager.get(roomId);
+						for (Map.Entry<Long, Whiteboard> e : wbList.getWhiteboards().entrySet()) {
 							if (!e.getValue().getRoomItems().isEmpty()) {
 								roomId = null;
 								break;

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a5d2b138/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.html
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.html b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.html
index d87af52..1e346f3 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.html
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/labels/LangPanel.html
@@ -27,7 +27,6 @@
 				, autoOpen: false
 				, resizable: false
 			});
-			ADMIN_TABLE_SHIIFT = 172;
 		};
 	</script>
 </wicket:head>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a5d2b138/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
index 9db123f..378ee2a 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
@@ -35,6 +35,7 @@ import java.util.Set;
 import java.util.UUID;
 
 import org.apache.directory.api.util.Strings;
+import org.apache.openmeetings.core.data.whiteboard.WhiteboardCache;
 import org.apache.openmeetings.core.remote.ConferenceLibrary;
 import org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter;
 import org.apache.openmeetings.core.util.WebSocketHelper;
@@ -64,6 +65,7 @@ import org.apache.openmeetings.web.room.activities.ActivitiesPanel;
 import org.apache.openmeetings.web.room.activities.Activity;
 import org.apache.openmeetings.web.room.menu.RoomMenuPanel;
 import org.apache.openmeetings.web.room.sidebar.RoomSidebar;
+import org.apache.openmeetings.web.user.record.JpgRecordingResourceReference;
 import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -633,10 +635,25 @@ public class RoomPanel extends BasePanel {
 
 	public void sendFileToWb(FileItem fi, boolean clean) {
 		if (activeWbId > -1 && fi.getId() != null && FileItem.Type.Folder != fi.getType()) {
-			if (fi.getType() == FileItem.Type.WmlFile) {
+			if (FileItem.Type.WmlFile == fi.getType()) {
 				getBean(ConferenceLibrary.class).sendToWhiteboard(getClient().getUid(), activeWbId, fi);
 			} else {
-				String url = urlFor(new RoomResourceReference(), new PageParameters().add("id", fi.getId())).toString();
+				String url = null;
+				PageParameters pp = new PageParameters();
+				pp.add("id", fi.getId())
+					.add("ruid", getBean(WhiteboardCache.class).get(r.getId()).getUid());
+				switch (fi.getType()) {
+					case Video:
+						pp.add("preview", true);
+						url = urlFor(new RoomResourceReference(), pp).toString();
+						break;
+					case Recording:
+						url = urlFor(new JpgRecordingResourceReference(), pp).toString();
+						break;
+					default:
+						url = urlFor(new RoomResourceReference(), pp).toString();
+						break;
+				}
 				getBean(ScopeApplicationAdapter.class).sendToWhiteboard(getClient().getUid(), activeWbId, fi, url, clean);
 			}
 		}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a5d2b138/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomResourceReference.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomResourceReference.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomResourceReference.java
index b5de9cd..0231370 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomResourceReference.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomResourceReference.java
@@ -27,8 +27,13 @@ import static org.apache.openmeetings.web.app.Application.getBean;
 import static org.apache.openmeetings.web.app.Application.getOnlineClient;
 
 import java.io.File;
+import java.util.Map.Entry;
 
+import org.apache.directory.api.util.Strings;
+import org.apache.openmeetings.core.data.whiteboard.WhiteboardCache;
 import org.apache.openmeetings.db.dao.file.FileExplorerItemDao;
+import org.apache.openmeetings.db.dto.room.Whiteboard;
+import org.apache.openmeetings.db.dto.room.Whiteboards;
 import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.file.FileExplorerItem;
 import org.apache.openmeetings.db.entity.file.FileItem;
@@ -93,10 +98,16 @@ public class RoomResourceReference extends FileItemResourceReference<FileExplore
 			return null;
 		}
 		FileExplorerItem f = getBean(FileExplorerItemDao.class).get(id);
-		// impossible to check file permission based on client, file can be dropped on WB
-		// and should be accessible to whole room
-		//FIXME TODO ADDITIONALLY CHECK Rights !! and room !!
-		return f;
+		String ruid = params.get("ruid").toString();
+		Whiteboards wbs = getBean(WhiteboardCache.class).get(c.getRoomId());
+		if (!Strings.isEmpty(ruid) && ruid.equals(wbs.getUid())) {
+			for (Entry<Long, Whiteboard> e : wbs.getWhiteboards().entrySet()) {
+				if (e.getValue().getRoomItems().containsKey(f.getHash())) {
+					return f; // item IS on WB
+				}
+			}
+		}
+		return null;
 	}
 
 	protected File getFile(FileExplorerItem f, String ext) {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a5d2b138/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java
index f321aba..b7f14cc 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java
@@ -181,6 +181,7 @@ public class UploadDialog extends AbstractFormDialog<String> {
 	protected void onSubmit(AjaxRequestTarget target) {
 		List<FileUpload> ful = uploadField.getFileUploads();
 		if (ful != null) {
+			boolean clean = cleanWb.getModelObject();
 			for (FileUpload fu : ful) {
 				FileExplorerItem f = new FileExplorerItem();
 				f.setSize(fu.getSize());
@@ -208,7 +209,8 @@ public class UploadDialog extends AbstractFormDialog<String> {
 						form.error(getString("convert.errors.file"));
 					} else {
 						if (toWb.getModelObject()) {
-							room.sendFileToWb(f, cleanWb.getModelObject());
+							room.sendFileToWb(f, clean);
+							clean = false;
 						}
 					}
 				} catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a5d2b138/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java
index 8350295..763d705 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java
@@ -20,14 +20,22 @@ package org.apache.openmeetings.web.user.record;
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import static org.apache.openmeetings.web.app.Application.getBean;
+import static org.apache.openmeetings.web.app.Application.getOnlineClient;
 import static org.apache.openmeetings.web.app.WebSession.getExternalType;
 import static org.apache.openmeetings.web.app.WebSession.getRecordingId;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import static org.red5.logging.Red5LoggerFactory.getLogger;
 
+import java.util.Map.Entry;
+
+import org.apache.directory.api.util.Strings;
+import org.apache.openmeetings.core.data.whiteboard.WhiteboardCache;
 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.dto.room.Whiteboard;
+import org.apache.openmeetings.db.dto.room.Whiteboards;
+import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.file.FileItem.Type;
 import org.apache.openmeetings.db.entity.record.Recording;
 import org.apache.openmeetings.db.entity.user.User;
@@ -50,13 +58,15 @@ public abstract class RecordingResourceReference extends FileItemResourceReferen
 	public String getMimeType(Recording r) {
 		return getMimeType();
 	}
-	
+
 	public abstract String getMimeType();
-	
+
 	@Override
 	protected Recording getFileItem(Attributes attributes) {
 		PageParameters params = attributes.getParameters();
 		StringValue _id = params.get("id");
+		String ruid = params.get("ruid").toString();
+		String uid = params.get("uid").toString();
 		Long id = null;
 		try {
 			id = _id.toOptionalLong();
@@ -68,12 +78,12 @@ public abstract class RecordingResourceReference extends FileItemResourceReferen
 			id = getRecordingId();
 		}
 		if (id != null && ws.isSignedIn()) {
-			return getRecording(id);
+			return getRecording(id, ruid, uid);
 		}
 		return null;
 	}
-	
-	private static Recording getRecording(Long id) {
+
+	private static Recording getRecording(Long id, String ruid, String uid) {
 		log.debug("Recording with id {} is requested", id);
 		Recording r = getBean(RecordingDao.class).get(id);
 		if (r == null || r.getType() == Type.Folder || r.isDeleted()) {
@@ -82,6 +92,17 @@ public abstract class RecordingResourceReference extends FileItemResourceReferen
 		if (id.equals(getRecordingId())) {
 			return r;
 		}
+		Client c = getOnlineClient(uid);
+		if (c != null) {
+			Whiteboards wbs = getBean(WhiteboardCache.class).get(c.getRoomId());
+			if (wbs != null && !Strings.isEmpty(ruid) && ruid.equals(wbs.getUid())) {
+				for (Entry<Long, Whiteboard> e : wbs.getWhiteboards().entrySet()) {
+					if (e.getValue().getRoomItems().containsKey(r.getHash())) {
+						return r; // item IS on WB
+					}
+				}
+			}
+		}
 		//TODO should we check parentId here
 		if (r.getOwnerId() == null && r.getGroupId() == null) {
 			//public

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a5d2b138/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml
index 8380ada..bd5c378 100644
--- a/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml
+++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml
@@ -64,9 +64,9 @@
 	<!-- Database cache -->
 	<bean id="openmeetings.DatabaseStore" class="org.apache.openmeetings.core.session.store.DatabaseStore" />
 	
-	<bean id="whiteBoardObjectListManagerById" scope="singleton" class="org.apache.openmeetings.core.data.whiteboard.WhiteBoardObjectListManagerById" />
-	<!-- WhiteBoardObjectSyncManager can stay in the memory, even on cluster! -->
-	<bean id="whiteBoardObjectSyncManager" scope="singleton" class="org.apache.openmeetings.core.data.whiteboard.WhiteBoardObjectSyncManager" />
+	<bean id="whiteboardCache" scope="singleton" class="org.apache.openmeetings.core.data.whiteboard.WhiteboardCache" />
+	<!-- WhiteboardObjectSyncManager can stay in the memory, even on cluster! -->
+	<bean id="whiteboardObjectSyncManager" scope="singleton" class="org.apache.openmeetings.core.data.whiteboard.WhiteboardObjectSyncManager" />
 
 	<!-- Cluster related config start -->
 	<bean id="openmeetings.ServerUtil" scope="singleton" class="org.apache.openmeetings.core.session.ServerUtil">
@@ -78,7 +78,7 @@
 	<!-- Start of Services -->
 	<bean id="xmlcrm.service" class="org.apache.openmeetings.core.remote.MainService" />
 	<bean id="languageservice.service" class="org.apache.openmeetings.core.remote.LanguageService" />
-	<bean id="whiteboardservice.service" class="org.apache.openmeetings.core.remote.WhiteBoardService" />
+	<bean id="whiteboardservice.service" class="org.apache.openmeetings.core.remote.WhiteboardService" />
 	<bean id="userservice.service" class="org.apache.openmeetings.core.remote.UserService" />
 	<bean id="fileservice.service" class="org.apache.openmeetings.core.remote.ConferenceLibrary" />
 	<bean id="openmeetings.FileProcessor" class="org.apache.openmeetings.core.data.file.FileProcessor" />
@@ -211,7 +211,7 @@
 	<bean id="generateSWF" class="org.apache.openmeetings.core.converter.GenerateSWF" />
 	<bean id="ldapLoginManagement" class="org.apache.openmeetings.core.ldap.LdapLoginManagement" />
 	<bean id="timezoneUtil" class="org.apache.openmeetings.db.util.TimezoneUtil" />
-	<bean id="whiteboardManagement" class="org.apache.openmeetings.core.data.whiteboard.WhiteboardManager" />
+	<bean id="whiteboardManager" class="org.apache.openmeetings.core.data.whiteboard.WhiteboardManager" />
 	<bean id="backupExport" class="org.apache.openmeetings.backup.BackupExport" />
 	<bean id="backupImport" class="org.apache.openmeetings.backup.BackupImport" />
 	<bean id="appointmentManager" class="org.apache.openmeetings.service.calendar.caldav.AppointmentManager" destroy-method="destroy"/>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a5d2b138/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/FileWebService.java
----------------------------------------------------------------------
diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/FileWebService.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/FileWebService.java
index 6b34f9b..ea70478 100644
--- a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/FileWebService.java
+++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/FileWebService.java
@@ -21,7 +21,6 @@ package org.apache.openmeetings.webservice;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import static org.apache.openmeetings.webservice.Constants.TNS;
 
-import java.io.File;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.List;
@@ -43,7 +42,6 @@ import javax.ws.rs.core.MediaType;
 import org.apache.cxf.feature.Features;
 import org.apache.cxf.jaxrs.ext.multipart.Multipart;
 import org.apache.openmeetings.core.data.file.FileProcessor;
-import org.apache.openmeetings.core.documents.LoadLibraryPresentation;
 import org.apache.openmeetings.db.dao.file.FileExplorerItemDao;
 import org.apache.openmeetings.db.dao.server.SessiondataDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
@@ -51,12 +49,10 @@ import org.apache.openmeetings.db.dto.basic.ServiceResult;
 import org.apache.openmeetings.db.dto.basic.ServiceResult.Type;
 import org.apache.openmeetings.db.dto.file.FileExplorerItemDTO;
 import org.apache.openmeetings.db.dto.file.FileExplorerObject;
-import org.apache.openmeetings.db.dto.file.LibraryPresentation;
 import org.apache.openmeetings.db.entity.file.FileExplorerItem;
 import org.apache.openmeetings.db.entity.server.Sessiondata;
 import org.apache.openmeetings.db.entity.user.User.Right;
 import org.apache.openmeetings.db.util.AuthLevelUtil;
-import org.apache.openmeetings.util.OmFileHelper;
 import org.apache.openmeetings.util.process.ConverterProcessResultList;
 import org.apache.openmeetings.webservice.error.ServiceException;
 import org.red5.logging.Red5LoggerFactory;
@@ -217,44 +213,6 @@ public class FileWebService {
 	}
 
 	/**
-	 * Get a LibraryPresentation-Object for a certain file
-	 *
-	 * @param sid
-	 *            The SID of the User. This SID must be marked as logged in
-	 * @param parentFolder
-	 *
-	 * @return - LibraryPresentation-Object for a certain file
-	 * @throws ServiceException
-	 */
-	public LibraryPresentation getPresentationPreviewFileExplorer(String sid, String parentFolder)
-			throws ServiceException {
-
-		try {
-			Sessiondata sd = sessionDao.check(sid);
-			if (AuthLevelUtil.hasWebServiceLevel(userDao.getRights(sd.getUserId()))) {
-
-				File working_dir = new File(OmFileHelper.getUploadProfilesDir(), parentFolder);
-				log.debug("############# working_dir : " + working_dir);
-
-				File file = new File(working_dir, OmFileHelper.libraryFileName);
-
-				if (!file.exists()) {
-					throw new ServiceException(file.getCanonicalPath() + ": does not exist ");
-				}
-
-				return LoadLibraryPresentation.parseLibraryFileToObject(file);
-			} else {
-				throw new ServiceException("not Authenticated");
-			}
-		} catch (ServiceException e) {
-			throw e;
-		} catch (Exception e) {
-			log.error("[getListOfFilesByAbsolutePath]", e);
-			return null;
-		}
-	}
-
-	/**
 	 * Get a File Explorer Object by a given Room
 	 *
 	 * @param sid