Package org.dspace.app.cris.batch

Source Code of org.dspace.app.cris.batch.ScriptDeleteRP

/**
* 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();
        }

    }

}
TOP

Related Classes of org.dspace.app.cris.batch.ScriptDeleteRP

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.