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 2014/02/03 03:37:58 UTC

svn commit: r1563761 - in /openmeetings: branches/3.0.x/src/db/java/org/apache/openmeetings/db/dao/record/ branches/3.0.x/src/db/java/org/apache/openmeetings/db/entity/record/ branches/3.0.x/src/main/java/org/apache/openmeetings/converter/ branches/3.0...

Author: solomax
Date: Mon Feb  3 02:37:57 2014
New Revision: 1563761

URL: http://svn.apache.org/r1563761
Log:
[OPENMEETINGS-902] conversion error dialog is added

Added:
    openmeetings/branches/3.0.x/src/main/webapp/css/images/script_error.png   (with props)
    openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingErrorsDialog.html
    openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingErrorsDialog.java
    openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.html
    openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.java
    openmeetings/trunk/singlewebapp/src/main/webapp/css/images/script_error.png   (with props)
    openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingErrorsDialog.html
    openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingErrorsDialog.java
    openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.html
    openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.java
Modified:
    openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingLogDao.java
    openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingMetaDataDao.java
    openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/entity/record/FlvRecordingLog.java
    openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/converter/FlvInterviewConverter.java
    openmeetings/branches/3.0.x/src/main/webapp/css/theme.css
    openmeetings/branches/3.0.x/src/util/java/org/apache/openmeetings/util/process/ConverterProcessResult.java
    openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.html
    openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java
    openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingLogDao.java
    openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingMetaDataDao.java
    openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/entity/record/FlvRecordingLog.java
    openmeetings/trunk/singlewebapp/src/main/java/org/apache/openmeetings/converter/FlvInterviewConverter.java
    openmeetings/trunk/singlewebapp/src/main/webapp/css/theme.css
    openmeetings/trunk/singlewebapp/src/util/java/org/apache/openmeetings/util/process/ConverterProcessResult.java
    openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.html
    openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java

Modified: openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingLogDao.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingLogDao.java?rev=1563761&r1=1563760&r2=1563761&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingLogDao.java (original)
+++ openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingLogDao.java Mon Feb  3 02:37:57 2014
@@ -18,12 +18,13 @@
  */
 package org.apache.openmeetings.db.dao.record;
 
+import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+
 import java.util.Date;
 import java.util.List;
 
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
-import javax.persistence.TypedQuery;
 
 import org.apache.openmeetings.db.entity.record.FlvRecording;
 import org.apache.openmeetings.db.entity.record.FlvRecordingLog;
