org.dspace.app.cris.batch.ScriptDeleteRP.java Source code

Java tutorial

Introduction

Here is the source code for org.dspace.app.cris.batch.ScriptDeleteRP.java

Source

/**
 * The contents of this file are subject to the license and copyright
 * detailed in the LICENSE and NOTICE files at the root of the source
 * tree and available online at
 *
 * https://github.com/CILEA/dspace-cris/wiki/License
 */
package org.dspace.app.cris.batch;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.sql.SQLException;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.PosixParser;
import org.apache.log4j.Logger;
import org.dspace.app.cris.integration.RPAuthority;
import org.dspace.app.cris.model.CrisConstants;
import org.dspace.app.cris.model.ResearcherPage;
import org.dspace.app.cris.service.ApplicationService;
import org.dspace.app.cris.util.ResearcherPageUtils;
import org.dspace.authorize.AuthorizeException;
import org.dspace.browse.BrowseEngine;
import org.dspace.browse.BrowseIndex;
import org.dspace.browse.BrowseInfo;
import org.dspace.browse.BrowserScope;
import org.dspace.content.DCValue;
import org.dspace.content.Item;
import org.dspace.content.MetadataField;
import org.dspace.content.MetadataSchema;
import org.dspace.content.authority.Choices;
import org.dspace.core.ConfigurationManager;
import org.dspace.core.Context;
import org.dspace.utils.DSpace;
import org.springframework.context.ApplicationContext;
import org.springframework.context.event.ContextClosedEvent;

public class ScriptDeleteRP {
    private static final String plugInBrowserIndex = ConfigurationManager.getProperty(CrisConstants.CFG_MODULE,
            "researcherpage.browseindex");

    /** log4j logger */
    private static Logger log = Logger.getLogger(ScriptDeleteRP.class);

    private static final String QUESTION_ONE = "Are you sure to continue? (yes/no)";

    private static final String MESSAGE_ONE = "WARNING: this operation can't be undone! Removing the Researcher Page will remove permanently any relations with the items in the HUB. The items will be NOT removed";

