/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.syncope.client.console.wizards.any;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.syncope.client.console.commons.Constants;
import org.apache.syncope.client.console.commons.SerializableTransformer;
import org.apache.syncope.client.console.commons.status.ConnObjectWrapper;
import org.apache.syncope.client.console.commons.status.Status;
import org.apache.syncope.client.console.commons.status.StatusBean;
import org.apache.syncope.client.console.commons.status.StatusUtils;
import org.apache.syncope.client.console.panels.ListViewPanel;
import org.apache.syncope.client.console.panels.MultilevelPanel;
import org.apache.syncope.client.console.panels.RemoteObjectPanel;
import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
import org.apache.syncope.common.lib.to.AnyTO;
import org.apache.syncope.common.lib.to.ConnObjectTO;
import org.apache.syncope.common.lib.to.GroupTO;
import org.apache.syncope.common.lib.to.UserTO;
import org.apache.syncope.common.lib.types.StandardEntitlement;
import org.apache.wicket.Component;
import org.apache.wicket.PageReference;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class StatusPanel extends Panel {
private static final long serialVersionUID = -4013796607157549641L;
private static final Logger LOG = LoggerFactory.getLogger(StatusPanel.class);
private Map<String, StatusBean> initialStatusBeanMap;
private final StatusUtils statusUtils;
private ListViewPanel<?> listViewPanel;
public <T extends AnyTO> StatusPanel(
final String id,
final T any,
final IModel<List<StatusBean>> model,
final PageReference pageRef) {
super(id);
statusUtils = new StatusUtils();
init(any, model,
CollectionUtils.collect(statusUtils.getConnectorObjects(any),
new SerializableTransformer<ConnObjectWrapper, Pair<ConnObjectTO, ConnObjectWrapper>>() {
private static final long serialVersionUID = 2658691884036294287L;
@Override
public Pair<ConnObjectTO, ConnObjectWrapper> transform(final ConnObjectWrapper input) {
return Pair.of(null, input);
}
}, new ArrayList<Pair<ConnObjectTO, ConnObjectWrapper>>()), pageRef, false);
}
public <T extends AnyTO> StatusPanel(
final String id,
final T any,
final IModel<List<StatusBean>> model,
final List<Pair<ConnObjectTO, ConnObjectWrapper>> connObjects,
final PageReference pageRef) {
super(id);
statusUtils = new StatusUtils();
init(any, model, connObjects, pageRef, true);
}
private void init(
final AnyTO any,
final IModel<List<StatusBean>> model,
final List<Pair<ConnObjectTO, ConnObjectWrapper>> connObjects,
final PageReference pageRef,
final boolean enableConnObjectLink) {
final List<StatusBean> statusBeans = new ArrayList<>(connObjects.size() + 1);
initialStatusBeanMap = new LinkedHashMap<>(connObjects.size() + 1);
final StatusBean syncope = new StatusBean(any, Constants.SYNCOPE);
if (any instanceof UserTO) {
syncope.setConnObjectLink(((UserTO) any).getUsername());
Status syncopeStatus = Status.UNDEFINED;
if (((UserTO) any).getStatus() != null) {
try {
syncopeStatus = Status.valueOf(((UserTO) any).getStatus().toUpperCase());
} catch (IllegalArgumentException e) {
LOG.warn("Unexpected status found: {}", ((UserTO) any).getStatus(), e);
}
}
syncope.setStatus(syncopeStatus);
} else if (any instanceof GroupTO) {
syncope.setConnObjectLink(((GroupTO) any).getName());
syncope.setStatus(Status.ACTIVE);
}
statusBeans.add(syncope);
initialStatusBeanMap.put(syncope.getResourceName(), syncope);
for (Pair<ConnObjectTO, ConnObjectWrapper> pair : connObjects) {
ConnObjectWrapper entry = pair.getRight();
final StatusBean statusBean = statusUtils.getStatusBean(entry.getAny(),
entry.getResourceName(),
entry.getConnObjectTO(),
any instanceof GroupTO);
initialStatusBeanMap.put(entry.getResourceName(), statusBean);
statusBeans.add(statusBean);
}
final MultilevelPanel mlp = new MultilevelPanel("resources");
add(mlp);
ListViewPanel.Builder<StatusBean> builder = new ListViewPanel.Builder<StatusBean>(StatusBean.class, pageRef) {
private static final long serialVersionUID = -6809736686861678498L;
@Override
protected Component getValueComponent(final String key, final StatusBean bean) {
if ("status".equalsIgnoreCase(key)) {
return StatusUtils.getStatusImagePanel("field", bean.getStatus());
} else {
return super.getValueComponent(key, bean);
}
}
};
builder.setModel(model);
builder.setItems(statusBeans);
builder.includes("resourceName", "connObjectLink", "status");
builder.withChecks(ListViewPanel.CheckAvailability.NONE);
builder.setReuseItem(false);
final ActionLink<StatusBean> connObjectLink = new ActionLink<StatusBean>() {
private static final long serialVersionUID = -3722207913631435501L;
@Override
protected boolean statusCondition(final StatusBean bean) {
final Pair<ConnObjectTO, ConnObjectTO> pair
= getConnObjectTO(bean.getAnyKey(), bean.getResourceName(), connObjects);
return pair != null && pair.getRight() != null;
}
@Override
public void onClick(final AjaxRequestTarget target, final StatusBean bean) {
mlp.next(bean.getResourceName(), new RemoteAnyPanel(bean, connObjects), target);
}
};
if (!enableConnObjectLink) {
connObjectLink.disable();
}
builder.addAction(connObjectLink, ActionLink.ActionType.VIEW, StandardEntitlement.RESOURCE_GET_CONNOBJECT);
listViewPanel = ListViewPanel.class.cast(builder.build(MultilevelPanel.FIRST_LEVEL_ID));
mlp.setFirstLevel(listViewPanel);
}
public void setCheckAvailability(final ListViewPanel.CheckAvailability check) {
listViewPanel.setCheckAvailability(check);
}
public Map<String, StatusBean> getInitialStatusBeanMap() {
return initialStatusBeanMap;
}
protected Pair<ConnObjectTO, ConnObjectTO> getConnObjectTO(
final String anyKey, final String resourceName,
final List<Pair<ConnObjectTO, ConnObjectWrapper>> objects) {
for (Pair<ConnObjectTO, ConnObjectWrapper> object : objects) {
if (anyKey.equals(object.getRight().getAny().getKey())
&& resourceName.equalsIgnoreCase(object.getRight().getResourceName())) {
return Pair.of(object.getLeft(), object.getRight().getConnObjectTO());
}
}
return null;
}
public class RemoteAnyPanel extends RemoteObjectPanel {
private static final long serialVersionUID = 4303365227411467563L;
private final StatusBean bean;
private final List<Pair<ConnObjectTO, ConnObjectWrapper>> connObjects;
public RemoteAnyPanel(final StatusBean bean, final List<Pair<ConnObjectTO, ConnObjectWrapper>> connObjects) {
this.bean = bean;
this.connObjects = connObjects;
add(new ConnObjectPanel(REMOTE_OBJECT_PANEL_ID, getConnObjectTO(), false));
}
@Override
protected final Pair<ConnObjectTO, ConnObjectTO> getConnObjectTO() {
return StatusPanel.this.getConnObjectTO(bean.getAnyKey(), bean.getResourceName(), connObjects);
}
}
}