diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/factory/GuiComponentFactory.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/factory/GuiComponentFactory.java index d5686db4cff..1127e1f2b13 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/factory/GuiComponentFactory.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/factory/GuiComponentFactory.java @@ -12,6 +12,8 @@ import com.evolveum.midpoint.gui.api.prism.wrapper.ItemWrapper; import com.evolveum.midpoint.gui.impl.factory.panel.ItemPanelContext; +import org.apache.wicket.feedback.ComponentFeedbackMessageFilter; + public interface GuiComponentFactory{ boolean match(IW wrapper); @@ -21,6 +23,7 @@ public interface GuiComponentFactory{ Integer getOrder(); default void configure(T panelCtx, Component component) { + panelCtx.getFeedback().setFilter(new ComponentFeedbackMessageFilter(component)); } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebPrismUtil.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebPrismUtil.java index 9fd718c5015..08dc4e0e9ac 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebPrismUtil.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebPrismUtil.java @@ -9,11 +9,22 @@ import com.evolveum.midpoint.gui.api.prism.wrapper.PrismObjectWrapper; import com.evolveum.midpoint.gui.api.prism.wrapper.PrismPropertyWrapper; import com.evolveum.midpoint.gui.api.prism.wrapper.PrismReferenceWrapper; +import com.evolveum.midpoint.gui.impl.Channel; +import com.evolveum.midpoint.model.api.authentication.GuiProfiledPrincipal; import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.util.logging.LoggingUtils; +import com.evolveum.midpoint.web.security.MidPointApplication; +import com.evolveum.midpoint.web.security.util.SecurityUtils; +import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ProvenanceAcquisitionType; + +import com.evolveum.midpoint.xml.ns._public.common.common_3.ProvenanceMetadataType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ValueMetadataType; + import org.apache.commons.lang.StringUtils; import org.apache.wicket.ajax.AjaxRequestTarget; @@ -29,6 +40,10 @@ import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.component.prism.ValueStatus; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + /** * @author katka * @@ -157,4 +172,102 @@ public static PrismPropertyValue findSinglePropertyValue(ItemWrapper return null; } } + + public static void cleanupEmptyContainers(PrismContainer container) { + List> values = container.getValues(); + Iterator> valueIterator = values.iterator(); + while (valueIterator.hasNext()) { + PrismContainerValue value = valueIterator.next(); + + PrismContainerValue valueAfter = cleanupEmptyContainerValue(value); + if (valueAfter == null || valueAfter.isIdOnly() || valueAfter.isEmpty()) { + valueIterator.remove(); + } + } + } + + public static PrismContainerValue cleanupEmptyContainerValue(PrismContainerValue value) { + Collection> items = value.getItems(); + + if (items != null) { + Iterator> iterator = items.iterator(); + while (iterator.hasNext()) { + Item item = iterator.next(); + + cleanupEmptyValues(item); + if (item.isEmpty()) { + iterator.remove(); + } + } + } + + if (value.getItems() == null || value.getItems().isEmpty()) { + return null; + } + + return value; + } + + + private static void cleanupEmptyValues(Item item) { + if (item instanceof PrismContainer) { + cleanupEmptyContainers((PrismContainer) item); + } + + if (item instanceof PrismProperty) { + PrismProperty property = (PrismProperty) item; + List> pVals = property.getValues(); + if (pVals == null || pVals.isEmpty()) { + return; + } + + Iterator> iterator = pVals.iterator(); + while (iterator.hasNext()) { + PrismPropertyValue pVal = iterator.next(); + if (pVal == null || pVal.isEmpty() || pVal.getRealValue() == null) { + iterator.remove(); + } + } + } + + if (item instanceof PrismReference) { + PrismReference ref = (PrismReference) item; + List values = ref.getValues(); + if (values == null || values.isEmpty()) { + return; + } + + Iterator iterator = values.iterator(); + while (iterator.hasNext()) { + PrismReferenceValue rVal = iterator.next(); + if (rVal == null || rVal.isEmpty()) { + iterator.remove(); + } + } + } + } + + //TODO find better place + public static PrismContainerValue getNewYieldValue() throws SchemaException { + MidPointApplication app = MidPointApplication.get(); + ProvenanceMetadataType provenanceMetadataType = new ProvenanceMetadataType(app.getPrismContext()).acquisition(WebPrismUtil.createAcquition()); + ValueMetadataType valueMetadataType = new ValueMetadataType(app.getPrismContext()).provenance(provenanceMetadataType); + return valueMetadataType.asPrismContainerValue(); + + } + + public static ProvenanceAcquisitionType createAcquition() { + MidPointApplication app = MidPointApplication.get(); + ProvenanceAcquisitionType acquisitionType = new ProvenanceAcquisitionType(app.getPrismContext()); + GuiProfiledPrincipal principal = SecurityUtils.getPrincipalUser(); + if (principal != null) { + FocusType focus = principal.getFocus(); + if (focus != null) { + acquisitionType.setActorRef(ObjectTypeUtil.createObjectRef(focus, app.getPrismContext())); + } + } + acquisitionType.setChannel(Channel.USER.getChannel()); + acquisitionType.setTimestamp(app.getClock().currentTimeXMLGregorianCalendar()); + return acquisitionType; + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/DefaultContainerablePanelFactory.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/DefaultContainerablePanelFactory.java index ab32e1a32c5..3dbb65ca649 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/DefaultContainerablePanelFactory.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/DefaultContainerablePanelFactory.java @@ -13,6 +13,7 @@ import com.evolveum.midpoint.gui.impl.prism.panel.DefaultContainerablePanel; import com.evolveum.midpoint.prism.Containerable; +import org.apache.wicket.feedback.ComponentFeedbackMessageFilter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -38,6 +39,14 @@ public org.apache.wicket.Component createPanel(PrismContainerPanelContext pan return new DefaultContainerablePanel<>(panelCtx.getComponentId(), panelCtx.getValueWrapper(), panelCtx.getSettings()); } +// @Override +// public void configure(PrismContainerPanelContext panelCtx, org.apache.wicket.Component component) { +// if (!(component instanceof DefaultContainerablePanel)) { +// return; +// } +// panelCtx.getFeedback().setFilter(new ComponentFeedbackMessageFilter(component)); +// } + @Override public Integer getOrder() { return Integer.MAX_VALUE; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/ItemWrapperFactoryImpl.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/ItemWrapperFactoryImpl.java index 2f113caf34e..965c24ec08a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/ItemWrapperFactoryImpl.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/ItemWrapperFactoryImpl.java @@ -21,6 +21,8 @@ import com.evolveum.midpoint.prism.path.ItemName; import com.evolveum.midpoint.task.api.TaskManager; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; + import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -38,9 +40,6 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.component.prism.ValueStatus; -import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.VirtualContainerItemSpecificationType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.VirtualContainersSpecificationType; import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; /** @@ -121,6 +120,9 @@ public IW createWrapper(PrismContainerValueWrapper parent, Item childItem, It } private boolean skipCreateWrapper(ItemDefinition def, ItemStatus status, WrapperContext context, boolean isEmptyValue) { + if (def == null) { + return true; + } if (QNameUtil.match(FocusType.F_LINK_REF, def.getItemName()) || QNameUtil.match(FocusType.F_PERSONA_REF, def.getItemName())) { LOGGER.trace("Skip creating wrapper for {}, it is not supported", def); return true; @@ -178,7 +180,7 @@ protected List createValuesWrapper(IW itemWrapper, I item, WrapperContext co if (shouldCreateEmptyValue(item, context)) { PV prismValue = createNewValue(item); VW valueWrapper = createValueWrapper(itemWrapper, prismValue, ValueStatus.ADDED, context); -// setupMetadata(valueWrapper, context); + setupMetadata(itemWrapper, valueWrapper, context); pvWrappers.add(valueWrapper); } return pvWrappers; @@ -187,7 +189,7 @@ protected List createValuesWrapper(IW itemWrapper, I item, WrapperContext co for (PV pcv : values) { if(canCreateValueWrapper(pcv)){ VW valueWrapper = createValueWrapper(itemWrapper, pcv, ValueStatus.NOT_CHANGED, context); - setupMetadata(valueWrapper, context); + setupMetadata(itemWrapper, valueWrapper, context); pvWrappers.add(valueWrapper); } } @@ -196,24 +198,91 @@ protected List createValuesWrapper(IW itemWrapper, I item, WrapperContext co } - protected void setupMetadata(VW valueWrapper, WrapperContext ctx) throws SchemaException { + protected void setupMetadata(IW itemWrapper, VW valueWrapper, WrapperContext ctx) throws SchemaException { + if (itemWrapper.isMetadata()) { + return; + } PrismValue oldValue = valueWrapper.getNewValue(); PrismContainer metadataContainer = oldValue.getValueMetadataAsContainer(); -// Optional metadata = oldValue.valueMetadata(); // TODO -// return; -// // TODO adapt this code -// if (!metadata.isPresent()) { -// LOGGER.trace("Skipping creating metadata"); -// return; -// } -// -// ValueMetadata valueMetadata = metadata.get(); + + if (canContainLegacyMetadata(oldValue)) { + PrismContainer oldMetadata = ((PrismContainerValue) oldValue).findContainer(ObjectType.F_METADATA); + if (oldMetadata != null && oldMetadata.getValue() != null) { + PrismContainerValue newMetadataValue = metadataContainer.createNewValue(); + transformStorageMetadata(newMetadataValue, oldMetadata); + transformProcessMetadata(newMetadataValue, oldMetadata); + } + } ValueMetadataWrapperFactoryImpl valueMetadataWrapperFactory = new ValueMetadataWrapperFactoryImpl(getRegistry()); - PrismContainerWrapper valueMetadataWrapper = valueMetadataWrapperFactory.createWrapper(null, metadataContainer, ItemStatus.NOT_CHANGED.NOT_CHANGED, ctx); + PrismContainerWrapper valueMetadataWrapper = valueMetadataWrapperFactory.createWrapper(null, metadataContainer, ItemStatus.NOT_CHANGED, ctx); valueWrapper.setValueMetadata(new ValueMetadataWrapperImpl(valueMetadataWrapper)); } + private boolean canContainLegacyMetadata(PV value) { + if (value instanceof PrismObjectValue) { + return true; + } + + if (!(value instanceof PrismContainerValue)) { + return false; + } + + PrismContainerDefinition containerDef = ((PrismContainerValue) value).getDefinition(); + if (containerDef == null || containerDef.isRuntimeSchema()) { + return false; + } + + T realValue = value.getRealValue(); + if (realValue == null) { + return false; + } + + if (PasswordType.class.isAssignableFrom(realValue.getClass())) { + return true; + } + + if (AssignmentType.class.isAssignableFrom(realValue.getClass())) { + return true; + } + + return false; + } + + private void transformStorageMetadata(PrismContainerValue metadataValue, PrismContainer oldMetadata) throws SchemaException { + PrismContainer storagetMetadata = metadataValue.findOrCreateContainer(ValueMetadataType.F_STORAGE); + + MetadataType oldMetadataType = oldMetadata.getRealValue(); + StorageMetadataType storageMetadataType = new StorageMetadataType(prismContext); + storageMetadataType.setCreateChannel(oldMetadataType.getCreateChannel()); + storageMetadataType.setCreateTaskRef(oldMetadataType.getCreateTaskRef()); + storageMetadataType.setCreateTimestamp(oldMetadataType.getCreateTimestamp()); + storageMetadataType.setCreatorRef(oldMetadataType.getCreatorRef()); + storageMetadataType.setModifierRef(oldMetadataType.getModifierRef()); + storageMetadataType.setModifyChannel(oldMetadataType.getModifyChannel()); + storageMetadataType.setModifyTaskRef(oldMetadataType.getModifyTaskRef()); + storageMetadataType.setModifyTimestamp(oldMetadataType.getModifyTimestamp()); + + storagetMetadata.setRealValue(storageMetadataType); + + } + + private void transformProcessMetadata(PrismContainerValue metadataValue, PrismContainer oldContainer) throws SchemaException { + PrismContainer processMetadata = metadataValue.findOrCreateContainer(ValueMetadataType.F_PROCESS); + + MetadataType oldMetadata = oldContainer.getRealValue(); + ProcessMetadataType processMetadataType = new ProcessMetadataType(prismContext); + processMetadataType.setCertificationFinishedTimestamp(oldMetadata.getCertificationFinishedTimestamp()); + processMetadataType.setCertificationOutcome(oldMetadata.getCertificationOutcome()); + processMetadataType.setCreateApprovalTimestamp(oldMetadata.getCreateApprovalTimestamp()); + processMetadataType.setModifyApprovalTimestamp(oldMetadata.getModifyApprovalTimestamp()); + processMetadataType.setRequestorComment(oldMetadata.getRequestorComment()); + processMetadataType.setRequestorRef(oldMetadata.getRequestorRef()); + processMetadataType.setRequestTimestamp(oldMetadata.getRequestTimestamp()); + + processMetadata.setRealValue(processMetadataType); + } + protected List getValues(I item) { return item.getValues(); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/MetadataWrapperFactoryImpl.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/MetadataWrapperFactoryImpl.java index b7a65bf6987..7076379e74c 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/MetadataWrapperFactoryImpl.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/MetadataWrapperFactoryImpl.java @@ -48,16 +48,17 @@ public void registerWrapperPanel(PrismContainerWrapper wrapper) { getRegistry().registerWrapperPanel(wrapper.getTypeName(), MetadataContainerPanel.class); } + @Override + protected boolean shouldCreateEmptyValue(PrismContainer item, WrapperContext context) { + return false; + } + @Override public PrismContainerWrapper createWrapper(PrismContainerValueWrapper parent, ItemDefinition def, WrapperContext context) throws SchemaException { -// Boolean readonly = context.getReadOnly() == null ? null : Boolean.valueOf(context.getReadOnly()); -// context.setReadOnly(true); -// context.setMetadata(true); WrapperContext ctx = context.clone(); ctx.setReadOnly(true); ctx.setMetadata(true); PrismContainerWrapper wrapper = super.createWrapper(parent, def, ctx); -// context.setReadOnly(readonly); return wrapper; } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/PrismObjectWrapperFactoryImpl.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/PrismObjectWrapperFactoryImpl.java index 3f8a98f58fd..dd1f505bc61 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/PrismObjectWrapperFactoryImpl.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/PrismObjectWrapperFactoryImpl.java @@ -70,7 +70,7 @@ public PrismObjectWrapper createObjectWrapper(PrismObject object, ItemStat context.setShowEmpty(ItemStatus.ADDED == status); objectWrapper.setExpanded(true); PrismContainerValueWrapper valueWrapper = createValueWrapper(objectWrapper, object.getValue(), ItemStatus.ADDED == status ? ValueStatus.ADDED : ValueStatus.NOT_CHANGED, context); - setupMetadata(valueWrapper, context); + setupMetadata(objectWrapper, valueWrapper, context); objectWrapper.getValues().add(valueWrapper); registerWrapperPanel(objectWrapper); @@ -98,7 +98,7 @@ public void updateWrapper(PrismObjectWrapper wrapper, WrapperContext context) wrapper.getValue().getItems().clear(); PrismContainerValueWrapper valueWrapper = createValueWrapper(wrapper, wrapper.getObject().getValue(), ItemStatus.ADDED == wrapper.getStatus() ? ValueStatus.ADDED : ValueStatus.NOT_CHANGED, context); - setupMetadata(valueWrapper, context); + setupMetadata(wrapper, valueWrapper, context); wrapper.getValues().clear(); wrapper.getValues().add(valueWrapper); @@ -136,6 +136,7 @@ public PrismContainerValueWrapper createValueWrapper(PrismContainerWrapper def.setMaxOccurs(1); def.setDisplayName(WebComponentUtil.getOrigStringFromPoly(display.getLabel())); def.setDynamic(true); + def.setRuntimeSchema(true); ItemWrapperFactory factory = getRegistry().findWrapperFactory(def, null); if (factory == null) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/ProvenanceMetadataWrapperFactory.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/ProvenanceMetadataWrapperFactory.java index 19fd07ad813..dd9ebdc9b30 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/ProvenanceMetadataWrapperFactory.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/ProvenanceMetadataWrapperFactory.java @@ -6,38 +6,54 @@ */ package com.evolveum.midpoint.gui.impl.factory.wrapper; +import org.springframework.stereotype.Component; + import com.evolveum.midpoint.gui.api.factory.wrapper.WrapperContext; -import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerWrapper; -import com.evolveum.midpoint.gui.impl.prism.panel.ProvenanceMetadataPanel; +import com.evolveum.midpoint.gui.impl.Channel; +import com.evolveum.midpoint.model.api.authentication.GuiProfiledPrincipal; import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismContainerValue; +import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.util.QNameUtil; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ProvenanceMetadataType; - -import org.springframework.stereotype.Component; - -import javax.xml.namespace.QName; +import com.evolveum.midpoint.web.security.util.SecurityUtils; +import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ProvenanceAcquisitionType; @Component -public class ProvenanceMetadataWrapperFactory extends MetadataWrapperFactoryImpl { +public class ProvenanceMetadataWrapperFactory extends MetadataWrapperFactoryImpl { @Override public boolean match(ItemDefinition def, PrismContainerValue parent) { - return QNameUtil.match(def.getTypeName(), ProvenanceMetadataType.COMPLEX_TYPE); + return QNameUtil.match(def.getTypeName(), ProvenanceAcquisitionType.COMPLEX_TYPE); } @Override public int getOrder() { - return super.getOrder() - 10; + return 9; } @Override - protected boolean shouldCreateEmptyValue(PrismContainer item, WrapperContext context) { - return true; + protected boolean shouldCreateEmptyValue(PrismContainer item, WrapperContext context) { + return false; } +// @Override +// protected PrismContainerValue createNewValue(PrismContainer item) { +// PrismContainerValue newValue = super.createNewValue(item); +// ProvenanceAcquisitionType acquisitionType = newValue.asContainerable(); +// GuiProfiledPrincipal principal = SecurityUtils.getPrincipalUser(); +// if (principal != null) { +// FocusType focus = principal.getFocus(); +// if (focus != null) { +// acquisitionType.setActorRef(ObjectTypeUtil.createObjectRef(focus, getPrismContext())); +// } +// } +// acquisitionType.setChannel(Channel.USER.getChannel()); +// return newValue; +// } + // // @Override // public void registerWrapperPanel(PrismContainerWrapper wrapper) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/ValueMetadataWrapperFactoryImpl.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/ValueMetadataWrapperFactoryImpl.java index f2dcaa91b26..90873b78ac1 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/ValueMetadataWrapperFactoryImpl.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/ValueMetadataWrapperFactoryImpl.java @@ -12,10 +12,7 @@ import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerValueWrapper; import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerWrapper; import com.evolveum.midpoint.gui.api.registry.GuiComponentRegistry; -import com.evolveum.midpoint.prism.Containerable; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContainerValue; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.web.component.prism.ValueStatus; @@ -30,6 +27,12 @@ public class ValueMetadataWrapperFactoryImpl extends PrismContainerWrapperFactor this.registry = registry; } + public PrismContainerWrapper createWrapper(PrismContainerValueWrapper parent, Item childItem, ItemStatus status, WrapperContext context) throws SchemaException { + WrapperContext ctx = context.clone(); + ctx.setMetadata(true); + return super.createWrapper(parent, childItem, status, ctx); + } + @Override public PrismContainerValueWrapper createValueWrapper(PrismContainerWrapper parent, PrismContainerValue value, ValueStatus status, WrapperContext context) throws SchemaException { WrapperContext ctx = context.clone(); @@ -49,13 +52,13 @@ protected boolean shouldCreateEmptyValue(PrismContainer item, Wra return false; } - @Override - protected List getItemDefinitions(PrismContainerWrapper parent, PrismContainerValue value) { - if (value == null || value.getComplexTypeDefinition() == null) { - return Collections.emptyList(); - } - return value.getComplexTypeDefinition().getDefinitions(); - } +// @Override +// protected List getItemDefinitions(PrismContainerWrapper parent, PrismContainerValue value) { +// if (value == null || value.getComplexTypeDefinition() == null) { +// return Collections.emptyList(); +// } +// return value.getComplexTypeDefinition().getDefinitions(); +// } @Override public GuiComponentRegistry getRegistry() { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/DefaultContainerablePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/DefaultContainerablePanel.java index 1ae617bdfeb..17760b4908b 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/DefaultContainerablePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/DefaultContainerablePanel.java @@ -99,8 +99,7 @@ public IModel getBody() { @Override public boolean isVisible() { - return nonContainerWrappers.getObject() != null && !nonContainerWrappers.getObject().isEmpty() - && getModelObject().isExpanded();// && !model.getObject().isShowEmpty(); + return isShowMoreButtonVisible(nonContainerWrappers); } }); propertiesLabel.add(labelShowEmpty); @@ -199,6 +198,11 @@ public boolean isEnabled() { } } + protected boolean isShowMoreButtonVisible(IModel>> nonContainerWrappers) { + return nonContainerWrappers.getObject() != null && !nonContainerWrappers.getObject().isEmpty() + && getModelObject().isExpanded(); + } + private void populateContainer(ListItem> container) { PrismContainerWrapper itemWrapper = container.getModelObject(); try { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/MetadataContainerValuePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/MetadataContainerValuePanel.java index b056c586d23..352716210b4 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/MetadataContainerValuePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/MetadataContainerValuePanel.java @@ -8,6 +8,7 @@ package com.evolveum.midpoint.gui.impl.prism.panel; import com.evolveum.midpoint.gui.api.component.BasePanel; +import com.evolveum.midpoint.gui.api.prism.wrapper.ItemWrapper; import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerValueWrapper; import com.evolveum.midpoint.prism.Containerable; @@ -15,6 +16,8 @@ import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.model.IModel; +import java.util.List; + public class MetadataContainerValuePanel> extends DefaultContainerablePanel { @@ -23,8 +26,8 @@ public MetadataContainerValuePanel(String id, IModel model, ItemPanelSettin } - - - - + @Override + protected boolean isShowMoreButtonVisible(IModel>> nonContainerWrappers) { + return false; + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismContainerValuePanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismContainerValuePanel.html index 947ad10ee0c..7d8e961c0d5 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismContainerValuePanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismContainerValuePanel.html @@ -25,7 +25,7 @@
-
+
- - - +
+ +
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/wrapper/PrismContainerWrapperImpl.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/wrapper/PrismContainerWrapperImpl.java index 4aa06430cf1..d418d5191b9 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/wrapper/PrismContainerWrapperImpl.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/wrapper/PrismContainerWrapperImpl.java @@ -13,6 +13,7 @@ import java.util.List; import javax.xml.namespace.QName; +import com.evolveum.midpoint.gui.api.util.WebPrismUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.ValueMetadataType; import org.apache.commons.collections4.CollectionUtils; @@ -211,78 +212,6 @@ public String debugDump(int indent) { return super.debugDump(indent); } - protected void cleanupEmptyContainers(PrismContainer container) { - List> values = container.getValues(); - Iterator> valueIterator = values.iterator(); - while (valueIterator.hasNext()) { - PrismContainerValue value = valueIterator.next(); - - PrismContainerValue valueAfter = cleanupEmptyContainerValue(value); - if (valueAfter == null || valueAfter.isIdOnly() || valueAfter.isEmpty()) { - valueIterator.remove(); - } - } - } - - protected PrismContainerValue cleanupEmptyContainerValue(PrismContainerValue value) { - Collection> items = value.getItems(); - - if (items != null) { - Iterator> iterator = items.iterator(); - while (iterator.hasNext()) { - Item item = iterator.next(); - - cleanupEmptyValues(item); - if (item.isEmpty()) { - iterator.remove(); - } - } - } - - if (value.getItems() == null || value.getItems().isEmpty()) { - return null; - } - - return value; - } - - private void cleanupEmptyValues(Item item) { - if (item instanceof PrismContainer) { - cleanupEmptyContainers((PrismContainer) item); - } - - if (item instanceof PrismProperty) { - PrismProperty property = (PrismProperty) item; - List> pVals = property.getValues(); - if (pVals == null || pVals.isEmpty()) { - return; - } - - Iterator> iterator = pVals.iterator(); - while (iterator.hasNext()) { - PrismPropertyValue pVal = iterator.next(); - if (pVal == null || pVal.isEmpty() || pVal.getRealValue() == null) { - iterator.remove(); - } - } - } - - if (item instanceof PrismReference) { - PrismReference ref = (PrismReference) item; - List values = ref.getValues(); - if (values == null || values.isEmpty()) { - return; - } - - Iterator iterator = values.iterator(); - while (iterator.hasNext()) { - PrismReferenceValue rVal = iterator.next(); - if (rVal == null || rVal.isEmpty()) { - iterator.remove(); - } - } - } - } @Override public > Collection getDelta() throws SchemaException { @@ -303,7 +232,7 @@ private void cleanupEmptyValues(Item item) { break; } - valueToAdd = cleanupEmptyContainerValue(valueToAdd); + valueToAdd = WebPrismUtil.cleanupEmptyContainerValue(valueToAdd); if (valueToAdd == null || valueToAdd.isEmpty() || valueToAdd.isIdOnly()) { LOGGER.trace("Value is empty, skipping delta creation."); break; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/wrapper/PrismValueWrapperImpl.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/wrapper/PrismValueWrapperImpl.java index 9ef06193f47..a627f907f63 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/wrapper/PrismValueWrapperImpl.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/wrapper/PrismValueWrapperImpl.java @@ -9,9 +9,9 @@ import com.evolveum.midpoint.gui.api.prism.wrapper.ItemWrapper; import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerValueWrapper; import com.evolveum.midpoint.gui.api.prism.wrapper.PrismValueWrapper; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismValue; -import com.evolveum.midpoint.prism.ValueMetadata; +import com.evolveum.midpoint.gui.api.util.WebPrismUtil; +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.delta.ContainerDelta; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.equivalence.EquivalenceStrategy; import com.evolveum.midpoint.util.DOMUtil; @@ -19,6 +19,8 @@ import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.web.component.prism.ValueStatus; +import com.evolveum.midpoint.web.security.MidPointApplication; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ValueMetadataType; import javax.xml.namespace.QName; @@ -57,9 +59,9 @@ public abstract class PrismValueWrapperImpl implements PrismValueWrapper { break; } if (parent.isSingleValue()) { - delta.addValueToReplace(getNewValue().clone()); + delta.addValueToReplace(getNewValueWithMetadataApplied()); } else { - delta.addValueToAdd(getNewValue().clone()); + delta.addValueToAdd(getNewValueWithMetadataApplied()); } break; case NOT_CHANGED: @@ -72,13 +74,13 @@ public abstract class PrismValueWrapperImpl implements PrismValueWrapper { if (newValue.isEmpty()) { delta.addValueToDelete(oldValue.clone()); } else { - delta.addValueToReplace(newValue.clone()); + delta.addValueToReplace(getNewValueWithMetadataApplied()); } break; } if (!newValue.isEmpty()) { - delta.addValueToAdd(newValue.clone()); + delta.addValueToAdd(getNewValueWithMetadataApplied()); } if (!oldValue.isEmpty()) { delta.addValueToDelete(oldValue.clone()); @@ -123,6 +125,18 @@ public V getNewValue() { return (V) newValue; } + private V getNewValueWithMetadataApplied() throws SchemaException { + PrismContainerValue newYieldValue = WebPrismUtil.getNewYieldValue(); + + MidPointApplication app = MidPointApplication.get(); + ValueMetadata newValueMetadata = app.getPrismContext().getValueMetadataFactory().createEmpty(); + newValueMetadata.addMetadataValue(newYieldValue); + + newValue.setValueMetadata(newValueMetadata.clone()); + + return (V) newValue.clone(); + } + @Override public V getOldValue() { return (V) oldValue; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/wrapper/ValueMetadataWrapperImpl.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/wrapper/ValueMetadataWrapperImpl.java index 0a4636bdf27..18f341604b7 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/wrapper/ValueMetadataWrapperImpl.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/wrapper/ValueMetadataWrapperImpl.java @@ -10,19 +10,22 @@ import com.evolveum.midpoint.gui.api.prism.ItemStatus; import com.evolveum.midpoint.gui.api.prism.wrapper.*; import com.evolveum.midpoint.gui.api.util.ModelServiceLocator; +import com.evolveum.midpoint.gui.api.util.WebPrismUtil; +import com.evolveum.midpoint.gui.impl.Channel; +import com.evolveum.midpoint.model.api.authentication.GuiProfiledPrincipal; import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.delta.ContainerDelta; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.path.ItemName; import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.web.component.prism.ContainerStatus; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ExpressionType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.UserInterfaceElementVisibilityType; - -import com.evolveum.midpoint.xml.ns._public.common.common_3.ValueMetadataType; +import com.evolveum.midpoint.web.component.prism.ValueStatus; +import com.evolveum.midpoint.web.security.MidPointApplication; +import com.evolveum.midpoint.web.security.util.SecurityUtils; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.commons.collections4.CollectionUtils; import org.jetbrains.annotations.NotNull; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/AbstractSpringBootApplication.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/AbstractSpringBootApplication.java index dcac29b781e..d423d0cc544 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/AbstractSpringBootApplication.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/AbstractSpringBootApplication.java @@ -11,6 +11,7 @@ import com.evolveum.midpoint.web.security.SessionAndRequestScopeImpl; import org.apache.wicket.Application; +import org.apache.wicket.RuntimeConfigurationType; import org.apache.wicket.protocol.http.WicketFilter; import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Autowired; @@ -109,7 +110,7 @@ public FilterRegistrationBean wicket() { registration.setDispatcherTypes(DispatcherType.ERROR, DispatcherType.REQUEST, DispatcherType.FORWARD); registration.addUrlPatterns("/*"); registration.addInitParameter(WicketFilter.FILTER_MAPPING_PARAM, "/*"); - registration.addInitParameter(Application.CONFIGURATION, "deployment"); // deployment development + registration.addInitParameter(Application.CONFIGURATION, "development"); // deployment development registration.addInitParameter("applicationBean", "midpointApplication"); registration.addInitParameter(WicketFilter.APP_FACT_PARAM, "org.apache.wicket.spring.SpringWebApplicationFactory"); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/MidPointApplication.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/MidPointApplication.java index 08267a96257..e77f4617adf 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/MidPointApplication.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/MidPointApplication.java @@ -14,6 +14,8 @@ import javax.servlet.ServletContext; import javax.xml.datatype.Duration; +import com.evolveum.midpoint.common.Clock; + import org.apache.commons.configuration2.Configuration; import org.apache.wicket.*; import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior; @@ -182,6 +184,7 @@ public class MidPointApplication extends AuthenticatedWebApplication implements @Autowired private AsyncWebProcessManager asyncWebProcessManager; @Autowired private ApplicationContext applicationContext; @Autowired private SystemConfigurationChangeDispatcher systemConfigurationChangeDispatcher; + @Autowired private Clock clock; private WebApplicationConfiguration webApplicationConfiguration; @@ -609,4 +612,8 @@ public boolean update(@Nullable SystemConfigurationType value) { public void setApplicationContext(@NotNull ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } + + public Clock getClock() { + return clock; + } } diff --git a/gui/admin-gui/src/main/resources/static/less/midpoint-theme.less b/gui/admin-gui/src/main/resources/static/less/midpoint-theme.less index 9110b919e65..bee0565a373 100644 --- a/gui/admin-gui/src/main/resources/static/less/midpoint-theme.less +++ b/gui/admin-gui/src/main/resources/static/less/midpoint-theme.less @@ -859,11 +859,11 @@ body .treeview-menu > li > span:hover { .prism-container { padding-left: 40px; - border-top: 0px solid @table-divider-color; + border-top: none; } .prism-container.multivalue-container { padding-left: 40px; - border-top: 0px solid @table-divider-color; + border-top: none; } } @@ -874,25 +874,33 @@ body .treeview-menu > li > span:hover { .prism-container.multivalue-container { padding-left: 40px; - border-top: 0px solid @table-divider-color; + border-top: none; .container-wrapper { padding-left: 40px; - border-top: 0px solid @table-divider-color; + border-top: none; } } .container-wrapper { padding-left: 40px; - border-top: 0px solid @table-divider-color; + border-top: none; .container-wrapper { padding-left: 0px; - border-top: 0px solid @table-divider-color; + border-top: none; } } } } + + .metadata { + .prism-properties { + .prism-container { + border-top: none; + } + } + } } .top-level-prism-container .row { @@ -1668,42 +1676,43 @@ display: inline-block; } .metadata { - .panel-default { - border-color: #ffffff; - } - .panel { - margin-bottom: 0px; - box-shadow: none; - } + .panel-default { + border-color: #ffffff; + } - .panel-body { - padding: 5px; - } + .panel { + margin-bottom: 0px; + box-shadow: none; + } - .info-box { - min-height: 50px; - } + .panel-body { + padding: 5px; + } - .info-box-icon { - height: 50px; - line-height: normal; - } + .info-box { + min-height: 50px; + } - .info-box-icon-ethereal-image { - font-size: 46px; - } + .info-box-icon { + height: 50px; + line-height: normal; + } + + .info-box-icon-ethereal-image { + font-size: 46px; + } } .metadata-nav > li > a { - border-radius: 10px; - padding: 5px 10px; - float: left; + border-radius: 10px; + padding: 5px 10px; + float: left; } .metadata-nav > li > a::before { - font-family: "FontAwesome"; - content: "\f02b"; + font-family: "FontAwesome"; + content: "\f02b"; } .acquisition {