Skip to content

Commit

Permalink
Merge branch 'master' of github.com:Evolveum/midpoint
Browse files Browse the repository at this point in the history
Conflicts:
	gui/admin-gui/src/main/resources/localization/Midpoint.properties
  • Loading branch information
katkav committed Apr 11, 2016
2 parents 32d93ba + feccbf8 commit 7a58c11
Show file tree
Hide file tree
Showing 157 changed files with 6,637 additions and 3,985 deletions.
Expand Up @@ -22,11 +22,16 @@
import com.evolveum.midpoint.prism.Visitor;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.result.OperationResultStatus;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.web.page.admin.PageAdmin;
import com.evolveum.midpoint.security.api.AuthorizationConstants;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.exception.*;
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.ObjectFactory;
import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultType;

import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.Validate;

Expand All @@ -43,6 +48,10 @@
*/
public class OpResult implements Serializable, Visitable {

private static final Trace LOGGER = TraceManager.getTrace(OpResult.class);

private static final String OPERATION_CHECK_TASK_VISIBILITY = OpResult.class.getName() + ".checkTaskVisibility";

private OperationResultStatus status;
private String operation;
private String message;
Expand All @@ -51,8 +60,13 @@ public class OpResult implements Serializable, Visitable {
private String exceptionMessage;
private String exceptionsStackTrace;
private List<OpResult> subresults;
private OpResult parent;
private int count;
private String xml;

// we assume there is at most one background task created (TODO revisit this assumption)
private String backgroundTaskOid;
private Boolean backgroundTaskVisible; // available on root opResult only

private boolean showMore;
private boolean showError;
Expand Down Expand Up @@ -102,10 +116,19 @@ public static OpResult getOpResult(PageBase page, OperationResult result){

if (result.getSubresults() != null) {
for (OperationResult subresult : result.getSubresults()) {
opResult.getSubresults().add(OpResult.getOpResult(page, subresult));
OpResult subOpResult = OpResult.getOpResult(page, subresult);
opResult.getSubresults().add(subOpResult);
subOpResult.parent = opResult;
if (subOpResult.getBackgroundTaskOid() != null) {
opResult.backgroundTaskOid = subOpResult.getBackgroundTaskOid();
}
}
}

if (result.getBackgroundTaskOid() != null) {
opResult.backgroundTaskOid = result.getBackgroundTaskOid();
}

try {
OperationResultType resultType = result.createOperationResultType();
ObjectFactory of = new ObjectFactory();
Expand All @@ -119,7 +142,34 @@ public static OpResult getOpResult(PageBase page, OperationResult result){
return opResult;
}

public boolean isShowMore() {
// This method should be called along with getOpResult for root operationResult. However, it might take some time,
// and there might be situations in which it is not required -- so we opted for calling it explicitly.
public void determineBackgroundTaskVisibility(PageBase pageBase) {
if (backgroundTaskOid == null) {
return;
}
try {
if (pageBase.getSecurityEnforcer().isAuthorized(AuthorizationConstants.AUTZ_ALL_URL, null, null, null, null, null)) {
backgroundTaskVisible = true;
return;
}
} catch (SchemaException e) {
backgroundTaskVisible = false;
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't determine background task visibility", e);
return;
}

Task task = pageBase.createSimpleTask(OPERATION_CHECK_TASK_VISIBILITY);
try {
pageBase.getModelService().getObject(TaskType.class, backgroundTaskOid, null, task, task.getResult());
backgroundTaskVisible = true;
} catch (ObjectNotFoundException|SchemaException|SecurityViolationException|CommunicationException|ConfigurationException e) {
LOGGER.debug("Task {} is not visible by the current user: {}: {}", backgroundTaskOid, e.getClass(), e.getMessage());
backgroundTaskVisible = false;
}
}

public boolean isShowMore() {
return showMore;
}

Expand Down Expand Up @@ -184,6 +234,20 @@ public String getXml() {
return xml;
}

public String getBackgroundTaskOid() {
return backgroundTaskOid;
}

public boolean isBackgroundTaskVisible() {
if (backgroundTaskVisible != null) {
return backgroundTaskVisible;
}
if (parent != null) {
return parent.isBackgroundTaskVisible();
}
return true; // at least as for now
}

@Override
public void accept(Visitor visitor) {

Expand Down
Expand Up @@ -22,6 +22,9 @@
<a class="box-title" wicket:id="message">
<b class="box-title" wicket:id="messageLabel" ></b>
</a>
<a class="box-title" wicket:id="backgroundTask">
<wicket:message key="OperationResultPanel.showTask"/>
</a>
<div class="box-tools pull-right">
<div wicket:id="hideAll" class="btn btn-box-tool fa fa-compress"></div>
<div wicket:id="showAll" class="btn btn-box-tool fa fa-expand"></div>
Expand Down
Expand Up @@ -23,6 +23,10 @@
import java.util.ArrayList;
import java.util.List;

import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.schema.constants.ObjectTypes;
import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.wicket.AttributeModifier;
Expand Down Expand Up @@ -53,7 +57,11 @@
*/
public class OperationResultPanel extends BasePanel<OpResult> {

private static final String ID_DETAILS_BOX = "detailsBox";
private static final String ID_ICON_TYPE = "iconType";
private static final String ID_MESSAGE = "message";
private static final String ID_MESSAGE_LABEL = "messageLabel";
private static final String ID_BACKGROUND_TASK = "backgroundTask";

static final String OPERATION_RESOURCE_KEY_PREFIX = "operation.";

Expand All @@ -67,7 +75,7 @@ public OperationResultPanel(String id, IModel<OpResult> model) {

public void initLayout() {

WebMarkupContainer detailsBox = new WebMarkupContainer("detailsBox");
WebMarkupContainer detailsBox = new WebMarkupContainer(ID_DETAILS_BOX);
detailsBox.setOutputMarkupId(true);
detailsBox.add(AttributeModifier.append("class", createHeaderCss()));
add(detailsBox);
Expand All @@ -78,7 +86,7 @@ public void initLayout() {
}

private void initHeader(WebMarkupContainer box) {
WebMarkupContainer iconType = new WebMarkupContainer("iconType");
WebMarkupContainer iconType = new WebMarkupContainer(ID_ICON_TYPE);
iconType.setOutputMarkupId(true);
iconType.add(new AttributeAppender("class", new AbstractReadOnlyModel() {
@Override
Expand Down Expand Up @@ -130,6 +138,29 @@ public void onClick(AjaxRequestTarget target) {
showMore.add(message);
box.add(showMore);

AjaxLink backgroundTask = new AjaxLink(ID_BACKGROUND_TASK) {

private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target) {
final OpResult opResult = OperationResultPanel.this.getModelObject();
String oid = opResult.getBackgroundTaskOid();
if (oid == null || !opResult.isBackgroundTaskVisible()) {
return; // just for safety
}
ObjectReferenceType ref = ObjectTypeUtil.createObjectRef(oid, ObjectTypes.TASK);
WebComponentUtil.dispatchToObjectDetailsPage(ref, getPageBase());
}
};
backgroundTask.add(new VisibleEnableBehaviour() {
@Override
public boolean isVisible() {
return getModelObject().getBackgroundTaskOid() != null && getModelObject().isBackgroundTaskVisible();
}
});
box.add(backgroundTask);

AjaxLink showAll = new AjaxLink("showAll") {

private static final long serialVersionUID = 1L;
Expand Down Expand Up @@ -201,9 +232,9 @@ private Label createMessage() {
Label message = null;
if (StringUtils.isNotBlank(getModelObject().getMessage())) {
PropertyModel<String> messageModel = new PropertyModel<String>(getModel(), "message");
message = new Label("messageLabel", messageModel);
message = new Label(ID_MESSAGE_LABEL, messageModel);
} else {
message = new Label("messageLabel", new LoadableModel<Object>() {
message = new Label(ID_MESSAGE_LABEL, new LoadableModel<Object>() {

@Override
protected Object load() {
Expand Down
Expand Up @@ -674,6 +674,7 @@ public void showResult(OperationResult result, String errorMessageKey, boolean s
Validate.notNull(result.getStatus(), "Operation result status must not be null.");

OpResult opResult = OpResult.getOpResult((PageBase) getPage(), result);
opResult.determineBackgroundTaskVisibility(this);
switch (opResult.getStatus()) {
case FATAL_ERROR:
case PARTIAL_ERROR:
Expand Down
Expand Up @@ -30,6 +30,7 @@
import com.evolveum.midpoint.prism.query.ObjectPaging;
import com.evolveum.midpoint.prism.xml.XmlTypeConverter;
import com.evolveum.midpoint.schema.SchemaConstantsGenerated;
import com.evolveum.midpoint.schema.constants.ObjectTypes;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
Expand All @@ -43,6 +44,7 @@
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.DateLabelComponent;
import com.evolveum.midpoint.web.component.TabbedPanel;
import com.evolveum.midpoint.web.component.data.BaseSortableDataProvider;
import com.evolveum.midpoint.web.component.data.Table;
Expand All @@ -51,6 +53,7 @@
import com.evolveum.midpoint.web.page.PageDialog;
import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnBlurAjaxFormUpdatingBehaviour;
import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnChangeAjaxFormUpdatingBehavior;
import com.evolveum.midpoint.web.page.admin.reports.PageReport;
import com.evolveum.midpoint.web.page.admin.resources.PageResource;
import com.evolveum.midpoint.web.page.admin.roles.PageRole;
import com.evolveum.midpoint.web.page.admin.server.PageTaskEdit;
Expand All @@ -69,6 +72,7 @@
import org.apache.wicket.authroles.authentication.AuthenticatedWebApplication;
import org.apache.wicket.authroles.authorization.strategies.role.Roles;
import org.apache.wicket.core.request.handler.RenderPageRequestHandler;
import org.apache.wicket.datetime.PatternDateConverter;
import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
import org.apache.wicket.extensions.markup.html.tabs.ITab;
import org.apache.wicket.feedback.IFeedback;
Expand Down Expand Up @@ -664,6 +668,12 @@ public static Locale getCurrentLocale(){
return locale;
}

public static String getLocalizedDate(Date date, String style){
PatternDateConverter converter = new PatternDateConverter(getLocalizedDatePattern(style), true );
return converter.convertToString(date, WebComponentUtil.getCurrentLocale());

}

public static boolean isActivationEnabled(PrismObject object) {
Validate.notNull(object);

Expand Down Expand Up @@ -1079,21 +1089,38 @@ public static void dispatchToObjectDetailsPage(ObjectReferenceType objectRef, Pa
page.setResponsePage(new PageResource(parameters, page));
} else if (TaskType.COMPLEX_TYPE.equals(type)) {
page.setResponsePage(new PageTaskEdit(parameters)); // TODO: "back" page
} else if (ReportType.COMPLEX_TYPE.equals(type)) {
page.setResponsePage(PageReport.class, parameters);
} else {
// nothing to do
}
}

public static boolean hasDetailsPage(PrismObject<?> object) {
Class<?> clazz = object.getCompileTimeClass();
return hasDetailsPage(clazz);
}

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);
TaskType.class.isAssignableFrom(clazz) ||
ReportType.class.isAssignableFrom(clazz);
}

public static boolean hasDetailsPage(ObjectReferenceType ref) {
if (ref == null) {
return false;
}
ObjectTypes t = ObjectTypes.getObjectTypeFromTypeQName(ref.getType());
if (t == null) {
return false;
}
return hasDetailsPage(t.getClassDefinition());
}

@NotNull
Expand Down

0 comments on commit 7a58c11

Please sign in to comment.