Skip to content

Commit

Permalink
MID-3233: Cleanup: object details page redirects
Browse files Browse the repository at this point in the history
  • Loading branch information
mederly committed Aug 1, 2016
1 parent c5ee1b4 commit 8d8dbb9
Show file tree
Hide file tree
Showing 13 changed files with 146 additions and 246 deletions.
Expand Up @@ -29,9 +29,7 @@
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.web.component.data.Table;
import com.evolveum.midpoint.web.component.data.column.CheckBoxHeaderColumn;
import com.evolveum.midpoint.web.component.data.column.LinkColumn;
import com.evolveum.midpoint.web.component.data.column.ObjectNameColumn;
import com.evolveum.midpoint.web.component.util.SelectableBean;
import com.evolveum.midpoint.web.page.admin.configuration.PageImportObject;
Expand Down Expand Up @@ -68,10 +66,19 @@ public void onClick(AjaxRequestTarget target, IModel<SelectableBean<O>> rowModel
O object = rowModel.getObject().getValue();
MainObjectListPanel.this.objectDetailsPerformed(target, object);
}
};

@Override
public boolean isClickable(IModel<SelectableBean<O>> rowModel) {
return MainObjectListPanel.this.isClickable(rowModel);
}
};
}

protected abstract void objectDetailsPerformed(AjaxRequestTarget target, O object);
protected boolean isClickable(IModel<SelectableBean<O>> rowModel) {
return true;
}

protected abstract void objectDetailsPerformed(AjaxRequestTarget target, O object);

protected abstract void newObjectPerformed(AjaxRequestTarget target);

