diff --git a/dspace-api/src/main/java/org/dspace/health/Check.java b/dspace-api/src/main/java/org/dspace/health/Check.java index fb61fc2cb9..66a2ca22b5 100644 --- a/dspace-api/src/main/java/org/dspace/health/Check.java +++ b/dspace-api/src/main/java/org/dspace/health/Check.java @@ -4,8 +4,6 @@ * tree and available online at * * http://www.dspace.org/license/ - * - * by lindat-dev team */ package org.dspace.health; @@ -13,6 +11,7 @@ import org.apache.log4j.Logger; /** * Abstract check interface. + * @author LINDAT/CLARIN dev team */ public abstract class Check { diff --git a/dspace-api/src/main/java/org/dspace/health/ChecksumCheck.java b/dspace-api/src/main/java/org/dspace/health/ChecksumCheck.java index f231c817b2..045e4df29b 100644 --- a/dspace-api/src/main/java/org/dspace/health/ChecksumCheck.java +++ b/dspace-api/src/main/java/org/dspace/health/ChecksumCheck.java @@ -4,8 +4,6 @@ * tree and available online at * * http://www.dspace.org/license/ - * - * by lindat-dev team */ package org.dspace.health; @@ -18,6 +16,9 @@ import java.util.Calendar; import java.util.Date; import java.util.List; +/** + * @author LINDAT/CLARIN dev team + */ public class ChecksumCheck extends Check { @Override @@ -27,9 +28,6 @@ public class ChecksumCheck extends Check { Date process_start = Calendar.getInstance().getTime(); checker.setProcessStartDate(process_start); checker.setDispatcher( - // new LimitedCountDispatcher(new SimpleDispatcher(new - // BitstreamInfoDAO(), null, false), 1) - // loop through all files new SimpleDispatcher(new BitstreamInfoDAO(), process_start, false)); md5_collector collector = new md5_collector(); diff --git a/dspace-api/src/main/java/org/dspace/health/Core.java b/dspace-api/src/main/java/org/dspace/health/Core.java index f67afb7adf..df83ee4070 100644 --- a/dspace-api/src/main/java/org/dspace/health/Core.java +++ b/dspace-api/src/main/java/org/dspace/health/Core.java @@ -4,66 +4,82 @@ * tree and available online at * * http://www.dspace.org/license/ - * - * by lindat-dev team */ package org.dspace.health; import org.apache.commons.io.FileUtils; -import org.dspace.content.Community; -import org.dspace.content.Item; -import org.dspace.content.ItemIterator; -import org.dspace.content.Metadatum; +import org.dspace.app.util.CollectionDropDown; +import org.dspace.content.*; +import org.dspace.content.Collection; import org.dspace.core.Context; import org.dspace.storage.rdbms.DatabaseManager; import org.dspace.storage.rdbms.TableRow; import org.dspace.storage.rdbms.TableRowIterator; import java.sql.SQLException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +/** + * @author LINDAT/CLARIN dev team + */ public class Core { // get info // public static String getCollectionSizesInfo() throws SQLException { - String ret = ""; + final StringBuffer ret = new StringBuffer(); List rows = sql( - "SELECT " - + "(SELECT text_value FROM metadatavalue " - + "WHERE metadata_field_id=64 AND resource_type_id=3 AND resource_id=col.collection_id) AS name, " - + "SUM(bit.size_bytes) AS sum " - + "FROM collection2item col, item2bundle item, bundle2bitstream bun, bitstream bit " - + "WHERE col.item_id=item.item_id AND item.bundle_id=bun.bundle_id AND bun.bitstream_id=bit.bitstream_id " - + "GROUP BY col.collection_id;"); + "SELECT" + + "(SELECT text_value FROM metadatavalue NATURAL JOIN metadatafieldregistry " + + "NATURAL JOIN metadataschemaregistry WHERE element='title' AND qualifier IS NULL AND short_id='dc'" + + " AND resource_type_id=3 AND resource_id=col.collection_id) AS name," + + "SUM(bit.size_bytes) AS sum," + + " collection_id" + + " FROM collection2item col, item2bundle item, bundle2bitstream bun, bitstream bit" + + " WHERE col.item_id=item.item_id AND item.bundle_id=bun.bundle_id AND bun.bitstream_id=bit.bitstream_id " + + "GROUP BY col.collection_id;" + ); long total_size = 0; + final Context context = new Context(); + Collections.sort(rows, new Comparator() { + @Override + public int compare(TableRow o1, TableRow o2) { + try { + return CollectionDropDown.collectionPath(Collection.find(context, o1.getIntColumn("collection_id"))).compareTo( + CollectionDropDown.collectionPath(Collection.find(context, o2.getIntColumn("collection_id"))) + ); + } catch (Exception e) { + ret.append(e.getMessage()); + } + return 0; + } + }); for (TableRow row : rows) { - double size = row.getLongColumn("sum") / (1024. * 1024.); + double size = row.getLongColumn("sum"); total_size += size; - ret += String.format( - "\t%s: %s\n", row.getStringColumn("name"), FileUtils.byteCountToDisplaySize((long)size)); + Collection col = Collection.find(context, row.getIntColumn("collection_id")); + ret.append(String.format( + "\t%s: %s\n", CollectionDropDown.collectionPath(col), FileUtils.byteCountToDisplaySize((long) size))); } - ret += String.format( - "Total size: %s\n", FileUtils.byteCountToDisplaySize(total_size)); + context.abort(); + ret.append(String.format( + "Total size: %s\n", FileUtils.byteCountToDisplaySize(total_size))); - ret += String.format( - "Resource without policy: %d\n", getBitstreamsWithoutPolicyCount()); + ret.append(String.format( + "Resource without policy: %d\n", getBitstreamsWithoutPolicyCount())); - ret += String.format( - "Deleted bitstreams: %d\n", getBitstreamsDeletedCount()); + ret.append(String.format( + "Deleted bitstreams: %d\n", getBitstreamsDeletedCount())); rows = getBitstreamOrphansRows(); String list_str = ""; for (TableRow row : rows) { list_str += String.format("%d, ", row.getIntColumn("bitstream_id")); } - ret += String.format( - "Orphan bitstreams: %d [%s]\n", rows.size(), list_str); + ret.append(String.format( + "Orphan bitstreams: %d [%s]\n", rows.size(), list_str)); - return ret; + return ret.toString(); } public static String getObjectSizesInfo() throws SQLException { @@ -183,13 +199,14 @@ public class Core { Context c = new Context(); TableRowIterator irows = DatabaseManager .query(c, - "SELECT eperson_group_id, " - + "(SELECT text_value FROM metadatavalue " - + "WHERE metadata_field_id=64 AND resource_type_id=6 AND resource_id=eperson_group_id) AS name " - + "FROM epersongroup " - + "WHERE eperson_group_id NOT IN (SELECT eperson_group_id FROM epersongroup2eperson)"); + "SELECT eperson_group_id," + + "(SELECT text_value FROM metadatavalue NATURAL JOIN metadatafieldregistry" + + " NATURAL JOIN metadataschemaregistry WHERE element='title'" + + " AND qualifier IS NULL AND short_id='dc' AND resource_type_id=6 AND resource_id=eperson_group_id) AS name "+ + "FROM epersongroup " + + "WHERE eperson_group_id NOT IN (SELECT eperson_group_id FROM epersongroup2eperson)"); for (TableRow row : irows.toList()) { - ret.add( row.getStringColumn("name") ); + ret.add(String.format("id=%s;name=%s", row.getIntColumn("eperson_group_id"), row.getStringColumn("name") )); } c.complete(); return ret; diff --git a/dspace-api/src/main/java/org/dspace/health/EmbargoCheck.java b/dspace-api/src/main/java/org/dspace/health/EmbargoCheck.java index 23e839ebf8..66ec542387 100644 --- a/dspace-api/src/main/java/org/dspace/health/EmbargoCheck.java +++ b/dspace-api/src/main/java/org/dspace/health/EmbargoCheck.java @@ -4,8 +4,6 @@ * tree and available online at * * http://www.dspace.org/license/ - * - * by lindat-dev team */ package org.dspace.health; @@ -19,6 +17,9 @@ import org.dspace.embargo.service.EmbargoService; import java.sql.SQLException; import java.util.Iterator; +/** + * @author LINDAT/CLARIN dev team + */ public class EmbargoCheck extends Check { private static final EmbargoService embargoService = EmbargoServiceFactory.getInstance().getEmbargoService(); diff --git a/dspace-api/src/main/java/org/dspace/health/InfoCheck.java b/dspace-api/src/main/java/org/dspace/health/InfoCheck.java index 23e1efa9e9..3411d23e76 100644 --- a/dspace-api/src/main/java/org/dspace/health/InfoCheck.java +++ b/dspace-api/src/main/java/org/dspace/health/InfoCheck.java @@ -4,8 +4,6 @@ * tree and available online at * * http://www.dspace.org/license/ - * - * by lindat-dev team */ package org.dspace.health; @@ -16,6 +14,9 @@ import org.dspace.core.ConfigurationManager; import java.io.File; import java.util.Date; +/** + * @author LINDAT/CLARIN dev team + */ public class InfoCheck extends Check { @Override @@ -27,9 +28,9 @@ public class InfoCheck extends Check { ).append("\n"); sb.append("From - Till: ").append( - new SimpleDateFormat("MM/dd/yyyy").format(ri.from().getTime()) + new SimpleDateFormat("yyyy-MM-dd").format(ri.from().getTime()) ).append(" - ").append( - new SimpleDateFormat("MM/dd/yyyy").format(ri.till().getTime()) + new SimpleDateFormat("yyyy-MM-dd").format(ri.till().getTime()) ).append("\n"); sb.append("Url: ").append( diff --git a/dspace-api/src/main/java/org/dspace/health/ItemCheck.java b/dspace-api/src/main/java/org/dspace/health/ItemCheck.java index 6c06c93717..5715d3e69d 100644 --- a/dspace-api/src/main/java/org/dspace/health/ItemCheck.java +++ b/dspace-api/src/main/java/org/dspace/health/ItemCheck.java @@ -4,8 +4,6 @@ * tree and available online at * * http://www.dspace.org/license/ - * - * by lindat-dev team */ package org.dspace.health; @@ -15,6 +13,9 @@ import org.dspace.storage.rdbms.TableRow; import java.sql.SQLException; import java.util.Map; +/** + * @author LINDAT/CLARIN dev team + */ public class ItemCheck extends Check { @Override @@ -23,7 +24,7 @@ public class ItemCheck extends Check { int tot_cnt = 0; try { for (Map.Entry name_count : Core.getCommunities()) { - ret += String.format("Collection [%s]: %d\n", + ret += String.format("Community [%s]: %d\n", name_count.getKey(), name_count.getValue()); tot_cnt += name_count.getValue(); } diff --git a/dspace-api/src/main/java/org/dspace/health/LogAnalyserCheck.java b/dspace-api/src/main/java/org/dspace/health/LogAnalyserCheck.java index bc80cc7242..c293a62ad9 100644 --- a/dspace-api/src/main/java/org/dspace/health/LogAnalyserCheck.java +++ b/dspace-api/src/main/java/org/dspace/health/LogAnalyserCheck.java @@ -4,8 +4,6 @@ * tree and available online at * * http://www.dspace.org/license/ - * - * by lindat-dev team */ package org.dspace.health; @@ -17,6 +15,9 @@ import java.text.SimpleDateFormat; import java.util.HashMap; import java.util.Map; +/** + * @author LINDAT/CLARIN dev team + */ public class LogAnalyserCheck extends Check { final static private String[][] interesting_fields = new String[][] { @@ -56,7 +57,7 @@ public class LogAnalyserCheck extends Check { sb.append( String.format("%-17s: %s\n", info[1], info_map.get(info[0])) ); } sb.append( String.format("Items added since [%s] (db): %s\n", - new SimpleDateFormat("MM/dd/yyyy").format(ri.from().getTime()), + new SimpleDateFormat("yyyy-MM-dd").format(ri.from().getTime()), LogAnalyser.getNumItems(c))); c.complete(); diff --git a/dspace-api/src/main/java/org/dspace/health/Report.java b/dspace-api/src/main/java/org/dspace/health/Report.java index 37f2cffb48..61d3dd83e6 100644 --- a/dspace-api/src/main/java/org/dspace/health/Report.java +++ b/dspace-api/src/main/java/org/dspace/health/Report.java @@ -4,15 +4,10 @@ * tree and available online at * * http://www.dspace.org/license/ - * - * by lindat-dev team */ package org.dspace.health; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; -import org.apache.commons.cli.PosixParser; +import org.apache.commons.cli.*; import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.log4j.Logger; import org.dspace.core.ConfigurationManager; @@ -23,6 +18,9 @@ import java.text.SimpleDateFormat; import java.util.*; import java.util.Map.Entry; +/** + * @author LINDAT/CLARIN dev team + */ public class Report { private static Logger log = Logger.getLogger(Report.class); @@ -147,7 +145,9 @@ public class Report { for (String check_name: checks().keySet()) { checks_summary += String.format( "%d. %s\n", pos++, check_name ); } - System.out.println( "Available checks:\n" + checks_summary ); + HelpFormatter formatter = new HelpFormatter(); + formatter.printHelp("dspace healthcheck", options); + System.out.println( "\nAvailable checks:\n" + checks_summary ); return; } @@ -198,6 +198,7 @@ public class Report { email.send(); } catch (Exception e) { log.fatal("Error sending email:", e); + System.err.println("Error sending email:\n" + e.getMessage()); System.exit(1); } } diff --git a/dspace-api/src/main/java/org/dspace/health/ReportInfo.java b/dspace-api/src/main/java/org/dspace/health/ReportInfo.java index 1fb0705d71..4a63d1989c 100644 --- a/dspace-api/src/main/java/org/dspace/health/ReportInfo.java +++ b/dspace-api/src/main/java/org/dspace/health/ReportInfo.java @@ -4,8 +4,6 @@ * tree and available online at * * http://www.dspace.org/license/ - * - * by lindat-dev team */ package org.dspace.health; @@ -18,6 +16,7 @@ import static java.util.Calendar.YEAR; /** * Information about a report run accessible by each check. + * @author LINDAT/CLARIN dev team */ public class ReportInfo { diff --git a/dspace-api/src/main/java/org/dspace/health/UserCheck.java b/dspace-api/src/main/java/org/dspace/health/UserCheck.java index a5f5ede2d2..155cc0868b 100644 --- a/dspace-api/src/main/java/org/dspace/health/UserCheck.java +++ b/dspace-api/src/main/java/org/dspace/health/UserCheck.java @@ -4,8 +4,6 @@ * tree and available online at * * http://www.dspace.org/license/ - * - * by lindat-dev team */ package org.dspace.health; @@ -19,6 +17,9 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +/** + * @author LINDAT/CLARIN dev team + */ public class UserCheck extends Check { @Override