/******************************************************************************* * 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.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.ebayopensource.turmeric.policy.adminui.client.Display; import org.ebayopensource.turmeric.policy.adminui.client.PolicyAdminUIUtil; import org.ebayopensource.turmeric.policy.adminui.client.SupportedService; import org.ebayopensource.turmeric.policy.adminui.client.model.HistoryToken; import org.ebayopensource.turmeric.policy.adminui.client.model.PolicyAdminUIService; import org.ebayopensource.turmeric.policy.adminui.client.model.policy.PolicyQueryService; import org.ebayopensource.turmeric.policy.adminui.client.model.policy.PolicyQueryService.CreateSubjectGroupsResponse; import org.ebayopensource.turmeric.policy.adminui.client.model.policy.PolicyQueryService.CreateSubjectsResponse; import org.ebayopensource.turmeric.policy.adminui.client.model.policy.PolicyQueryService.FindExternalSubjectsResponse; import org.ebayopensource.turmeric.policy.adminui.client.model.policy.PolicyQueryService.FindSubjectsResponse; import org.ebayopensource.turmeric.policy.adminui.client.model.policy.PolicyQueryService.GetMetaDataResponse; import org.ebayopensource.turmeric.policy.adminui.client.model.policy.QueryCondition; import org.ebayopensource.turmeric.policy.adminui.client.model.policy.QueryCondition.Query; import org.ebayopensource.turmeric.policy.adminui.client.model.policy.Subject; import org.ebayopensource.turmeric.policy.adminui.client.model.policy.SubjectGroup; import org.ebayopensource.turmeric.policy.adminui.client.model.policy.SubjectGroupImpl; import org.ebayopensource.turmeric.policy.adminui.client.model.policy.SubjectImpl; import org.ebayopensource.turmeric.policy.adminui.client.model.policy.SubjectKey; import org.ebayopensource.turmeric.policy.adminui.client.model.policy.SubjectQuery; import org.ebayopensource.turmeric.policy.adminui.client.presenter.AbstractGenericPresenter; import org.ebayopensource.turmeric.policy.adminui.client.view.common.PolicyTemplateDisplay.PolicyPageTemplateDisplay; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.HasClickHandlers; 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.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.HasWidgets; /** * The Class SubjectGroupCreatePresenter. */ public class SubjectGroupCreatePresenter extends AbstractGenericPresenter { /** The Constant PRESENTER_ID. */ public final static String PRESENTER_ID = "SubjectGroupCreate"; /** The event bus. */ protected HandlerManager eventBus; /** The view. */ protected SubjectGroupCreateDisplay view; /** The service map. */ protected Map<SupportedService, PolicyAdminUIService> serviceMap; /** The subject types. */ protected List<String> subjectTypes; private List<Long> createdSubjectIds; /** The service. */ protected PolicyQueryService service; /** * The Interface SubjectGroupCreateDisplay. */ public interface SubjectGroupCreateDisplay extends PolicyPageTemplateDisplay { /** * Gets the creates the button. * * @return the creates the button */ Button getCreateButton(); /** * Gets the cancel button. * * @return the cancel button */ HasClickHandlers getCancelButton(); /** * Gets the search button. * * @return the search button */ HasClickHandlers getSearchButton(); /** * Gets the selected subjects. * * @return the selected subjects */ List<String> getSelectedSubjects(); /** * Gets the subject type. * * @return the subject type */ String getSubjectType(); /** * Gets the search term. * * @return the search term */ String getSearchTerm(); /** * Gets the description. * * @return the description */ String getDescription(); /** * Gets the name. * * @return the name */ String getName(); /** * Sets the available subjects. * * @param subjects * the new available subjects */ void setAvailableSubjects(List<String> subjects); /** * Sets the subject types. * * @param subjectTypes * the new subject types */ void setSubjectTypes(List<String> subjectTypes); /** * Error. * * @param msg * the msg */ void error(String msg); /** * Info. * * @param msg the msg */ void info(String msg); /** * Sets the sg calculator map. * * @param sgCalculatorMap * the sg calculator map */ void setSgCalculatorMap(Map<String, String> sgCalculatorMap); /** * Checks if is sg calculated. * * @return the boolean */ Boolean isSgCalculated(); /** * Gets the selected subject group calculator name. * * @return the selected subject group calculator name */ String getSelectedSubjectGroupCalculatorName(); } /** * Instantiates a new subject group create presenter. * * @param eventBus * the event bus * @param view * the view * @param serviceMap * the service map */ public SubjectGroupCreatePresenter(HandlerManager eventBus, SubjectGroupCreateDisplay view, Map<SupportedService, PolicyAdminUIService> serviceMap) { this.eventBus = eventBus; this.view = view; this.view.setAssociatedId(getId()); this.serviceMap = serviceMap; bind(); } /* (non-Javadoc) * @see org.ebayopensource.turmeric.policy.adminui.client.presenter.Presenter#getId() */ public String getId() { return PRESENTER_ID; } /* (non-Javadoc) * @see org.ebayopensource.turmeric.policy.adminui.client.presenter.AbstractGenericPresenter#getView() */ @Override protected Display getView() { return view; } /** * Bind. */ public void bind() { this.view.getSearchButton().addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { // a search term has been entered SubjectGroupCreatePresenter.this.view.getSearchTerm(); // get the Subject Type SubjectGroupCreatePresenter.this.view.getSubjectType(); // do a lookup of all the matching Subjects service = (PolicyQueryService) serviceMap .get(SupportedService.POLICY_QUERY_SERVICE); SubjectKey key = new SubjectKey(); final String searchTerm = SubjectGroupCreatePresenter.this.view .getSearchTerm(); if (searchTerm != null && !searchTerm.trim().equals("")){ key.setName(searchTerm); } key.setType(SubjectGroupCreatePresenter.this.view .getSubjectType()); final SubjectQuery query = new SubjectQuery(); query.setSubjectKeys(Collections.singletonList(key)); if ("USER".equals(key.getType())) { service.findExternalSubjects(query, new AsyncCallback<FindExternalSubjectsResponse>() { 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( FindExternalSubjectsResponse response) { List<Subject> subjects = response .getSubjects(); List<String> names = new ArrayList<String>(); if (subjects != null && subjects.size() > 0) { for (Subject s : subjects) names.add(s.getName()); }else{ view.info(PolicyAdminUIUtil.policyAdminConstants .noItemFoundMessage()); } view.setAvailableSubjects(names); } }); } else { service.findSubjects(query, new AsyncCallback<FindSubjectsResponse>() { @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( FindSubjectsResponse response) { List<Subject> subjects = response .getSubjects(); List<String> names = new ArrayList<String>(); if (subjects != null && subjects.size() > 0) { for (Subject s : subjects){ names.add(s.getName()); } }else { final String newSubjectName = query.getSubjectKeys().get(0).getName(); final String newSubjectType = query.getSubjectKeys().get(0).getType(); if(newSubjectName != null && !newSubjectName.endsWith("%")){ //create a new one if(Window.confirm(PolicyAdminUIUtil.policyAdminConstants.createInternalSubjects())){ createInternalSubject(newSubjectName, newSubjectType); names.add(newSubjectName); } }else{ // not found and do not create it view.info(PolicyAdminUIUtil.policyAdminConstants .noItemFoundMessage()); } } view.setAvailableSubjects(names); } }); } } }); this.view.getCreateButton().addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { // Verify that the group has a name, and at least one subject String name = SubjectGroupCreatePresenter.this.view.getName(); if (name == null || name.length() == 0) { SubjectGroupCreatePresenter.this.view .error(PolicyAdminUIUtil.policyAdminMessages .nameFieldMessage()); return; } String description = SubjectGroupCreatePresenter.this.view .getDescription(); List<String> subjectNames = SubjectGroupCreatePresenter.this.view .getSelectedSubjects(); if (subjectNames == null || subjectNames.isEmpty()) { SubjectGroupCreatePresenter.this.view .error(PolicyAdminUIUtil.policyAdminMessages .minimumSubjectsMessage()); return; } if ("USER".equals(view.getSubjectType())) { // external subjects todays are only USER types List<Subject> subjects = new ArrayList<Subject>(); for (String sbName : subjectNames) { SubjectImpl subject = new SubjectImpl(); subject.setType("USER"); subject.setName(sbName); subjects.add(subject); } createExternalAsInternalSubject(subjects); } // user wants to create the Subject Group // 1. send the new Subject Group to the server // 2. when server acknowledges creation, use the history // mechanism to move back to the Subject Group Summary service = (PolicyQueryService) serviceMap .get(SupportedService.POLICY_QUERY_SERVICE); final SubjectGroupImpl group = new SubjectGroupImpl(); group.setName(name); group.setDescription(description); group.setType(SubjectGroupCreatePresenter.this.view .getSubjectType()); group.setSubjects(subjectNames); group.setGroupCalculator(SubjectGroupCreatePresenter.this.view.getSelectedSubjectGroupCalculatorName()); /** * 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.createSubjectGroups( Collections.singletonList((SubjectGroup) group), new AsyncCallback<CreateSubjectGroupsResponse>() { @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( CreateSubjectGroupsResponse arg0) { Map<String, String> prefill = new HashMap<String, String>(); prefill.put( HistoryToken.SRCH_SUBJECT_GROUP_TYPE, SubjectGroupCreatePresenter.this.view .getSubjectType()); prefill.put( HistoryToken.SRCH_SUBJECT_GROUP_NAME, SubjectGroupCreatePresenter.this.view .getName()); HistoryToken token = makeToken( PolicyController.PRESENTER_ID, SubjectGroupSummaryPresenter.PRESENTER_ID, prefill); History.newItem(token.toString(), true); } }); view.getCreateButton().setEnabled(true); } }; if ("USER".equals(view.getSubjectType())) { view.getCreateButton().setEnabled(false); timer.schedule(3000); } else { timer.schedule(1); } } }); this.view.getCancelButton().addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { // Just go back to the summary HistoryToken token = makeToken(PolicyController.PRESENTER_ID, SubjectGroupSummaryPresenter.PRESENTER_ID, null); History.newItem(token.toString(), true); } }); } private void createExternalAsInternalSubject(final List<Subject> subjects) { List<SubjectKey> keys = new ArrayList<SubjectKey>(); for (Subject subj : subjects) { SubjectKey key = new SubjectKey(); key.setName(subj.getName()); // today external subject supported are USER types key.setType("USER"); keys.add(key); } final SubjectQuery query = new SubjectQuery(); query.setSubjectKeys(keys); // looking for already created subjects service.findSubjects(query, new AsyncCallback<PolicyQueryService.FindSubjectsResponse>() { public void onSuccess(FindSubjectsResponse result) { subjects.removeAll(result.getSubjects()); if (subjects.size() > 0) { service.createSubjects( subjects, new AsyncCallback<PolicyQueryService.CreateSubjectsResponse>() { public void onSuccess( final CreateSubjectsResponse result) { // do nothing, subjects has been // stored, // we can continue... } public void onFailure( final 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 onFailure(Throwable arg) { if (arg.getLocalizedMessage().contains("500")) { view.error(PolicyAdminUIUtil.messages .serverError(PolicyAdminUIUtil.policyAdminConstants .genericErrorMessage())); } else { view.error(PolicyAdminUIUtil.messages.serverError(arg .getLocalizedMessage())); } } }); } private void createInternalSubject(final String subjectName, final String subjectType) { List<Subject> subjects = new ArrayList<Subject>(); SubjectImpl subject = new SubjectImpl(); subject.setName(subjectName); subject.setType(subjectType); subjects.add(subject); service.createSubjects( subjects, new AsyncCallback<PolicyQueryService.CreateSubjectsResponse>() { public void onSuccess( final CreateSubjectsResponse result) { // do nothing, subjects has been // stored, // we can continue... } public void onFailure( final Throwable arg) { if (arg.getLocalizedMessage() .contains("500")) { view.error(PolicyAdminUIUtil.messages .serverError(PolicyAdminUIUtil.policyAdminConstants .genericErrorMessage())); } else { view.error(PolicyAdminUIUtil.messages.serverError(arg .getLocalizedMessage())); } } }); } /* (non-Javadoc) * @see org.ebayopensource.turmeric.policy.adminui.client.presenter.AbstractGenericPresenter#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) { fetchSubjectTypes(); fetchSubjectGroupCalculators(); this.view.setSubjectTypes(subjectTypes); container.clear(); this.view.activate(); container.add(this.view.asWidget()); } private void fetchSubjectGroupCalculators() { QueryCondition queryCondition = new QueryCondition(); queryCondition.setResolution(null); QueryCondition.Query query = new Query("SUBJECT_TYPE", "SubjectGroupCalculator"); queryCondition.getQueries().add(query); service = (PolicyQueryService) serviceMap.get(SupportedService.POLICY_QUERY_SERVICE); service.getMetaData(queryCondition, new AsyncCallback<PolicyQueryService.GetMetaDataResponse>() { @Override public void onFailure(Throwable arg0) { if (arg0.getLocalizedMessage() .contains("500")) { view.error(PolicyAdminUIUtil.messages .serverError(PolicyAdminUIUtil.policyAdminConstants .genericErrorMessage())); } else { view.error(PolicyAdminUIUtil.messages.serverError(arg0 .getLocalizedMessage())); } } @Override public void onSuccess(GetMetaDataResponse arg0) { view.setSgCalculatorMap(arg0.getValues()); } }); } private void fetchSubjectTypes() { subjectTypes = org.ebayopensource.turmeric.policy.adminui.client.model.policy.SubjectType .getValues(); } }