/* * Copyright Siemens AG, 2013-2015. Part of the SW360 Portal Project. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package org.eclipse.sw360.attachments.db; import com.google.common.base.Predicate; import com.google.common.collect.FluentIterable; import org.eclipse.sw360.datahandler.couchdb.DatabaseConnector; import org.eclipse.sw360.datahandler.couchdb.DatabaseRepository; import org.eclipse.sw360.datahandler.permissions.PermissionUtils; import org.eclipse.sw360.datahandler.thrift.RequestStatus; import org.eclipse.sw360.datahandler.thrift.RequestSummary; import org.eclipse.sw360.datahandler.thrift.attachments.AttachmentContent; import org.eclipse.sw360.datahandler.thrift.users.User; import org.ektorp.DocumentOperationResult; import org.ektorp.ViewQuery; import org.ektorp.support.View; import java.util.List; import java.util.Set; /** * CRUD access for the Attachment class * * @author cedric.bodet@tngtech.com * @author Johannes.Najjar@tngtech.com * @author daniele.fognini@tngtech.com */ @View(name = "all", map = "function(doc) { if (doc.type == 'attachment') emit(null, doc._id) }") public class AttachmentRepository extends DatabaseRepository<AttachmentContent> { public AttachmentRepository(DatabaseConnector db) { super(AttachmentContent.class, db); initStandardDesignDocument(); } private static final String ONLY_REMOTE_VIEW = "function(doc) { if(doc.type == 'attachment' && doc.onlyRemote) { emit(null, doc) } }"; @View(name = "onlyRemotes", map = ONLY_REMOTE_VIEW) public List<AttachmentContent> getOnlyRemoteAttachments() { ViewQuery query = createQuery("onlyRemotes"); query.includeDocs(false); return queryView(query); } public RequestSummary vacuumAttachmentDB(User user, final Set<String> usedIds) { final RequestSummary requestSummary = new RequestSummary(); if (!PermissionUtils.isAdmin(user)) return requestSummary.setRequestStatus(RequestStatus.FAILURE); final List<AttachmentContent> allAttachmentContents = getAll(); final Set<AttachmentContent> unusedAttachmentContents = FluentIterable.from(allAttachmentContents).filter(new Predicate<AttachmentContent>() { @Override public boolean apply(AttachmentContent input) { return !usedIds.contains(input.getId()); } }).toSet(); requestSummary.setTotalElements(allAttachmentContents.size()); requestSummary.setTotalAffectedElements(unusedAttachmentContents.size()); final List<DocumentOperationResult> documentOperationResults = deleteBulk(unusedAttachmentContents); requestSummary.setRequestStatus(RequestStatus.SUCCESS); return requestSummary; } }