/*******************************************************************************
* Copyright (c) 2006-2010 eBay Inc. All Rights Reserved.
* 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
*******************************************************************************/
package org.ebayopensource.turmeric.policy.adminui.client.presenter.policy;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.ebayopensource.turmeric.policy.adminui.client.PolicyAdminUIUtil;
import org.ebayopensource.turmeric.policy.adminui.client.SupportedService;
import org.ebayopensource.turmeric.policy.adminui.client.model.PolicyAdminUIService;
import org.ebayopensource.turmeric.policy.adminui.client.model.HistoryToken;
import org.ebayopensource.turmeric.policy.adminui.client.model.policy.Condition;
import org.ebayopensource.turmeric.policy.adminui.client.model.policy.ConditionImpl;
import org.ebayopensource.turmeric.policy.adminui.client.model.policy.ExpressionImpl;
import org.ebayopensource.turmeric.policy.adminui.client.model.policy.GenericPolicy;
import org.ebayopensource.turmeric.policy.adminui.client.model.policy.Operation;
import org.ebayopensource.turmeric.policy.adminui.client.model.policy.PrimitiveValueImpl;
import org.ebayopensource.turmeric.policy.adminui.client.model.policy.Resource;
import org.ebayopensource.turmeric.policy.adminui.client.model.policy.ResourceKey;
import org.ebayopensource.turmeric.policy.adminui.client.model.policy.RuleAttribute;
import org.ebayopensource.turmeric.policy.adminui.client.model.policy.RuleAttributeImpl;
import org.ebayopensource.turmeric.policy.adminui.client.model.policy.RuleImpl;
import org.ebayopensource.turmeric.policy.adminui.client.model.policy.SupportedPrimitive;
import org.ebayopensource.turmeric.policy.adminui.client.model.policy.PolicyQueryService.GetResourcesResponse;
import org.ebayopensource.turmeric.policy.adminui.client.model.policy.PolicyQueryService.ResourceLevel;
import org.ebayopensource.turmeric.policy.adminui.client.model.policy.PolicyQueryService.RuleEffectType;
import org.ebayopensource.turmeric.policy.adminui.client.model.policy.PolicyQueryService.UpdateMode;
import org.ebayopensource.turmeric.policy.adminui.client.model.policy.PolicyQueryService.UpdatePolicyResponse;
import org.ebayopensource.turmeric.policy.adminui.client.presenter.policy.RLPolicyCreatePresenter.RLPolicyCreateDisplay;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.shared.HandlerManager;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.HasWidgets;
/**
* The Class RLPolicyEditPresenter.
*/
public class RLPolicyEditPresenter extends PolicyEditPresenter {
private List<Resource> resources = null;
/**
* Instantiates a new rL policy edit presenter.
*
* @param eventBus
* the event bus
* @param view
* the view
* @param serviceMap
* the service map
*/
public RLPolicyEditPresenter(HandlerManager eventBus,
PolicyEditDisplay view,
Map<SupportedService, PolicyAdminUIService> serviceMap) {
super(eventBus, view, serviceMap);
view.setConditionBuilderVisible(true);
view.setExclusionListsVisible(true);
bind();
}
/** The Constant PRESENTER_ID. */
public final static String PRESENTER_ID = "RLPolicyEdit";
/**
* The Interface RLPolicyEditDisplay.
*/
public interface RLPolicyEditDisplay extends RLPolicyCreateDisplay {
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policy.adminui.client.presenter.Presenter#getId()
*/
@Override
public String getId() {
return PRESENTER_ID;
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policy.adminui.client.presenter.policy.PolicyCreatePresenter#getResourceLevels()
*/
@Override
public List<String> getResourceLevels() {
List<String> rsLevels = new ArrayList<String>();
rsLevels.add(ResourceLevel.OPERATION.name());
rsLevels.add(ResourceLevel.RESOURCE.name());
return rsLevels;
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policy.adminui.client.presenter.policy.PolicyEditPresenter#go(com.google.gwt.user.client.ui.HasWidgets, org.ebayopensource.turmeric.policy.adminui.client.model.HistoryToken)
*/
@Override
public void go(HasWidgets container, final HistoryToken token) {
super.go(container, token);
fetchServices();
fetchConditions();
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policy.adminui.client.presenter.policy.PolicyCreatePresenter#bindSaveButton()
*/
@Override
protected void bindSaveButton() {
{
// fired on saved policy
this.view.addSaveButtonClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
GWT.log("EDITION MODE:");
rules.clear();
String ruleName = view.getPolicyName().getValue();
RuleEffectType ruleEffectType = RuleEffectType.valueOf(view
.getExtraFieldValue(6));
Integer priority = view.getExtraFieldValue(5) != null ? Integer
.valueOf(view.getExtraFieldValue(5)) : null;
Long rolloverPeriod = Long.valueOf(view
.getExtraFieldValue(4));
Long effectDuration = (view.getExtraFieldValue(3) == null ? 0L
: Long.valueOf(view.getExtraFieldValue(3)));
Long conditionDuration = 0L;
String value = view.getExtraFieldValue(7);
RuleImpl rule = null;
if (value != null && !value.isEmpty()) {
PrimitiveValueImpl primitiveValueImpl = null;
ExpressionImpl exp = null;
primitiveValueImpl = new PrimitiveValueImpl();
primitiveValueImpl.setValue(value);
primitiveValueImpl.setType(SupportedPrimitive.STRING);
exp = new ExpressionImpl();
exp.setPrimitiveValue(primitiveValueImpl);
Condition condition = new ConditionImpl(exp);
List<RuleAttribute> attributeList = new ArrayList<RuleAttribute>();
RuleAttributeImpl raMails = new RuleAttributeImpl(view
.getExtraFieldValue(1));
attributeList.add(raMails);
RuleAttributeImpl raActive = new RuleAttributeImpl(
RuleAttribute.NotifyActiveValue.valueOf(view
.getExtraFieldValue(2).toUpperCase()));
attributeList.add(raActive);
rule = new RuleImpl(ruleName, null, ruleEffectType,
priority, rolloverPeriod, effectDuration,
conditionDuration, condition, attributeList);
rules.add(rule);
}
final GenericPolicy p = getPolicy(view.getPolicyName()
.getValue(), originalPolicyType, view
.getPolicyDesc().getValue(), resourceAssignments,
subjectAssignments, view.getPolicyEnabled(), Long
.valueOf(originalPolicyId), rules);
GWT.log("Updating policy: " + p.getId() + "-" + p.getName());
/**
* This timer is needed due to GWT has only one thread, so
* Thread.sleep is not a valid option The purpose of
* sleeping time is wait until new external subject been
* created into turmeric db, in order to assign them as
* internal subjects
*/
Timer timer = new Timer() {
public void run() {
service.updatePolicy(UpdateMode.REPLACE, p,
new AsyncCallback<UpdatePolicyResponse>() {
public void onFailure(Throwable arg) {
if (arg.getLocalizedMessage()
.contains("500")) {
view.error(PolicyAdminUIUtil.messages
.serverError(PolicyAdminUIUtil.policyAdminConstants
.genericErrorMessage()));
} else {
view.error(PolicyAdminUIUtil.messages.serverError(arg
.getLocalizedMessage()));
}
}
public void onSuccess(
UpdatePolicyResponse response) {
GWT.log("Updated policy");
RLPolicyEditPresenter.this.view
.clear();
clearLists();
HistoryToken token = makeToken(
PolicyController.PRESENTER_ID,
PolicySummaryPresenter.PRESENTER_ID,
null);
// Prefill the summary search with
// the policy we just modified
token.addValue(
HistoryToken.SRCH_POLICY_TYPE,
originalPolicyType);
token.addValue(
HistoryToken.SRCH_POLICY_NAME,
p.getName());
History.newItem(token.toString(),
true);
}
});
view.getSaveButton().setEnabled(true);
}
};
if (view.getSubjectContentView().getAssignments().size() > 0
&& "USER".equals(view.getSubjectContentView()
.getAssignments().get(0).getSubjectType())) {
view.getSaveButton().setEnabled(false);
timer.schedule(3000);
} else {
timer.schedule(1);
}
}
});
}
}
private void fetchServices() {
List<ResourceKey> rsKeys = new ArrayList<ResourceKey>();
ResourceKey rsKey = new ResourceKey();
rsKey.setType("SERVICE");
rsKeys.add(rsKey);
service.getResources(rsKeys, new AsyncCallback<GetResourcesResponse>() {
@Override
public void onFailure(Throwable arg) {
if (arg.getLocalizedMessage().contains("500")) {
view.error(PolicyAdminUIUtil.messages
.serverError(PolicyAdminUIUtil.policyAdminConstants
.genericErrorMessage()));
} else {
view.error(PolicyAdminUIUtil.messages.serverError(arg
.getLocalizedMessage()));
}
}
@Override
public void onSuccess(GetResourcesResponse result) {
resources = new ArrayList<Resource>(result.getResources());
List<String> rsNames = new ArrayList<String>();
for (Resource resource : resources) {
rsNames.add(resource.getResourceName());
}
view.setRsNames(rsNames);
}
});
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.policy.adminui.client.presenter.policy.PolicyCreatePresenter#bind()
*/
@Override
public void bind() {
super.bind();
this.view.addAddConditionButtonClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
setConditionExtraField();
}
});
// retrieve resource names based on selected type
this.view.addRsListBoxChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
String rsName = view.getRsNameSelected();
List<String> opNames = new ArrayList<String>();
for (Resource resource : resources) {
if (rsName.equals(resource.getResourceName())) {
List<Operation> opList = resource.getOpList();
if (opList != null && !opList.isEmpty()) {
for (Operation operation : opList) {
opNames.add(operation.getOperationName());
}
}
break;
}
}
view.setOpNames(opNames);
}
});
}
/**
* Sets the condition extra field.
*/
protected void setConditionExtraField() {
StringBuilder conditionString = new StringBuilder(
view.getRsNameSelected());
conditionString.append(":");
conditionString.append(view.getOpNameSelected());
if(view.getSubjectOrSGSelected() != null){
conditionString.append(view.getSubjectOrSGSelected());
}
conditionString.append(".");
conditionString.append(view.getConditionSelected());
conditionString.append(view.getAritmSignSelected());
conditionString.append(view.getQuantityBox() + " ");
conditionString.append(view.getLogicOpSelected() == null ? "" : view
.getLogicOpSelected() + " ");
if (view.validAllConditionFields()) {
view.setExtraFieldValue(7, conditionString.toString(), true);
}
}
private void fetchConditions() {
List<String> conditions = new ArrayList<String>();
conditions.add("count");
conditions.add("hits");
conditions.add("HITS");
view.setConditionNames(conditions);
}
}