Skip to content

Commit

Permalink
fix for choices for object class and intent on schema handling panel …
Browse files Browse the repository at this point in the history
…(MID-7274)
  • Loading branch information
skublik committed Oct 8, 2021
1 parent 81fb598 commit a2a8e58
Show file tree
Hide file tree
Showing 7 changed files with 276 additions and 138 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.gui.impl.factory.panel.PrismPropertyPanelContext;
import com.evolveum.midpoint.gui.impl.page.admin.assignmentholder.component.assignmentType.AbstractAssignmentTypePanel;
import com.evolveum.midpoint.gui.impl.page.admin.ObjectDetailsModels;

Expand Down Expand Up @@ -5188,4 +5189,42 @@ public static <T extends ObjectType> Panel createPanel(Class<? extends Panel> pa
}
return null;
}

public static PrismObject<ResourceType> findResource(PrismPropertyWrapper itemWrapper, PrismPropertyPanelContext panelCtx) {
PrismObjectWrapper<?> objectWrapper = itemWrapper.findObjectWrapper();
if (objectWrapper == null) {
return null;
}

if (ResourceType.class.equals(objectWrapper.getObject().getCompileTimeClass())) {
return (PrismObject<ResourceType>) objectWrapper.getObject();
} else if (TaskType.class.equals(objectWrapper.getObject().getCompileTimeClass())) {
PrismReferenceValue objectRef = findResourceReference(itemWrapper);

if (objectRef == null || objectRef.getOid() == null) {
return null;
}

Task task = panelCtx.getPageBase().createSimpleTask("load resource");
return WebModelServiceUtils.loadObject(objectRef, ResourceType.COMPLEX_TYPE, panelCtx.getPageBase(), task, task.getResult());
}
return null;
}

