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 2012/07/18 18:14:48 UTC

svn commit: r1362997 - in /incubator/openmeetings/trunk/singlewebapp: docs/ src/org/openmeetings/app/data/flvrecord/ src/org/openmeetings/app/persistence/beans/flvrecord/ src/org/openmeetings/cli/ xdocs/

Author: solomax
Date: Wed Jul 18 16:14:48 2012
New Revision: 1362997

URL: http://svn.apache.org/viewvc?rev=1362997&view=rev
Log:
OPENMEETINGS-111 file options of command-line admin are improved, cleanup switch is added

Modified:
    incubator/openmeetings/trunk/singlewebapp/docs/CommandLineAdmin.html
    incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/FlvRecordingDaoImpl.java
    incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/persistence/beans/flvrecord/FlvRecording.java
    incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/Admin.java
    incubator/openmeetings/trunk/singlewebapp/xdocs/CommandLineAdmin.xml

Modified: incubator/openmeetings/trunk/singlewebapp/docs/CommandLineAdmin.html
URL: http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/docs/CommandLineAdmin.html?rev=1362997&r1=1362996&r2=1362997&view=diff
==============================================================================
--- incubator/openmeetings/trunk/singlewebapp/docs/CommandLineAdmin.html (original)
+++ incubator/openmeetings/trunk/singlewebapp/docs/CommandLineAdmin.html Wed Jul 18 16:14:48 2012
@@ -651,6 +651,7 @@ limitations under the License.
 <span style="margin-left: 100px;">--db-pass &lt;arg&gt;                (optional) Password of the user with write access to the DB specified</span><br />
 --------------------------------------------------------------------------------------------------<br />
  -f,--files                          File operations - statictics/cleanup<br />
+<span style="margin-left: 100px;">--cleanup                      (optional) Should intermediate files be clean up</span><br />
 --------------------------------------------------------------------------------------------------<br />
 				</div>
 			</div>

Modified: incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/FlvRecordingDaoImpl.java
URL: http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/FlvRecordingDaoImpl.java?rev=1362997&r1=1362996&r2=1362997&view=diff
==============================================================================
--- incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/FlvRecordingDaoImpl.java (original)
+++ incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/FlvRecordingDaoImpl.java Wed Jul 18 16:14:48 2012
@@ -64,6 +64,22 @@ public class FlvRecordingDaoImpl {
 		return null;
 	}
 
