Skip to content

Commit

Permalink
Merge branch 'refs/heads/master' into feature/native-associations
Browse files Browse the repository at this point in the history
Including quite a heavy merging.

Not 100% complete:

1. The GUI code for schema editing needs to be reviewed and fixed more
carefully, as the code diverged a lot between the branches.

2. The enum serialization code in SchemaToDomProcessor
(now SchemaDomSerializer) needs to be manually converted, using the
new definition feature serialization/parsing support.

# Conflicts:
#	gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/form/ValueChoosePanel.java
#	infra/schema/src/main/java/com/evolveum/midpoint/schema/MidPointPrismContextFactory.java
#	infra/schema/src/main/java/com/evolveum/midpoint/schema/merger/GenericItemMerger.java
#	infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/CompositeObjectDefinitionImpl.java
#	infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceAttributeDefinitionImpl.java
#	infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceObjectClassDefinitionImpl.java
#	infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ResourceSchema.java
#	infra/schema/src/main/java/com/evolveum/midpoint/schema/processor/ShadowAssociationDefinition.java
#	model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/schema/transform/TransformableItemDefinition.java
  • Loading branch information
mederly committed Apr 18, 2024
2 parents 8ca4344 + ef3c2a0 commit ed75e60
Show file tree
Hide file tree
Showing 154 changed files with 3,664 additions and 1,510 deletions.
27 changes: 24 additions & 3 deletions config/sql/native/postgres-upgrade.sql
Original file line number Diff line number Diff line change
Expand Up @@ -434,7 +434,6 @@ call apply_change(24, $aa$
ALTER TABLE m_connector ADD displayNameNorm TEXT;
$aa$);