private static PrismReferenceValue findResourceReference(PrismPropertyWrapper<QName> itemWrapper) {
PrismContainerValueWrapper<?> parent = itemWrapper.getParent();
if (parent == null) {
return null;
}
try {
PrismReferenceWrapper<Referencable> resourceRefWrapper = parent.findReference(ResourceObjectSetType.F_RESOURCE_REF);
if (resourceRefWrapper == null) {
return null;
}

return resourceRefWrapper.getValue().getNewValue();
} catch (SchemaException e) {
return null;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
/*
* Copyright (C) 2010-2020 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/
package com.evolveum.midpoint.gui.impl.factory.panel;

import com.evolveum.midpoint.gui.api.component.autocomplete.AutoCompleteTextPanel;
import com.evolveum.midpoint.gui.api.prism.wrapper.*;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismPropertyValue;
import com.evolveum.midpoint.prism.PrismReferenceValue;
import com.evolveum.midpoint.prism.Referencable;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.web.component.prism.InputPanel;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.apache.wicket.extensions.ajax.markup.html.autocomplete.StringAutoCompleteRenderer;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.io.Serializable;
import java.util.Collections;
import java.util.Iterator;

//FIXME serializable?
@Component
public abstract class AbstractIntentFactory extends AbstractInputGuiComponentFactory<String> implements Serializable {

@Override
protected InputPanel getPanel(PrismPropertyPanelContext<String> panelCtx) {
return new AutoCompleteTextPanel<String>(panelCtx.getComponentId(), panelCtx.getRealValueModel(), String.class, StringAutoCompleteRenderer.INSTANCE) {

@Override
public Iterator<String> getIterator(String input) {
PrismPropertyWrapper<String> itemWrapper = panelCtx.unwrapWrapperModel();
PrismObject<ResourceType> resourceType = WebComponentUtil.findResource(itemWrapper, panelCtx);

if (resourceType == null) {
return Collections.emptyIterator();
}

PrismPropertyValue<ShadowKindType> kindPropValue = findKind(itemWrapper);
if (kindPropValue == null) {
return Collections.emptyIterator();
}
return WebComponentUtil.getIntensForKind(resourceType, kindPropValue.getRealValue(), panelCtx.getPageBase()).iterator();
}
};
}

private PrismPropertyValue<ShadowKindType> findKind(PrismPropertyWrapper<String> itemWrapper) {
PrismContainerValueWrapper<?> parent = itemWrapper.getParent();
if (parent == null) {
return null;
}
try {
PrismPropertyWrapper<ShadowKindType> kindWrapper = parent.findProperty(ResourceObjectSetType.F_KIND);
if (kindWrapper == null) {
return null;
}

return kindWrapper.getValue().getNewValue();
} catch (SchemaException e) {
return null;
}
}

@Override
public Integer getOrder() {
return 100;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/*
* Copyright (C) 2010-2020 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/
package com.evolveum.midpoint.gui.impl.factory.panel;

import com.evolveum.midpoint.gui.api.component.autocomplete.AutoCompleteQNamePanel;
import com.evolveum.midpoint.gui.api.prism.wrapper.*;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.web.component.prism.InputPanel;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import javax.xml.namespace.QName;
import java.io.Serializable;
import java.util.Collection;
import java.util.Collections;

//FIXME serializable
public abstract class AbstractObjectClassFactory extends AbstractInputGuiComponentFactory<QName> implements Serializable {

@Override
protected InputPanel getPanel(PrismPropertyPanelContext<QName> panelCtx) {
return new AutoCompleteQNamePanel<>(panelCtx.getComponentId(), panelCtx.getRealValueModel()) {

@Override
public Collection<QName> loadChoices() {
PrismPropertyWrapper<QName> itemWrapper = panelCtx.unwrapWrapperModel();
PrismObject<ResourceType> resourceType = WebComponentUtil.findResource(itemWrapper, panelCtx);

if (resourceType == null) {
return Collections.emptyList();
}
return WebComponentUtil.loadResourceObjectClassValues(resourceType.asObjectable(), panelCtx.getPageBase());
}

@Override
protected boolean alwaysReload() {
return true;
}
};
}

@Override
public Integer getOrder() {
return 10000 - 10;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/*
* Copyright (C) 2010-2020 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/
package com.evolveum.midpoint.gui.impl.factory.panel;

import com.evolveum.midpoint.gui.api.component.autocomplete.AutoCompleteTextPanel;
import com.evolveum.midpoint.gui.api.prism.wrapper.*;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismPropertyValue;
import com.evolveum.midpoint.prism.PrismReferenceValue;
import com.evolveum.midpoint.prism.Referencable;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.web.component.prism.InputPanel;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.apache.wicket.extensions.ajax.markup.html.autocomplete.StringAutoCompleteRenderer;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.io.Serializable;
import java.util.Collections;
import java.util.Iterator;

@Component
public class ResourceIntentFactory extends AbstractIntentFactory {

@PostConstruct
public void register() {
getRegistry().addToRegistry(this);
}

@Override
public <IW extends ItemWrapper<?, ?>> boolean match(IW wrapper) {
PrismObjectWrapper<?> objectWrapper = wrapper.findObjectWrapper();
if (objectWrapper == null) {
return false;
}

ObjectType object = objectWrapper.getObject().asObjectable();
if (!(object instanceof ResourceType)) {
return false;
}
return wrapper.getPath().lastName().equivalent(ResourceObjectTypeDefinitionType.F_INTENT);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/*
* Copyright (C) 2010-2020 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/
package com.evolveum.midpoint.gui.impl.factory.panel;

import com.evolveum.midpoint.gui.api.prism.wrapper.*;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismReferenceValue;
import com.evolveum.midpoint.prism.Referencable;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.xml.namespace.QName;
import java.io.Serializable;

@Component
public class ResourceObjectClassFactory extends AbstractObjectClassFactory {

@PostConstruct
public void register() {
getRegistry().addToRegistry(this);
}


@Override
public <IW extends ItemWrapper<?, ?>> boolean match(IW wrapper) {
PrismObjectWrapper<?> objectWrapper = wrapper.findObjectWrapper();
if (objectWrapper == null) {
return false;
}

ObjectType object = objectWrapper.getObject().asObjectable();
if (!(object instanceof ResourceType)) {
return false;
}
return wrapper.getPath().lastName().equivalent(ResourceObjectTypeDefinitionType.F_OBJECT_CLASS);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,44 +32,14 @@
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.web.component.prism.InputPanel;

//FIXME serializable?
@Component
public class TaskIntentFactory extends AbstractInputGuiComponentFactory<String> implements Serializable {
public class TaskIntentFactory extends AbstractIntentFactory {

@PostConstruct
public void register() {
getRegistry().addToRegistry(this);
}

@Override
protected InputPanel getPanel(PrismPropertyPanelContext<String> panelCtx) {
return new AutoCompleteTextPanel<String>(panelCtx.getComponentId(), panelCtx.getRealValueModel(), String.class, StringAutoCompleteRenderer.INSTANCE) {

@Override
public Iterator<String> getIterator(String input) {
PrismPropertyWrapper<String> itemWrapper = panelCtx.unwrapWrapperModel();
PrismReferenceValue objectRef = findResourceReference(itemWrapper);

if (objectRef == null || objectRef.getOid() == null) {
return Collections.emptyIterator();
}

Task task = panelCtx.getPageBase().createSimpleTask("load resource");
PrismObject<ResourceType> resourceType = WebModelServiceUtils.loadObject(objectRef, ResourceType.COMPLEX_TYPE, panelCtx.getPageBase(), task, task.getResult());

if (resourceType == null) {
return Collections.emptyIterator();
}

PrismPropertyValue<ShadowKindType> kindPropValue = findKind(itemWrapper);
if (kindPropValue == null) {
return Collections.emptyIterator();
}
return WebComponentUtil.getIntensForKind(resourceType, kindPropValue.getRealValue(), panelCtx.getPageBase()).iterator();
}
};
}

@Override
public <IW extends ItemWrapper<?, ?>> boolean match(IW wrapper) {
PrismObjectWrapper<?> objectWrapper = wrapper.findObjectWrapper();
Expand All @@ -83,50 +53,11 @@ public Iterator<String> getIterator(String input) {
}

TaskType task = (TaskType) object;
if (WebComponentUtil.isResourceRelatedTask(task) && wrapper.getPath().startsWith(ItemPath.create(TaskType.F_ACTIVITY, ActivityDefinitionType.F_WORK)) && wrapper.getPath().lastName().equivalent(ResourceObjectSetType.F_INTENT)) {
if (WebComponentUtil.isResourceRelatedTask(task)
&& wrapper.getPath().startsWith(ItemPath.create(TaskType.F_ACTIVITY, ActivityDefinitionType.F_WORK))
&& wrapper.getPath().lastName().equivalent(ResourceObjectSetType.F_INTENT)) {
return true;
}
return false;
}

//TODO coppied from TaskObjectClassFactory
private PrismReferenceValue findResourceReference(PrismPropertyWrapper<String> itemWrapper) {
PrismContainerValueWrapper<?> parent = itemWrapper.getParent();
if (parent == null) {
return null;
}
try {
PrismReferenceWrapper<Referencable> resourceRefWrapper = parent.findReference(ResourceObjectSetType.F_RESOURCE_REF);
if (resourceRefWrapper == null) {
return null;
}

return resourceRefWrapper.getValue().getNewValue();
} catch (SchemaException e) {
return null;
}
// WebPrismUtil.findSingleReferenceValue(itemWrapper, ItemPath.create(TaskType.F_OBJECT_REF))
}

private PrismPropertyValue<ShadowKindType> findKind(PrismPropertyWrapper<String> itemWrapper) {
PrismContainerValueWrapper<?> parent = itemWrapper.getParent();
if (parent == null) {
return null;
}
try {
PrismPropertyWrapper<ShadowKindType> kindWrapper = parent.findProperty(ResourceObjectSetType.F_KIND);
if (kindWrapper == null) {
return null;
}

return kindWrapper.getValue().getNewValue();
} catch (SchemaException e) {
return null;
}
}

@Override
public Integer getOrder() {
return 100;
}
}

0 comments on commit a2a8e58

Please sign in to comment.