/**
* =============================================================================
*
* ORCID (R) Open Source
* http://orcid.org
*
* Copyright (c) 2012-2014 ORCID, Inc.
* Licensed under an MIT-Style License (MIT)
* http://orcid.org/open-source-license
*
* This copyright and license information (including a link to the full license)
* shall be included in its entirety in all copies or substantial portion of
* the software.
*
* =============================================================================
*/
package org.orcid.api.publicV2.server.security.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import javax.annotation.Resource;
import org.orcid.api.publicV2.server.security.PublicAPISecurityManagerV2;
import org.orcid.core.exception.OrcidCoreExceptionMapper;
import org.orcid.core.exception.OrcidNoBioException;
import org.orcid.core.exception.OrcidNonPublicElementException;
import org.orcid.jaxb.model.common_v2.Filterable;
import org.orcid.jaxb.model.common_v2.VisibilityType;
import org.orcid.jaxb.model.error_v2.OrcidError;
import org.orcid.jaxb.model.record.summary_v2.ActivitiesSummary;
import org.orcid.jaxb.model.record_v2.ActivitiesContainer;
import org.orcid.jaxb.model.record_v2.Activity;
import org.orcid.jaxb.model.record_v2.Addresses;
import org.orcid.jaxb.model.record_v2.Biography;
import org.orcid.jaxb.model.record_v2.BulkElement;
import org.orcid.jaxb.model.record_v2.Emails;
import org.orcid.jaxb.model.record_v2.Group;
import org.orcid.jaxb.model.record_v2.GroupableActivity;
import org.orcid.jaxb.model.record_v2.GroupsContainer;
import org.orcid.jaxb.model.record_v2.Keywords;
import org.orcid.jaxb.model.record_v2.Name;
import org.orcid.jaxb.model.record_v2.OtherNames;
import org.orcid.jaxb.model.record_v2.Person;
import org.orcid.jaxb.model.record_v2.PersonExternalIdentifiers;
import org.orcid.jaxb.model.record_v2.PersonalDetails;
import org.orcid.jaxb.model.record_v2.Record;
import org.orcid.jaxb.model.record_v2.ResearcherUrls;
import org.orcid.jaxb.model.record_v2.Work;
import org.orcid.jaxb.model.record_v2.WorkBulk;
import org.orcid.pojo.ajaxForm.PojoUtil;
public class PublicAPISecurityManagerV2Impl implements PublicAPISecurityManagerV2 {
@Resource
private OrcidCoreExceptionMapper orcidCoreExceptionMapper;
@Override
public void checkIsPublic(VisibilityType visibilityType) {
if (visibilityType != null && !org.orcid.jaxb.model.common_v2.Visibility.PUBLIC.equals(visibilityType.getVisibility())) {
throw new OrcidNonPublicElementException();
}
}
@Override
public void checkIsPublic(Biography biography) {
if (biography == null) {
throw new OrcidNoBioException();
}
if (PojoUtil.isEmpty(biography.getContent()) && biography.getVisibility() == null) {
return;
}
if (!org.orcid.jaxb.model.common_v2.Visibility.PUBLIC.equals(biography.getVisibility())) {
throw new OrcidNonPublicElementException();
}
}
@Override
public void filter(ActivitiesSummary activitiesSummary) {
if (activitiesSummary == null) {
return;
}
if (activitiesSummary.getEmployments() != null) {
filter(activitiesSummary.getEmployments());
}
if (activitiesSummary.getEducations() != null) {
filter(activitiesSummary.getEducations());
}
if (activitiesSummary.getFundings() != null) {
filter(activitiesSummary.getFundings());
}
if (activitiesSummary.getWorks() != null) {
filter(activitiesSummary.getWorks());
}
if (activitiesSummary.getPeerReviews() != null) {
filter(activitiesSummary.getPeerReviews());
}
}
@Override
public void filter(ActivitiesContainer container) {
if (container == null || container.retrieveActivities() == null) {
return;
}
Collection<? extends Activity> list = container.retrieveActivities();
list.removeIf(e -> {
try {
checkIsPublic(e);
return false;
} catch (OrcidNonPublicElementException ex) {
return true;
}
});
}
@Override
public void filter(GroupsContainer container) {
if (container == null || container.retrieveGroups() == null) {
return;
}
Iterator<? extends Group> groupIt = container.retrieveGroups().iterator();
while (groupIt.hasNext()) {
Group g = groupIt.next();
if (g.getActivities() != null) {
Iterator<? extends GroupableActivity> activityIt = g.getActivities().iterator();
while (activityIt.hasNext()) {
GroupableActivity activity = activityIt.next();
try {
checkIsPublic(activity);
} catch (OrcidNonPublicElementException e) {
activityIt.remove();
}
}
if (g.getActivities().isEmpty()) {
groupIt.remove();
}
}
}
}
@Override
public void filter(PersonalDetails personalDetails) {
if (personalDetails == null) {
return;
}
if (personalDetails.getName() != null) {
try {
checkIsPublic(personalDetails.getName());
} catch (OrcidNonPublicElementException e) {
personalDetails.setName(null);
}
}
if (personalDetails.getBiography() != null) {
try {
checkIsPublic(personalDetails.getBiography());
} catch (OrcidNonPublicElementException e) {
personalDetails.setBiography(null);
}
}
if (personalDetails.getOtherNames() != null && personalDetails.getOtherNames().getOtherNames() != null) {
personalDetails.getOtherNames().getOtherNames().removeIf(e -> {
try {
checkIsPublic(e);
return false;
} catch (OrcidNonPublicElementException ex) {
return true;
}
});
}
}
@Override
public void filter(Addresses addresses) {
if (addresses == null) {
return;
}
filter(addresses.getAddress());
}
@Override
public void filter(Emails emails) {
if (emails == null) {
return;
}
filter(emails.getEmails());
}
@Override
public void filter(Keywords keywords) {
if (keywords == null) {
return;
}
filter(keywords.getKeywords());
}
@Override
public void filter(OtherNames otherNames) {
if (otherNames == null) {
return;
}
filter(otherNames.getOtherNames());
}
@Override
public void filter(PersonExternalIdentifiers extIds) {
if (extIds == null) {
return;
}
filter(extIds.getExternalIdentifiers());
}
@Override
public void filter(WorkBulk workBulk) {
if (workBulk != null && workBulk.getBulk() != null) {
List<BulkElement> filtered = new ArrayList<>();
for (int i = 0; i < workBulk.getBulk().size(); i++) {
BulkElement bulkElement = workBulk.getBulk().get(i);
if (bulkElement instanceof OrcidError) {
filtered.add(bulkElement);
} else {
try {
checkIsPublic((Work) bulkElement);
filtered.add(bulkElement);
} catch (OrcidNonPublicElementException e) {
filtered.add(orcidCoreExceptionMapper.getOrcidError(e));
}
}
}
workBulk.setBulk(filtered);
}
}
@Override
public void filter(ResearcherUrls researcherUrls) {
if (researcherUrls == null) {
return;
}
filter(researcherUrls.getResearcherUrls());
}
private void filter(List<? extends Filterable> filterable) {
if (filterable == null) {
return;
}
filterable.removeIf(e -> {
try {
checkIsPublic(e);
return false;
} catch (OrcidNonPublicElementException ex) {
return true;
}
});
}
@Override
public void filter(Person person) {
if (person == null) {
return;
}
if (person.getAddresses() != null) {
filter(person.getAddresses());
}
if (person.getEmails() != null) {
filter(person.getEmails());
}
if (person.getExternalIdentifiers() != null) {
filter(person.getExternalIdentifiers());
}
if (person.getKeywords() != null) {
filter(person.getKeywords());
}
if (person.getOtherNames() != null) {
filter(person.getOtherNames());
}
if (person.getResearcherUrls() != null) {
filter(person.getResearcherUrls());
}
Name name = person.getName();
if (name != null) {
try {
checkIsPublic(name);
} catch (OrcidNonPublicElementException ex) {
person.setName(null);
}
}
Biography bio = person.getBiography();
if (bio != null) {
try {
checkIsPublic(bio);
} catch (OrcidNonPublicElementException ex) {
person.setBiography(null);
}
}
}
@Override
public void filter(Record record) {
if (record == null) {
return;
}
filter(record.getActivitiesSummary());
filter(record.getPerson());
}
}