org.dspace.app.cris.model.ACrisObject.java Source code

Java tutorial

Introduction

Here is the source code for org.dspace.app.cris.model.ACrisObject.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.model;

import it.cilea.osd.common.core.TimeStampInfo;
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.AValue;
import it.cilea.osd.jdyna.model.PropertiesDefinition;
import it.cilea.osd.jdyna.model.Property;

import java.beans.PropertyEditor;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.MappedSuperclass;

import org.apache.commons.lang.StringUtils;
import org.dspace.app.cris.model.export.ExportConstants;
import org.dspace.app.cris.model.jdyna.ACrisNestedObject;
import org.dspace.app.cris.util.ResearcherPageUtils;
import org.dspace.authorize.AuthorizeException;
import org.dspace.browse.BrowsableDSpaceObject;
import org.dspace.content.DCValue;
import org.dspace.content.DSpaceObject;
import org.dspace.content.authority.Choices;

@MappedSuperclass
public abstract class ACrisObject<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>>
        extends DSpaceObject implements ICrisObject<P, TP>, BrowsableDSpaceObject,
        IExportableDynamicObject<TP, P, ACrisObject<P, TP, NP, NTP, ACNO, ATNO>> {
    /** Cris internal unique identifier, must be null */
    @Column(nullable = true, unique = true)
    private String sourceID;

    /** Cris public unique identifier, must be null */
    @Column(nullable = true, unique = true)
    private String crisID;

    private Boolean status;

    @Column(nullable = false, unique = true)
    private String uuid;

    public ACrisObject() {
        this.status = false;
    }

    public Boolean getStatus() {
        return status;
    }

    public void setStatus(Boolean status) {
        this.status = status;
    }

    public void setUuid(String uuid) {
        this.uuid = uuid;
    }

    public String getUuid() {
        return uuid;
    }

    public void setSourceID(String sourceID) {
        this.sourceID = sourceID;
    }

    public String getSourceID() {
        return sourceID;
    }

    public abstract String getPublicPath();

    public abstract String getAuthorityPrefix();

    @Override
    public String getHandle() {
        return uuid;
    }

    @Override
    public int getID() {
        return getId() != null ? getId().intValue() : -1;
    }

    @Override
    public boolean isArchived() {
        return getStatus() != null ? getStatus() : false;
    }

    @Override
    public boolean isWithdrawn() {
        return getStatus() != null ? !getStatus() : false;
    }

    /**
     * Convenience method to get data from ResearcherPage by a string. For any
     * existent field name the method must return the relative value (i.e
     * getMetadata("fullName") is equivalent to getFullName()) but the method
     * always return a list (with 0, 1 or more elements). For dynamic field it
     * returns the value of the dynamic field with the shorter name equals to
     * the argument. Only public values are returned!
     * 
     * 
     * @param dcField
     *            the field (not null) to retrieve the value
     * @return a list of 0, 1 or more values
     */
    public List<String> getMetadata(String field) {
        List<String> result = new ArrayList();

        List<P> dyna = getAnagrafica4view().get(field);
        for (P prop : dyna) {
            if (prop.getVisibility() == VisibilityConstants.PUBLIC)
                result.add(prop.toString());
        }

        return result;
    }

    @Override
    public DCValue[] getMetadata(String schema, String element, String qualifier, String lang) {
        List values = new ArrayList();
        String authority = null;
        if ("crisdo".equals(schema) && "name".equals(element)) {
            values.add(getName());
        } else if (!schema.equalsIgnoreCase("cris" + this.getPublicPath())) {
            return new DCValue[0];
        } else {
            element = getCompatibleJDynAShortName(this, element);

            List<P> proprieties = this.getAnagrafica4view().get(element);

            if (proprieties != null) {
                for (P prop : proprieties) {
                    Object val = prop.getObject();
                    if (StringUtils.isNotEmpty(qualifier) && val instanceof ACrisObject) {
                        authority = ResearcherPageUtils.getPersistentIdentifier((ACrisObject) val);
                        qualifier = getCompatibleJDynAShortName((ACrisObject) val, qualifier);
                        List pointProps = (List) ((ACrisObject) val).getAnagrafica4view().get(qualifier);
                        if (pointProps != null && pointProps.size() > 0) {
                            for (Object pprop : pointProps) {
                                values.add(((Property) pprop).getObject());
                            }
                        }
                    } else if (val instanceof ACrisObject) {
                        authority = ResearcherPageUtils.getPersistentIdentifier((ACrisObject) val);
                        values.add(((ACrisObject) val).getName());
                    } else {
                        PropertyEditor propertyEditor = prop.getTypo().getRendering().getPropertyEditor(null);
                        propertyEditor.setValue(val);
                        values.add(propertyEditor.getAsText());
                    }
                }
            }
        }
        DCValue[] result = new DCValue[values.size()];
        for (int idx = 0; idx < values.size(); idx++) {
            result[idx] = new DCValue();
            result[idx].schema = schema;
            result[idx].element = element;
            result[idx].qualifier = qualifier;
            result[idx].authority = authority;
            result[idx].confidence = StringUtils.isNotEmpty(authority) ? Choices.CF_ACCEPTED : Choices.CF_UNSET;
            result[idx].value = values.get(idx).toString();
        }
        return result;
    }

    private String getCompatibleJDynAShortName(ACrisObject aCrisObject, String element) {
        Set<String> keys = aCrisObject.getAnagrafica4view().keySet();
        if (!keys.contains(element)) {
            // DSpace is case insensitive, metadata are all lowercase
            for (String key : keys) {
                if (key.replaceAll("[\\-_]", "").equalsIgnoreCase(element)) {
                    return key;
                }
            }
        }
        return element;
    }

    @Override
    public String toString() {
        return getName();
    }

    public String getCrisID() {
        return crisID;
    }

    public void setCrisID(String crisID) {
        this.crisID = crisID;
    }

    abstract public TimeStampInfo getTimeStampInfo();

    public String getNamePublicIDAttribute() {
        return ExportConstants.NAME_PUBLICID_ATTRIBUTE;
    }

    public String getValuePublicIDAttribute() {
        return "" + this.getId();
    }

    public String getNameIDAttribute() {
        return ExportConstants.NAME_ID_ATTRIBUTE;
    }

    public String getValueIDAttribute() {
        if (this.getUuid() == null) {
            return "";
        }
        return "" + this.getUuid().toString();
    }

    public String getNameBusinessIDAttribute() {
        return ExportConstants.NAME_BUSINESSID_ATTRIBUTE;
    }

    public String getValueBusinessIDAttribute() {
        return this.getSourceID();
    }

    public String getNameTypeIDAttribute() {
        return ExportConstants.NAME_TYPE_ATTRIBUTE;
    }

    public String getValueTypeIDAttribute() {
        return "" + getType();
    }

    public String getNameSingleRowElement() {
        return ExportConstants.ELEMENT_SINGLEROW;
    }

    public ACrisObject<P, TP, NP, NTP, ACNO, ATNO> getAnagraficaSupport() {
        return this;
    }

    public abstract Class<ACNO> getClassNested();

    public abstract Class<ATNO> getClassTypeNested();

    @Override
    public void update() throws SQLException, AuthorizeException {
        // TODO Auto-generated method stub

    }

    @Override
    public void updateLastModified() {
        // TODO Auto-generated method stub

    }
}