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 <arg>
(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 <arg>
(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>