Skip to content

Commit

Permalink
Merge branch 'master' into feature/dynamic-values
Browse files Browse the repository at this point in the history
  • Loading branch information
semancik committed May 12, 2017
2 parents 8ef0729 + 63127be commit c8921ea
Show file tree
Hide file tree
Showing 40 changed files with 629 additions and 343 deletions.
Expand Up @@ -209,15 +209,22 @@ public static void runTask(Collection<TaskType> tasksToRun, Task operationalTask

@Nullable
public static <T extends ObjectType> PrismObject<T> loadObject(Class<T> type, String oid,
PageBase page, Task task, OperationResult result) {
PageBase page, Task task, OperationResult result) {
return loadObject(type, oid, null, page, task, result);
}

@Nullable
@Nullable
public static <T extends ObjectType> PrismObject<T> loadObject(Class<T> type, String oid,
Collection<SelectorOptions<GetOperationOptions>> options,
PageBase page, Task task, OperationResult result) {
return loadObject(type, oid, options, true, page, task, result);
}

@Nullable
public static <T extends ObjectType> PrismObject<T> loadObject(Class<T> type, String oid,
Collection<SelectorOptions<GetOperationOptions>> options,
PageBase page, Task task, OperationResult result) {
LOGGER.debug("Loading {} with oid {}, options {}", new Object[]{type.getSimpleName(), oid, options});
Collection<SelectorOptions<GetOperationOptions>> options, boolean allowNotFound,
PageBase page, Task task, OperationResult result) {
LOGGER.debug("Loading {} with oid {}, options {}", type.getSimpleName(), oid, options);

OperationResult subResult;
if (result != null) {
Expand All @@ -227,17 +234,16 @@ public static <T extends ObjectType> PrismObject<T> loadObject(Class<T> type, St
}
PrismObject<T> object = null;
try {
if (options == null){
if (options == null) {
options = SelectorOptions.createCollection(GetOperationOptions.createResolveNames());
} else {
GetOperationOptions getOpts = SelectorOptions.findRootOptions(options);
if (getOpts == null){
options.add(new SelectorOptions<GetOperationOptions>(GetOperationOptions.createResolveNames()));
if (getOpts == null) {
options.add(new SelectorOptions<>(GetOperationOptions.createResolveNames()));
} else {
getOpts.setResolveNames(Boolean.TRUE);
}
}
// .createResolveNames();
object = page.getModelService().getObject(type, oid, options, task, subResult);
} catch (AuthorizationException e) {
// Not authorized to access the object. This is probably caused by a reference that
Expand All @@ -248,18 +254,23 @@ public static <T extends ObjectType> PrismObject<T> loadObject(Class<T> type, St
task.getOwner() != null ? task.getOwner().getName() : null, type.getSimpleName(), oid);
return null;
} catch (ObjectNotFoundException e) {
// Object does not exist. It was deleted in the meanwhile, or not created yet. This could happen quite often.
subResult.recordHandledError(e);
LOGGER.debug("{} {} does not exist", type.getSimpleName(), oid, e);
return null;
if (allowNotFound) {
// Object does not exist. It was deleted in the meanwhile, or not created yet. This could happen quite often.
subResult.recordHandledError(e);
LOGGER.debug("{} {} does not exist", type.getSimpleName(), oid, e);
return null;
} else {
subResult.recordFatalError("WebModelUtils.couldntLoadObject", e);
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't load object", e);
}
} catch (Exception ex) {
subResult.recordFatalError("WebModelUtils.couldntLoadObject", ex);
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't load object", ex);
} finally {
subResult.computeStatus();
}

if (result == null && WebComponentUtil.showResultInPage(subResult)) {
// TODO reconsider this part: until recently, the condition was always 'false'
if (WebComponentUtil.showResultInPage(subResult)) {
page.showResult(subResult);
}

Expand Down
Expand Up @@ -15,20 +15,6 @@
*/
package com.evolveum.midpoint.web.component.prism;

import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.JAXBElement;

import org.apache.commons.lang.StringUtils;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.repeater.RepeatingView;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;

import com.evolveum.midpoint.gui.api.component.BasePanel;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.impl.util.GuiImplUtil;
Expand All @@ -37,17 +23,24 @@
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.xml.XsdTypeMapper;
import com.evolveum.midpoint.schema.util.FormTypeUtil;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractFormItemType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.FormDefinitionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.FormFieldGroupType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.FormItemDisplayType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import com.evolveum.prism.xml.ns._public.types_3.ItemPathType;
import com.evolveum.midpoint.schema.util.FormTypeUtil;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.repeater.RepeatingView;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.jetbrains.annotations.NotNull;

import java.util.List;

public class DynamicFieldGroupPanel<O extends ObjectType> extends BasePanel<ObjectWrapper<O>>{
public class DynamicFieldGroupPanel<O extends ObjectType> extends BasePanel<ObjectWrapper<O>> {

private static final long serialVersionUID = 1L;

Expand All @@ -65,7 +58,7 @@ public DynamicFieldGroupPanel(String id, String groupName, IModel<ObjectWrapper<
initLayout(groupName, formItems, mainForm);
}

public DynamicFieldGroupPanel(String id, IModel<ObjectWrapper<O>> objectWrapper, FormDefinitionType formDefinition, Form<?> mainForm, PageBase parentPage) {
public DynamicFieldGroupPanel(String id, IModel<ObjectWrapper<O>> objectWrapper, @NotNull FormDefinitionType formDefinition, Form<?> mainForm, PageBase parentPage) {
super(id, objectWrapper);
setParent(parentPage);
String groupName = "Basic";
Expand Down Expand Up @@ -102,7 +95,7 @@ private void initLayout(String groupName, List<AbstractFormItemType> formItems,
containerPanel.setOutputMarkupId(true);
itemView.add(containerPanel);
} else {
PrismPropertyPanel propertyPanel = new PrismPropertyPanel(itemView.newChildId(),
PrismPropertyPanel<?> propertyPanel = new PrismPropertyPanel<>(itemView.newChildId(),
Model.of(itemWrapper), mainForm, getPageBase());
propertyPanel.setOutputMarkupId(true);
propertyPanel.add(AttributeModifier.append("class", ((i % 2) == 0) ? "" : "stripe"));
Expand Down
Expand Up @@ -17,12 +17,10 @@
<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org">
<wicket:panel>
<div class="container-fluid prism-object" >
<div class="row col-md-12">
<div class="container-fluid prism-container" wicket:id="formFields"/>
</div>
<div class="container-fluid prism-object" >
<div class="row col-md-12">
<div class="container-fluid prism-container" wicket:id="formFields"/>
</div>
</div>


</wicket:panel>
</html>
Expand Up @@ -16,12 +16,13 @@
package com.evolveum.midpoint.web.component.prism;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.xml.namespace.QName;

import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.IModel;

Expand All @@ -34,21 +35,16 @@
import com.evolveum.midpoint.prism.PrismObjectDefinition;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.Producer;
import com.evolveum.midpoint.util.exception.SchemaException;
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.xml.ns._public.common.common_3.AbstractFormItemType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.FormDefinitionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.FormFieldGroupType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.FormType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.prism.xml.ns._public.types_3.ItemPathType;
import com.evolveum.midpoint.schema.util.FormTypeUtil;

import static com.evolveum.midpoint.schema.util.ObjectTypeUtil.asObjectable;

public class DynamicFormPanel<O extends ObjectType> extends BasePanel<ObjectWrapper<O>> {

private static final long serialVersionUID = 1L;
Expand All @@ -60,7 +56,8 @@ public class DynamicFormPanel<O extends ObjectType> extends BasePanel<ObjectWrap

private static final String ID_FORM_FIELDS = "formFields";

LoadableModel<ObjectWrapper<O>> wrapperModel = null;
private LoadableModel<ObjectWrapper<O>> wrapperModel;
private FormType form;

public DynamicFormPanel(String id, final IModel<O> model, String formOid, Form<?> mainForm,
boolean runPrivileged, final PageBase parentPage) {
Expand All @@ -71,17 +68,14 @@ public DynamicFormPanel(String id, final IModel<O> model, String formOid, Form<?
public DynamicFormPanel(String id, final PrismObject<O> prismObject, String formOid, Form<?> mainForm,
boolean runPrivileged, final PageBase parentPage) {
super(id);

initialize(prismObject, formOid, mainForm, runPrivileged, parentPage);

}

public DynamicFormPanel(String id, final QName objectType, String formOid, Form<?> mainForm,
boolean runPrivileged, final PageBase parentPage) {
super(id);
PrismObject<O> prismObject = instantiateObject(objectType, parentPage);
initialize(prismObject, formOid, mainForm, runPrivileged, parentPage);

}

private PrismObject<O> instantiateObject(QName objectType, PageBase parentPage) {
Expand All @@ -105,27 +99,33 @@ private void initialize(final PrismObject<O> prismObject, String formOid, Form<?
throw new RestartResponseException(getPageBase());
}

wrapperModel = new LoadableModel<ObjectWrapper<O>>() {
setParent(parentPage);
form = loadForm(formOid, runPrivileged);
if (form == null || form.getFormDefinition() == null) {
LOGGER.debug("No form or form definition; form OID = {}", formOid);
add(new Label(ID_FORM_FIELDS)); // to avoid wicket exceptions
return;
}

wrapperModel = new LoadableModel<ObjectWrapper<O>>() {
private static final long serialVersionUID = 1L;

@Override
protected ObjectWrapper<O> load() {

final ObjectWrapperFactory owf = new ObjectWrapperFactory(parentPage);
return createObjectWrapper(owf, prismObject);
}
};

setParent(parentPage);

initLayout(formOid, runPrivileged, mainForm);
initLayout(mainForm);
}

private ObjectWrapper<O> createObjectWrapper(ObjectWrapperFactory owf, PrismObject<O> prismObject){

private ObjectWrapper<O> createObjectWrapper(ObjectWrapperFactory owf, PrismObject<O> prismObject) {
FormAuthorizationType formAuthorization = form.getFormDefinition().getAuthorization();
AuthorizationPhaseType authorizationPhase = formAuthorization != null && formAuthorization.getPhase() != null
? formAuthorization.getPhase()
: AuthorizationPhaseType.REQUEST;
ObjectWrapper<O> objectWrapper = owf.createObjectWrapper("DisplayName", "description",
prismObject,
(prismObject.getOid() == null) ? ContainerStatus.ADDING : ContainerStatus.MODIFYING);
prismObject, prismObject.getOid() == null ? ContainerStatus.ADDING : ContainerStatus.MODIFYING,
false, authorizationPhase);
objectWrapper.setShowEmpty(true);
return objectWrapper;
}
Expand All @@ -135,35 +135,22 @@ public IModel<ObjectWrapper<O>> getModel() {
return wrapperModel;
}

private void initLayout(String formOid, boolean runPrivileged, Form<?> mainForm) {
private void initLayout(Form<?> mainForm) {
DynamicFieldGroupPanel<O> formFields = new DynamicFieldGroupPanel<>(ID_FORM_FIELDS, getModel(),
form.getFormDefinition(), mainForm, getPageBase());
formFields.setOutputMarkupId(true);
add(formFields);
}

Task task = null;
private FormType loadForm(String formOid, boolean runPrivileged) {
Task task;
if (runPrivileged) {
task = getPageBase().createAnonymousTask(OPERATION_LOAD_FORM);
} else {
task = getPageBase().createSimpleTask(OPERATION_LOAD_FORM);
}
OperationResult result = new OperationResult(OPERATION_LOAD_FORM);
PrismObject<FormType> prismForm = WebModelServiceUtils.loadObject(FormType.class, formOid,
getPageBase(), task, result);

if (prismForm == null) {
LOGGER.trace("No form defined, skipping generating GUI form");
return;
}

FormType formType = prismForm.asObjectable();

FormDefinitionType formDefinitionType = formType.getFormDefinition();
if (formDefinitionType == null) {
LOGGER.trace("No form definition defined for dynamic form");
}

DynamicFieldGroupPanel<O> formFields = new DynamicFieldGroupPanel<O>(ID_FORM_FIELDS, getModel(),
formDefinitionType, mainForm, getPageBase());
formFields.setOutputMarkupId(true);
add(formFields);

return asObjectable(WebModelServiceUtils.loadObject(FormType.class, formOid, null, false,
getPageBase(), task, task.getResult()));
}

public ObjectDelta<O> getObjectDelta() throws SchemaException {
Expand All @@ -186,19 +173,15 @@ public List<ItemPath> getChangedItems() {
return paths;
}

private Collection<? extends ItemPath> collectItemPaths(List<AbstractFormItemType> items, List<ItemPath> paths) {
private void collectItemPaths(List<AbstractFormItemType> items, List<ItemPath> paths) {
for (AbstractFormItemType aItem : items) {
ItemPathType itemPathType = GuiImplUtil.getPathType(aItem);
if (itemPathType != null) {
paths.add(itemPathType.getItemPath());
}

if (aItem instanceof FormFieldGroupType) {
collectItemPaths(FormTypeUtil.getFormItems(((FormFieldGroupType) aItem).getFormItems()), paths);
}
}

return paths;
}

}
Expand Up @@ -83,23 +83,22 @@ public OperationResult getResult() {
}

public <O extends ObjectType> ObjectWrapper<O> createObjectWrapper(String displayName,
String description,
PrismObject<O> object,
ContainerStatus status) {
return createObjectWrapper(displayName, description, object, status, false);
String description, PrismObject<O> object, ContainerStatus status) {
return createObjectWrapper(displayName, description, object, status, false, AuthorizationPhaseType.REQUEST);
}

public <O extends ObjectType> ObjectWrapper<O> createObjectWrapper(String displayName,
String description,
PrismObject<O> object,
ContainerStatus status,
boolean delayContainerCreation) {
public <O extends ObjectType> ObjectWrapper<O> createObjectWrapper(String displayName, String description,
PrismObject<O> object, ContainerStatus status, boolean delayContainerCreation,
AuthorizationPhaseType authorizationPhase) {
if (authorizationPhase == null) {
authorizationPhase = AuthorizationPhaseType.REQUEST;
}
try {
Task task = modelServiceLocator.createSimpleTask(CREATE_OBJECT_WRAPPER);
OperationResult result = task.getResult();

PrismObjectDefinition<O> objectDefinitionForEditing = modelServiceLocator.getModelInteractionService()
.getEditObjectDefinition(object, AuthorizationPhaseType.REQUEST, task, result);
.getEditObjectDefinition(object, authorizationPhase, task, result);
if (LOGGER.isTraceEnabled()) {
LOGGER.trace("Edit definition for {}:\n{}", object, objectDefinitionForEditing.debugDump(1));
}
Expand All @@ -109,7 +108,7 @@ public <O extends ObjectType> ObjectWrapper<O> createObjectWrapper(String displa
PrismObject<ResourceType> resource = resourceRef.getValue().getObject();
Validate.notNull(resource, "No resource object in the resourceRef");
objectClassDefinitionForEditing = modelServiceLocator.getModelInteractionService().getEditObjectClassDefinition(
(PrismObject<ShadowType>) object, resource, AuthorizationPhaseType.REQUEST);
(PrismObject<ShadowType>) object, resource, authorizationPhase);
}

return createObjectWrapper(displayName, description, object, objectDefinitionForEditing,
Expand Down

0 comments on commit c8921ea

Please sign in to comment.