+	public FlvRecording getRecordingByHash(String hash) {
+		try {
+			TypedQuery<FlvRecording> query = em.createNamedQuery("getRecordingByHash", FlvRecording.class);
+			query.setParameter("fileHash", hash);
+			
+			try {
+				return query.getSingleResult();
+		    } catch (NoResultException ex) {
+		    	//noop
+		    }
+		} catch (Exception ex2) {
+			log.error("[getRecordingByHash]: ",ex2);
+		}
+		return null;
+	}
+
 	public List<FlvRecording> getFlvRecordings() {
 		try { 
 			

Modified: incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/persistence/beans/flvrecord/FlvRecording.java
URL: http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/persistence/beans/flvrecord/FlvRecording.java?rev=1362997&r1=1362996&r2=1362997&view=diff
==============================================================================
--- incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/persistence/beans/flvrecord/FlvRecording.java (original)
+++ incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/persistence/beans/flvrecord/FlvRecording.java Wed Jul 18 16:14:48 2012
@@ -31,10 +31,15 @@ import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 import javax.persistence.Transient;
 
 @Entity
+@NamedQueries({
+	@NamedQuery(name = "getRecordingByHash", query = "SELECT f FROM FlvRecording f WHERE f.fileHash = :fileHash")
+})
 @Table(name = "flvrecording")
 public class FlvRecording implements Serializable {
 	

Modified: incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/Admin.java
URL: http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/Admin.java?rev=1362997&r1=1362996&r2=1362997&view=diff
==============================================================================
--- incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/Admin.java (original)
+++ incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/Admin.java Wed Jul 18 16:14:48 2012
@@ -47,11 +47,13 @@ import org.apache.commons.cli.PosixParse
 import org.apache.commons.transaction.util.FileHelper;
 import org.apache.openjpa.jdbc.meta.MappingTool;
 import org.openmeetings.app.data.file.dao.FileExplorerItemDaoImpl;
+import org.openmeetings.app.data.flvrecord.FlvRecordingDaoImpl;
 import org.openmeetings.app.data.user.dao.UsersDaoImpl;
 import org.openmeetings.app.documents.InstallationDocumentHandler;
 import org.openmeetings.app.installation.ImportInitvalues;
 import org.openmeetings.app.installation.InstallationConfig;
 import org.openmeetings.app.persistence.beans.files.FileExplorerItem;
+import org.openmeetings.app.persistence.beans.flvrecord.FlvRecording;
 import org.openmeetings.app.persistence.beans.user.Users;
 import org.openmeetings.servlet.outputhandler.BackupExport;
 import org.openmeetings.servlet.outputhandler.BackupImportController;
@@ -120,6 +122,8 @@ public class Admin {
 		options.addOption(new OmOption("i", null, "force", false, "Install without checking the existence of old data in the database.", true));
 		//languages
 		options.addOption(new OmOption("l", "lang", "language", true, "Single language to be imported (id or name)", true));
+		//files
+		options.addOption(new OmOption("f", null, "cleanup", false, "Should intermediate files be clean up", true));
 		
 		return options;
 	}
@@ -404,11 +408,12 @@ public class Admin {
 				}
 				break;
 			case languages:
-				System.out.println("All language file will be reimported");
+				System.out.println("All language files will be reimported");
 				try {
 					ImportInitvalues importInit = getApplicationContext(ctxName).getBean(ImportInitvalues.class);
 					if (cmdl.hasOption("lang")) {
 						String lang = cmdl.getOptionValue("lang");
+						System.out.println("Only '" + lang + "' language will be reimported");
 						try {
 							int id = Integer.parseInt(lang);
 							importInit.loadLanguagesFile(id);
@@ -416,6 +421,7 @@ public class Admin {
 							importInit.loadLanguagesFile(lang);
 						}
 					} else {
+						System.out.println("All language files will be reimported");
 						importInit.loadLanguagesFiles();
 					}
 				} catch (Exception e) {
@@ -424,6 +430,10 @@ public class Admin {
 				break;
 			case files:
 				try {
+					boolean cleanup = cmdl.hasOption("cleanup");
+					if (cleanup) {
+						System.out.println("WARNING: all intermadiate files will be clean up!");
+					}
 					StringBuilder report = new StringBuilder();
 					report.append("Temporary files allocates: ").append(OmFileHelper.getHumanSize(OmFileHelper.getUploadTempDir())).append("\n");
 					{ //UPLOAD
@@ -440,9 +450,17 @@ public class Admin {
 							long userId = getUserIdByProfile(profile.getName());
 							Users u = udao.getUser(userId);
 							if (profile.isFile() || userId < 0 || u == null) {
-								invalid += pSize;
+								if (cleanup) {
+									FileHelper.removeRec(profile);
+								} else {
+									invalid += pSize;
+								}
 							} else if ("true".equals(u.getDeleted())) {
-								deleted += pSize;
+								if (cleanup) {
+									FileHelper.removeRec(profile);
+								} else {
+									deleted += pSize;
+								}
 							}
 						}
 						long missing = 0;
@@ -474,9 +492,17 @@ public class Admin {
 							long fSize = OmFileHelper.getSize(f);
 							FileExplorerItem item = fileDao.getFileExplorerItemsByHash(f.getName());
 							if (item == null) {
-								invalid += fSize;
+								if (cleanup) {
+									FileHelper.removeRec(f);
+								} else {
+									invalid += fSize;
+								}
 							} else if ("true".equals(item.getDeleted())) {
-								deleted += fSize;
+								if (cleanup) {
+									FileHelper.removeRec(f);
+								} else {
+									deleted += fSize;
+								}
 							}
 						}
 						missing = 0;
@@ -492,18 +518,62 @@ public class Admin {
 						report.append("\t\trest: ").append(OmFileHelper.getHumanSize(restSize)).append("\n");
 					}
 					{ //STREAMS
-						long sectionSize = OmFileHelper.getSize(OmFileHelper.getStreamsDir());
+						File streamsDir = OmFileHelper.getStreamsDir();
+						File hibernateDir = OmFileHelper.getStreamsHibernateDir();
+						if (cleanup) {
+							String hiberPath = hibernateDir.getCanonicalPath();
+							for (File f : streamsDir.listFiles()) {
+								if (!f.getCanonicalPath().equals(hiberPath)) {
+									FileHelper.removeRec(f);
+								}
+							}
+						}
+						long sectionSize = OmFileHelper.getSize(streamsDir);
 						report.append("Recordings allocates: ").append(OmFileHelper.getHumanSize(sectionSize)).append("\n");
-						long size = OmFileHelper.getSize(OmFileHelper.getStreamsHibernateDir());
+						long size = OmFileHelper.getSize(hibernateDir);
 						long restSize = sectionSize - size;
+						FlvRecordingDaoImpl recordDao = ctx.getBean(FlvRecordingDaoImpl.class);
+						long[] params = {0, 0}; // [0] == deleted [1] == missing
+						for (FlvRecording rec : recordDao.getAllFlvRecordings()) {
+							checkRecordingFile(hibernateDir, rec.getFileHash(), rec.getDeleted(), params, cleanup);
+							checkRecordingFile(hibernateDir, rec.getAlternateDownload(), rec.getDeleted(), params, cleanup);
+							checkRecordingFile(hibernateDir, rec.getPreviewImage(), rec.getDeleted(), params, cleanup);
+						}
+						long invalid = 0;
+						for (File f : hibernateDir.listFiles()) {
+							if (f.isFile() && f.getName().endsWith(".flv")) {
+								FlvRecording rec = recordDao.getRecordingByHash(f.getName());
+								if (rec == null) {
+									if (cleanup) {
+										FileHelper.removeRec(f);
+									} else {
+										invalid += f.length();
+									}
+									String name = f.getName().substring(0, f.getName().length() - 5);
+									File rfa = new File(hibernateDir, name + ".avi");
+									if (rfa.exists()) {
+										if (cleanup) {
+											FileHelper.removeRec(rfa);
+										} else {
+											invalid += rfa.length();
+										}
+									}
+									File rfj = new File(hibernateDir, name + ".jpg");
+									if (rfj.exists()) {
+										if (cleanup) {
+											FileHelper.removeRec(rfj);
+										} else {
+											invalid += rfj.length();
+										}
+									}
+								}
+							}
+						}
 						report.append("\t\tfinal: ").append(OmFileHelper.getHumanSize(size)).append("\n");
+						report.append("\t\t\tinvalid: ").append(OmFileHelper.getHumanSize(invalid)).append("\n");
+						report.append("\t\t\tdeleted: ").append(OmFileHelper.getHumanSize(params[0])).append("\n");
+						report.append("\t\t\tmissing count: ").append(params[1]).append("\n");
 						report.append("\t\trest: ").append(OmFileHelper.getHumanSize(restSize)).append("\n");
-						
-						//public/private recordings
-						//Object: flvrecording_metadata == possibly incomplete
-						//Object: flvrecording == final
-						//webapps/openmeetings/streams/<room_id>/rec_<id>*				-->temporary files
-						//webapps/openmeetings/streams/hibernate/flvRecording_<id>*		-->files
 					}
 					System.out.println(report);
 				} catch (Exception e) {
@@ -520,6 +590,22 @@ public class Admin {
 		System.exit(0);
 	}
 	
+	private void checkRecordingFile(File hibernateDir, String name, String deleted, long[] params, boolean cleanup) {
+		File flv = name != null ? new File(hibernateDir, name) : null;
+		if (flv != null) {
+			if (flv.exists() && flv.isFile()) {
+				if ("true".equals(deleted)) {
+					params[0] += flv.length();
+					if (cleanup) {
+						FileHelper.removeRec(flv);
+					}
+				}
+			} else {
+				params[1]++;
+			}
+		}
+	}
+	
 	private long getUserIdByProfile(String name) {
 		long result = -1;
 		if (name.startsWith(OmFileHelper.profilesPrefix)) {

Modified: incubator/openmeetings/trunk/singlewebapp/xdocs/CommandLineAdmin.xml
URL: http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/xdocs/CommandLineAdmin.xml?rev=1362997&r1=1362996&r2=1362997&view=diff
==============================================================================
--- incubator/openmeetings/trunk/singlewebapp/xdocs/CommandLineAdmin.xml (original)
+++ incubator/openmeetings/trunk/singlewebapp/xdocs/CommandLineAdmin.xml Wed Jul 18 16:14:48 2012
@@ -57,6 +57,7 @@
 <span style="margin-left: 100px;">--db-pass &lt;arg&gt;                (optional) Password of the user with write access to the DB specified</span><br/>
 --------------------------------------------------------------------------------------------------<br/>
  -f,--files                          File operations - statictics/cleanup<br/>
+<span style="margin-left: 100px;">--cleanup                      (optional) Should intermediate files be clean up</span><br/>
 --------------------------------------------------------------------------------------------------<br/>
 				</div>
 			</div>