Package org.dspace.app.cris.discovery

Source Code of org.dspace.app.cris.discovery.CrisItemEnhancerUtility

/**
* 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.discovery;

import it.cilea.osd.jdyna.model.ANestedPropertiesDefinition;
import it.cilea.osd.jdyna.model.ANestedProperty;
import it.cilea.osd.jdyna.model.ATypeNestedObject;
import it.cilea.osd.jdyna.model.PropertiesDefinition;
import it.cilea.osd.jdyna.model.Property;

import java.beans.PropertyEditor;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.dspace.app.cris.model.ACrisObject;
import org.dspace.app.cris.model.jdyna.ACrisNestedObject;
import org.dspace.app.cris.service.ApplicationService;
import org.dspace.app.cris.util.ResearcherPageUtils;
import org.dspace.content.DCValue;
import org.dspace.content.Item;
import org.dspace.content.authority.Choices;
import org.dspace.content.authority.MetadataAuthorityManager;
import org.dspace.utils.DSpace;

public class CrisItemEnhancerUtility
{
    private static final Logger log = Logger
            .getLogger(CrisItemEnhancerUtility.class);

    public static List<String> getAllCrisMetadata()
    {
        DSpace dspace = new DSpace();
        List<String> result = new ArrayList<String>();
        List<CrisItemEnhancer> enhancers = dspace.getServiceManager()
                .getServicesByType(CrisItemEnhancer.class);
        if (enhancers != null)
        {
            for (CrisItemEnhancer enhancer : enhancers)
            {
                for (String qual : enhancer.getQualifiers2path().keySet())
                {
                    result.add("crisitem." + enhancer.getAlias() + "." + qual);
                }
            }
        }
        return result;
    }

    public static List<DCValue> getCrisMetadata(Item item, String metadata)
    {
        StringTokenizer dcf = new StringTokenizer(metadata, ".");

        String[] tokens = { "", "", "" };
        int i = 0;
        while (dcf.hasMoreTokens())
        {
            tokens[i] = dcf.nextToken().trim();
            i++;
        }
        String schema = tokens[0];
        String element = tokens[1];
        String qualifier = tokens[2];

        if (!"crisitem".equals(schema))
        {
            return null;
        }
        if (element == null)
        {
            log.error("Wrong configuration asked for crisitem metadata with null element");
        }

        List<CrisItemEnhancer> enhancers = getEnhancers(element);
        List<DCValue> result = new ArrayList<DCValue>();
        if (Item.ANY.equals(qualifier))
        {
            for (CrisItemEnhancer enh : enhancers)
            {
                Set<String> qualifiers = enh.getQualifiers2path().keySet();
                for (String qual : qualifiers)
                {
                    List<String[]> vals = getCrisMetadata(item, enh, qual);
                    for (String[] e : vals)
                    {
                        DCValue dc = new DCValue();
                        dc.schema = "crisitem";
                        dc.element = enh.getAlias();
                        dc.qualifier = qual;
                        dc.value = e[0];
                        dc.authority = e[1];
                        dc.confidence = StringUtils.isNotEmpty(e[1])?Choices.CF_ACCEPTED:Choices.CF_UNSET;
                        result.add(dc);
                    }
                }
            }

        }
        else if ("".equals(qualifier))
        {
            if (qualifier == null)
            {
                log.error("Wrong configuration asked for unqualified crisitem."
                        + element
                        + " metadata. All crisitem metadata MUST BE qualified");
            }
            return null;
        }
        else
        {
            for (CrisItemEnhancer enh : enhancers)
            {
                List<String[]> vals = getCrisMetadata(item, enh, qualifier);
                for (String[] e : vals)
                {
                    DCValue dc = new DCValue();
                    dc.schema = "crisitem";
                    dc.element = enh.getAlias();
                    dc.qualifier = qualifier;
                    dc.value = e[0];
                    dc.authority = e[1];
                    dc.confidence = StringUtils.isNotEmpty(e[1])?Choices.CF_ACCEPTED:Choices.CF_UNSET;
                    result.add(dc);
                }
            }
        }
        return result;
    }

    private static List<String[]> getCrisMetadata(Item item,
            CrisItemEnhancer enh, String qualifier)
    {
        List<String> mdList = enh.getMetadata();
        Set<String> validAuthorities = new HashSet<String>();
        MetadataAuthorityManager mam = MetadataAuthorityManager.getManager();

        for (String md : mdList)
        {
            DCValue[] dcvalues = item.getMetadata(md);
            for (DCValue dc : dcvalues)
            {
                try
                {
                    if (dc.authority != null
                            && dc.authority.startsWith(
                                    enh.getClazz().newInstance().getAuthorityPrefix()))
                    {
                        if (mam.getMinConfidence(dc.schema, dc.element,
                                dc.qualifier) <= dc.confidence)
                        {
                            validAuthorities.add(dc.authority);
                        }
                    }
                }
                catch (InstantiationException e)
                {
                   log.error(e.getMessage(), e);
                }
                catch (IllegalAccessException e)
                {
                    log.error(e.getMessage(), e);
                }
            }
        }

        List<String[]> result = new ArrayList<String[]>();
        if (validAuthorities.size() > 0)
        {
            DSpace dspace = new DSpace();
            String path = enh.getQualifiers2path().get(qualifier);
            ApplicationService as = dspace.getServiceManager()
                    .getServiceByName("applicationService",
                            ApplicationService.class);
            for (String authKey : validAuthorities)
            {

                result.addAll(getPathAsMetadata(as, as.get(enh.getClazz(),
                        ResearcherPageUtils
                                .getRealPersistentIdentifier(authKey,enh.getClazz())), path));
            }

        }
        return result;
    }

    private static <P extends Property<TP>, TP extends PropertiesDefinition, NP extends ANestedProperty<NTP>, NTP extends ANestedPropertiesDefinition, ACNO extends ACrisNestedObject<NP, NTP, P, TP>, ATNO extends ATypeNestedObject<NTP>> List<String[]> getPathAsMetadata(
            ApplicationService as, ACrisObject<P, TP, NP, NTP, ACNO, ATNO> aCrisObject, String path)
    {
        String[] splitted = path.split("\\.", 2);
        List<String[]> result = new ArrayList<String[]>();
        List<P> props = aCrisObject.getAnagrafica4view().get(splitted[0]);
        if (splitted.length == 2)
        {
            for (P prop : props)
            {
                if (prop.getObject() instanceof ACrisObject)
                {
                    result.addAll(getPathAsMetadata(as,
                            (ACrisObject) prop.getObject(), splitted[1]));
                }
                else
                {
                    log.error("Wrong configuration, asked for path "
                            + splitted[1] + " on a not CRIS Object value.");
                }
            }

        }
        for (P prop : props)
        {
            if (prop.getObject() instanceof ACrisObject)
            {
                ACrisObject val = (ACrisObject) prop.getObject();
                result.add(new String[] { val.getName(),
                        ResearcherPageUtils.getPersistentIdentifier(val) });
            }
            else
            {
                PropertyEditor editor = prop.getTypo().getRendering()
                        .getPropertyEditor(as);
                editor.setValue(prop.getObject());

                result.add(new String[] { editor.getAsText(), null });
            }
        }

        return result;
    }

    private static List<CrisItemEnhancer> getEnhancers(String alias)
    {
        DSpace dspace = new DSpace();
        List<CrisItemEnhancer> enhancers = dspace.getServiceManager()
                .getServicesByType(CrisItemEnhancer.class);
        if (Item.ANY.equals(alias))
        {
            return enhancers;
        }
        List<CrisItemEnhancer> result = new ArrayList<CrisItemEnhancer>();
        for (CrisItemEnhancer enhancer : enhancers)
        {
            if (enhancer.getAlias().equals(alias))
            {
                result.add(enhancer);
            }
        }
        return result;
    }
}
TOP

Related Classes of org.dspace.app.cris.discovery.CrisItemEnhancerUtility

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.