/**
* Copyright (c) Istituto Nazionale di Fisica Nucleare (INFN). 2006-2016
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.glite.security.voms.admin.view.actions.admin;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.apache.struts2.interceptor.ParameterAware;
import org.apache.struts2.interceptor.TokenInterceptor;
import org.glite.security.voms.admin.operations.VOMSOperation;
import org.glite.security.voms.admin.operations.requests.BaseHandleRequestOperation;
import org.glite.security.voms.admin.operations.requests.DECISION;
import org.glite.security.voms.admin.operations.requests.HandleCertificateRequestOperation;
import org.glite.security.voms.admin.operations.requests.HandleGroupRequestOperation;
import org.glite.security.voms.admin.operations.requests.HandleMembershipRemovalRequest;
import org.glite.security.voms.admin.operations.requests.HandleRoleMembershipRequestOperation;
import org.glite.security.voms.admin.operations.requests.HandleVOMembershipRequest;
import org.glite.security.voms.admin.persistence.model.request.CertificateRequest;
import org.glite.security.voms.admin.persistence.model.request.GroupMembershipRequest;
import org.glite.security.voms.admin.persistence.model.request.MembershipRemovalRequest;
import org.glite.security.voms.admin.persistence.model.request.NewVOMembershipRequest;
import org.glite.security.voms.admin.persistence.model.request.Request;
import org.glite.security.voms.admin.persistence.model.request.RoleMembershipRequest;
import org.glite.security.voms.admin.view.actions.BaseAction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Results({
@Result(name = BaseAction.SUCCESS, location = "adminHome"),
@Result(name = BaseAction.INPUT, location = "adminHome"),
@Result(name = TokenInterceptor.INVALID_TOKEN_CODE, location = "adminHome")
})
@InterceptorRef(value = "authenticatedStack", params = {
"token.includeMethods", "execute" })
public class BulkDecisionAction extends BulkRequestActionSupport implements
ParameterAware {
/**
*
*/
private static final long serialVersionUID = 1L;
private static final Logger LOGGER = LoggerFactory
.getLogger(BulkDecisionAction.class);
Map<String, String[]> parametersMap;
String decision;
@Override
public void validate() {
super.validate();
if (decision == null) {
addActionError("Please provide a decision!");
}
}
public BaseHandleRequestOperation<?> resolveRequestHandler(Request request,
DECISION decision) {
if (request instanceof NewVOMembershipRequest) {
List<String> approvedGroups = resolveApprovedGroups(request);
return new HandleVOMembershipRequest((NewVOMembershipRequest) request,
decision, approvedGroups);
}
if (request instanceof GroupMembershipRequest) {
return new HandleGroupRequestOperation((GroupMembershipRequest) request,
decision);
}
if (request instanceof RoleMembershipRequest) {
return new HandleRoleMembershipRequestOperation(
(RoleMembershipRequest) request, decision);
}
if (request instanceof MembershipRemovalRequest) {
return new HandleMembershipRemovalRequest(
(MembershipRemovalRequest) request, decision);
}
if (request instanceof CertificateRequest) {
return new HandleCertificateRequestOperation(
(CertificateRequest) request, decision);
}
return null;
}
private List<String> resolveApprovedGroups(Request request) {
NewVOMembershipRequest r = (NewVOMembershipRequest) request;
String approvedGroupsParameterName = String.format("approvedGroups_%d",
r.getId());
String[] approvedGroupNames = parametersMap.get(approvedGroupsParameterName);
if (approvedGroupNames == null || approvedGroupNames.length == 0){
return null;
}
return Arrays.asList(approvedGroupNames);
}
@Override
public String execute() throws Exception {
DECISION theDecision = DECISION.valueOf(decision.toUpperCase());
int numFailures = 0;
for (Request r : selectedRequests) {
VOMSOperation op = resolveRequestHandler(r, theDecision);
if (op != null) {
try {
op.execute();
} catch (Throwable t) {
numFailures++;
String errorMessage = String.format("Error handling '%s (%d)': %s",
r.getTypeName(), r.getId(), t.getMessage());
addActionError(errorMessage);
LOGGER.error(t.getMessage(), t);
}
}
}
if (numFailures == 0) {
if (selectedRequests.size() > 1) {
addActionMessage(String.format("%d requests %s.",
selectedRequests.size(), decisionToVerb(theDecision)));
} else {
addActionMessage(String.format("Request %s.",
decisionToVerb(theDecision)));
}
} else {
if (selectedRequests.size() - numFailures > 0) {
addActionMessage(String
.format("%d (out of %d) requests %s succesfully.",
selectedRequests.size() - numFailures, selectedRequests.size(),
decisionToVerb(theDecision)));
}
}
refreshRequests();
if (numFailures == 0) {
return SUCCESS;
}
return INPUT;
}
private String decisionToVerb(DECISION d) {
if (d.equals(DECISION.APPROVE)) {
return "approved";
}
return "rejected";
}
public String getDecision() {
return decision;
}
public void setDecision(String decision) {
this.decision = decision;
}
@Override
public void setParameters(Map<String, String[]> parameters) {
parametersMap = parameters;
}
}