call apply_change(25, $aa$
CREATE OR REPLACE PROCEDURE m_refresh_org_closure(force boolean = false)
LANGUAGE plpgsql
Expand Down Expand Up @@ -470,8 +469,6 @@ call apply_change(26, $aa$
ALTER TABLE m_ref_role_membership ADD COLUMN fullObject BYTEA;
$aa$);



--- Policy Type

call apply_change(27, $aa$
Expand Down Expand Up @@ -502,6 +499,30 @@ call apply_change(28, $aa$
CREATE INDEX m_policy_createTimestamp_idx ON m_policy (createTimestamp);
CREATE INDEX m_policy_modifyTimestamp_idx ON m_policy (modifyTimestamp);
$aa$);

--- Schema Type

call apply_change(29, $aa$
ALTER TYPE ObjectType ADD VALUE IF NOT EXISTS 'SCHEMA' AFTER 'ROLE_ANALYSIS_SESSION';
$aa$);

call apply_change(30, $aa$
CREATE TABLE m_schema (
oid UUID NOT NULL PRIMARY KEY REFERENCES m_object_oid(oid),
objectType ObjectType GENERATED ALWAYS AS ('SCHEMA') STORED
CHECK (objectType = 'SCHEMA')
)
INHERITS (m_assignment_holder);

CREATE TRIGGER m_schema_oid_insert_tr BEFORE INSERT ON m_schema
FOR EACH ROW EXECUTE FUNCTION insert_object_oid();
CREATE TRIGGER m_schema_update_tr BEFORE UPDATE ON m_schema
FOR EACH ROW EXECUTE FUNCTION before_update_object();
CREATE TRIGGER m_schema_oid_delete_tr AFTER DELETE ON m_schema
FOR EACH ROW EXECUTE FUNCTION delete_object_oid();

$aa$);

---
-- WRITE CHANGES ABOVE ^^
-- IMPORTANT: update apply_change number at the end of postgres-new.sql
Expand Down
18 changes: 18 additions & 0 deletions config/sql/native/postgres.sql
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ CREATE TYPE ObjectType AS ENUM (
'ROLE',
'ROLE_ANALYSIS_CLUSTER',
'ROLE_ANALYSIS_SESSION',
'SCHEMA',
'SECURITY_POLICY',
'SEQUENCE',
'SERVICE',
Expand Down Expand Up @@ -2177,6 +2178,23 @@ CREATE TRIGGER m_mark_oid_delete_tr AFTER DELETE ON m_mark

-- endregion

-- region schema
CREATE TABLE m_schema (
oid UUID NOT NULL PRIMARY KEY REFERENCES m_object_oid(oid),
objectType ObjectType GENERATED ALWAYS AS ('SCHEMA') STORED
CHECK (objectType = 'SCHEMA')
)
INHERITS (m_assignment_holder);

CREATE TRIGGER m_schema_oid_insert_tr BEFORE INSERT ON m_schema
FOR EACH ROW EXECUTE FUNCTION insert_object_oid();
CREATE TRIGGER m_schema_update_tr BEFORE UPDATE ON m_schema
FOR EACH ROW EXECUTE FUNCTION before_update_object();
CREATE TRIGGER m_schema_oid_delete_tr AFTER DELETE ON m_schema
FOR EACH ROW EXECUTE FUNCTION delete_object_oid();

-- endregion

-- region Extension support
-- Catalog table of known indexed extension items.
-- While itemName and valueType are both Q-names they are not cached via m_uri because this
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@

import com.evolveum.midpoint.gui.api.util.LocalizationUtil;

import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;

import org.apache.commons.lang3.StringUtils;
import org.apache.wicket.ajax.AjaxChannel;
import org.apache.wicket.ajax.AjaxRequestTarget;
Expand Down Expand Up @@ -145,7 +147,9 @@ protected List<StringLimitationResult> load() {
@Override
protected void onComponentTag(ComponentTag tag) {
super.onComponentTag(tag);
tag.remove("value");
if (removePasswordValueAttribute()) {
tag.remove("value");
}
}

@Override
Expand Down Expand Up @@ -180,8 +184,7 @@ protected boolean shouldTrimInput() {
};
password2.setRequired(false);
password2.setOutputMarkupId(true);
password2.add(new EnableBehaviour(this::canEditPassword));
password2.add(new VisibleBehaviour(() -> !showOneLinePasswordPanel));
password2.add(new VisibleEnableBehaviour(() -> !showOneLinePasswordPanel, this::canEditPassword));
password2.add(AttributeAppender.append(
"aria-label",
LocalizationUtil.translate(
Expand Down Expand Up @@ -398,4 +401,8 @@ public PrismObject<? extends FocusType> getPrismObject() {
private PageAdminLTE getParentPage() {
return WebComponentUtil.getPage(PasswordPanel.this, PageAdminLTE.class);
}

protected boolean removePasswordValueAttribute() {
return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -501,6 +501,8 @@ public void showMainPopup(Popupable popupable, AjaxRequestTarget target) {

public void hideMainPopup(AjaxRequestTarget target) {
getMainPopup().close(target);
target.appendJavaScript("$('body').removeClass('modal-open');\n"
+ "$('.modal-backdrop').remove();");
}

private VisibleBehaviour createUserStatusBehaviour() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -531,6 +531,13 @@ private MainMenuItem createMarkItems() {
return menu;
}

private MainMenuItem createSchemaItems() {
MainMenuItem menu = createMainMenuItem("PageAdmin.menu.top.schema", GuiStyleConstants.CLASS_ICON_RESOURCE_SCHEMA);
createBasicAssignmentHolderMenuItems(menu, PageTypes.SCHEMA);

return menu;
}

private SideBarMenuItem createConfigurationMenu(boolean experimentalFeaturesEnabled) {
SideBarMenuItem item = new SideBarMenuItem("PageAdmin.menu.top.configuration", experimentalFeaturesEnabled) {
@Override
Expand All @@ -543,6 +550,7 @@ public boolean isVisible() {
item.addMainMenuItem(createObjectsCollectionItems());
item.addMainMenuItem(createObjectTemplatesItems());
item.addMainMenuItem(createMarkItems());
item.addMainMenuItem(createSchemaItems());
item.addMainMenuItem(createMainMenuItem("PageAdmin.menu.top.configuration.bulkActions", "fa fa-bullseye", PageBulkAction.class));
item.addMainMenuItem(createMainMenuItem("PageAdmin.menu.top.configuration.importObject", "fa fa-upload", PageImportObject.class));
item.addMainMenuItem(createRepositoryObjectsMenu());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
import com.evolveum.midpoint.gui.impl.page.admin.report.PageReport;
import com.evolveum.midpoint.gui.impl.page.admin.resource.PageResource;
import com.evolveum.midpoint.gui.impl.page.admin.role.PageRole;
import com.evolveum.midpoint.gui.impl.page.admin.schema.PageSchema;
import com.evolveum.midpoint.gui.impl.page.admin.schema.PageSchemas;
import com.evolveum.midpoint.gui.impl.page.admin.service.PageService;
import com.evolveum.midpoint.gui.impl.page.admin.simulation.PageSimulationResult;
import com.evolveum.midpoint.gui.impl.page.admin.simulation.PageSimulationResults;
Expand Down Expand Up @@ -56,7 +58,8 @@ public enum PageTypes {
OBJECT_TEMPLATE("objectTemplates", GuiStyleConstants.CLASS_OBJECT_TEMPLATE_ICON, PageObjectTemplates.class, PageObjectTemplate.class, ObjectTemplateType.COMPLEX_TYPE),
REPORT("reports", GuiStyleConstants.CLASS_REPORT_ICON, PageReports.class, PageReport.class, ReportType.COMPLEX_TYPE),
SIMULATION_RESULT("simulationResults", GuiStyleConstants.CLASS_SIMULATION_RESULT, PageSimulationResults.class, PageSimulationResult.class, SimulationResultType.COMPLEX_TYPE),
MARK("marks", GuiStyleConstants.CLASS_MARK, PageMarks.class, PageMark.class, MarkType.COMPLEX_TYPE);
MARK("marks", GuiStyleConstants.CLASS_MARK, PageMarks.class, PageMark.class, MarkType.COMPLEX_TYPE),
SCHEMA("schemas", GuiStyleConstants.CLASS_ICON_RESOURCE_SCHEMA, PageSchemas.class, PageSchema.class, SchemaType.COMPLEX_TYPE);

private String identifier;
private String icon;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<!--
~ Copyright (c) 2022 Evolveum
~
~ This work is dual-licensed under the Apache License 2.0
~ and European Union Public License. See LICENSE file for details.
-->
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:wicket="http://wicket.apache.org">
<body>
<wicket:panel>
<div wicket:id="definitions"/>

<wicket:fragment wicket:id="buttonBar">
<div class="btn-group" wicket:id="buttonsRepeater">
<a wicket:id="button"></a>
</div>
</wicket:fragment>


</wicket:panel>
</body>
</html>
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
/*
* Copyright (C) 2023 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/

package com.evolveum.midpoint.gui.impl.component.table;

import com.evolveum.midpoint.gui.api.component.BasePanel;
import com.evolveum.midpoint.gui.impl.component.ButtonBar;
import com.evolveum.midpoint.gui.impl.component.data.provider.ListDataProvider;
import com.evolveum.midpoint.gui.impl.page.admin.schema.component.ItemDefinitionPanel;

import com.evolveum.midpoint.gui.impl.page.admin.schema.dto.ItemDefinitionDto;
import com.evolveum.midpoint.prism.PrismPropertyDefinition;
import com.evolveum.midpoint.web.component.AjaxIconButton;
import com.evolveum.midpoint.web.component.data.BoxedTablePanel;
import com.evolveum.midpoint.web.component.data.column.AjaxLinkColumn;
import com.evolveum.midpoint.web.page.admin.resources.dto.AttributeDto;
import com.evolveum.midpoint.web.session.UserProfileStorage;

import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;

import javax.xml.namespace.QName;
import java.util.ArrayList;
import java.util.List;

public class DefinitionTablePanel<T extends ItemDefinitionDto> extends BasePanel<List<T>> {

private static final String ID_DEFINITIONS = "definitions";
private static final String ID_BUTTON_BAR = "buttonBar";
private static final String ID_BUTTON = "button";

public DefinitionTablePanel(String id, IModel<List<T>> model) {
super(id, model);
}

@Override
protected void onInitialize() {
super.onInitialize();
initLayout();
}

private void initLayout() {
ListDataProvider<T> attributeProvider = new ListDataProvider<>(this, getModel(), true) {

@Override
public IModel<T> model(T object) {
return new IModel<>() {
@Override
public T getObject() {
return object;
}
};
}
};
attributeProvider.setSort(AttributeDto.F_DISPLAY_ORDER, SortOrder.ASCENDING);
BoxedTablePanel<T> attributeTable = new BoxedTablePanel<>(ID_DEFINITIONS, attributeProvider, initColumns()) {

@Override
protected WebMarkupContainer createButtonToolbar(String id) {
return createTableButtons(id);
}
};
attributeTable.setOutputMarkupId(true);
attributeTable.setItemsPerPage(UserProfileStorage.DEFAULT_PAGING_SIZE);
attributeTable.setShowPaging(true);
add(attributeTable);
}

private List<IColumn<T, String>> initColumns() {
List<IColumn<T, String>> columns = new ArrayList<>();

columns.add(new AjaxLinkColumn<>(createStringResource("SchemaListPanel.name"), ItemDefinitionDto.F_NAME, ItemDefinitionDto.F_NAME) {

@Override
public void onClick(AjaxRequestTarget target, IModel<T> rowModel) {
ItemDefinitionPanel itemDefPanel = new ItemDefinitionPanel(getPageBase().getMainPopupBodyId(), (IModel<ItemDefinitionDto>) rowModel) {

@Override
protected void refresh(AjaxRequestTarget target) {
target.add(DefinitionTablePanel.this);
}
};
getPageBase().showMainPopup(itemDefPanel, target);
}

@Override
public boolean isEnabled(IModel<T> rowModel) {
return rowModel.getObject() instanceof ItemDefinitionDto;
}
});
columns.add(new PropertyColumn<>(createStringResource("SchemaListPanel.displayName"), ItemDefinitionDto.F_DISPLAY_NAME));
// columns.add(new PropertyColumn<>(createStringResource("SchemaListPanel.nativeAttributeName"), AttributeDto.F_NATIVE_ATTRIBUTE_NAME, AttributeDto.F_NATIVE_ATTRIBUTE_NAME));
columns.add(new PropertyColumn<>(createStringResource("SchemaListPanel.minMax"), ItemDefinitionDto.F_MIN_MAX_OCCURS));
// columns.add(new PropertyColumn<>(createStringResource("SchemaListPanel.minMax"), ItemDefinitionDto.F_MAX_OCCURS));
columns.add(new PropertyColumn<>(createStringResource("SchemaListPanel.displayOrder"), ItemDefinitionDto.F_DISPLAY_ORDER, ItemDefinitionDto.F_DISPLAY_ORDER));
columns.add(new PropertyColumn<>(createStringResource("SchemaListPanel.displayOrder"), ItemDefinitionDto.F_TYPE, ItemDefinitionDto.F_TYPE));

// CheckBoxColumn<AttributeDto> check = new CheckBoxColumn<>(createStringResource("SchemaListPanel.returnedByDefault"), AttributeDto.F_RETURNED_BY_DEFAULT);
// check.setEnabled(false);
// columns.add(check);

return columns;
}

private WebMarkupContainer createTableButtons(String id) {
return new ButtonBar<>(id, ID_BUTTON_BAR, DefinitionTablePanel.this, createToolbarButtonsList(ID_BUTTON));
}


protected List<Component> createToolbarButtonsList(String idButton) {
List<Component> buttonsList = new ArrayList<>();
buttonsList.add(createNewDefinitionBUtton(idButton));
return buttonsList;
}

private AjaxIconButton createNewDefinitionBUtton(String buttonId) {
return new AjaxIconButton(buttonId, new Model<>("fa fa-plus"), createStringResource("SchemaListPanel.newDefinition")) {

@Override
public void onClick(AjaxRequestTarget target) {

//TODO ugly hack
PrismPropertyDefinition ppd = createNewDefinition();
ItemDefinitionPanel itemDefPanel = new ItemDefinitionPanel(getPageBase().getMainPopupBodyId(), new Model<>(new ItemDefinitionDto(ppd)), true) {

@Override
protected void refresh(AjaxRequestTarget target) {
DefinitionTablePanel.this.getModelObject().add((T) getModelObject());
target.add(DefinitionTablePanel.this);
newDefinitionAdded(target, getModelObject());

}
};
getPageBase().showMainPopup(itemDefPanel, target);
}
};
}

protected void newDefinitionAdded(AjaxRequestTarget target, ItemDefinitionDto newDefinition) {

}

protected PrismPropertyDefinition createNewDefinition() {
throw new UnsupportedOperationException("Not implemented");
}

}

0 comments on commit ed75e60

Please sign in to comment.