/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE file at the root of the source
* tree and available online at
*
* https://github.com/keeps/roda
*/
package org.roda.wui.server.browse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.MissingResourceException;
import java.util.Optional;
import java.util.Set;
import org.apache.commons.configuration.Configuration;
import org.apache.commons.lang3.StringEscapeUtils;
import org.roda.core.RodaCoreFactory;
import org.roda.core.common.Messages;
import org.roda.core.common.RodaUtils;
import org.roda.core.common.SelectedItemsUtils;
import org.roda.core.common.UserUtility;
import org.roda.core.data.common.RodaConstants;
import org.roda.core.data.exceptions.AlreadyExistsException;
import org.roda.core.data.exceptions.AuthorizationDeniedException;
import org.roda.core.data.exceptions.GenericException;
import org.roda.core.data.exceptions.InvalidParameterException;
import org.roda.core.data.exceptions.IsStillUpdatingException;
import org.roda.core.data.exceptions.JobAlreadyStartedException;
import org.roda.core.data.exceptions.NotFoundException;
import org.roda.core.data.exceptions.RequestNotValidException;
import org.roda.core.data.utils.JsonUtils;
import org.roda.core.data.v2.IsRODAObject;
import org.roda.core.data.v2.Void;
import org.roda.core.data.v2.common.Pair;
import org.roda.core.data.v2.formats.Format;
import org.roda.core.data.v2.index.IndexResult;
import org.roda.core.data.v2.index.IsIndexed;
import org.roda.core.data.v2.index.facet.Facets;
import org.roda.core.data.v2.index.filter.Filter;
import org.roda.core.data.v2.index.select.SelectedItems;
import org.roda.core.data.v2.index.select.SelectedItemsAll;
import org.roda.core.data.v2.index.select.SelectedItemsList;
import org.roda.core.data.v2.index.select.SelectedItemsNone;
import org.roda.core.data.v2.index.sort.Sorter;
import org.roda.core.data.v2.index.sublist.Sublist;
import org.roda.core.data.v2.ip.IndexedAIP;
import org.roda.core.data.v2.ip.IndexedDIP;
import org.roda.core.data.v2.ip.IndexedFile;
import org.roda.core.data.v2.ip.IndexedRepresentation;
import org.roda.core.data.v2.ip.Permissions;
import org.roda.core.data.v2.ip.TransferredResource;
import org.roda.core.data.v2.jobs.Job;
import org.roda.core.data.v2.jobs.PluginInfo;
import org.roda.core.data.v2.jobs.PluginParameter;
import org.roda.core.data.v2.jobs.PluginParameter.PluginParameterType;
import org.roda.core.data.v2.jobs.PluginType;
import org.roda.core.data.v2.risks.IndexedRisk;
import org.roda.core.data.v2.risks.Risk;
import org.roda.core.data.v2.risks.RiskIncidence;
import org.roda.core.data.v2.user.User;
import org.roda.core.data.v2.validation.ValidationException;
import org.roda.core.index.utils.IndexUtils;
import org.roda.core.plugins.plugins.PluginHelper;
import org.roda.core.storage.ContentPayload;
import org.roda.core.storage.StringContentPayload;
import org.roda.core.util.IdUtils;
import org.roda.wui.api.controllers.Browser;
import org.roda.wui.api.controllers.Jobs;
import org.roda.wui.client.browse.BrowserService;
import org.roda.wui.client.browse.Viewers;
import org.roda.wui.client.browse.bundle.BrowseAIPBundle;
import org.roda.wui.client.browse.bundle.BrowseFileBundle;
import org.roda.wui.client.browse.bundle.BrowseRepresentationBundle;
import org.roda.wui.client.browse.bundle.DescriptiveMetadataEditBundle;
import org.roda.wui.client.browse.bundle.DescriptiveMetadataVersionsBundle;
import org.roda.wui.client.browse.bundle.DipBundle;
import org.roda.wui.client.browse.bundle.PreservationEventViewBundle;
import org.roda.wui.client.browse.bundle.SupportedMetadataTypeBundle;
import org.roda.wui.client.common.search.SearchField;
import org.roda.wui.client.common.utils.Tree;
import org.roda.wui.client.ingest.process.CreateIngestJobBundle;
import org.roda.wui.client.ingest.process.JobBundle;
import org.roda.wui.client.planning.MitigationPropertiesBundle;
import org.roda.wui.client.planning.RiskMitigationBundle;
import org.roda.wui.client.planning.RiskVersionsBundle;
import org.roda.wui.common.I18nUtility;
import org.roda.wui.common.server.ServerTools;
import org.roda_project.commons_ip.model.RepresentationContentType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
/**
* Browser Service Implementation
*
* @author Luis Faria
*
*/
public class BrowserServiceImpl extends RemoteServiceServlet implements BrowserService {
private static final long serialVersionUID = 1L;
static final String FONDLIST_PAGESIZE = "10";
private static final Logger LOGGER = LoggerFactory.getLogger(BrowserServiceImpl.class);
private static final String COOKIES_ACTIVE_PROPERTY = "ui.cookies.active";
private static final String GANALYTICS_CODE_PROPERTY = "ui.google.analytics.code";
private static final String GRECAPTCHA_CODE_PROPERTY = "ui.google.recaptcha.code";
private static String GANALYTICS_ACCOUNT_CODE = null;
private static String GRECAPTCHA_ACCOUNT_CODE = null;
/**
* Create a new BrowserService Implementation instance
*
*/
public BrowserServiceImpl() {
// do nothing
}
@Override
protected void doUnexpectedFailure(Throwable e) {
LOGGER.error("Unexpected failure", e);
super.doUnexpectedFailure(e);
}
@Override
public boolean isCookiesMessageActive() {
return RodaCoreFactory.getRodaConfiguration().getBoolean(COOKIES_ACTIVE_PROPERTY, false);
}
@Override
public String retrieveGoogleAnalyticsAccount() {
if (GANALYTICS_ACCOUNT_CODE == null) {
GANALYTICS_ACCOUNT_CODE = RodaCoreFactory.getRodaConfiguration().getString(GANALYTICS_CODE_PROPERTY, "");
LOGGER.debug("Google Analytics Account Code: {}", GANALYTICS_ACCOUNT_CODE);
}
return GANALYTICS_ACCOUNT_CODE;
}
@Override
public String retrieveGoogleReCAPTCHAAccount() {
if (GRECAPTCHA_ACCOUNT_CODE == null) {
GRECAPTCHA_ACCOUNT_CODE = RodaCoreFactory.getRodaConfiguration().getString(GRECAPTCHA_CODE_PROPERTY, "");
LOGGER.debug("Google ReCAPTCHA Account Code: {}", GRECAPTCHA_ACCOUNT_CODE);
}
return GRECAPTCHA_ACCOUNT_CODE;
}
@Override
public BrowseAIPBundle retrieveBrowseAIPBundle(String aipId, String localeString, List<String> aipFieldsToReturn)
throws AuthorizationDeniedException, GenericException, NotFoundException, RequestNotValidException {
User user = UserUtility.getUser(getThreadLocalRequest());
Locale locale = ServerTools.parseLocale(localeString);
return Browser.retrieveBrowseAipBundle(user, aipId, locale, aipFieldsToReturn);
}
@Override
public BrowseRepresentationBundle retrieveBrowseRepresentationBundle(String aipId, String representationId,
String localeString, List<String> representationFieldsToReturn)
throws AuthorizationDeniedException, GenericException, NotFoundException, RequestNotValidException {
User user = UserUtility.getUser(getThreadLocalRequest());
Locale locale = ServerTools.parseLocale(localeString);
return Browser.retrieveBrowseRepresentationBundle(user, aipId, representationId, locale,
representationFieldsToReturn);
}
@Override
public BrowseFileBundle retrieveBrowseFileBundle(String aipId, String representationId, List<String> filePath,
String fileId, List<String> fileFieldsToReturn)
throws AuthorizationDeniedException, GenericException, NotFoundException, RequestNotValidException {
User user = UserUtility.getUser(getThreadLocalRequest());
return Browser.retrieveBrowseFileBundle(user, aipId, representationId, filePath, fileId, fileFieldsToReturn);
}
@Override
public DescriptiveMetadataEditBundle retrieveDescriptiveMetadataEditBundle(String aipId, String representationId,
String descId, String type, String version, String localeString)
throws AuthorizationDeniedException, GenericException, RequestNotValidException, NotFoundException {
User user = UserUtility.getUser(getThreadLocalRequest());
Locale locale = ServerTools.parseLocale(localeString);
return Browser.retrieveDescriptiveMetadataEditBundle(user, aipId, representationId, descId, type, version, locale);
}
@Override
public DescriptiveMetadataEditBundle retrieveDescriptiveMetadataEditBundle(String aipId, String representationId,
String descId, String localeString)
throws AuthorizationDeniedException, GenericException, RequestNotValidException, NotFoundException {
User user = UserUtility.getUser(getThreadLocalRequest());
Locale locale = ServerTools.parseLocale(localeString);
return Browser.retrieveDescriptiveMetadataEditBundle(user, aipId, representationId, descId, locale);
}
@Override
public <T extends IsIndexed> IndexResult<T> find(String classNameToReturn, Filter filter, Sorter sorter,
Sublist sublist, Facets facets, String localeString, boolean justActive, List<String> fieldsToReturn)
throws GenericException, AuthorizationDeniedException, RequestNotValidException {
try {
User user = UserUtility.getUser(getThreadLocalRequest());
Class<T> classToReturn = SelectedItemsUtils.parseClass(classNameToReturn);
IndexResult<T> result = Browser.find(classToReturn, filter, sorter, sublist, facets, user, justActive,
fieldsToReturn);
return I18nUtility.translate(result, classToReturn, localeString);
} catch (RuntimeException e) {
LOGGER.error("Unexpected error in find", e);
throw new GenericException(e);
} catch (GenericException e) {
LOGGER.error("Unexpected error in find", e);
throw e;
}
}
@Override
public <T extends IsIndexed> Long count(String classNameToReturn, Filter filter, boolean justActive)
throws AuthorizationDeniedException, GenericException, RequestNotValidException {
User user = UserUtility.getUser(getThreadLocalRequest());
Class<T> classToReturn = SelectedItemsUtils.parseClass(classNameToReturn);
return Browser.count(user, classToReturn, filter, justActive);
}
@Override
public <T extends IsIndexed> T retrieve(String classNameToReturn, String id, List<String> fieldsToReturn)
throws AuthorizationDeniedException, GenericException, NotFoundException {
User user = UserUtility.getUser(getThreadLocalRequest());
Class<T> classToReturn = SelectedItemsUtils.parseClass(classNameToReturn);
return Browser.retrieve(user, classToReturn, id, fieldsToReturn);
}
@Override
public <T extends IsIndexed> List<T> retrieve(String classNameToReturn, SelectedItems<T> selectedItems,
List<String> fieldsToReturn)
throws GenericException, AuthorizationDeniedException, NotFoundException, RequestNotValidException {
User user = UserUtility.getUser(getThreadLocalRequest());
Class<T> classToReturn = SelectedItemsUtils.parseClass(classNameToReturn);
return Browser.retrieve(user, classToReturn, selectedItems, fieldsToReturn);
}
@Override
public <T extends IsIndexed> void delete(String classNameToReturn, SelectedItems<T> ids)
throws AuthorizationDeniedException, GenericException, NotFoundException, RequestNotValidException {
User user = UserUtility.getUser(getThreadLocalRequest());
Class<T> classToReturn = SelectedItemsUtils.parseClass(classNameToReturn);
Browser.delete(user, classToReturn, ids);
}
@Override
public <T extends IsIndexed> List<String> suggest(String classNameToReturn, String field, String query,
boolean allowPartial) throws AuthorizationDeniedException, GenericException, NotFoundException {
User user = UserUtility.getUser(getThreadLocalRequest());
Class<T> classToReturn = SelectedItemsUtils.parseClass(classNameToReturn);
return Browser.suggest(user, classToReturn, field, query, allowPartial);
}
@Override
public List<SearchField> retrieveSearchFields(String className, String localeString) throws GenericException {
List<SearchField> searchFields = new ArrayList<>();
List<String> fields = RodaUtils.copyList(RodaCoreFactory.getRodaConfiguration()
.getList(RodaCoreFactory.getConfigurationKey(RodaConstants.SEARCH_FIELD_PREFIX, className)));
Locale locale = ServerTools.parseLocale(localeString);
Messages messages = RodaCoreFactory.getI18NMessages(locale);
for (String field : fields) {
SearchField searchField = new SearchField();
String fieldsNames = RodaCoreFactory.getRodaConfigurationAsString(RodaConstants.SEARCH_FIELD_PREFIX, className,
field, RodaConstants.SEARCH_FIELD_FIELDS);
String fieldType = RodaCoreFactory.getRodaConfigurationAsString(RodaConstants.SEARCH_FIELD_PREFIX, className,
field, RodaConstants.SEARCH_FIELD_TYPE);
String fieldLabelI18N = RodaCoreFactory.getRodaConfigurationAsString(RodaConstants.SEARCH_FIELD_PREFIX, className,
field, RodaConstants.SEARCH_FIELD_I18N);
String fieldI18NPrefix = RodaCoreFactory.getRodaConfigurationAsString(RodaConstants.SEARCH_FIELD_PREFIX,
className, field, RodaConstants.SEARCH_FIELD_I18N_PREFIX);
List<String> fieldsValues = RodaCoreFactory.getRodaConfigurationAsList(RodaConstants.SEARCH_FIELD_PREFIX,
className, field, RodaConstants.SEARCH_FIELD_VALUES);
String suggestField = RodaCoreFactory.getRodaConfigurationAsString(RodaConstants.SEARCH_FIELD_PREFIX, className,
field, RodaConstants.SEARCH_FIELD_TYPE_SUGGEST_FIELD);
boolean fieldFixed = Boolean.parseBoolean(RodaCoreFactory.getRodaConfigurationAsString(
RodaConstants.SEARCH_FIELD_PREFIX, className, field, RodaConstants.SEARCH_FIELD_FIXED));
boolean suggestPartial = Boolean.parseBoolean(RodaCoreFactory.getRodaConfigurationAsString(
RodaConstants.SEARCH_FIELD_PREFIX, className, field, RodaConstants.SEARCH_FIELD_TYPE_SUGGEST_PARTIAL));
if (fieldsNames != null && fieldType != null && fieldLabelI18N != null) {
List<String> fieldsNamesList = Arrays.asList(fieldsNames.split(","));
searchField.setId(field);
searchField.setSearchFields(fieldsNamesList);
searchField.setType(fieldType);
try {
searchField.setLabel(messages.getTranslation(fieldLabelI18N));
} catch (MissingResourceException e) {
searchField.setLabel(fieldLabelI18N);
}
searchField.setFixed(fieldFixed);
if (fieldsValues != null) {
Map<String, String> labels = messages.getTranslations(fieldI18NPrefix, String.class, false);
Tree<String> terms = new Tree<>(field, field);
for (String value : fieldsValues) {
terms.addChild(labels.get(fieldI18NPrefix + "." + value), value);
}
searchField.setTerms(terms);
}
if (suggestField != null) {
searchField.setSuggestField(suggestField);
}
searchField.setSuggestPartial(suggestPartial);
searchFields.add(searchField);
}
}
return searchFields;
}
@Override
public IndexedAIP moveAIPInHierarchy(SelectedItems<IndexedAIP> selected, String parentId, String details)
throws AuthorizationDeniedException, GenericException, NotFoundException, RequestNotValidException,
AlreadyExistsException, ValidationException {
User user = UserUtility.getUser(getThreadLocalRequest());
return Browser.moveAIPInHierarchy(user, selected, parentId, details);
}
@Override
public String createAIP(String parentId, String type) throws AuthorizationDeniedException, GenericException,
NotFoundException, RequestNotValidException, AlreadyExistsException {
User user = UserUtility.getUser(getThreadLocalRequest());
return Browser.createAIP(user, parentId, type).getId();
}
@Override
public void deleteAIP(SelectedItems<IndexedAIP> aips, String details)
throws AuthorizationDeniedException, GenericException, NotFoundException, RequestNotValidException {
User user = UserUtility.getUser(getThreadLocalRequest());
Browser.deleteAIP(user, aips, details);
}
@Override
public void deleteRepresentation(SelectedItems<IndexedRepresentation> representations, String details)
throws AuthorizationDeniedException, GenericException, NotFoundException, RequestNotValidException {
User user = UserUtility.getUser(getThreadLocalRequest());
Browser.deleteRepresentation(user, representations, details);
}
@Override
public void deleteFile(SelectedItems<IndexedFile> files, String details)
throws AuthorizationDeniedException, GenericException, NotFoundException, RequestNotValidException {
User user = UserUtility.getUser(getThreadLocalRequest());
Browser.deleteFile(user, files, details);
}
@Override
public void createDescriptiveMetadataFile(String aipId, String representationId, DescriptiveMetadataEditBundle bundle)
throws AuthorizationDeniedException, GenericException, NotFoundException, RequestNotValidException,
AlreadyExistsException, ValidationException {
User user = UserUtility.getUser(getThreadLocalRequest());
// If the bundle has values from the form, we need to update the XML by
// applying the values of the form to the raw template
if (bundle.getValues() != null) {
SupportedMetadataTypeBundle smtb = new SupportedMetadataTypeBundle(bundle.getId(), bundle.getType(),
bundle.getVersion(), bundle.getId(), bundle.getRawTemplate(), bundle.getValues());
bundle.setXml(Browser.retrieveDescriptiveMetadataPreview(user, smtb));
}
String metadataId = bundle.getId();
String descriptiveMetadataType = bundle.getType();
String descriptiveMetadataVersion = bundle.getVersion();
ContentPayload payload = new StringContentPayload(bundle.getXml());
Browser.createDescriptiveMetadataFile(user, aipId, representationId, metadataId, descriptiveMetadataType,
descriptiveMetadataVersion, payload);
}
@Override
public String retrieveDescriptiveMetadataPreview(SupportedMetadataTypeBundle bundle)
throws AuthorizationDeniedException, GenericException, ValidationException, NotFoundException,
RequestNotValidException {
User user = UserUtility.getUser(getThreadLocalRequest());
return Browser.retrieveDescriptiveMetadataPreview(user, bundle);
}
@Override
public void updateDescriptiveMetadataFile(String aipId, String representationId, DescriptiveMetadataEditBundle bundle)
throws AuthorizationDeniedException, GenericException, NotFoundException, RequestNotValidException,
ValidationException {
User user = UserUtility.getUser(getThreadLocalRequest());
String metadataId = bundle.getId();
String metadataType = bundle.getType();
String metadataVersion = bundle.getVersion();
ContentPayload payload = new StringContentPayload(bundle.getXml());
Browser.updateDescriptiveMetadataFile(user, aipId, representationId, metadataId, metadataType, metadataVersion,
payload);
}
@Override
public void deleteDescriptiveMetadataFile(String aipId, String representationId, String descriptiveMetadataId)
throws AuthorizationDeniedException, GenericException, NotFoundException, RequestNotValidException {
User user = UserUtility.getUser(getThreadLocalRequest());
Browser.deleteDescriptiveMetadataFile(user, aipId, representationId, descriptiveMetadataId);
}
@Override
public String createTransferredResourcesFolder(String parent, String folderName, boolean commit)
throws AuthorizationDeniedException, GenericException, RequestNotValidException, NotFoundException {
User user = UserUtility.getUser(getThreadLocalRequest());
return Browser.createTransferredResourcesFolder(user, parent, folderName, commit).getUUID();
}
@Override
public void deleteTransferredResources(SelectedItems<TransferredResource> selected)
throws AuthorizationDeniedException, GenericException, NotFoundException, RequestNotValidException {
User user = UserUtility.getUser(getThreadLocalRequest());
Browser.deleteTransferredResources(user, selected);
}
@Override
public void transferScanRequestUpdate(String transferredResourceRelativePath)
throws IsStillUpdatingException, AuthorizationDeniedException {
try {
User user = UserUtility.getUser(getThreadLocalRequest());
Browser.updateTransferredResources(user,
transferredResourceRelativePath != null ? Optional.of(transferredResourceRelativePath) : Optional.empty(),
true);
} catch (RuntimeException | GenericException e) {
LOGGER.error("Error running transferred resources scanner");
}
}
@Override
public JobBundle retrieveJobBundle(String jobId, List<String> fieldsToReturn)
throws AuthorizationDeniedException, GenericException, NotFoundException {
User user = UserUtility.getUser(getThreadLocalRequest());
Job job = Browser.retrieve(user, Job.class, jobId, fieldsToReturn);
List<PluginInfo> pluginsInfo = new ArrayList<>();
PluginInfo basePlugin = RodaCoreFactory.getPluginManager().getPluginInfo(job.getPlugin());
if (basePlugin != null) {
pluginsInfo.add(basePlugin);
for (PluginParameter parameter : basePlugin.getParameters()) {
if (PluginParameterType.PLUGIN_SIP_TO_AIP.equals(parameter.getType())) {
String pluginId = job.getPluginParameters().get(parameter.getId());
if (pluginId == null) {
pluginId = parameter.getDefaultValue();
}
if (pluginId != null) {
PluginInfo refPlugin = RodaCoreFactory.getPluginManager().getPluginInfo(pluginId);
pluginsInfo.add(refPlugin);
}
}
}
}
// FIXME nvieira 20170208 it could possibly, in the future, be necessary to
// add more plugin types adding all AIP to AIP plugins for job report list
List<PluginInfo> aipToAipPlugins = RodaCoreFactory.getPluginManager().getPluginsInfo(PluginType.AIP_TO_AIP);
if (aipToAipPlugins != null) {
pluginsInfo.addAll(aipToAipPlugins);
}
JobBundle bundle = new JobBundle();
bundle.setJob(job);
bundle.setPluginsInfo(pluginsInfo);
return bundle;
}
@Override
public Job createJob(Job job) throws RequestNotValidException, AuthorizationDeniedException, NotFoundException,
GenericException, JobAlreadyStartedException {
User user = UserUtility.getUser(getThreadLocalRequest());
return Jobs.createJob(user, job, true);
}
@Override
public void stopJob(String jobId)
throws RequestNotValidException, GenericException, NotFoundException, AuthorizationDeniedException {
User user = UserUtility.getUser(getThreadLocalRequest());
Jobs.stopJob(user, jobId);
}
@Override
public List<PluginInfo> retrievePluginsInfo(List<PluginType> types) {
// TODO check permissions
return RodaCoreFactory.getPluginManager().getPluginsInfo(types);
}
@Override
public Set<Pair<String, String>> retrieveReindexPluginObjectClasses() {
// TODO check permissions
Set<Pair<String, String>> classNames = new HashSet<>();
List<?> classes = PluginHelper.getReindexObjectClasses();
classes.remove(Void.class);
for (Object o : classes) {
Class c = (Class) o;
Pair<String, String> names = Pair.of(c.getSimpleName(), c.getName());
classNames.add(names);
}
return classNames;
}
@Override
public CreateIngestJobBundle retrieveCreateIngestProcessBundle() {
// TODO check permissions
CreateIngestJobBundle bundle = new CreateIngestJobBundle();
bundle.setIngestPlugins(RodaCoreFactory.getPluginManager().getPluginsInfo(PluginType.INGEST));
bundle.setSipToAipPlugins(RodaCoreFactory.getPluginManager().getPluginsInfo(PluginType.SIP_TO_AIP));
return bundle;
}
@Override
public Viewers retrieveViewersProperties() {
Viewers viewers = new Viewers();
Configuration rodaConfig = RodaCoreFactory.getRodaConfiguration();
List<String> viewersSupported = RodaUtils.copyList(rodaConfig.getList("ui.viewers"));
for (String type : viewersSupported) {
List<String> fieldPronoms = RodaUtils.copyList(rodaConfig.getList("ui.viewers." + type + ".pronoms"));
List<String> fieldMimetypes = RodaUtils.copyList(rodaConfig.getList("ui.viewers." + type + ".mimetypes"));
List<String> fieldExtensions = RodaUtils.copyList(rodaConfig.getList("ui.viewers." + type + ".extensions"));
for (String pronom : fieldPronoms) {
viewers.addPronom(pronom, type);
}
for (String mimetype : fieldMimetypes) {
viewers.addMimetype(mimetype, type);
}
for (String extension : fieldExtensions) {
viewers.addExtension(extension, type);
}
viewers.setTextLimit(rodaConfig.getString("ui.viewers.text.limit"));
}
return viewers;
}
@Override
public List<SupportedMetadataTypeBundle> retrieveSupportedMetadata(String aipId, String representationId,
String localeString) throws AuthorizationDeniedException, GenericException, NotFoundException {
User user = UserUtility.getUser(getThreadLocalRequest());
Locale locale = ServerTools.parseLocale(localeString);
return Browser.retrieveSupportedMetadata(user, aipId, representationId, locale);
}
@Override
public PreservationEventViewBundle retrievePreservationEventViewBundle(String eventId)
throws AuthorizationDeniedException, GenericException, NotFoundException {
User user = UserUtility.getUser(getThreadLocalRequest());
return Browser.retrievePreservationEventViewBundle(user, eventId);
}
@Override
public DescriptiveMetadataVersionsBundle retrieveDescriptiveMetadataVersionsBundle(String aipId,
String representationId, String descriptiveMetadataId, String localeString)
throws AuthorizationDeniedException, RequestNotValidException, GenericException, NotFoundException {
User user = UserUtility.getUser(getThreadLocalRequest());
Locale locale = ServerTools.parseLocale(localeString);
return Browser.retrieveDescriptiveMetadataVersionsBundle(user, aipId, representationId, descriptiveMetadataId,
locale);
}
@Override
public void revertDescriptiveMetadataVersion(String aipId, String representationId, String descriptiveMetadataId,
String versionId)
throws AuthorizationDeniedException, RequestNotValidException, NotFoundException, GenericException {
User user = UserUtility.getUser(getThreadLocalRequest());
Browser.revertDescriptiveMetadataVersion(user, aipId, representationId, descriptiveMetadataId, versionId);
}
@Override
public void deleteDescriptiveMetadataVersion(String aipId, String representationId, String descriptiveMetadataId,
String versionId)
throws AuthorizationDeniedException, RequestNotValidException, NotFoundException, GenericException {
User user = UserUtility.getUser(getThreadLocalRequest());
Browser.deleteDescriptiveMetadataVersion(user, aipId, representationId, descriptiveMetadataId, versionId);
}
@Override
public void updateAIPPermissions(List<IndexedAIP> aips, Permissions permissions, String details, boolean recursive)
throws AuthorizationDeniedException, GenericException, NotFoundException, RequestNotValidException,
JobAlreadyStartedException {
User user = UserUtility.getUser(getThreadLocalRequest());
Browser.updateAIPPermissions(user, aips, permissions, details, recursive);
}
@Override
public void updateDIPPermissions(List<IndexedDIP> dips, Permissions permissions, String details)
throws AuthorizationDeniedException, GenericException, NotFoundException, RequestNotValidException {
User user = UserUtility.getUser(getThreadLocalRequest());
Browser.updateDIPPermissions(user, dips, permissions, details);
}
@Override
public void updateRisk(Risk risk, int incidences)
throws AuthorizationDeniedException, NotFoundException, GenericException, RequestNotValidException {
User user = UserUtility.getUser(getThreadLocalRequest());
Browser.updateRisk(user, risk, incidences);
}
@Override
public void updateFormat(Format format)
throws AuthorizationDeniedException, NotFoundException, GenericException, RequestNotValidException {
User user = UserUtility.getUser(getThreadLocalRequest());
Browser.updateFormat(user, format);
}
@Override
public Risk createRisk(Risk risk)
throws AuthorizationDeniedException, NotFoundException, GenericException, RequestNotValidException {
User user = UserUtility.getUser(getThreadLocalRequest());
return Browser.createRisk(user, risk);
}
@Override
public Format createFormat(Format format)
throws AuthorizationDeniedException, NotFoundException, GenericException, RequestNotValidException {
User user = UserUtility.getUser(getThreadLocalRequest());
return Browser.createFormat(user, format);
}
@Override
public void revertRiskVersion(String riskId, String versionId)
throws AuthorizationDeniedException, NotFoundException, GenericException, RequestNotValidException, IOException {
User user = UserUtility.getUser(getThreadLocalRequest());
Browser.revertRiskVersion(user, riskId, versionId);
}
@Override
public void deleteRiskVersion(String riskId, String versionId)
throws AuthorizationDeniedException, NotFoundException, GenericException, RequestNotValidException, IOException {
User user = UserUtility.getUser(getThreadLocalRequest());
Browser.deleteRiskVersion(user, riskId, versionId);
}
@Override
public RiskVersionsBundle retrieveRiskVersions(String riskId)
throws AuthorizationDeniedException, NotFoundException, GenericException, RequestNotValidException, IOException {
User user = UserUtility.getUser(getThreadLocalRequest());
return Browser.retrieveRiskVersions(user, riskId);
}
@Override
public boolean hasRiskVersions(String id)
throws AuthorizationDeniedException, RequestNotValidException, GenericException, NotFoundException {
User user = UserUtility.getUser(getThreadLocalRequest());
return Browser.hasRiskVersions(user, id);
}
@Override
public Risk retrieveRiskVersion(String riskId, String selectedVersion)
throws AuthorizationDeniedException, RequestNotValidException, GenericException, NotFoundException, IOException {
User user = UserUtility.getUser(getThreadLocalRequest());
return Browser.retrieveRiskVersion(user, riskId, selectedVersion);
}
@Override
public RiskMitigationBundle retrieveShowMitigationTerms(int preMitigationProbability, int preMitigationImpact,
int posMitigationProbability, int posMitigationImpact) throws AuthorizationDeniedException {
User user = UserUtility.getUser(getThreadLocalRequest());
return Browser.retrieveShowMitigationTerms(user, preMitigationProbability, preMitigationImpact,
posMitigationProbability, posMitigationImpact);
}
@Override
public List<String> retrieveMitigationSeverityLimits() throws AuthorizationDeniedException {
User user = UserUtility.getUser(getThreadLocalRequest());
return Browser.retrieveMitigationSeverityLimits(user);
}
@Override
public MitigationPropertiesBundle retrieveAllMitigationProperties() throws AuthorizationDeniedException {
User user = UserUtility.getUser(getThreadLocalRequest());
return Browser.retrieveAllMitigationProperties(user);
}
@Override
public void deleteRisk(SelectedItems<IndexedRisk> selected) throws AuthorizationDeniedException, GenericException,
RequestNotValidException, NotFoundException, InvalidParameterException, JobAlreadyStartedException {
User user = UserUtility.getUser(getThreadLocalRequest());
Browser.deleteRisk(user, selected);
}
@Override
public void deleteFormat(SelectedItems<Format> selected)
throws AuthorizationDeniedException, GenericException, RequestNotValidException, NotFoundException {
User user = UserUtility.getUser(getThreadLocalRequest());
Browser.deleteFormat(user, selected);
}
@Override
public <T extends IsIndexed> Job createProcess(String jobName, SelectedItems<T> selected, String id,
Map<String, String> value, String selectedClass) throws AuthorizationDeniedException, RequestNotValidException,
NotFoundException, GenericException, JobAlreadyStartedException {
SelectedItems<T> selectedItems = selected;
User user = UserUtility.getUser(getThreadLocalRequest());
if (selectedItems instanceof SelectedItemsList) {
SelectedItemsList<T> items = (SelectedItemsList<T>) selectedItems;
if (items.getIds().isEmpty()) {
selectedItems = getAllItemsByClass(selectedClass);
}
}
Job job = new Job();
job.setName(jobName);
job.setSourceObjects(selectedItems);
job.setPlugin(id);
job.setPluginParameters(value);
return Jobs.createJob(user, job, true);
}
@Override
public <T extends IsIndexed> String createProcessJson(String jobName, SelectedItems<T> selected, String id,
Map<String, String> value, String selectedClass) throws AuthorizationDeniedException, RequestNotValidException,
NotFoundException, GenericException, JobAlreadyStartedException {
SelectedItems<T> selectedItems = selected;
User user = UserUtility.getUser(getThreadLocalRequest());
if (selectedItems instanceof SelectedItemsList) {
SelectedItemsList<T> items = (SelectedItemsList<T>) selectedItems;
if (items.getIds().isEmpty()) {
selectedItems = getAllItemsByClass(selectedClass);
}
}
Job job = new Job();
job.setId(IdUtils.createUUID());
job.setName(jobName);
job.setSourceObjects(selectedItems);
job.setPlugin(id);
job.setPluginParameters(value);
job.setUsername(user.getName());
String command = RodaCoreFactory.getRodaConfiguration().getString("ui.createJob.curl");
if (command != null) {
command = command.replace("{{jsonObject}}", StringEscapeUtils.escapeJava(JsonUtils.getJsonFromObject(job)));
return command;
} else {
return "";
}
}
private <T extends IsIndexed> SelectedItems<T> getAllItemsByClass(String selectedClass) {
if (selectedClass == null || Void.class.getName().equals(selectedClass)) {
return new SelectedItemsNone<>();
} else {
return new SelectedItemsAll<>(selectedClass);
}
}
@Override
public void updateRiskCounters()
throws AuthorizationDeniedException, GenericException, RequestNotValidException, NotFoundException {
User user = UserUtility.getUser(getThreadLocalRequest());
Browser.updateRiskCounters(user);
}
@Override
public void appraisal(SelectedItems<IndexedAIP> selected, boolean accept, String rejectReason, String localeString)
throws GenericException, AuthorizationDeniedException, RequestNotValidException, NotFoundException {
User user = UserUtility.getUser(getThreadLocalRequest());
Browser.appraisal(user, selected, accept, rejectReason, ServerTools.parseLocale(localeString));
}
@Override
public String renameTransferredResource(String transferredResourceId, String newName)
throws GenericException, RequestNotValidException, AuthorizationDeniedException, AlreadyExistsException,
IsStillUpdatingException, NotFoundException {
User user = UserUtility.getUser(getThreadLocalRequest());
return Browser.renameTransferredResource(user, transferredResourceId, newName);
}
@Override
public IndexedFile renameFolder(String folderUUID, String newName, String details)
throws AuthorizationDeniedException, GenericException, RequestNotValidException, AlreadyExistsException,
NotFoundException {
User user = UserUtility.getUser(getThreadLocalRequest());
return Browser.renameFolder(user, folderUUID, newName, details);
}
@Override
public void moveFiles(String aipId, String representationId, SelectedItems<IndexedFile> selectedFiles,
IndexedFile toFolder, String details) throws AuthorizationDeniedException, GenericException,
RequestNotValidException, AlreadyExistsException, NotFoundException {
User user = UserUtility.getUser(getThreadLocalRequest());
Browser.moveFiles(user, aipId, representationId, selectedFiles, toFolder, details);
}
@Override
public IndexedFile createFolder(String aipId, String representationId, String folderUUID, String newName,
String details) throws AuthorizationDeniedException, GenericException, RequestNotValidException,
AlreadyExistsException, NotFoundException {
User user = UserUtility.getUser(getThreadLocalRequest());
return Browser.createFolder(user, aipId, representationId, folderUUID, newName, details);
}
@Override
public String moveTransferredResource(SelectedItems<TransferredResource> selected,
TransferredResource transferredResource) throws AuthorizationDeniedException, GenericException,
RequestNotValidException, AlreadyExistsException, IsStillUpdatingException, NotFoundException {
User user = UserUtility.getUser(getThreadLocalRequest());
return Browser.moveTransferredResource(user, selected, transferredResource);
}
@Override
public List<TransferredResource> retrieveSelectedTransferredResource(SelectedItems<TransferredResource> selected)
throws GenericException, RequestNotValidException, AuthorizationDeniedException {
User user = UserUtility.getUser(getThreadLocalRequest());
return Browser.retrieveSelectedTransferredResource(user, selected);
}
@Override
public void deleteFile(String fileUUID, String details)
throws AuthorizationDeniedException, GenericException, RequestNotValidException, NotFoundException {
User user = UserUtility.getUser(getThreadLocalRequest());
Browser.deleteFile(user, fileUUID, details);
}
@Override
public void updateRiskIncidence(RiskIncidence incidence) throws AuthorizationDeniedException, GenericException {
User user = UserUtility.getUser(getThreadLocalRequest());
Browser.updateRiskIncidence(user, incidence);
}
@Override
public void deleteRiskIncidences(SelectedItems<RiskIncidence> selected)
throws JobAlreadyStartedException, AuthorizationDeniedException, GenericException, RequestNotValidException,
NotFoundException, InvalidParameterException {
User user = UserUtility.getUser(getThreadLocalRequest());
Browser.deleteRiskIncidences(user, selected);
}
@Override
public void updateMultipleIncidences(SelectedItems<RiskIncidence> selected, String status, String severity,
Date mitigatedOn, String mitigatedBy, String mitigatedDescription)
throws AuthorizationDeniedException, RequestNotValidException, GenericException, NotFoundException {
User user = UserUtility.getUser(getThreadLocalRequest());
Browser.updateMultipleIncidences(user, selected, status, severity, mitigatedOn, mitigatedBy, mitigatedDescription);
}
@Override
public String createRepresentation(String aipId, String details) throws AuthorizationDeniedException,
GenericException, NotFoundException, RequestNotValidException, AlreadyExistsException {
User user = UserUtility.getUser(getThreadLocalRequest());
String representationId = IdUtils.createUUID();
Browser.createRepresentation(user, aipId, representationId, RepresentationContentType.getMIXED().asString(),
details);
return representationId;
}
@Override
public void createFormatIdentificationJob(SelectedItems<?> selected) throws GenericException,
AuthorizationDeniedException, JobAlreadyStartedException, RequestNotValidException, NotFoundException {
User user = UserUtility.getUser(getThreadLocalRequest());
Browser.createFormatIdentificationJob(user, selected);
}
@Override
public void changeRepresentationType(SelectedItems<IndexedRepresentation> selected, String newType, String details)
throws AuthorizationDeniedException, GenericException, RequestNotValidException, NotFoundException {
User user = UserUtility.getUser(getThreadLocalRequest());
Browser.changeRepresentationType(user, selected, newType, details);
}
@Override
public DipBundle retrieveDipBundle(String dipUUID, String dipFileUUID)
throws RequestNotValidException, AuthorizationDeniedException, GenericException, NotFoundException {
User user = UserUtility.getUser(getThreadLocalRequest());
return Browser.retrieveDipBundle(user, dipUUID, dipFileUUID);
}
@Override
public void deleteDIPs(SelectedItems<IndexedDIP> dips)
throws AuthorizationDeniedException, GenericException, NotFoundException, RequestNotValidException {
User user = UserUtility.getUser(getThreadLocalRequest());
Browser.deleteDIPs(user, dips);
}
@Override
public <T extends IsIndexed> T retrieveFromModel(String classNameToReturn, String id)
throws AuthorizationDeniedException, GenericException, NotFoundException {
User user = UserUtility.getUser(getThreadLocalRequest());
Class<? extends IsRODAObject> classToReturn = SelectedItemsUtils.parseClass(classNameToReturn);
Class<T> indexedClassToReturn = IndexUtils.giveRespectiveIndexClass(classToReturn);
return Browser.retrieve(user, indexedClassToReturn, id, new ArrayList<>());
}
@Override
public boolean hasDocumentation(String aipId)
throws AuthorizationDeniedException, RequestNotValidException, GenericException {
User user = UserUtility.getUser(getThreadLocalRequest());
return Browser.hasDocumentation(user, aipId);
}
@Override
public int getListThreshold() {
return RodaCoreFactory.getRodaConfiguration().getInt("ui.list.threshold", RodaConstants.DEFAULT_LIST_THRESHOLD);
}
@Override
public boolean showDIPEmbedded() {
return RodaCoreFactory.getRodaConfiguration().getBoolean("ui.dip.externalURL.showEmbedded", false);
}
}