    /**
     * Batch script to delete a RP. See the technical documentation for further
     * details.
     */
    public static void main(String[] args) {
        log.info("#### START DELETE: -----" + new Date() + " ----- ####");
        Context dspaceContext = null;
        ApplicationContext context = null;
        try {
            dspaceContext = new Context();
            dspaceContext.turnOffAuthorisationSystem();

            DSpace dspace = new DSpace();
            ApplicationService applicationService = dspace.getServiceManager()
                    .getServiceByName("applicationService", ApplicationService.class);

            CommandLineParser parser = new PosixParser();

            Options options = new Options();
            options.addOption("h", "help", false, "help");

            options.addOption("r", "researcher", true, "RP id to delete");

            options.addOption("s", "silent", false, "no interactive mode");

            CommandLine line = parser.parse(options, args);

            if (line.hasOption('h')) {
                HelpFormatter myhelp = new HelpFormatter();
                myhelp.printHelp("ScriptHKURPDelete \n", options);
                System.out.println("\n\nUSAGE:\n ScriptHKURPDelete -r <id> \n");
                System.out.println("Please note: add -s for no interactive mode");
                System.exit(0);
            }

            Integer rpId = null;
            boolean delete = false;
            boolean silent = line.hasOption('s');
            Item[] items = null;
            if (line.hasOption('r')) {
                rpId = ResearcherPageUtils.getRealPersistentIdentifier(line.getOptionValue("r"),
                        ResearcherPage.class);
                ResearcherPage rp = applicationService.get(ResearcherPage.class, rpId);

                if (rp == null) {
                    if (!silent) {
                        System.out.println("RP not exist...exit");
                    }
                    log.info("RP not exist...exit");
                    System.exit(0);
                }

                log.info("Use browse indexing");

                BrowseIndex bi = BrowseIndex.getBrowseIndex(plugInBrowserIndex);
                // now start up a browse engine and get it to do the work for us
                BrowseEngine be = new BrowseEngine(dspaceContext);

                String authKey = ResearcherPageUtils.getPersistentIdentifier(rp);

                // set up a BrowseScope and start loading the values into it
                BrowserScope scope = new BrowserScope(dspaceContext);
                scope.setBrowseIndex(bi);
                // scope.setOrder(order);
                scope.setFilterValue(authKey);
                scope.setAuthorityValue(authKey);
                scope.setResultsPerPage(Integer.MAX_VALUE);
                scope.setBrowseLevel(1);

                BrowseInfo binfo = be.browse(scope);
                log.debug("Find " + binfo.getResultCount() + "item(s) for the reseracher " + authKey);
                items = binfo.getItemResults(dspaceContext);

                if (!silent && rp != null) {
                    System.out.println(MESSAGE_ONE);

                    // interactive mode
                    System.out.println("Attempting to remove Researcher Page:");
                    System.out.println("StaffNo:" + rp.getSourceID());
                    System.out.println("FullName:" + rp.getFullName());
                    System.out
                            .println("the researcher has " + items.length + " relation(s) with item(s) in the HUB");
                    System.out.println();

                    System.out.println(QUESTION_ONE);
                    InputStreamReader isr = new InputStreamReader(System.in);
                    BufferedReader reader = new BufferedReader(isr);
                    String answer = reader.readLine();
                    if (answer.equals("yes")) {
                        delete = true;
                    } else {
                        System.out.println("Exit without delete");
                        log.info("Exit without delete");
                        System.exit(0);
                    }

                } else {
                    delete = true;
                }
            } else {
                System.out.println("\n\nUSAGE:\n ScriptHKURPDelete <-v> -r <RPid> \n");
                System.out.println("-r option is mandatory");
                log.error("-r option is mandatory");
                System.exit(1);
            }

            if (delete) {
                if (!silent) {
                    System.out.println("Deleting...");
                }
                log.info("Deleting...");
                cleanAuthority(dspaceContext, items, rpId);
                applicationService.delete(ResearcherPage.class, rpId);
                dspaceContext.complete();
            }

            if (!silent) {
                System.out.println("Ok...Bye");
            }
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            throw new RuntimeException(e.getMessage(), e);
        } finally {
            if (dspaceContext != null && dspaceContext.isValid()) {
                dspaceContext.abort();
            }
            if (context != null) {
                context.publishEvent(new ContextClosedEvent(context));
            }
        }
        log.info("#### END: -----" + new Date() + " ----- ####");
        System.exit(0);
    }

    public static void cleanAuthority(Context dspaceContext, Item[] items, Integer rpId)
            throws SQLException, AuthorizeException {
        //find all metadata with authority support
        MetadataField[] fields = MetadataField.findAll(dspaceContext);
        List<MetadataField> fieldsWithAuthoritySupport = new LinkedList<MetadataField>();
        for (MetadataField field : fields) {
            String schema = (MetadataSchema.find(dspaceContext, field.getSchemaID())).getName();
            String mdstring = schema + "." + field.getElement()
                    + (field.getQualifier() == null ? "" : "." + field.getQualifier());
            String choicesPlugin = ConfigurationManager.getProperty("choices.plugin." + mdstring);

            if (choicesPlugin != null) {
                choicesPlugin = choicesPlugin.trim();
            }
            if ((RPAuthority.RP_AUTHORITY_NAME.equals(choicesPlugin))) {
                fieldsWithAuthoritySupport.add(field);
            }
        }

        String authorityKey = ResearcherPageUtils.getPersistentIdentifier(rpId, ResearcherPage.class);
        for (Item item : items) {
            DCValue[] values = null;
            for (MetadataField md : fieldsWithAuthoritySupport) {
                String schema = (MetadataSchema.find(dspaceContext, md.getSchemaID())).getName();

                values = item.getMetadata(schema, md.getElement(), md.getQualifier(), Item.ANY);
                item.clearMetadata(schema, md.getElement(), md.getQualifier(), Item.ANY);
                for (DCValue value : values) {
                    if (authorityKey.equals(value.authority)) {
                        log.debug("remove authority_key " + authorityKey + " in item_id: " + item.getID());
                        value.confidence = Choices.CF_UNSET;
                        value.authority = null;
                    }

                    item.addMetadata(value.schema, value.element, value.qualifier, value.language, value.value,
                            value.authority, value.confidence);
                }
            }
            item.update();
        }

    }

}