/* * Copyright (c) 2010-2013 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.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import org.apache.wicket.Component; import org.apache.wicket.RestartResponseException; import org.apache.wicket.extensions.markup.html.repeater.util.SortableTreeProvider; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import com.evolveum.midpoint.gui.api.page.PageBase; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils; import com.evolveum.midpoint.model.api.ModelService; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.query.ObjectPaging; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.OrderDirection; import com.evolveum.midpoint.prism.query.OrgFilter; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem; import com.evolveum.midpoint.web.component.util.SelectableBean; import com.evolveum.midpoint.web.page.admin.users.PageOrgTree; import com.evolveum.midpoint.web.page.admin.users.PageUsers; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.midpoint.xml.ns._public.common.common_3.OrgType; /** * @author lazyman */ public class OrgTreeProvider extends SortableTreeProvider<SelectableBean<OrgType>, String> { private static final long serialVersionUID = 1L; private static final Trace LOGGER = TraceManager.getTrace(OrgTreeProvider.class); private static final String DOT_CLASS = OrgTreeProvider.class.getName() + "."; private static final String LOAD_ORG_UNIT = DOT_CLASS + "loadOrgUnit"; private static final String LOAD_ORG_UNITS = DOT_CLASS + "loadOrgUnits"; private Component component; private IModel<String> rootOid; private SelectableBean<OrgType> root; private List<SelectableBean<OrgType>> availableData; public OrgTreeProvider(Component component, IModel<String> rootOid) { this.component = component; this.rootOid = rootOid; } public List<SelectableBean<OrgType>> getAvailableData() { if (availableData == null){ availableData = new ArrayList<>(); } return availableData; } private PageBase getPageBase() { return WebComponentUtil.getPageBase(component); } private ModelService getModelService() { return getPageBase().getModelService(); } @Override public Iterator<? extends SelectableBean<OrgType>> getChildren(SelectableBean<OrgType> node) { // getAvailableData().clear(); LOGGER.debug("Loading children for {}", new Object[]{node}); Iterator<SelectableBean<OrgType>> iterator = null; ObjectQuery query = QueryBuilder.queryFor(ObjectType.class, getPageBase().getPrismContext()) .isDirectChildOf(node.getValue().getOid()) // TODO what if getValue==null .asc(ObjectType.F_NAME) .build(); OperationResult result = new OperationResult(LOAD_ORG_UNITS); try { // Collection<SelectorOptions<GetOperationOptions>> options = WebModelServiceUtils.createOptionsForParentOrgRefs(); Collection<SelectorOptions<GetOperationOptions>> options = null; Task task = getPageBase().createSimpleTask(LOAD_ORG_UNITS); List<PrismObject<OrgType>> units = getModelService().searchObjects(OrgType.class, query, options, task, result); LOGGER.debug("Found {} units.", units.size()); List<SelectableBean<OrgType>> list = new ArrayList<SelectableBean<OrgType>>(); for (PrismObject<OrgType> unit : units) { SelectableBean<OrgType> selectable =createObjectWrapper(node, unit); list.add(selectable); // if (getAvailableData().contains(selectable)){ // getAvailableData().remove(selectable); // } // getAvailableData().add(selectable); } getAvailableData().addAll(list); // Collections.sort(list); iterator = list.iterator(); } catch (Exception ex) { LoggingUtils.logUnexpectedException(LOGGER, "Couldn't load children", ex); result.recordFatalError("Unable to load org unit", ex); } finally { result.computeStatus(); } if (WebComponentUtil.showResultInPage(result)) { getPageBase().showResult(result); throw new RestartResponseException(PageOrgTree.class); } if (iterator == null) { iterator = new ArrayList<SelectableBean<OrgType>>().iterator(); } LOGGER.debug("Finished loading children."); return iterator; } private SelectableBean<OrgType> createObjectWrapper(SelectableBean<OrgType> parent, PrismObject<OrgType> unit) { if (unit == null) { return null; } //todo relation [lazyman] // OrgTreeDto orgDto = new OrgTreeDto(parent, unit); OrgType org = unit.asObjectable(); if (parent != null){ org.getParentOrg().clear(); org.getParentOrg().add(parent.getValue()); } SelectableBean<OrgType> orgDto = new SelectableBean<OrgType>(org); orgDto.getMenuItems().addAll(createInlineMenuItems()); return orgDto; } protected List<InlineMenuItem> createInlineMenuItems(){ return null; } @Override public Iterator<SelectableBean<OrgType>> getRoots() { OperationResult result = null; if (root == null) { Task task = getPageBase().createSimpleTask(LOAD_ORG_UNIT); result = task.getResult(); LOGGER.debug("Getting roots for: " + rootOid.getObject()); PrismObject<OrgType> object = WebModelServiceUtils.loadObject(OrgType.class, rootOid.getObject(), WebModelServiceUtils.createOptionsForParentOrgRefs(), getPageBase(), task, result); result.computeStatus(); root = createObjectWrapper(null, object); if (LOGGER.isDebugEnabled()) { LOGGER.debug("\n{}", result.debugDump()); LOGGER.debug("Finished roots loading."); } } if (WebComponentUtil.showResultInPage(result)) { getPageBase().showResult(result); throw new RestartResponseException(PageUsers.class); } List<SelectableBean<OrgType>> list = new ArrayList<SelectableBean<OrgType>>(); if (root != null) { list.add(root); if (!getAvailableData().contains(root)){ getAvailableData().add(root); } } // getAvailableData().addAll(list); return list.iterator(); } @Override public boolean hasChildren(SelectableBean<OrgType> node) { return true; } @Override public IModel<SelectableBean<OrgType>> model(SelectableBean<OrgType> object) { return new Model<>(object); } public List<OrgType> getSelectedObjects(){ List<OrgType> selectedOrgs = new ArrayList<>(); for (SelectableBean<OrgType> selected : getAvailableData()){ if (selected.isSelected() && selected.getValue() != null) { selectedOrgs.add(selected.getValue()); } } return selectedOrgs; } }