Expand Down
Expand Up @@ -158,7 +158,7 @@ public void onClick(AjaxRequestTarget target) {
return; // just for safety
}
ObjectReferenceType ref = ObjectTypeUtil.createObjectRef(oid, ObjectTypes.TASK);
WebComponentUtil.dispatchToObjectDetailsPage(ref, getPageBase());
WebComponentUtil.dispatchToObjectDetailsPage(ref, getPageBase(), false);
}
};
backgroundTask.add(new VisibleEnableBehaviour() {
Expand Down
Expand Up @@ -22,15 +22,10 @@
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.RuntimeMXBean;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.*;

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
Expand Down Expand Up @@ -75,7 +70,6 @@
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.model.NonEmptyModel;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.model.api.ModelInteractionService;
import com.evolveum.midpoint.prism.Objectable;
import com.evolveum.midpoint.prism.PrismContainer;
import com.evolveum.midpoint.prism.PrismContainerValue;
Expand Down Expand Up @@ -195,6 +189,19 @@ public final class WebComponentUtil {
private static final Trace LOGGER = TraceManager.getTrace(WebComponentUtil.class);
private static DatatypeFactory df = null;

private static Map<Class<?>, Class<? extends PageBase>> objectDetailsMap;

static {
objectDetailsMap = new HashMap<>();
objectDetailsMap.put(UserType.class, PageUser.class);
objectDetailsMap.put(OrgType.class, PageOrgUnit.class);
objectDetailsMap.put(RoleType.class, PageRole.class);
objectDetailsMap.put(ServiceType.class, PageService.class);
objectDetailsMap.put(ResourceType.class, PageResource.class);
objectDetailsMap.put(TaskType.class, PageTaskEdit.class);
objectDetailsMap.put(ReportType.class, PageReport.class);
}

public enum Channel {
// TODO: move this to schema component
LIVE_SYNC(SchemaConstants.CHANGE_CHANNEL_LIVE_SYNC_URI),
Expand Down Expand Up @@ -1510,29 +1517,52 @@ public static <T extends ObjectType> T getObjectFromReference(ObjectReferenceTyp
return (T) object;
}

public static void dispatchToObjectDetailsPage(ObjectReferenceType objectRef, PageBase page) {
public static void dispatchToObjectDetailsPage(ObjectReferenceType objectRef, Component component, boolean failIfUnsupported) {
if (objectRef == null) {
return; // should not occur
}
QName type = objectRef.getType();
Validate.notNull(objectRef.getOid(), "No OID in objectRef");
Validate.notNull(objectRef.getType(), "No type in objectRef");
Class<? extends ObjectType> targetClass = ObjectTypes.getObjectTypeFromTypeQName(objectRef.getType()).getClassDefinition();
dispatchToObjectDetailsPage(targetClass, objectRef.getOid(), component, failIfUnsupported);
}

// shows the actual object that is passed via parameter (not its state in repository)
public static void dispatchToObjectDetailsPage(PrismObject obj, Component component) {
Class newObjectPageClass = objectDetailsMap.get(obj.getCompileTimeClass());
if (newObjectPageClass == null) {
throw new IllegalArgumentException("Cannot determine details page for "+obj.getCompileTimeClass());
}

Constructor constructor;
try {
constructor = newObjectPageClass.getConstructor(PrismObject.class);

} catch (NoSuchMethodException | SecurityException e) {
throw new SystemException("Unable to locate constructor (PrismObject) in " + newObjectPageClass
+ ": " + e.getMessage(), e);
}

PageBase page;
try {
page = (PageBase) constructor.newInstance(obj);
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException
| InvocationTargetException e) {
throw new SystemException("Error instantiating " + newObjectPageClass + ": " + e.getMessage(), e);
}

component.setResponsePage(page);
}

public static void dispatchToObjectDetailsPage(Class<? extends ObjectType> objectClass, String oid, Component component, boolean failIfUnsupported) {
PageParameters parameters = new PageParameters();
parameters.add(OnePageParameterEncoder.PARAMETER, objectRef.getOid());
if (RoleType.COMPLEX_TYPE.equals(type)) {
page.setResponsePage(PageRole.class, parameters);
} else if (OrgType.COMPLEX_TYPE.equals(type)) {
page.setResponsePage(PageOrgUnit.class, parameters);
} else if (ServiceType.COMPLEX_TYPE.equals(type)) {
page.setResponsePage(PageService.class, parameters);
} else if (UserType.COMPLEX_TYPE.equals(type)) {
page.setResponsePage(PageUser.class, parameters);
} else if (ResourceType.COMPLEX_TYPE.equals(type)) {
page.setResponsePage(PageResource.class, parameters);
} else if (TaskType.COMPLEX_TYPE.equals(type)) {
page.setResponsePage(PageTaskEdit.class, parameters);
} else if (ReportType.COMPLEX_TYPE.equals(type)) {
page.setResponsePage(PageReport.class, parameters);
} else {
// nothing to do
parameters.add(OnePageParameterEncoder.PARAMETER, oid);
Class<? extends PageBase> page = objectDetailsMap.get(objectClass);
if (page != null) {
component.setResponsePage(page, parameters);
} else if (failIfUnsupported) {
// todo maybe we could use "error" + RestartResponseException, as it was e.g. in AbstractRoleMemberPanel before refactoring (MID-3233)
throw new SystemException("Cannot determine details page for "+objectClass);
}
}

Expand All @@ -1542,12 +1572,7 @@ public static boolean hasDetailsPage(PrismObject<?> object) {
}

public static boolean hasDetailsPage(Class<?> clazz) {
if (clazz == null) {
return false;
}
return AbstractRoleType.class.isAssignableFrom(clazz) || UserType.class.isAssignableFrom(clazz)
|| ResourceType.class.isAssignableFrom(clazz) || TaskType.class.isAssignableFrom(clazz)
|| ReportType.class.isAssignableFrom(clazz);
return objectDetailsMap.containsKey(clazz);
}

public static boolean hasDetailsPage(ObjectReferenceType ref) {
Expand Down Expand Up @@ -1690,22 +1715,4 @@ public static void setSelectedTabFromPageParameters(TabbedPanel tabbed, PagePara
tabbed.setSelectedTab(tabIndex);
}

public static <O extends ObjectType> Class<? extends PageBase> getObjectDetailsPage(Class<O> type) {
if (type == UserType.class) {
return PageUser.class;
} else if (type == OrgType.class) {
return PageOrgUnit.class;
} else if (type == RoleType.class) {
return PageRole.class;
} else if (type == ServiceType.class) {
return PageService.class;
} else if (type == ResourceType.class) {
return PageResource.class;
} else if (type == TaskType.class) {
return PageTaskEdit.class;
} else {
throw new IllegalArgumentException("Cannot determine details page for "+type);
}
}

}
Expand Up @@ -19,6 +19,7 @@
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
Expand Down Expand Up @@ -76,34 +77,33 @@ public String getObject() {
}
}
};

cellItem.add(new LinkPanel(componentId, labelModel) {
private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target) {
SelectableBean<O> selectableBean = rowModel.getObject();
O value = selectableBean.getValue();
if (value == null) {
OperationResult result = selectableBean.getResult();
throw new RestartResponseException(new PageOperationResult(result));
} else {
if (selectableBean.getResult() != null){
throw new RestartResponseException(new PageOperationResult(selectableBean.getResult()));

if (isClickable(rowModel)) { // beware: rowModel is very probably resolved at this moment; but it seems to cause no problems
cellItem.add(new LinkPanel(componentId, labelModel) {
private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target) {
SelectableBean<O> selectableBean = rowModel.getObject();
O value = selectableBean.getValue();
if (value == null) {
OperationResult result = selectableBean.getResult();
throw new RestartResponseException(new PageOperationResult(result));
} else {
ObjectNameColumn.this.onClick(target, rowModel);
if (selectableBean.getResult() != null) {
throw new RestartResponseException(new PageOperationResult(selectableBean.getResult()));
} else {
ObjectNameColumn.this.onClick(target, rowModel);
}
}
}
}

@Override
public boolean isEnabled() {
return ObjectNameColumn.this.isEnabled(rowModel);
}
});
});
} else {
cellItem.add(new Label(componentId, labelModel));
}
}

public boolean isEnabled(IModel<SelectableBean<O>> rowModel) {
public boolean isClickable(IModel<SelectableBean<O>> rowModel) {
return true;
}

Expand Down
Expand Up @@ -82,7 +82,7 @@ public void onClick(AjaxRequestTarget target) {
PrismReferenceValue refValue = (PrismReferenceValue) getModelObject().getSourceValue();
ObjectReferenceType ort = new ObjectReferenceType();
ort.setupReferenceValue(refValue);
WebComponentUtil.dispatchToObjectDetailsPage(ort, getPageBase());
WebComponentUtil.dispatchToObjectDetailsPage(ort, getPageBase(), false);
}
};
link.add(visibleIfReference);
Expand Down
Expand Up @@ -40,7 +40,6 @@
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.*;

import java.io.Serializable;
import java.util.List;

/**
Expand Down Expand Up @@ -149,7 +148,7 @@ public void onClick(AjaxRequestTarget target) {
PrismContainerValue<?> value = getModelObject().getScene().getSourceValue();
if (value != null && value.getParent() instanceof PrismObject) {
PrismObject<? extends ObjectType> object = (PrismObject<? extends ObjectType>) value.getParent();
WebComponentUtil.dispatchToObjectDetailsPage(ObjectTypeUtil.createObjectRef(object), getPageBase());
WebComponentUtil.dispatchToObjectDetailsPage(ObjectTypeUtil.createObjectRef(object), getPageBase(), false);
}
}
};
Expand Down
Expand Up @@ -184,7 +184,7 @@ IColumn<WorkItemDto, String> createObjectNameColumn(final String headerKey) {
@Override
public void onClick(AjaxRequestTarget target, IModel<WorkItemDto> rowModel) {
WorkItemDto dto = rowModel.getObject();
dispatchToObjectDetailsPage(dto.getObjectRef(), getPageBase());
dispatchToObjectDetailsPage(dto.getObjectRef(), getPageBase(), false);
}
};
}
Expand All @@ -195,7 +195,7 @@ IColumn<WorkItemDto, String> createTargetNameColumn(final String headerKey) {
@Override
public void onClick(AjaxRequestTarget target, IModel<WorkItemDto> rowModel) {
WorkItemDto dto = rowModel.getObject();
dispatchToObjectDetailsPage(dto.getTargetRef(), getPageBase());
dispatchToObjectDetailsPage(dto.getTargetRef(), getPageBase(), false);
}
};
}
Expand Down
Expand Up @@ -57,7 +57,7 @@ IColumn createObjectNameColumn(final PageBase page, final String headerKey) {
@Override
public void onClick(AjaxRequestTarget target, IModel<CertCaseOrDecisionDto> rowModel) {
CertCaseOrDecisionDto dto = rowModel.getObject();
dispatchToObjectDetailsPage(dto.getCertCase().getObjectRef(), page);
dispatchToObjectDetailsPage(dto.getCertCase().getObjectRef(), page, false);
}
};
return column;
Expand Down Expand Up @@ -99,7 +99,7 @@ IColumn createTargetNameColumn(final PageBase page, final String headerKey) {
@Override
public void onClick(AjaxRequestTarget target, IModel<CertCaseOrDecisionDto> rowModel) {
CertCaseOrDecisionDto dto = rowModel.getObject();
dispatchToObjectDetailsPage(dto.getCertCase().getTargetRef(), page);
dispatchToObjectDetailsPage(dto.getCertCase().getTargetRef(), page, false);
}
};
return column;
Expand Down
Expand Up @@ -21,7 +21,6 @@

import com.evolveum.midpoint.web.component.dialog.ConfirmationPanel;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.commons.collections.IteratorUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
Expand Down Expand Up @@ -103,7 +102,6 @@
import com.evolveum.midpoint.web.page.admin.resources.ResourceContentTabPanel.Operation;
import com.evolveum.midpoint.web.page.admin.resources.content.PageAccount;
import com.evolveum.midpoint.web.page.admin.server.PageTaskAdd;
import com.evolveum.midpoint.web.page.admin.users.PageUser;
import com.evolveum.midpoint.web.session.UserProfileStorage.TableId;
import com.evolveum.midpoint.web.util.OnePageParameterEncoder;

Expand Down Expand Up @@ -627,11 +625,7 @@ private void ownerDetailsPerformed(AjaxRequestTarget target, FocusType owner) {
if (owner == null) {
return;
}

PageParameters parameters = new PageParameters();
parameters.add(OnePageParameterEncoder.PARAMETER, owner.getOid());
Class<? extends PageBase> page = WebComponentUtil.getObjectDetailsPage(owner.getClass());
setResponsePage(page, parameters);
WebComponentUtil.dispatchToObjectDetailsPage(owner.getClass(), owner.getOid(), this, true);
}

private <F extends FocusType> F loadShadowOwner(IModel<SelectableBean<ShadowType>> model) {
Expand Down
Expand Up @@ -56,7 +56,7 @@ public boolean isVisible() {
public void onClick(AjaxRequestTarget target) {
ObjectReferenceType ref = getModelObject().getObjectRef();
if (ref != null) {
WebComponentUtil.dispatchToObjectDetailsPage(ref, parentPage);
WebComponentUtil.dispatchToObjectDetailsPage(ref, parentPage, false);
}
}
@Override
Expand Down

0 comments on commit 8d8dbb9

Please sign in to comment.