/* * Copyright (c) 2010-2015 Evolveum * * 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 com.evolveum.midpoint.web.page.admin.users.component; import java.util.Arrays; import java.util.Iterator; import java.util.List; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterExit; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import org.apache.commons.lang.StringUtils; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.extensions.markup.html.repeater.tree.ITreeProvider; import org.apache.wicket.extensions.markup.html.repeater.tree.TableTree; import org.apache.wicket.extensions.markup.html.tabs.ITab; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.model.IModel; import com.evolveum.midpoint.gui.api.component.BasePanel; import com.evolveum.midpoint.gui.api.model.LoadableModel; import com.evolveum.midpoint.gui.api.page.PageBase; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.match.PolyStringNormMatchingRule; import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; import com.evolveum.midpoint.prism.query.AndFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.OrFilter; import com.evolveum.midpoint.prism.query.OrgFilter; import com.evolveum.midpoint.prism.query.SubstringFilter; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.component.BasicSearchPanel; import com.evolveum.midpoint.web.component.TabbedPanel; import com.evolveum.midpoint.web.component.data.TablePanel; import com.evolveum.midpoint.web.component.util.SelectableBean; import com.evolveum.midpoint.xml.ns._public.common.common_3.OrgType; /** * Common superclass for TreeTablePanel and OrgTreeTablePanel * * @author semancik */ public abstract class AbstractTreeTablePanel extends BasePanel<String> { private static final Trace LOGGER = TraceManager.getTrace(AbstractTreeTablePanel.class); protected static final int CONFIRM_DELETE = 0; protected static final int CONFIRM_DELETE_ROOT = 1; protected static final int CONFIRM_DELETE_MANAGER = 2; protected static final int CONFIRM_DELETE_MEMBER = 3; protected static final String DOT_CLASS = AbstractTreeTablePanel.class.getName() + "."; protected static final String OPERATION_DELETE_OBJECTS = DOT_CLASS + "deleteObjects"; protected static final String OPERATION_DELETE_OBJECT = DOT_CLASS + "deleteObject"; protected static final String OPERATION_MOVE_OBJECTS = DOT_CLASS + "moveObjects"; protected static final String OPERATION_MOVE_OBJECT = DOT_CLASS + "moveObject"; protected static final String OPERATION_UPDATE_OBJECTS = DOT_CLASS + "updateObjects"; protected static final String OPERATION_UPDATE_OBJECT = DOT_CLASS + "updateObject"; protected static final String OPERATION_RECOMPUTE = DOT_CLASS + "recompute"; protected static final String OPERATION_SEARCH_MANAGERS = DOT_CLASS + "searchManagers"; protected static final String ID_TREE = "tree"; protected static final String ID_TREE_CONTAINER = "treeContainer"; protected static final String ID_CONTAINER_CHILD_ORGS = "childOrgContainer"; protected static final String ID_CONTAINER_MANAGER = "managerContainer"; protected static final String ID_CONTAINER_MEMBER = "memberContainer"; protected static final String ID_CHILD_TABLE = "childUnitTable"; protected static final String ID_MANAGER_TABLE = "managerTable"; protected static final String ID_MEMBER_TABLE = "memberTable"; protected static final String ID_FORM = "form"; protected static final String ID_CONFIRM_DELETE_POPUP = "confirmDeletePopup"; protected static final String ID_MOVE_POPUP = "movePopup"; protected static final String ID_ADD_DELETE_POPUP = "addDeletePopup"; protected static final String ID_TREE_MENU = "treeMenu"; protected static final String ID_TREE_HEADER = "treeHeader"; protected static final String ID_TREE_TITLE = "treeTitle"; protected static final String ID_SEARCH_FORM = "searchForm"; protected static final String ID_BASIC_SEARCH = "basicSearch"; protected static final String ID_SEARCH_SCOPE = "searchScope"; protected static final String ID_SEARCH_BY_TYPE = "searchByType"; protected static final String SEARCH_SCOPE_SUBTREE = "subtree"; protected static final String SEARCH_SCOPE_ONE = "one"; protected static final ObjectTypes OBJECT_TYPES_DEFAULT = ObjectTypes.OBJECT; protected static final List<String> SEARCH_SCOPE_VALUES = Arrays.asList( SEARCH_SCOPE_SUBTREE, SEARCH_SCOPE_ONE); protected IModel<SelectableBean<OrgType>> selected; public AbstractTreeTablePanel(String id, IModel<String> rootOid) { super(id, rootOid); } protected SelectableBean<OrgType> getRootFromProvider() { TableTree<SelectableBean<OrgType>, String> tree = getTree(); ITreeProvider<SelectableBean<OrgType>> provider = tree.getProvider(); Iterator<? extends SelectableBean<OrgType>> iterator = provider.getRoots(); return iterator.hasNext() ? iterator.next() : null; } protected void refreshTabbedPanel(AjaxRequestTarget target) { PageBase page = getPageBase(); TabbedPanel tabbedPanel = findParent(TabbedPanel.class); IModel<List<ITab>> tabs = tabbedPanel.getTabs(); if (tabs instanceof LoadableModel) { ((LoadableModel) tabs).reset(); } if (tabs.getObject() != null && tabs.getObject().size() > 0) { tabbedPanel.setSelectedTab(0); } target.add(tabbedPanel); target.add(page.getFeedbackPanel()); } protected TableTree<SelectableBean<OrgType>, String> getTree() { return (TableTree<SelectableBean<OrgType>, String>) get(createComponentPath(ID_TREE_CONTAINER, ID_TREE)); } protected WebMarkupContainer getOrgChildContainer() { return (WebMarkupContainer) get(createComponentPath(ID_FORM, ID_CONTAINER_CHILD_ORGS)); } protected TablePanel getOrgChildTable() { return (TablePanel) get(createComponentPath(ID_FORM, ID_CONTAINER_CHILD_ORGS, ID_CHILD_TABLE)); } protected ObjectQuery createOrgChildQuery() { SelectableBean<OrgType> dto = selected.getObject(); String oid = dto != null && dto.getValue() != null ? dto.getValue().getOid() : getModel().getObject(); BasicSearchPanel<String> basicSearch = (BasicSearchPanel) get(createComponentPath(ID_SEARCH_FORM, ID_BASIC_SEARCH)); String object = basicSearch.getModelObject(); DropDownChoice<String> searchScopeChoice = (DropDownChoice) get(createComponentPath(ID_SEARCH_FORM, ID_SEARCH_SCOPE)); String scope = searchScopeChoice.getModelObject(); if (StringUtils.isBlank(object)) { object = null; } PageBase page = getPageBase(); PrismContext context = page.getPrismContext(); S_AtomicFilterExit q; if (object == null || SEARCH_SCOPE_ONE.equals(scope)) { q = QueryBuilder.queryFor(OrgType.class, context) .isDirectChildOf(oid); } else { q = QueryBuilder.queryFor(OrgType.class, context) .isChildOf(oid); } if (object == null) { return q.build(); } PolyStringNormalizer normalizer = context.getDefaultPolyStringNormalizer(); String normalizedString = normalizer.normalize(object); if (StringUtils.isEmpty(normalizedString)) { return q.build(); } ObjectQuery query = q.and().block() .item(OrgType.F_NAME).containsPoly(normalizedString).matchingNorm() .or().item(OrgType.F_DISPLAY_NAME).containsPoly(normalizedString).matchingNorm() .build(); if (LOGGER.isTraceEnabled()) { LOGGER.trace("Searching child orgs of org {} with query:\n{}", oid, query.debugDump()); } return query; } }