@@ -34,30 +35,23 @@ import org.springframework.transaction.a
 
 @Transactional
 public class FlvRecordingLogDao {
-	
-	private static final Logger log = Red5LoggerFactory.getLogger(FlvRecordingLogDao.class);
+	private static final Logger log = Red5LoggerFactory.getLogger(FlvRecordingDao.class, webAppRootKey);
 	@PersistenceContext
 	private EntityManager em;
 	
-	public List<FlvRecordingLog> getFLVRecordingLogByRecordingId(Long flvRecordingId){
-		try {
-			String hql = "select c from FlvRecordingLog as c where c.flvRecording.flvRecordingId = :flvRecordingId";
-			
-			TypedQuery<FlvRecordingLog> query = em.createQuery(hql, FlvRecordingLog.class);
-			query.setParameter("flvRecordingId", flvRecordingId);
-			List<FlvRecordingLog> flvRecordingList = query.getResultList();
-			
-			return flvRecordingList;
-			
-		} catch (Exception ex2) {
-			log.error("[getFLVRecordingLogByRecordingId] ", ex2);
-		}
-		return null;
+	public long countErrors(Long recordingId) {
+		return em.createNamedQuery("countErrorRecordingLogsByRecording", Long.class)
+				.setParameter("recId", recordingId).getSingleResult();
 	}	
 	
-	public void deleteFLVRecordingLogByRecordingId(Long flvRecordingId){
+	public List<FlvRecordingLog> getByRecordingId(Long recordingId) {
+		return em.createNamedQuery("getRecordingLogsByRecording", FlvRecordingLog.class)
+				.setParameter("recId", recordingId).getResultList();
+	}	
+	
+	public void deleteByRecordingId(Long flvRecordingId) {
 		try {
-			List<FlvRecordingLog> flvRecordingLogs = this.getFLVRecordingLogByRecordingId(flvRecordingId);
+			List<FlvRecordingLog> flvRecordingLogs = getByRecordingId(flvRecordingId);
 			
 			for (FlvRecordingLog flvRecordingLog : flvRecordingLogs) {
 				flvRecordingLog = em.find(FlvRecordingLog.class, flvRecordingLog.getFlvRecordingLogId());
@@ -87,5 +81,4 @@ public class FlvRecordingLogDao {
 		}
 		return -1L;
 	}
-	
 }

Modified: openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingMetaDataDao.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingMetaDataDao.java?rev=1563761&r1=1563760&r2=1563761&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingMetaDataDao.java (original)
+++ openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingMetaDataDao.java Mon Feb  3 02:37:57 2014
@@ -63,7 +63,7 @@ public class FlvRecordingMetaDataDao {
 		return null;
 	}
 
-	public List<FlvRecordingMetaData> getFlvRecordingMetaDataByRecording(Long flvRecordingId) {
+	public List<FlvRecordingMetaData> getByRecording(Long flvRecordingId) {
 		try {
 
 			String hql = "SELECT c FROM FlvRecordingMetaData c WHERE c.flvRecording.flvRecordingId = :flvRecordingId "

Modified: openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/entity/record/FlvRecordingLog.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/entity/record/FlvRecordingLog.java?rev=1563761&r1=1563760&r2=1563761&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/entity/record/FlvRecordingLog.java (original)
+++ openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/entity/record/FlvRecordingLog.java Mon Feb  3 02:37:57 2014
@@ -21,8 +21,6 @@ package org.apache.openmeetings.db.entit
 import java.io.Serializable;
 import java.util.Date;
 
-
-
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
@@ -32,8 +30,14 @@ import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.Lob;
 import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 @Entity
+@NamedQueries({ 
+	@NamedQuery(name = "getRecordingLogsByRecording", query = "SELECT fl FROM FlvRecordingLog fl WHERE fl.flvRecording.flvRecordingId = :recId")
+	, @NamedQuery(name = "countErrorRecordingLogsByRecording", query = "SELECT COUNT(fl) FROM FlvRecordingLog fl WHERE fl.flvRecording.flvRecordingId = :recId AND fl.exitValue <> '0'")
+})
 @Table(name = "flvrecording_log")
 public class FlvRecordingLog implements Serializable {
 	private static final long serialVersionUID = -2577533628675416706L;

Modified: openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/converter/FlvInterviewConverter.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/converter/FlvInterviewConverter.java?rev=1563761&r1=1563760&r2=1563761&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/converter/FlvInterviewConverter.java (original)
+++ openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/converter/FlvInterviewConverter.java Mon Feb  3 02:37:57 2014
@@ -282,7 +282,7 @@ public class FlvInterviewConverter exten
 			recordingDao.updateFlvRecording(flvRecording);
 			convertToMp4(flvRecording, returnLog);
 
-			logDao.deleteFLVRecordingLogByRecordingId(flvRecording.getFlvRecordingId());
+			logDao.deleteByRecordingId(flvRecording.getFlvRecordingId());
 
 			for (ConverterProcessResult returnMap : returnLog) {
 				logDao.addFLVRecordingLog("generateFFMPEG", flvRecording, returnMap);

Added: openmeetings/branches/3.0.x/src/main/webapp/css/images/script_error.png
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/main/webapp/css/images/script_error.png?rev=1563761&view=auto
==============================================================================
Binary file - no diff available.

Propchange: openmeetings/branches/3.0.x/src/main/webapp/css/images/script_error.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: openmeetings/branches/3.0.x/src/main/webapp/css/theme.css
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/main/webapp/css/theme.css?rev=1563761&r1=1563760&r2=1563761&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/main/webapp/css/theme.css (original)
+++ openmeetings/branches/3.0.x/src/main/webapp/css/theme.css Mon Feb  3 02:37:57 2014
@@ -446,6 +446,34 @@ div.tableWrapperSmall {
 	background-image: url(images/world_link.png);
 	background-repeat: no-repeat;
 }
+.recording.item {
+	position: relative;
+}
+.recording.item .name {
+	color: black;
+}
+.recording.item .errors {
+	position: absolute;
+	right: 0px;
+	background-image: url(images/script_error.png);
+	width: 16px;
+	height: 16px;
+}
+.recording.dialog.errors {
+	width: 600px;
+	height: 500px;
+	font-size: small;
+}
+.recording.dialog.errors .alert {
+	color: red;
+}
+.recording.dialog.errors .message {
+	display: block;
+    unicode-bidi: embed;
+    font-family: monospace;
+    white-space: pre;
+    margin: 0;
+}
 .online.om-icon {
 	background-image: url(images/bullet_green.png);
 }

Modified: openmeetings/branches/3.0.x/src/util/java/org/apache/openmeetings/util/process/ConverterProcessResult.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/util/java/org/apache/openmeetings/util/process/ConverterProcessResult.java?rev=1563761&r1=1563760&r2=1563761&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/util/java/org/apache/openmeetings/util/process/ConverterProcessResult.java (original)
+++ openmeetings/branches/3.0.x/src/util/java/org/apache/openmeetings/util/process/ConverterProcessResult.java Mon Feb  3 02:37:57 2014
@@ -19,9 +19,8 @@
 package org.apache.openmeetings.util.process;
 
 /**
- * Object created by each conversion step,
- * each conversion step that invokes and external tool like ImageMagick is one single 
- * ConverterProcessMessage
+ * Object created by each conversion step, each conversion step that invokes and
+ * external tool like ImageMagick is one single ConverterProcessMessage
  * 
  * if exitValue equals "-1" then there was an issue.
  * 
@@ -29,89 +28,84 @@ package org.apache.openmeetings.util.pro
  *
  */
 public class ConverterProcessResult {
-	
 	private String process;
 	private String command;
 	private String exception;
 	private String error;
 	private String exitValue;
 	private String out;
-	
+
 	public ConverterProcessResult() {
-		
+		this(null, null, null);
+	}
+
+	public ConverterProcessResult(String error) {
+		this(null, error, null);
 	}
-	
-	public ConverterProcessResult (String process,
-			String error, Exception ex) {
+
+	public ConverterProcessResult(String process, String error, Exception ex) {
 		setProcess(process);
 		setException(ex.toString());
 		setError(error);
 		setExitValue("-1");
 	}
-	
-	public ConverterProcessResult(String error) {
-		setError(error);
-		setExitValue("-1");
-	}
 
 	public String getOut() {
 		return out;
 	}
+
 	public void setOut(String out) {
 		this.out = out;
 	}
+
 	public String getCommand() {
 		return command;
 	}
+
 	public void setCommand(String command) {
 		this.command = command;
 	}
+
 	public String getProcess() {
 		return process;
 	}
+
 	public void setProcess(String process) {
 		this.process = process;
 	}
+
 	public String getException() {
 		return exception;
 	}
+
 	public void setException(String exception) {
 		this.exception = exception;
 	}
+
 	public String getError() {
 		return error;
 	}
+
 	public void setError(String error) {
 		this.error = error;
 	}
+
 	public String getExitValue() {
 		return exitValue;
 	}
+
 	public void setExitValue(String exitValue) {
 		this.exitValue = exitValue;
 	}
-	
+
 	public String buildLogMessage() {
 		StringBuilder strBuilder = new StringBuilder();
-		strBuilder.append("process: ");
-		strBuilder.append(getProcess());
-		strBuilder.append("\r\n");
-		strBuilder.append("command; ");
-		strBuilder.append(getCommand());
-		strBuilder.append("\r\n");
-		strBuilder.append("exception: ");
-		strBuilder.append(getException());
-		strBuilder.append("\r\n");
-		strBuilder.append("error: ");
-		strBuilder.append(getError());
-		strBuilder.append("\r\n");
-		strBuilder.append("exitValue: ");
-		strBuilder.append(getException());
-		strBuilder.append("\r\n");
-		strBuilder.append("out: ");
-		strBuilder.append(getOut());
-		strBuilder.append("\r\n");
+		strBuilder.append("process: ").append(getProcess()).append("\r\n");
+		strBuilder.append("command: ").append(getCommand()).append("\r\n");
+		strBuilder.append("exception: ").append(getException()).append("\r\n");
+		strBuilder.append("error: ").append(getError()).append("\r\n");
+		strBuilder.append("exitValue: ").append(getException()).append("\r\n");
+		strBuilder.append("out: ").append(getOut()).append("\r\n");
 		return strBuilder.toString();
 	}
-
 }

Added: openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingErrorsDialog.html
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingErrorsDialog.html?rev=1563761&view=auto
==============================================================================
--- openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingErrorsDialog.html (added)
+++ openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingErrorsDialog.html Mon Feb  3 02:37:57 2014
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+  
+-->
+<html xmlns:wicket="http://wicket.apache.org">
+<wicket:panel>
+	<div wicket:id="container" class="recording dialog errors">
+		<h3 wicket:id="message"></h3>
+		<table style="width: 100%">
+			<tr>
+				<th>[Name]</th>
+				<th>[ExitCode]</th>
+				<th>[Message]</th>
+			</tr>
+			<tr wicket:id="row">
+				<td wicket:id="name"></td>
+				<td wicket:id="exitCode"></td>
+				<td wicket:id="message" class="message"></td>
+			</tr>
+		</table>
+	</div>
+</wicket:panel>
+</html>

Added: openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingErrorsDialog.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingErrorsDialog.java?rev=1563761&view=auto
==============================================================================
--- openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingErrorsDialog.java (added)
+++ openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingErrorsDialog.java Mon Feb  3 02:37:57 2014
@@ -0,0 +1,111 @@
+/*
+ * 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.user.record;
+
+import static org.apache.openmeetings.util.OmFileHelper.MP4_EXTENSION;
+import static org.apache.openmeetings.util.OmFileHelper.isRecordingExists;
+import static org.apache.openmeetings.web.app.Application.getBean;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.openmeetings.db.dao.record.FlvRecordingLogDao;
+import org.apache.openmeetings.db.entity.record.FlvRecording;
+import org.apache.openmeetings.db.entity.record.FlvRecordingLog;
+import org.apache.openmeetings.web.app.WebSession;
+import org.apache.wicket.AttributeModifier;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+
+import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractDialog;
+import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
+
+public class RecordingErrorsDialog extends AbstractDialog<FlvRecording> {
+	private static final long serialVersionUID = 1L;
+	private final WebMarkupContainer container = new WebMarkupContainer("container");
+	private final Label message = new Label("message", Model.of((String)null));
+	private final ListView<FlvRecordingLog> logView = new ListView<FlvRecordingLog>("row") {
+		private static final long serialVersionUID = 1L;
+
+		@Override
+		protected void populateItem(ListItem<FlvRecordingLog> item) {
+			FlvRecordingLog l = item.getModelObject();
+			item.add(new Label("name", l.getMsgType()));
+			item.add(new Label("exitCode", l.getExitValue()));
+			item.add(new Label("message", l.getFullMessage()));
+			if (!"0".equals(l.getExitValue())) {
+				item.add(AttributeModifier.replace("class", "alert"));
+			}
+		}
+	};
+
+	@Override
+	public int getWidth() {
+		return 600;
+	}
+	
+	@Override
+	public boolean isResizable() {
+		return true;
+	}
+
+	@Override
+	public boolean isModal() {
+		return true;
+	}
+
+	public RecordingErrorsDialog(String id, IModel<FlvRecording> model) {
+		super(id, WebSession.getString(887), model);
+		add(container.add(message.setVisible(false), logView.setVisible(false)).setOutputMarkupId(true));
+	}
+	
+	@Override
+	protected void onOpen(AjaxRequestTarget target) {
+		FlvRecording f = getModelObject();
+		List<FlvRecordingLog> logs = getBean(FlvRecordingLogDao.class).getByRecordingId(f.getFlvRecordingId());
+		if (f.getFileHash() == null) {
+			message.setVisible(true);
+			message.setDefaultModelObject(WebSession.getString(888));
+		} else if (!isRecordingExists(f.getFileHash() + MP4_EXTENSION)) {
+			message.setVisible(true);
+			message.setDefaultModelObject("[Recording file is not found]");
+		} else {
+			message.setVisible(false);
+		}
+		if (!logs.isEmpty()) {
+			logView.setVisible(false);
+			logView.setList(logs).setVisible(true);
+		}
+		target.add(container);
+		super.onOpen(target);
+	}
+	
+	public void onClose(AjaxRequestTarget target, DialogButton button) {
+	}
+	
+	@Override
+	protected List<DialogButton> getButtons() {
+		return new ArrayList<DialogButton>();
+	}
+}

Added: openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.html?rev=1563761&view=auto
==============================================================================
--- openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.html (added)
+++ openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.html Mon Feb  3 02:37:57 2014
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+  
+-->
+<html xmlns:wicket="http://wicket.apache.org">
+<wicket:panel>
+	<div class="recording item"><span wicket:id="name" class="name"></span><span wicket:id="errors" class="errors"></span></div>
+</wicket:panel>
+</html>

Added: openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.java?rev=1563761&view=auto
==============================================================================
--- openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.java (added)
+++ openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.java Mon Feb  3 02:37:57 2014
@@ -0,0 +1,52 @@
+/*
+ * 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.user.record;
+
+import static org.apache.openmeetings.util.OmFileHelper.MP4_EXTENSION;
+import static org.apache.openmeetings.util.OmFileHelper.isRecordingExists;
+import static org.apache.openmeetings.web.app.Application.getBean;
+
+import org.apache.openmeetings.db.dao.record.FlvRecordingLogDao;
+import org.apache.openmeetings.db.entity.record.FlvRecording;
+import org.apache.wicket.ajax.AjaxEventBehavior;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.IModel;
+
+public class RecordingPanel extends Panel {
+	private static final long serialVersionUID = 1L;
+
+	public RecordingPanel(String id, final IModel<FlvRecording> model, final RecordingErrorsDialog errorsDialog) {
+		super(id, model);
+		add(new Label("name", model.getObject().getFileName()));
+		long errorCount = getBean(FlvRecordingLogDao.class).countErrors(model.getObject().getFlvRecordingId());
+		boolean visible = errorCount != 0 || !isRecordingExists(model.getObject().getFileHash() + MP4_EXTENSION);
+		add(new WebMarkupContainer("errors").add(new AjaxEventBehavior("click") {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void onEvent(AjaxRequestTarget target) {
+				errorsDialog.setDefaultModel(model);
+				errorsDialog.open(target);
+			}
+		}).setVisible(visible));
+	}
+}

Modified: openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.html?rev=1563761&r1=1563760&r2=1563761&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.html (original)
+++ openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.html Mon Feb  3 02:37:57 2014
@@ -55,5 +55,6 @@
 		</tr>
 	</table>
 	<div wicket:id="addFolder"></div>
+	<div wicket:id="errors"></div>
 </wicket:panel>
 </html>

Modified: openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java?rev=1563761&r1=1563760&r2=1563761&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java (original)
+++ openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java Mon Feb  3 02:37:57 2014
@@ -18,7 +18,8 @@
  */
 package org.apache.openmeetings.web.user.record;
 
-import static org.apache.openmeetings.util.OmFileHelper.getMp4Recording;
+import static org.apache.openmeetings.util.OmFileHelper.MP4_EXTENSION;
+import static org.apache.openmeetings.util.OmFileHelper.isRecordingExists;
 import static org.apache.openmeetings.web.app.Application.getBean;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 
@@ -57,6 +58,7 @@ public class RecordingsPanel extends Use
 	private final VideoInfo info = new VideoInfo("info");
 	private final RecordingTree myTree;
 	private final IModel<FlvRecording> rm = new CompoundPropertyModel<FlvRecording>(new FlvRecording());
+	private final RecordingErrorsDialog errorsDialog = new RecordingErrorsDialog("errors", Model.of((FlvRecording)null));
 	private RecordingTree selected;
 
 	public RecordingsPanel(String id) {
@@ -122,7 +124,7 @@ public class RecordingsPanel extends Use
 			);
 		add(new Label("homeSize", ""));
 		add(new Label("publicSize", ""));
-		add(video, info);
+		add(video, info, errorsDialog);
 	}
 
 	//FIXME need to be generalized to use as Room files explorer
@@ -162,7 +164,11 @@ public class RecordingsPanel extends Use
 							}
 						};
 					} else {
-						return super.newLabelComponent(id, lm);
+						if (r.getFlvRecordingId() > 0) {
+							return new RecordingPanel(id, lm, errorsDialog);
+						} else {
+							return super.newLabelComponent(id, lm);
+						}
 					}
 				}
 				
@@ -209,7 +215,7 @@ public class RecordingsPanel extends Use
 						style = "public-recordings om-icon";
 					} else {
 						style = t.getIsFolder() ? super.getOtherStyleClass(t)
-								: (getMp4Recording(t.getFileHash()).exists() ? "recording om-icon" : "broken-recording om-icon");
+								: (isRecordingExists(t.getFileHash() + MP4_EXTENSION) ? "recording om-icon" : "broken-recording om-icon");
 					}
 					if (isSelected()) {
 						style += " selected";

Modified: openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingLogDao.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingLogDao.java?rev=1563761&r1=1563760&r2=1563761&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingLogDao.java (original)
+++ openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingLogDao.java Mon Feb  3 02:37:57 2014
@@ -18,12 +18,13 @@
  */
 package org.apache.openmeetings.db.dao.record;
 
+import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+
 import java.util.Date;
 import java.util.List;
 
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
-import javax.persistence.TypedQuery;
 
 import org.apache.openmeetings.db.entity.record.FlvRecording;
 import org.apache.openmeetings.db.entity.record.FlvRecordingLog;
@@ -34,30 +35,23 @@ import org.springframework.transaction.a
 
 @Transactional
 public class FlvRecordingLogDao {
-	
-	private static final Logger log = Red5LoggerFactory.getLogger(FlvRecordingLogDao.class);
+	private static final Logger log = Red5LoggerFactory.getLogger(FlvRecordingDao.class, webAppRootKey);
 	@PersistenceContext
 	private EntityManager em;
 	
-	public List<FlvRecordingLog> getFLVRecordingLogByRecordingId(Long flvRecordingId){
-		try {
-			String hql = "select c from FlvRecordingLog as c where c.flvRecording.flvRecordingId = :flvRecordingId";
-			
-			TypedQuery<FlvRecordingLog> query = em.createQuery(hql, FlvRecordingLog.class);
-			query.setParameter("flvRecordingId", flvRecordingId);
-			List<FlvRecordingLog> flvRecordingList = query.getResultList();
-			
-			return flvRecordingList;
-			
-		} catch (Exception ex2) {
-			log.error("[getFLVRecordingLogByRecordingId] ", ex2);
-		}
-		return null;
+	public long countErrors(Long recordingId) {
+		return em.createNamedQuery("countErrorRecordingLogsByRecording", Long.class)
+				.setParameter("recId", recordingId).getSingleResult();
 	}	
 	
-	public void deleteFLVRecordingLogByRecordingId(Long flvRecordingId){
+	public List<FlvRecordingLog> getByRecordingId(Long recordingId) {
+		return em.createNamedQuery("getRecordingLogsByRecording", FlvRecordingLog.class)
+				.setParameter("recId", recordingId).getResultList();
+	}	
+	
+	public void deleteByRecordingId(Long flvRecordingId) {
 		try {
-			List<FlvRecordingLog> flvRecordingLogs = this.getFLVRecordingLogByRecordingId(flvRecordingId);
+			List<FlvRecordingLog> flvRecordingLogs = getByRecordingId(flvRecordingId);
 			
 			for (FlvRecordingLog flvRecordingLog : flvRecordingLogs) {
 				flvRecordingLog = em.find(FlvRecordingLog.class, flvRecordingLog.getFlvRecordingLogId());
@@ -87,5 +81,4 @@ public class FlvRecordingLogDao {
 		}
 		return -1L;
 	}
-	
 }

Modified: openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingMetaDataDao.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingMetaDataDao.java?rev=1563761&r1=1563760&r2=1563761&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingMetaDataDao.java (original)
+++ openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/dao/record/FlvRecordingMetaDataDao.java Mon Feb  3 02:37:57 2014
@@ -63,7 +63,7 @@ public class FlvRecordingMetaDataDao {
 		return null;
 	}
 
-	public List<FlvRecordingMetaData> getFlvRecordingMetaDataByRecording(Long flvRecordingId) {
+	public List<FlvRecordingMetaData> getByRecording(Long flvRecordingId) {
 		try {
 
 			String hql = "SELECT c FROM FlvRecordingMetaData c WHERE c.flvRecording.flvRecordingId = :flvRecordingId "

Modified: openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/entity/record/FlvRecordingLog.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/entity/record/FlvRecordingLog.java?rev=1563761&r1=1563760&r2=1563761&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/entity/record/FlvRecordingLog.java (original)
+++ openmeetings/trunk/singlewebapp/src/db/java/org/apache/openmeetings/db/entity/record/FlvRecordingLog.java Mon Feb  3 02:37:57 2014
@@ -21,8 +21,6 @@ package org.apache.openmeetings.db.entit
 import java.io.Serializable;
 import java.util.Date;
 
-
-
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
@@ -32,8 +30,14 @@ import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.Lob;
 import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 @Entity
+@NamedQueries({ 
+	@NamedQuery(name = "getRecordingLogsByRecording", query = "SELECT fl FROM FlvRecordingLog fl WHERE fl.flvRecording.flvRecordingId = :recId")
+	, @NamedQuery(name = "countErrorRecordingLogsByRecording", query = "SELECT COUNT(fl) FROM FlvRecordingLog fl WHERE fl.flvRecording.flvRecordingId = :recId AND fl.exitValue <> '0'")
+})
 @Table(name = "flvrecording_log")
 public class FlvRecordingLog implements Serializable {
 	private static final long serialVersionUID = -2577533628675416706L;

Modified: openmeetings/trunk/singlewebapp/src/main/java/org/apache/openmeetings/converter/FlvInterviewConverter.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/main/java/org/apache/openmeetings/converter/FlvInterviewConverter.java?rev=1563761&r1=1563760&r2=1563761&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/main/java/org/apache/openmeetings/converter/FlvInterviewConverter.java (original)
+++ openmeetings/trunk/singlewebapp/src/main/java/org/apache/openmeetings/converter/FlvInterviewConverter.java Mon Feb  3 02:37:57 2014
@@ -282,7 +282,7 @@ public class FlvInterviewConverter exten
 			recordingDao.updateFlvRecording(flvRecording);
 			convertToMp4(flvRecording, returnLog);
 
-			logDao.deleteFLVRecordingLogByRecordingId(flvRecording.getFlvRecordingId());
+			logDao.deleteByRecordingId(flvRecording.getFlvRecordingId());
 
 			for (ConverterProcessResult returnMap : returnLog) {
 				logDao.addFLVRecordingLog("generateFFMPEG", flvRecording, returnMap);

Added: openmeetings/trunk/singlewebapp/src/main/webapp/css/images/script_error.png
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/main/webapp/css/images/script_error.png?rev=1563761&view=auto
==============================================================================
Binary file - no diff available.

Propchange: openmeetings/trunk/singlewebapp/src/main/webapp/css/images/script_error.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: openmeetings/trunk/singlewebapp/src/main/webapp/css/theme.css
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/main/webapp/css/theme.css?rev=1563761&r1=1563760&r2=1563761&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/main/webapp/css/theme.css (original)
+++ openmeetings/trunk/singlewebapp/src/main/webapp/css/theme.css Mon Feb  3 02:37:57 2014
@@ -446,6 +446,34 @@ div.tableWrapperSmall {
 	background-image: url(images/world_link.png);
 	background-repeat: no-repeat;
 }
+.recording.item {
+	position: relative;
+}
+.recording.item .name {
+	color: black;
+}
+.recording.item .errors {
+	position: absolute;
+	right: 0px;
+	background-image: url(images/script_error.png);
+	width: 16px;
+	height: 16px;
+}
+.recording.dialog.errors {
+	width: 600px;
+	height: 500px;
+	font-size: small;
+}
+.recording.dialog.errors .alert {
+	color: red;
+}
+.recording.dialog.errors .message {
+	display: block;
+    unicode-bidi: embed;
+    font-family: monospace;
+    white-space: pre;
+    margin: 0;
+}
 .online.om-icon {
 	background-image: url(images/bullet_green.png);
 }

Modified: openmeetings/trunk/singlewebapp/src/util/java/org/apache/openmeetings/util/process/ConverterProcessResult.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/util/java/org/apache/openmeetings/util/process/ConverterProcessResult.java?rev=1563761&r1=1563760&r2=1563761&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/util/java/org/apache/openmeetings/util/process/ConverterProcessResult.java (original)
+++ openmeetings/trunk/singlewebapp/src/util/java/org/apache/openmeetings/util/process/ConverterProcessResult.java Mon Feb  3 02:37:57 2014
@@ -19,9 +19,8 @@
 package org.apache.openmeetings.util.process;
 
 /**
- * Object created by each conversion step,
- * each conversion step that invokes and external tool like ImageMagick is one single 
- * ConverterProcessMessage
+ * Object created by each conversion step, each conversion step that invokes and
+ * external tool like ImageMagick is one single ConverterProcessMessage
  * 
  * if exitValue equals "-1" then there was an issue.
  * 
@@ -29,89 +28,84 @@ package org.apache.openmeetings.util.pro
  *
  */
 public class ConverterProcessResult {
-	
 	private String process;
 	private String command;
 	private String exception;
 	private String error;
 	private String exitValue;
 	private String out;
-	
+
 	public ConverterProcessResult() {
-		
+		this(null, null, null);
+	}
+
+	public ConverterProcessResult(String error) {
+		this(null, error, null);
 	}
-	
-	public ConverterProcessResult (String process,
-			String error, Exception ex) {
+
+	public ConverterProcessResult(String process, String error, Exception ex) {
 		setProcess(process);
 		setException(ex.toString());
 		setError(error);
 		setExitValue("-1");
 	}
-	
-	public ConverterProcessResult(String error) {
-		setError(error);
-		setExitValue("-1");
-	}
 
 	public String getOut() {
 		return out;
 	}
+
 	public void setOut(String out) {
 		this.out = out;
 	}
+
 	public String getCommand() {
 		return command;
 	}
+
 	public void setCommand(String command) {
 		this.command = command;
 	}
+
 	public String getProcess() {
 		return process;
 	}
+
 	public void setProcess(String process) {
 		this.process = process;
 	}
+
 	public String getException() {
 		return exception;
 	}
+
 	public void setException(String exception) {
 		this.exception = exception;
 	}
+
 	public String getError() {
 		return error;
 	}
+
 	public void setError(String error) {
 		this.error = error;
 	}
+
 	public String getExitValue() {
 		return exitValue;
 	}
+
 	public void setExitValue(String exitValue) {
 		this.exitValue = exitValue;
 	}
-	
+
 	public String buildLogMessage() {
 		StringBuilder strBuilder = new StringBuilder();
-		strBuilder.append("process: ");
-		strBuilder.append(getProcess());
-		strBuilder.append("\r\n");
-		strBuilder.append("command; ");
-		strBuilder.append(getCommand());
-		strBuilder.append("\r\n");
-		strBuilder.append("exception: ");
-		strBuilder.append(getException());
-		strBuilder.append("\r\n");
-		strBuilder.append("error: ");
-		strBuilder.append(getError());
-		strBuilder.append("\r\n");
-		strBuilder.append("exitValue: ");
-		strBuilder.append(getException());
-		strBuilder.append("\r\n");
-		strBuilder.append("out: ");
-		strBuilder.append(getOut());
-		strBuilder.append("\r\n");
+		strBuilder.append("process: ").append(getProcess()).append("\r\n");
+		strBuilder.append("command: ").append(getCommand()).append("\r\n");
+		strBuilder.append("exception: ").append(getException()).append("\r\n");
+		strBuilder.append("error: ").append(getError()).append("\r\n");
+		strBuilder.append("exitValue: ").append(getException()).append("\r\n");
+		strBuilder.append("out: ").append(getOut()).append("\r\n");
 		return strBuilder.toString();
 	}
-
 }

Added: openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingErrorsDialog.html
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingErrorsDialog.html?rev=1563761&view=auto
==============================================================================
--- openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingErrorsDialog.html (added)
+++ openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingErrorsDialog.html Mon Feb  3 02:37:57 2014
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+  
+-->
+<html xmlns:wicket="http://wicket.apache.org">
+<wicket:panel>
+	<div wicket:id="container" class="recording dialog errors">
+		<h3 wicket:id="message"></h3>
+		<table style="width: 100%">
+			<tr>
+				<th>[Name]</th>
+				<th>[ExitCode]</th>
+				<th>[Message]</th>
+			</tr>
+			<tr wicket:id="row">
+				<td wicket:id="name"></td>
+				<td wicket:id="exitCode"></td>
+				<td wicket:id="message" class="message"></td>
+			</tr>
+		</table>
+	</div>
+</wicket:panel>
+</html>

Added: openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingErrorsDialog.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingErrorsDialog.java?rev=1563761&view=auto
==============================================================================
--- openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingErrorsDialog.java (added)
+++ openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingErrorsDialog.java Mon Feb  3 02:37:57 2014
@@ -0,0 +1,111 @@
+/*
+ * 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.user.record;
+
+import static org.apache.openmeetings.util.OmFileHelper.MP4_EXTENSION;
+import static org.apache.openmeetings.util.OmFileHelper.isRecordingExists;
+import static org.apache.openmeetings.web.app.Application.getBean;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.openmeetings.db.dao.record.FlvRecordingLogDao;
+import org.apache.openmeetings.db.entity.record.FlvRecording;
+import org.apache.openmeetings.db.entity.record.FlvRecordingLog;
+import org.apache.openmeetings.web.app.WebSession;
+import org.apache.wicket.AttributeModifier;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+
+import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractDialog;
+import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
+
+public class RecordingErrorsDialog extends AbstractDialog<FlvRecording> {
+	private static final long serialVersionUID = 1L;
+	private final WebMarkupContainer container = new WebMarkupContainer("container");
+	private final Label message = new Label("message", Model.of((String)null));
+	private final ListView<FlvRecordingLog> logView = new ListView<FlvRecordingLog>("row") {
+		private static final long serialVersionUID = 1L;
+
+		@Override
+		protected void populateItem(ListItem<FlvRecordingLog> item) {
+			FlvRecordingLog l = item.getModelObject();
+			item.add(new Label("name", l.getMsgType()));
+			item.add(new Label("exitCode", l.getExitValue()));
+			item.add(new Label("message", l.getFullMessage()));
+			if (!"0".equals(l.getExitValue())) {
+				item.add(AttributeModifier.replace("class", "alert"));
+			}
+		}
+	};
+
+	@Override
+	public int getWidth() {
+		return 600;
+	}
+	
+	@Override
+	public boolean isResizable() {
+		return true;
+	}
+
+	@Override
+	public boolean isModal() {
+		return true;
+	}
+
+	public RecordingErrorsDialog(String id, IModel<FlvRecording> model) {
+		super(id, WebSession.getString(887), model);
+		add(container.add(message.setVisible(false), logView.setVisible(false)).setOutputMarkupId(true));
+	}
+	
+	@Override
+	protected void onOpen(AjaxRequestTarget target) {
+		FlvRecording f = getModelObject();
+		List<FlvRecordingLog> logs = getBean(FlvRecordingLogDao.class).getByRecordingId(f.getFlvRecordingId());
+		if (f.getFileHash() == null) {
+			message.setVisible(true);
+			message.setDefaultModelObject(WebSession.getString(888));
+		} else if (!isRecordingExists(f.getFileHash() + MP4_EXTENSION)) {
+			message.setVisible(true);
+			message.setDefaultModelObject("[Recording file is not found]");
+		} else {
+			message.setVisible(false);
+		}
+		if (!logs.isEmpty()) {
+			logView.setVisible(false);
+			logView.setList(logs).setVisible(true);
+		}
+		target.add(container);
+		super.onOpen(target);
+	}
+	
+	public void onClose(AjaxRequestTarget target, DialogButton button) {
+	}
+	
+	@Override
+	protected List<DialogButton> getButtons() {
+		return new ArrayList<DialogButton>();
+	}
+}

Added: openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.html?rev=1563761&view=auto
==============================================================================
--- openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.html (added)
+++ openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.html Mon Feb  3 02:37:57 2014
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+  
+-->
+<html xmlns:wicket="http://wicket.apache.org">
+<wicket:panel>
+	<div class="recording item"><span wicket:id="name" class="name"></span><span wicket:id="errors" class="errors"></span></div>
+</wicket:panel>
+</html>

Added: openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.java?rev=1563761&view=auto
==============================================================================
--- openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.java (added)
+++ openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingPanel.java Mon Feb  3 02:37:57 2014
@@ -0,0 +1,52 @@
+/*
+ * 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.user.record;
+
+import static org.apache.openmeetings.util.OmFileHelper.MP4_EXTENSION;
+import static org.apache.openmeetings.util.OmFileHelper.isRecordingExists;
+import static org.apache.openmeetings.web.app.Application.getBean;
+
+import org.apache.openmeetings.db.dao.record.FlvRecordingLogDao;
+import org.apache.openmeetings.db.entity.record.FlvRecording;
+import org.apache.wicket.ajax.AjaxEventBehavior;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.IModel;
+
+public class RecordingPanel extends Panel {
+	private static final long serialVersionUID = 1L;
+
+	public RecordingPanel(String id, final IModel<FlvRecording> model, final RecordingErrorsDialog errorsDialog) {
+		super(id, model);
+		add(new Label("name", model.getObject().getFileName()));
+		long errorCount = getBean(FlvRecordingLogDao.class).countErrors(model.getObject().getFlvRecordingId());
+		boolean visible = errorCount != 0 || !isRecordingExists(model.getObject().getFileHash() + MP4_EXTENSION);
+		add(new WebMarkupContainer("errors").add(new AjaxEventBehavior("click") {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void onEvent(AjaxRequestTarget target) {
+				errorsDialog.setDefaultModel(model);
+				errorsDialog.open(target);
+			}
+		}).setVisible(visible));
+	}
+}

Modified: openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.html?rev=1563761&r1=1563760&r2=1563761&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.html (original)
+++ openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.html Mon Feb  3 02:37:57 2014
@@ -55,5 +55,6 @@
 		</tr>
 	</table>
 	<div wicket:id="addFolder"></div>
+	<div wicket:id="errors"></div>
 </wicket:panel>
 </html>

Modified: openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java?rev=1563761&r1=1563760&r2=1563761&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java (original)
+++ openmeetings/trunk/singlewebapp/src/web/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java Mon Feb  3 02:37:57 2014
@@ -18,7 +18,8 @@
  */
 package org.apache.openmeetings.web.user.record;
 
-import static org.apache.openmeetings.util.OmFileHelper.getMp4Recording;
+import static org.apache.openmeetings.util.OmFileHelper.MP4_EXTENSION;
+import static org.apache.openmeetings.util.OmFileHelper.isRecordingExists;
 import static org.apache.openmeetings.web.app.Application.getBean;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 
@@ -57,6 +58,7 @@ public class RecordingsPanel extends Use
 	private final VideoInfo info = new VideoInfo("info");
 	private final RecordingTree myTree;
 	private final IModel<FlvRecording> rm = new CompoundPropertyModel<FlvRecording>(new FlvRecording());
+	private final RecordingErrorsDialog errorsDialog = new RecordingErrorsDialog("errors", Model.of((FlvRecording)null));
 	private RecordingTree selected;
 
 	public RecordingsPanel(String id) {
@@ -122,7 +124,7 @@ public class RecordingsPanel extends Use
 			);
 		add(new Label("homeSize", ""));
 		add(new Label("publicSize", ""));
-		add(video, info);
+		add(video, info, errorsDialog);
 	}
 
 	//FIXME need to be generalized to use as Room files explorer
@@ -162,7 +164,11 @@ public class RecordingsPanel extends Use
 							}
 						};
 					} else {
-						return super.newLabelComponent(id, lm);
+						if (r.getFlvRecordingId() > 0) {
+							return new RecordingPanel(id, lm, errorsDialog);
+						} else {
+							return super.newLabelComponent(id, lm);
+						}
 					}
 				}
 				
@@ -209,7 +215,7 @@ public class RecordingsPanel extends Use
 						style = "public-recordings om-icon";
 					} else {
 						style = t.getIsFolder() ? super.getOtherStyleClass(t)
-								: (getMp4Recording(t.getFileHash()).exists() ? "recording om-icon" : "broken-recording om-icon");
+								: (isRecordingExists(t.getFileHash() + MP4_EXTENSION) ? "recording om-icon" : "broken-recording om-icon");
 					}
 					if (isSelected()) {
 						style += " selected";