diff --git a/build-system/pom.xml b/build-system/pom.xml
index 343ead78135..c922ac21273 100644
--- a/build-system/pom.xml
+++ b/build-system/pom.xml
@@ -74,8 +74,8 @@
5.1.31
7.1.0
2.4.0
- 5.17.0
- 5.17.0
+ 5.19.0.2
+ 5.19.0.2
1.3
2.0.1
1.4.3.0-SNAPSHOT
@@ -294,6 +294,11 @@
commons-pool
1.5.6
+
+ org.jetbrains
+ annotations-java5
+ 15.0
+
javax.annotation
jsr250-api
diff --git a/config/sql/midpoint/3.4/h2/h2-3.4.sql b/config/sql/midpoint/3.4/h2/h2-3.4.sql
index 9e1951d7d48..0b6f61bdf60 100644
--- a/config/sql/midpoint/3.4/h2/h2-3.4.sql
+++ b/config/sql/midpoint/3.4/h2/h2-3.4.sql
@@ -621,6 +621,18 @@ CREATE TABLE m_task (
taskIdentifier VARCHAR(255),
threadStopAction INTEGER,
waitingReason INTEGER,
+ wfEndTimestamp TIMESTAMP,
+ wfObjectRef_relation VARCHAR(157),
+ wfObjectRef_targetOid VARCHAR(36),
+ wfObjectRef_type INTEGER,
+ wfProcessInstanceId VARCHAR(255),
+ wfRequesterRef_relation VARCHAR(157),
+ wfRequesterRef_targetOid VARCHAR(36),
+ wfRequesterRef_type INTEGER,
+ wfStartTimestamp TIMESTAMP,
+ wfTargetRef_relation VARCHAR(157),
+ wfTargetRef_targetOid VARCHAR(36),
+ wfTargetRef_type INTEGER,
oid VARCHAR(36) NOT NULL,
PRIMARY KEY (oid)
);
@@ -837,6 +849,18 @@ ADD CONSTRAINT uc_system_configuration_name UNIQUE (name_norm);
CREATE INDEX iParent ON m_task (parent);
+CREATE INDEX iTaskWfProcessInstanceId ON m_task (wfProcessInstanceId);
+
+CREATE INDEX iTaskWfStartTimestamp ON m_task (wfStartTimestamp);
+
+CREATE INDEX iTaskWfEndTimestamp ON m_task (wfEndTimestamp);
+
+CREATE INDEX iTaskWfRequesterOid ON m_task (wfRequesterRef_targetOid);
+
+CREATE INDEX iTaskWfObjectOid ON m_task (wfObjectRef_targetOid);
+
+CREATE INDEX iTaskWfTargetOid ON m_task (wfTargetRef_targetOid);
+
CREATE INDEX iTriggerTimestamp ON m_trigger (timestampValue);
ALTER TABLE m_user
diff --git a/config/sql/midpoint/3.4/h2/h2-upgrade-3.3-3.4.sql b/config/sql/midpoint/3.4/h2/h2-upgrade-3.3-3.4.sql
index 662aff41f9c..1f64982636f 100644
--- a/config/sql/midpoint/3.4/h2/h2-upgrade-3.3-3.4.sql
+++ b/config/sql/midpoint/3.4/h2/h2-upgrade-3.3-3.4.sql
@@ -1,3 +1,28 @@
+ALTER TABLE m_task ADD wfEndTimestamp TIMESTAMP;
+ALTER TABLE m_task ADD wfObjectRef_relation VARCHAR(157);
+ALTER TABLE m_task ADD wfObjectRef_targetOid VARCHAR(36);
+ALTER TABLE m_task ADD wfObjectRef_type INTEGER;
+ALTER TABLE m_task ADD wfProcessInstanceId VARCHAR(255);
+ALTER TABLE m_task ADD wfRequesterRef_relation VARCHAR(157);
+ALTER TABLE m_task ADD wfRequesterRef_targetOid VARCHAR(36);
+ALTER TABLE m_task ADD wfRequesterRef_type INTEGER;
+ALTER TABLE m_task ADD wfStartTimestamp TIMESTAMP;
+ALTER TABLE m_task ADD wfTargetRef_relation VARCHAR(157);
+ALTER TABLE m_task ADD wfTargetRef_targetOid VARCHAR(36);
+ALTER TABLE m_task ADD wfTargetRef_type INTEGER;
+
+CREATE INDEX iTaskWfProcessInstanceId ON m_task (wfProcessInstanceId);
+
+CREATE INDEX iTaskWfStartTimestamp ON m_task (wfStartTimestamp);
+
+CREATE INDEX iTaskWfEndTimestamp ON m_task (wfEndTimestamp);
+
+CREATE INDEX iTaskWfRequesterOid ON m_task (wfRequesterRef_targetOid);
+
+CREATE INDEX iTaskWfObjectOid ON m_task (wfObjectRef_targetOid);
+
+CREATE INDEX iTaskWfTargetOid ON m_task (wfTargetRef_targetOid);
+
ALTER TABLE m_abstract_role ADD ownerRef_relation VARCHAR(157);
ALTER TABLE m_abstract_role ADD ownerRef_targetOid VARCHAR(36);
ALTER TABLE m_abstract_role ADD ownerRef_type INTEGER;
diff --git a/config/sql/midpoint/3.4/h2/h2-upgrade-3.4-SNAPSHOT-3.sql b/config/sql/midpoint/3.4/h2/h2-upgrade-3.4-SNAPSHOT-3.sql
new file mode 100644
index 00000000000..cffc2ec30fe
--- /dev/null
+++ b/config/sql/midpoint/3.4/h2/h2-upgrade-3.4-SNAPSHOT-3.sql
@@ -0,0 +1,25 @@
+ALTER TABLE m_task ADD wfEndTimestamp TIMESTAMP;
+ALTER TABLE m_task ADD wfObjectRef_relation VARCHAR(157);
+ALTER TABLE m_task ADD wfObjectRef_targetOid VARCHAR(36);
+ALTER TABLE m_task ADD wfObjectRef_type INTEGER;
+ALTER TABLE m_task ADD wfProcessInstanceId VARCHAR(255);
+ALTER TABLE m_task ADD wfRequesterRef_relation VARCHAR(157);
+ALTER TABLE m_task ADD wfRequesterRef_targetOid VARCHAR(36);
+ALTER TABLE m_task ADD wfRequesterRef_type INTEGER;
+ALTER TABLE m_task ADD wfStartTimestamp TIMESTAMP;
+ALTER TABLE m_task ADD wfTargetRef_relation VARCHAR(157);
+ALTER TABLE m_task ADD wfTargetRef_targetOid VARCHAR(36);
+ALTER TABLE m_task ADD wfTargetRef_type INTEGER;
+
+CREATE INDEX iTaskWfProcessInstanceId ON m_task (wfProcessInstanceId);
+
+CREATE INDEX iTaskWfStartTimestamp ON m_task (wfStartTimestamp);
+
+CREATE INDEX iTaskWfEndTimestamp ON m_task (wfEndTimestamp);
+
+CREATE INDEX iTaskWfRequesterOid ON m_task (wfRequesterRef_targetOid);
+
+CREATE INDEX iTaskWfObjectOid ON m_task (wfObjectRef_targetOid);
+
+CREATE INDEX iTaskWfTargetOid ON m_task (wfTargetRef_targetOid);
+
diff --git a/config/sql/midpoint/3.4/mysql/mysql-3.4.sql b/config/sql/midpoint/3.4/mysql/mysql-3.4.sql
index 37bf1b8fe24..25cc8126d40 100644
--- a/config/sql/midpoint/3.4/mysql/mysql-3.4.sql
+++ b/config/sql/midpoint/3.4/mysql/mysql-3.4.sql
@@ -775,6 +775,18 @@ CREATE TABLE m_task (
taskIdentifier VARCHAR(255),
threadStopAction INTEGER,
waitingReason INTEGER,
+ wfEndTimestamp DATETIME(6),
+ wfObjectRef_relation VARCHAR(157),
+ wfObjectRef_targetOid VARCHAR(36),
+ wfObjectRef_type INTEGER,
+ wfProcessInstanceId VARCHAR(255),
+ wfRequesterRef_relation VARCHAR(157),
+ wfRequesterRef_targetOid VARCHAR(36),
+ wfRequesterRef_type INTEGER,
+ wfStartTimestamp DATETIME(6),
+ wfTargetRef_relation VARCHAR(157),
+ wfTargetRef_targetOid VARCHAR(36),
+ wfTargetRef_type INTEGER,
oid VARCHAR(36) NOT NULL,
PRIMARY KEY (oid)
)
@@ -1017,6 +1029,18 @@ ADD CONSTRAINT uc_system_configuration_name UNIQUE (name_norm);
CREATE INDEX iParent ON m_task (parent);
+CREATE INDEX iTaskWfProcessInstanceId ON m_task (wfProcessInstanceId);
+
+CREATE INDEX iTaskWfStartTimestamp ON m_task (wfStartTimestamp);
+
+CREATE INDEX iTaskWfEndTimestamp ON m_task (wfEndTimestamp);
+
+CREATE INDEX iTaskWfRequesterOid ON m_task (wfRequesterRef_targetOid);
+
+CREATE INDEX iTaskWfObjectOid ON m_task (wfObjectRef_targetOid);
+
+CREATE INDEX iTaskWfTargetOid ON m_task (wfTargetRef_targetOid);
+
CREATE INDEX iTriggerTimestamp ON m_trigger (timestampValue);
ALTER TABLE m_user
diff --git a/config/sql/midpoint/3.4/mysql/mysql-upgrade-3.3-3.4.sql b/config/sql/midpoint/3.4/mysql/mysql-upgrade-3.3-3.4.sql
index 1d8e037472f..b2c3b55f529 100644
--- a/config/sql/midpoint/3.4/mysql/mysql-upgrade-3.3-3.4.sql
+++ b/config/sql/midpoint/3.4/mysql/mysql-upgrade-3.3-3.4.sql
@@ -1,3 +1,29 @@
+ALTER TABLE m_task
+ ADD wfEndTimestamp DATETIME(6),
+ ADD wfObjectRef_relation VARCHAR(157),
+ ADD wfObjectRef_targetOid VARCHAR(36),
+ ADD wfObjectRef_type INTEGER,
+ ADD wfProcessInstanceId VARCHAR(255),
+ ADD wfRequesterRef_relation VARCHAR(157),
+ ADD wfRequesterRef_targetOid VARCHAR(36),
+ ADD wfRequesterRef_type INTEGER,
+ ADD wfStartTimestamp DATETIME(6),
+ ADD wfTargetRef_relation VARCHAR(157),
+ ADD wfTargetRef_targetOid VARCHAR(36),
+ ADD wfTargetRef_type INTEGER;
+
+CREATE INDEX iTaskWfProcessInstanceId ON m_task (wfProcessInstanceId);
+
+CREATE INDEX iTaskWfStartTimestamp ON m_task (wfStartTimestamp);
+
+CREATE INDEX iTaskWfEndTimestamp ON m_task (wfEndTimestamp);
+
+CREATE INDEX iTaskWfRequesterOid ON m_task (wfRequesterRef_targetOid);
+
+CREATE INDEX iTaskWfObjectOid ON m_task (wfObjectRef_targetOid);
+
+CREATE INDEX iTaskWfTargetOid ON m_task (wfTargetRef_targetOid);
+
ALTER TABLE m_abstract_role
ADD ownerRef_relation VARCHAR(157),
ADD ownerRef_targetOid VARCHAR(36),
diff --git a/config/sql/midpoint/3.4/mysql/mysql-upgrade-3.4-SNAPSHOT-3.sql b/config/sql/midpoint/3.4/mysql/mysql-upgrade-3.4-SNAPSHOT-3.sql
new file mode 100644
index 00000000000..417790144dd
--- /dev/null
+++ b/config/sql/midpoint/3.4/mysql/mysql-upgrade-3.4-SNAPSHOT-3.sql
@@ -0,0 +1,25 @@
+ALTER TABLE m_task
+ ADD wfEndTimestamp DATETIME(6),
+ ADD wfObjectRef_relation VARCHAR(157),
+ ADD wfObjectRef_targetOid VARCHAR(36),
+ ADD wfObjectRef_type INTEGER,
+ ADD wfProcessInstanceId VARCHAR(255),
+ ADD wfRequesterRef_relation VARCHAR(157),
+ ADD wfRequesterRef_targetOid VARCHAR(36),
+ ADD wfRequesterRef_type INTEGER,
+ ADD wfStartTimestamp DATETIME(6),
+ ADD wfTargetRef_relation VARCHAR(157),
+ ADD wfTargetRef_targetOid VARCHAR(36),
+ ADD wfTargetRef_type INTEGER;
+
+CREATE INDEX iTaskWfProcessInstanceId ON m_task (wfProcessInstanceId);
+
+CREATE INDEX iTaskWfStartTimestamp ON m_task (wfStartTimestamp);
+
+CREATE INDEX iTaskWfEndTimestamp ON m_task (wfEndTimestamp);
+
+CREATE INDEX iTaskWfRequesterOid ON m_task (wfRequesterRef_targetOid);
+
+CREATE INDEX iTaskWfObjectOid ON m_task (wfObjectRef_targetOid);
+
+CREATE INDEX iTaskWfTargetOid ON m_task (wfTargetRef_targetOid);
diff --git a/config/sql/midpoint/3.4/oracle/oracle-3.4.sql b/config/sql/midpoint/3.4/oracle/oracle-3.4.sql
index 23a3ccbd69b..a591fd900db 100644
--- a/config/sql/midpoint/3.4/oracle/oracle-3.4.sql
+++ b/config/sql/midpoint/3.4/oracle/oracle-3.4.sql
@@ -631,6 +631,18 @@ CREATE TABLE m_task (
taskIdentifier VARCHAR2(255 CHAR),
threadStopAction NUMBER(10, 0),
waitingReason NUMBER(10, 0),
+ wfEndTimestamp TIMESTAMP,
+ wfObjectRef_relation VARCHAR2(157 CHAR),
+ wfObjectRef_targetOid VARCHAR2(36 CHAR),
+ wfObjectRef_type NUMBER(10, 0),
+ wfProcessInstanceId VARCHAR2(255 CHAR),
+ wfRequesterRef_relation VARCHAR2(157 CHAR),
+ wfRequesterRef_targetOid VARCHAR2(36 CHAR),
+ wfRequesterRef_type NUMBER(10, 0),
+ wfStartTimestamp TIMESTAMP,
+ wfTargetRef_relation VARCHAR2(157 CHAR),
+ wfTargetRef_targetOid VARCHAR2(36 CHAR),
+ wfTargetRef_type NUMBER(10, 0),
oid VARCHAR2(36 CHAR) NOT NULL,
PRIMARY KEY (oid)
) INITRANS 30;
@@ -847,6 +859,18 @@ ADD CONSTRAINT uc_system_configuration_name UNIQUE (name_norm) INITRANS 30;
CREATE INDEX iParent ON m_task (parent) INITRANS 30;
+CREATE INDEX iTaskWfProcessInstanceId ON m_task (wfProcessInstanceId) INITRANS 30;
+
+CREATE INDEX iTaskWfStartTimestamp ON m_task (wfStartTimestamp) INITRANS 30;
+
+CREATE INDEX iTaskWfEndTimestamp ON m_task (wfEndTimestamp) INITRANS 30;
+
+CREATE INDEX iTaskWfRequesterOid ON m_task (wfRequesterRef_targetOid) INITRANS 30;
+
+CREATE INDEX iTaskWfObjectOid ON m_task (wfObjectRef_targetOid) INITRANS 30;
+
+CREATE INDEX iTaskWfTargetOid ON m_task (wfTargetRef_targetOid) INITRANS 30;
+
CREATE INDEX iTriggerTimestamp ON m_trigger (timestampValue) INITRANS 30;
ALTER TABLE m_user
diff --git a/config/sql/midpoint/3.4/oracle/oracle-upgrade-3.3-3.4.sql b/config/sql/midpoint/3.4/oracle/oracle-upgrade-3.3-3.4.sql
index bd3760bd411..4b9755b5449 100644
--- a/config/sql/midpoint/3.4/oracle/oracle-upgrade-3.3-3.4.sql
+++ b/config/sql/midpoint/3.4/oracle/oracle-upgrade-3.3-3.4.sql
@@ -1,3 +1,30 @@
+ALTER TABLE m_task ADD (
+ wfEndTimestamp TIMESTAMP,
+ wfObjectRef_relation VARCHAR2(157 CHAR),
+ wfObjectRef_targetOid VARCHAR2(36 CHAR),
+ wfObjectRef_type NUMBER(10, 0),
+ wfProcessInstanceId VARCHAR2(255 CHAR),
+ wfRequesterRef_relation VARCHAR2(157 CHAR),
+ wfRequesterRef_targetOid VARCHAR2(36 CHAR),
+ wfRequesterRef_type NUMBER(10, 0),
+ wfStartTimestamp TIMESTAMP,
+ wfTargetRef_relation VARCHAR2(157 CHAR),
+ wfTargetRef_targetOid VARCHAR2(36 CHAR),
+ wfTargetRef_type NUMBER(10, 0)
+);
+
+CREATE INDEX iTaskWfProcessInstanceId ON m_task (wfProcessInstanceId) INITRANS 30;
+
+CREATE INDEX iTaskWfStartTimestamp ON m_task (wfStartTimestamp) INITRANS 30;
+
+CREATE INDEX iTaskWfEndTimestamp ON m_task (wfEndTimestamp) INITRANS 30;
+
+CREATE INDEX iTaskWfRequesterOid ON m_task (wfRequesterRef_targetOid) INITRANS 30;
+
+CREATE INDEX iTaskWfObjectOid ON m_task (wfObjectRef_targetOid) INITRANS 30;
+
+CREATE INDEX iTaskWfTargetOid ON m_task (wfTargetRef_targetOid) INITRANS 30;
+
ALTER TABLE m_abstract_role ADD (
ownerRef_relation VARCHAR2(157 CHAR),
ownerRef_targetOid VARCHAR2(36 CHAR),
diff --git a/config/sql/midpoint/3.4/oracle/oracle-upgrade-3.4-SNAPSHOT-3.sql b/config/sql/midpoint/3.4/oracle/oracle-upgrade-3.4-SNAPSHOT-3.sql
new file mode 100644
index 00000000000..6392fbe73b1
--- /dev/null
+++ b/config/sql/midpoint/3.4/oracle/oracle-upgrade-3.4-SNAPSHOT-3.sql
@@ -0,0 +1,26 @@
+ALTER TABLE m_task ADD (
+ wfEndTimestamp TIMESTAMP,
+ wfObjectRef_relation VARCHAR2(157 CHAR),
+ wfObjectRef_targetOid VARCHAR2(36 CHAR),
+ wfObjectRef_type NUMBER(10, 0),
+ wfProcessInstanceId VARCHAR2(255 CHAR),
+ wfRequesterRef_relation VARCHAR2(157 CHAR),
+ wfRequesterRef_targetOid VARCHAR2(36 CHAR),
+ wfRequesterRef_type NUMBER(10, 0),
+ wfStartTimestamp TIMESTAMP,
+ wfTargetRef_relation VARCHAR2(157 CHAR),
+ wfTargetRef_targetOid VARCHAR2(36 CHAR),
+ wfTargetRef_type NUMBER(10, 0)
+);
+
+CREATE INDEX iTaskWfProcessInstanceId ON m_task (wfProcessInstanceId) INITRANS 30;
+
+CREATE INDEX iTaskWfStartTimestamp ON m_task (wfStartTimestamp) INITRANS 30;
+
+CREATE INDEX iTaskWfEndTimestamp ON m_task (wfEndTimestamp) INITRANS 30;
+
+CREATE INDEX iTaskWfRequesterOid ON m_task (wfRequesterRef_targetOid) INITRANS 30;
+
+CREATE INDEX iTaskWfObjectOid ON m_task (wfObjectRef_targetOid) INITRANS 30;
+
+CREATE INDEX iTaskWfTargetOid ON m_task (wfTargetRef_targetOid) INITRANS 30;
diff --git a/config/sql/midpoint/3.4/postgresql/postgresql-3.4.sql b/config/sql/midpoint/3.4/postgresql/postgresql-3.4.sql
index 8bc282e942a..a83481e4d81 100644
--- a/config/sql/midpoint/3.4/postgresql/postgresql-3.4.sql
+++ b/config/sql/midpoint/3.4/postgresql/postgresql-3.4.sql
@@ -621,6 +621,18 @@ CREATE TABLE m_task (
taskIdentifier VARCHAR(255),
threadStopAction INT4,
waitingReason INT4,
+ wfEndTimestamp TIMESTAMP,
+ wfObjectRef_relation VARCHAR(157),
+ wfObjectRef_targetOid VARCHAR(36),
+ wfObjectRef_type INT4,
+ wfProcessInstanceId VARCHAR(255),
+ wfRequesterRef_relation VARCHAR(157),
+ wfRequesterRef_targetOid VARCHAR(36),
+ wfRequesterRef_type INT4,
+ wfStartTimestamp TIMESTAMP,
+ wfTargetRef_relation VARCHAR(157),
+ wfTargetRef_targetOid VARCHAR(36),
+ wfTargetRef_type INT4,
oid VARCHAR(36) NOT NULL,
PRIMARY KEY (oid)
);
@@ -837,6 +849,18 @@ ADD CONSTRAINT uc_system_configuration_name UNIQUE (name_norm);
CREATE INDEX iParent ON m_task (parent);
+CREATE INDEX iTaskWfProcessInstanceId ON m_task (wfProcessInstanceId);
+
+CREATE INDEX iTaskWfStartTimestamp ON m_task (wfStartTimestamp);
+
+CREATE INDEX iTaskWfEndTimestamp ON m_task (wfEndTimestamp);
+
+CREATE INDEX iTaskWfRequesterOid ON m_task (wfRequesterRef_targetOid);
+
+CREATE INDEX iTaskWfObjectOid ON m_task (wfObjectRef_targetOid);
+
+CREATE INDEX iTaskWfTargetOid ON m_task (wfTargetRef_targetOid);
+
CREATE INDEX iTriggerTimestamp ON m_trigger (timestampValue);
ALTER TABLE m_user
diff --git a/config/sql/midpoint/3.4/postgresql/postgresql-upgrade-3.3-3.4.sql b/config/sql/midpoint/3.4/postgresql/postgresql-upgrade-3.3-3.4.sql
index 75ad030a052..06e068e55f8 100644
--- a/config/sql/midpoint/3.4/postgresql/postgresql-upgrade-3.3-3.4.sql
+++ b/config/sql/midpoint/3.4/postgresql/postgresql-upgrade-3.3-3.4.sql
@@ -1,3 +1,29 @@
+ALTER TABLE m_task
+ ADD wfEndTimestamp TIMESTAMP,
+ ADD wfObjectRef_relation VARCHAR(157),
+ ADD wfObjectRef_targetOid VARCHAR(36),
+ ADD wfObjectRef_type INT4,
+ ADD wfProcessInstanceId VARCHAR(255),
+ ADD wfRequesterRef_relation VARCHAR(157),
+ ADD wfRequesterRef_targetOid VARCHAR(36),
+ ADD wfRequesterRef_type INT4,
+ ADD wfStartTimestamp TIMESTAMP,
+ ADD wfTargetRef_relation VARCHAR(157),
+ ADD wfTargetRef_targetOid VARCHAR(36),
+ ADD wfTargetRef_type INT4;
+
+CREATE INDEX iTaskWfProcessInstanceId ON m_task (wfProcessInstanceId);
+
+CREATE INDEX iTaskWfStartTimestamp ON m_task (wfStartTimestamp);
+
+CREATE INDEX iTaskWfEndTimestamp ON m_task (wfEndTimestamp);
+
+CREATE INDEX iTaskWfRequesterOid ON m_task (wfRequesterRef_targetOid);
+
+CREATE INDEX iTaskWfObjectOid ON m_task (wfObjectRef_targetOid);
+
+CREATE INDEX iTaskWfTargetOid ON m_task (wfTargetRef_targetOid);
+
ALTER TABLE m_abstract_role
ADD ownerRef_relation VARCHAR(157),
ADD ownerRef_targetOid VARCHAR(36),
diff --git a/config/sql/midpoint/3.4/postgresql/postgresql-upgrade-3.4-SNAPSHOT-3.sql b/config/sql/midpoint/3.4/postgresql/postgresql-upgrade-3.4-SNAPSHOT-3.sql
new file mode 100644
index 00000000000..60548ade72f
--- /dev/null
+++ b/config/sql/midpoint/3.4/postgresql/postgresql-upgrade-3.4-SNAPSHOT-3.sql
@@ -0,0 +1,26 @@
+ALTER TABLE m_task
+ ADD wfEndTimestamp TIMESTAMP,
+ ADD wfObjectRef_relation VARCHAR(157),
+ ADD wfObjectRef_targetOid VARCHAR(36),
+ ADD wfObjectRef_type INT4,
+ ADD wfProcessInstanceId VARCHAR(255),
+ ADD wfRequesterRef_relation VARCHAR(157),
+ ADD wfRequesterRef_targetOid VARCHAR(36),
+ ADD wfRequesterRef_type INT4,
+ ADD wfStartTimestamp TIMESTAMP,
+ ADD wfTargetRef_relation VARCHAR(157),
+ ADD wfTargetRef_targetOid VARCHAR(36),
+ ADD wfTargetRef_type INT4;
+
+CREATE INDEX iTaskWfProcessInstanceId ON m_task (wfProcessInstanceId);
+
+CREATE INDEX iTaskWfStartTimestamp ON m_task (wfStartTimestamp);
+
+CREATE INDEX iTaskWfEndTimestamp ON m_task (wfEndTimestamp);
+
+CREATE INDEX iTaskWfRequesterOid ON m_task (wfRequesterRef_targetOid);
+
+CREATE INDEX iTaskWfObjectOid ON m_task (wfObjectRef_targetOid);
+
+CREATE INDEX iTaskWfTargetOid ON m_task (wfTargetRef_targetOid);
+
diff --git a/config/sql/midpoint/3.4/sqlserver/sqlserver-3.4.sql b/config/sql/midpoint/3.4/sqlserver/sqlserver-3.4.sql
index 9eb3fc6b567..695a5fcef24 100644
--- a/config/sql/midpoint/3.4/sqlserver/sqlserver-3.4.sql
+++ b/config/sql/midpoint/3.4/sqlserver/sqlserver-3.4.sql
@@ -621,6 +621,18 @@ CREATE TABLE m_task (
taskIdentifier NVARCHAR(255) COLLATE database_default,
threadStopAction INT,
waitingReason INT,
+ wfEndTimestamp DATETIME2,
+ wfObjectRef_relation NVARCHAR(157) COLLATE database_default,
+ wfObjectRef_targetOid NVARCHAR(36) COLLATE database_default,
+ wfObjectRef_type INT,
+ wfProcessInstanceId NVARCHAR(255) COLLATE database_default,
+ wfRequesterRef_relation NVARCHAR(157) COLLATE database_default,
+ wfRequesterRef_targetOid NVARCHAR(36) COLLATE database_default,
+ wfRequesterRef_type INT,
+ wfStartTimestamp DATETIME2,
+ wfTargetRef_relation NVARCHAR(157) COLLATE database_default,
+ wfTargetRef_targetOid NVARCHAR(36) COLLATE database_default,
+ wfTargetRef_type INT,
oid NVARCHAR(36) COLLATE database_default NOT NULL,
PRIMARY KEY (oid)
);
@@ -837,6 +849,18 @@ ADD CONSTRAINT uc_system_configuration_name UNIQUE (name_norm);
CREATE INDEX iParent ON m_task (parent);
+CREATE INDEX iTaskWfProcessInstanceId ON m_task (wfProcessInstanceId);
+
+CREATE INDEX iTaskWfStartTimestamp ON m_task (wfStartTimestamp);
+
+CREATE INDEX iTaskWfEndTimestamp ON m_task (wfEndTimestamp);
+
+CREATE INDEX iTaskWfRequesterOid ON m_task (wfRequesterRef_targetOid);
+
+CREATE INDEX iTaskWfObjectOid ON m_task (wfObjectRef_targetOid);
+
+CREATE INDEX iTaskWfTargetOid ON m_task (wfTargetRef_targetOid);
+
CREATE INDEX iTriggerTimestamp ON m_trigger (timestampValue);
ALTER TABLE m_user
diff --git a/config/sql/midpoint/3.4/sqlserver/sqlserver-upgrade-3.3-3.4.sql b/config/sql/midpoint/3.4/sqlserver/sqlserver-upgrade-3.3-3.4.sql
index 9a3b19dcfca..073a45030cd 100644
--- a/config/sql/midpoint/3.4/sqlserver/sqlserver-upgrade-3.3-3.4.sql
+++ b/config/sql/midpoint/3.4/sqlserver/sqlserver-upgrade-3.3-3.4.sql
@@ -1,3 +1,29 @@
+ALTER TABLE m_task ADD
+ wfEndTimestamp DATETIME2,
+ wfObjectRef_relation NVARCHAR(157) COLLATE database_default,
+ wfObjectRef_targetOid NVARCHAR(36) COLLATE database_default,
+ wfObjectRef_type INT,
+ wfProcessInstanceId NVARCHAR(255) COLLATE database_default,
+ wfRequesterRef_relation NVARCHAR(157) COLLATE database_default,
+ wfRequesterRef_targetOid NVARCHAR(36) COLLATE database_default,
+ wfRequesterRef_type INT,
+ wfStartTimestamp DATETIME2,
+ wfTargetRef_relation NVARCHAR(157) COLLATE database_default,
+ wfTargetRef_targetOid NVARCHAR(36) COLLATE database_default,
+ wfTargetRef_type INT;
+
+CREATE INDEX iTaskWfProcessInstanceId ON m_task (wfProcessInstanceId);
+
+CREATE INDEX iTaskWfStartTimestamp ON m_task (wfStartTimestamp);
+
+CREATE INDEX iTaskWfEndTimestamp ON m_task (wfEndTimestamp);
+
+CREATE INDEX iTaskWfRequesterOid ON m_task (wfRequesterRef_targetOid);
+
+CREATE INDEX iTaskWfObjectOid ON m_task (wfObjectRef_targetOid);
+
+CREATE INDEX iTaskWfTargetOid ON m_task (wfTargetRef_targetOid);
+
ALTER TABLE m_abstract_role ADD
ownerRef_relation NVARCHAR(157) COLLATE database_default,
ownerRef_targetOid NVARCHAR(36) COLLATE database_default,
diff --git a/config/sql/midpoint/3.4/sqlserver/sqlserver-upgrade-3.4-SNAPSHOT-3.sql b/config/sql/midpoint/3.4/sqlserver/sqlserver-upgrade-3.4-SNAPSHOT-3.sql
new file mode 100644
index 00000000000..efa2deb3172
--- /dev/null
+++ b/config/sql/midpoint/3.4/sqlserver/sqlserver-upgrade-3.4-SNAPSHOT-3.sql
@@ -0,0 +1,26 @@
+ALTER TABLE m_task ADD
+ wfEndTimestamp DATETIME2,
+ wfObjectRef_relation NVARCHAR(157) COLLATE database_default,
+ wfObjectRef_targetOid NVARCHAR(36) COLLATE database_default,
+ wfObjectRef_type INT,
+ wfProcessInstanceId NVARCHAR(255) COLLATE database_default,
+ wfRequesterRef_relation NVARCHAR(157) COLLATE database_default,
+ wfRequesterRef_targetOid NVARCHAR(36) COLLATE database_default,
+ wfRequesterRef_type INT,
+ wfStartTimestamp DATETIME2,
+ wfTargetRef_relation NVARCHAR(157) COLLATE database_default,
+ wfTargetRef_targetOid NVARCHAR(36) COLLATE database_default,
+ wfTargetRef_type INT;
+
+CREATE INDEX iTaskWfProcessInstanceId ON m_task (wfProcessInstanceId);
+
+CREATE INDEX iTaskWfStartTimestamp ON m_task (wfStartTimestamp);
+
+CREATE INDEX iTaskWfEndTimestamp ON m_task (wfEndTimestamp);
+
+CREATE INDEX iTaskWfRequesterOid ON m_task (wfRequesterRef_targetOid);
+
+CREATE INDEX iTaskWfObjectOid ON m_task (wfObjectRef_targetOid);
+
+CREATE INDEX iTaskWfTargetOid ON m_task (wfTargetRef_targetOid);
+
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java
index 94f632a3b33..d629b9a0006 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java
@@ -16,63 +16,43 @@
package com.evolveum.midpoint.gui.api.util;
-import com.evolveum.midpoint.prism.PrismContainer;
-import com.evolveum.midpoint.prism.PrismContainerValue;
-import com.evolveum.midpoint.prism.PrismObject;
-import com.evolveum.midpoint.prism.PrismProperty;
-import com.evolveum.midpoint.prism.PrismPropertyValue;
-import com.evolveum.midpoint.prism.crypto.EncryptionException;
-import com.evolveum.midpoint.prism.crypto.Protector;
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.prism.*;
+import com.evolveum.midpoint.prism.crypto.EncryptionException;
+import com.evolveum.midpoint.prism.crypto.Protector;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.delta.PropertyDelta;
-import com.evolveum.midpoint.prism.match.DistinguishedNameMatchingRule;
-import com.evolveum.midpoint.prism.match.PolyStringNormMatchingRule;
-import com.evolveum.midpoint.prism.match.PolyStringOrigMatchingRule;
-import com.evolveum.midpoint.prism.match.PolyStringStrictMatchingRule;
-import com.evolveum.midpoint.prism.match.StringIgnoreCaseMatchingRule;
+import com.evolveum.midpoint.prism.match.*;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.path.ItemPathSegment;
import com.evolveum.midpoint.prism.polystring.PolyString;
import com.evolveum.midpoint.prism.query.ObjectPaging;
-import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.xml.XmlTypeConverter;
-import com.evolveum.midpoint.prism.xml.XsdTypeMapper;
import com.evolveum.midpoint.schema.SchemaConstantsGenerated;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
+import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
+import com.evolveum.midpoint.security.api.AuthorizationConstants;
+import com.evolveum.midpoint.task.api.TaskCategory;
import com.evolveum.midpoint.util.DOMUtil;
import com.evolveum.midpoint.util.DisplayableValue;
import com.evolveum.midpoint.util.exception.SchemaException;
-import com.evolveum.midpoint.security.api.Authorization;
-import com.evolveum.midpoint.security.api.AuthorizationConstants;
-import com.evolveum.midpoint.security.api.MidPointPrincipal;
-import com.evolveum.midpoint.task.api.Task;
-import com.evolveum.midpoint.task.api.TaskCategory;
import com.evolveum.midpoint.util.exception.SystemException;
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.data.BaseSortableDataProvider;
-import com.evolveum.midpoint.web.component.data.BoxedTablePanel;
import com.evolveum.midpoint.web.component.data.Table;
-import com.evolveum.midpoint.web.component.data.TablePanel;
import com.evolveum.midpoint.web.component.input.DropDownChoicePanel;
-import com.evolveum.midpoint.web.component.prism.ObjectWrapper;
import com.evolveum.midpoint.web.component.util.Selectable;
-import com.evolveum.midpoint.web.component.wf.processes.itemApproval.ItemApprovalPanel;
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.configuration.component.ObjectSelectionPanel;
import com.evolveum.midpoint.web.security.MidPointApplication;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import com.evolveum.prism.xml.ns._public.types_3.PolyStringType;
import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType;
-import com.sun.management.OperatingSystemMXBean;
-
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;
import org.apache.wicket.*;
@@ -87,29 +67,20 @@
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.request.IRequestHandler;
import org.apache.wicket.util.visit.IVisit;
import org.apache.wicket.util.visit.IVisitor;
-import javax.management.*;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.namespace.QName;
-
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.RuntimeMXBean;
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.List;
-import java.util.Locale;
+import java.util.*;
/**
* Utility class containing miscellaneous methods used mostly in Wicket components.
@@ -407,10 +378,12 @@ public static String getName(ObjectReferenceType ref) {
if (ref == null) {
return null;
}
-
if (ref.getTargetName() != null) {
return getOrigStringFromPoly(ref.getTargetName());
}
+ if (ref.asReferenceValue().getObject() != null) {
+ return getName(ref.asReferenceValue().getObject());
+ }
return ref.getOid();
}
@@ -991,4 +964,17 @@ public static ItemPath joinPath(ItemPath path, ItemPath deltaPath) {
return new ItemPath(newPath);
}
+
+ public static T getObjectFromReference(ObjectReferenceType ref, Class type) {
+ if (ref == null || ref.asReferenceValue().getObject() == null) {
+ return null;
+ }
+ Objectable object = ref.asReferenceValue().getObject().asObjectable();
+ if (!type.isAssignableFrom(object.getClass())) {
+ throw new IllegalStateException("Got " + object.getClass() + " when expected " + type + ": " + ObjectTypeUtil.toShortString(ref, true));
+ }
+ return (T) object;
+ }
+
+
}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/BaseSortableDataProvider.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/BaseSortableDataProvider.java
index a086d503472..067ee013e26 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/BaseSortableDataProvider.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/BaseSortableDataProvider.java
@@ -22,9 +22,11 @@
import com.evolveum.midpoint.model.api.ModelService;
import com.evolveum.midpoint.model.api.TaskService;
import com.evolveum.midpoint.model.api.WorkflowService;
+import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.query.ObjectPaging;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.OrderDirection;
+import com.evolveum.midpoint.repo.api.RepositoryService;
import com.evolveum.midpoint.schema.SchemaConstantsGenerated;
import com.evolveum.midpoint.task.api.TaskManager;
import com.evolveum.midpoint.util.logging.Trace;
@@ -83,11 +85,21 @@ protected ModelService getModel() {
return application.getModel();
}
+ protected RepositoryService getRepositoryService() {
+ MidPointApplication application = (MidPointApplication) MidPointApplication.get();
+ return application.getRepositoryService();
+ }
+
protected TaskManager getTaskManager() {
MidPointApplication application = (MidPointApplication) MidPointApplication.get();
return application.getTaskManager();
}
+ protected PrismContext getPrismContext() {
+ MidPointApplication application = (MidPointApplication) MidPointApplication.get();
+ return application.getPrismContext();
+ }
+
protected TaskService getTaskService() {
MidPointApplication application = (MidPointApplication) MidPointApplication.get();
return application.getTaskService();
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/PasswordPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/PasswordPanel.html
index ea50ece1afa..4fa1c64a126 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/PasswordPanel.html
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/PasswordPanel.html
@@ -17,10 +17,11 @@
-
-
+
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/PasswordPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/PasswordPanel.java
index 0a323faa10c..3db99e6e108 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/PasswordPanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/PasswordPanel.java
@@ -48,7 +48,10 @@ public class PasswordPanel extends InputPanel {
private static final String ID_LINK_CONTAINER = "linkContainer";
private static final String ID_PASSWORD_SET = "passwordSet";
+ private static final String ID_PASSWORD_REMOVE = "passwordRemove";
private static final String ID_CHANGE_PASSWORD_LINK = "changePasswordLink";
+ private static final String ID_REMOVE_PASSWORD_LINK = "removePasswordLink";
+ private static final String ID_REMOVE_BUTTON_CONTAINER = "removeButtonContainer";
private static final String ID_INPUT_CONTAINER = "inputContainer";
private static final String ID_PASSWORD_ONE = "password1";
private static final String ID_PASSWORD_TWO = "password2";
@@ -58,18 +61,18 @@ public class PasswordPanel extends InputPanel {
private boolean passwordInputVisble;
public PasswordPanel(String id, IModel model) {
- this(id, model, false);
+ this(id, model, false, false);
}
- public PasswordPanel(String id, IModel model, boolean isReadOnly) {
+ public PasswordPanel(String id, IModel model, boolean isReadOnly, boolean showRemoveButton) {
super(id);
- initLayout(model, isReadOnly);
+ initLayout(model, isReadOnly, showRemoveButton);
}
- private void initLayout(IModel model, final boolean isReadOnly) {
+ private void initLayout(final IModel model, final boolean isReadOnly, boolean showRemoveButton) {
setOutputMarkupId(true);
-
+
passwordInputVisble = model.getObject() == null;
// TODO: remove
// LOGGER.trace("PASSWORD model: {}", model.getObject());
@@ -116,11 +119,16 @@ public boolean isVisible() {
}
};
inputContainer.setOutputMarkupId(true);
+ linkContainer.setOutputMarkupId(true);
add(linkContainer);
- Label passwordSetLabel = new Label(ID_PASSWORD_SET, new ResourceModel("passwordPanel.passwordSet"));
+ final Label passwordSetLabel = new Label(ID_PASSWORD_SET, new ResourceModel("passwordPanel.passwordSet"));
linkContainer.add(passwordSetLabel);
+ final Label passwordRemoveLabel = new Label(ID_PASSWORD_REMOVE, new ResourceModel("passwordPanel.passwordRemoveLabel"));
+ passwordRemoveLabel.setVisible(false);
+ linkContainer.add(passwordRemoveLabel);
+
AjaxLink link = new AjaxLink(ID_CHANGE_PASSWORD_LINK) {
@Override
public void onClick(AjaxRequestTarget target) {
@@ -142,7 +150,20 @@ public boolean isVisible() {
link.setBody(new ResourceModel("passwordPanel.passwordChange"));
link.setOutputMarkupId(true);
linkContainer.add(link);
-
+
+ final WebMarkupContainer removeButtonContainer = new WebMarkupContainer(ID_REMOVE_BUTTON_CONTAINER);
+ AjaxLink removePassword = new AjaxLink(ID_REMOVE_PASSWORD_LINK) {
+ @Override
+ public void onClick(AjaxRequestTarget target) {
+ onRemovePassword(model, target);
+ }
+
+ };
+ removePassword.setVisible(showRemoveButton);
+ removePassword.setBody(new ResourceModel("passwordPanel.passwordRemove"));
+ removePassword.setOutputMarkupId(true);
+ removeButtonContainer.add(removePassword);
+ add(removeButtonContainer);
}
private void onLinkClick(AjaxRequestTarget target) {
@@ -150,6 +171,18 @@ private void onLinkClick(AjaxRequestTarget target) {
target.add(this);
}
+ private void onRemovePassword(IModel model, AjaxRequestTarget target) {
+ get(ID_LINK_CONTAINER).get(ID_PASSWORD_SET).setVisible(false);
+ get(ID_LINK_CONTAINER).get(ID_PASSWORD_REMOVE).setVisible(true);
+ passwordInputVisble = false;
+ target.add(this);
+
+ ProtectedStringType newValue = new ProtectedStringType();
+ byte[] temp = new byte[0];
+ newValue.setClearBytes(temp);
+ model.setObject(null);
+ }
+
@Override
public List getFormComponents() {
List list = new ArrayList();
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/model/operationStatus/ModelOperationStatusDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/model/operationStatus/ModelOperationStatusDto.java
index 8d5465a6927..e12eff2c76a 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/model/operationStatus/ModelOperationStatusDto.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/model/operationStatus/ModelOperationStatusDto.java
@@ -16,12 +16,26 @@
package com.evolveum.midpoint.web.component.model.operationStatus;
+import com.evolveum.midpoint.model.api.ModelInteractionService;
import com.evolveum.midpoint.model.api.context.ModelContext;
+import com.evolveum.midpoint.model.api.context.ModelProjectionContext;
import com.evolveum.midpoint.model.api.context.ModelState;
+import com.evolveum.midpoint.model.api.visualizer.Scene;
import com.evolveum.midpoint.prism.PrismObject;
-import com.evolveum.midpoint.web.component.model.delta.DeltaDto;
+import com.evolveum.midpoint.prism.delta.ObjectDelta;
+import com.evolveum.midpoint.schema.result.OperationResult;
+import com.evolveum.midpoint.task.api.Task;
+import com.evolveum.midpoint.util.exception.SchemaException;
+import com.evolveum.midpoint.util.exception.SystemException;
+import com.evolveum.midpoint.web.component.prism.show.WrapperScene;
+import com.evolveum.midpoint.web.component.prism.show.SceneDto;
+import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.apache.commons.collections.CollectionUtils.addIgnoreNull;
/**
* @author mederly
@@ -36,9 +50,9 @@ public class ModelOperationStatusDto implements Serializable {
private ModelState state;
private String focusType;
private String focusName;
- private DeltaDto primaryDelta;
+ private SceneDto primarySceneDto;
- public ModelOperationStatusDto(ModelContext modelContext) {
+ public ModelOperationStatusDto(ModelContext> modelContext, ModelInteractionService modelInteractionService, Task opTask, OperationResult result) {
state = modelContext.getState();
@@ -55,9 +69,24 @@ public ModelOperationStatusDto(ModelContext modelContext) {
}
// primaryDelta
- if (modelContext.getFocusContext().getPrimaryDelta() != null) {
- primaryDelta = new DeltaDto(modelContext.getFocusContext().getPrimaryDelta());
- }
+ final List> primaryDeltas = new ArrayList<>();
+// final List> secondaryDeltas = new ArrayList<>();
+ final List extends Scene> primaryScenes;
+// final List extends Scene> secondaryScenes;
+ try {
+ addIgnoreNull(primaryDeltas, modelContext.getFocusContext().getPrimaryDelta());
+// addIgnoreNull(secondaryDeltas, modelContext.getFocusContext().getSecondaryDelta());
+ for (ModelProjectionContext projCtx : modelContext.getProjectionContexts()) {
+ addIgnoreNull(primaryDeltas, projCtx.getPrimaryDelta());
+// addIgnoreNull(secondaryDeltas, projCtx.getExecutableDelta());
+ }
+ primaryScenes = modelInteractionService.visualizeDeltas(primaryDeltas, opTask, result);
+// secondaryScenes = modelInteractionService.visualizeDeltas(secondaryDeltas, opTask, result);
+ } catch (SchemaException e) {
+ throw new SystemException(e); // TODO
+ }
+ final WrapperScene primaryWrapperScene = new WrapperScene(primaryScenes, primaryDeltas.size() != 1 ? "PagePreviewChanges.primaryChangesMore" : "PagePreviewChanges.primaryChangesOne", primaryDeltas.size());
+ primarySceneDto = new SceneDto(primaryWrapperScene);
}
}
@@ -74,7 +103,7 @@ public String getFocusName() {
return focusName;
}
- public DeltaDto getPrimaryDelta() {
- return primaryDelta;
+ public SceneDto getPrimaryDelta() {
+ return primarySceneDto;
}
}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/model/operationStatus/ModelOperationStatusPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/model/operationStatus/ModelOperationStatusPanel.java
index c04e9f2c94a..9afce1255cc 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/model/operationStatus/ModelOperationStatusPanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/model/operationStatus/ModelOperationStatusPanel.java
@@ -19,6 +19,8 @@
import com.evolveum.midpoint.model.api.context.ModelState;
import com.evolveum.midpoint.web.component.model.delta.DeltaDto;
import com.evolveum.midpoint.web.component.model.delta.DeltaPanel;
+import com.evolveum.midpoint.web.component.prism.show.SceneDto;
+import com.evolveum.midpoint.web.component.prism.show.ScenePanel;
import com.evolveum.midpoint.web.component.util.SimplePanel;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import org.apache.wicket.markup.html.basic.Label;
@@ -48,7 +50,7 @@ protected void initLayout() {
add(new Label(ID_FOCUS_NAME, new PropertyModel(getModel(), ModelOperationStatusDto.F_FOCUS_NAME)));
- DeltaPanel deltaPanel = new DeltaPanel(ID_PRIMARY_DELTA, new PropertyModel(getModel(), ModelOperationStatusDto.F_PRIMARY_DELTA));
+ ScenePanel deltaPanel = new ScenePanel(ID_PRIMARY_DELTA, new PropertyModel(getModel(), ModelOperationStatusDto.F_PRIMARY_DELTA));
deltaPanel.add(new VisibleEnableBehaviour() {
@Override
public boolean isVisible() {
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/AbstractObjectMainPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/AbstractObjectMainPanel.html
index d9887dadc72..5ceff33b623 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/AbstractObjectMainPanel.html
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/AbstractObjectMainPanel.html
@@ -29,6 +29,7 @@
+
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/AbstractObjectMainPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/AbstractObjectMainPanel.java
index e75bb47f7f8..762ee9b9305 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/AbstractObjectMainPanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/AbstractObjectMainPanel.java
@@ -17,6 +17,11 @@
import java.util.List;
+import com.evolveum.midpoint.gui.api.page.PageBase;
+import com.evolveum.midpoint.model.api.context.ModelContext;
+import com.evolveum.midpoint.web.component.prism.show.PagePreviewChanges;
+import com.evolveum.midpoint.web.page.admin.server.PageTaskEdit;
+import com.evolveum.midpoint.web.util.OnePageParameterEncoder;
import org.apache.commons.lang.Validate;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
@@ -38,6 +43,7 @@
import com.evolveum.midpoint.web.page.admin.users.component.ExecuteChangeOptionsDto;
import com.evolveum.midpoint.web.page.admin.users.component.ExecuteChangeOptionsPanel;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
/**
* @author semancik
@@ -50,7 +56,8 @@ public abstract class AbstractObjectMainPanel extends Pane
private static final String ID_EXECUTE_OPTIONS = "executeOptions";
private static final String ID_BACK = "back";
private static final String ID_SAVE = "save";
-
+ private static final String ID_PREVIEW_CHANGES = "previewChanges";
+
private static final Trace LOGGER = TraceManager.getTrace(AbstractObjectMainPanel.class);
private Form mainForm;
@@ -137,6 +144,7 @@ protected void initLayoutOptions(PageAdminObjectDetails parentPage) {
}
protected void initLayoutButtons(PageAdminObjectDetails parentPage) {
+ initLayoutPreviewButton(parentPage);
initLayoutSaveButton(parentPage);
initLayoutBackButton(parentPage);
}
@@ -160,6 +168,25 @@ protected void onError(AjaxRequestTarget target,
mainForm.add(saveButton);
}
+ // TEMPORARY
+ protected void initLayoutPreviewButton(final PageAdminObjectDetails parentPage) {
+ AjaxSubmitButton previewButton = new AjaxSubmitButton(ID_PREVIEW_CHANGES, parentPage.createStringResource("pageAdminFocus.button.previewChanges")) {
+
+ @Override
+ protected void onSubmit(AjaxRequestTarget target,
+ org.apache.wicket.markup.html.form.Form> form) {
+ getDetailsPage().previewPerformed(target);
+ }
+
+ @Override
+ protected void onError(AjaxRequestTarget target,
+ org.apache.wicket.markup.html.form.Form> form) {
+ target.add(parentPage.getFeedbackPanel());
+ }
+ };
+ mainForm.add(previewButton);
+ }
+
protected void initLayoutBackButton(PageAdminObjectDetails parentPage) {
AjaxButton back = new AjaxButton(ID_BACK, parentPage.createStringResource("pageAdminFocus.button.back")) {
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapper.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapper.java
index f981ccdee49..e099647415c 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapper.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapper.java
@@ -332,6 +332,13 @@ public ObjectDelta getObjectDelta() throws SchemaException {
if (itemWrapper instanceof PropertyWrapper) {
ItemDelta pDelta = computePropertyDeltas((PropertyWrapper) itemWrapper, containerPath);
if (!pDelta.isEmpty()) {
+ //HACK to remove a password replace delta is to be created
+ if (containerWrapper.getName().equals(CredentialsType.F_PASSWORD)) {
+ if (pDelta.getValuesToDelete() != null){
+ pDelta.resetValuesToDelete();
+ pDelta.setValuesToReplace(new ArrayList());
+ }
+ }
delta.addModification(pDelta);
}
} else if (itemWrapper instanceof ReferenceWrapper) {
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismValuePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismValuePanel.java
index 5628b9fa159..e52128d3283 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismValuePanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismValuePanel.java
@@ -16,16 +16,6 @@
package com.evolveum.midpoint.web.component.prism;
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import javax.xml.datatype.XMLGregorianCalendar;
-import javax.xml.namespace.QName;
-
import com.evolveum.midpoint.common.refinery.CompositeRefinedObjectClassDefinition;
import com.evolveum.midpoint.common.refinery.RefinedAssociationDefinition;
import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition;
@@ -34,19 +24,42 @@
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.prism.*;
+import com.evolveum.midpoint.prism.delta.ObjectDelta;
+import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.query.*;
+import com.evolveum.midpoint.prism.xml.XsdTypeMapper;
+import com.evolveum.midpoint.schema.DeltaConvertor;
+import com.evolveum.midpoint.schema.GetOperationOptions;
+import com.evolveum.midpoint.schema.RetrieveOption;
+import com.evolveum.midpoint.schema.SelectorOptions;
+import com.evolveum.midpoint.schema.constants.SchemaConstants;
+import com.evolveum.midpoint.schema.processor.ResourceAttribute;
+import com.evolveum.midpoint.schema.result.OperationResult;
+import com.evolveum.midpoint.schema.util.ShadowUtil;
+import com.evolveum.midpoint.task.api.Task;
+import com.evolveum.midpoint.util.DOMUtil;
+import com.evolveum.midpoint.util.exception.SchemaException;
+import com.evolveum.midpoint.util.exception.SystemException;
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.form.ValueChoosePanel;
+import com.evolveum.midpoint.web.component.input.*;
+import com.evolveum.midpoint.web.component.model.delta.DeltaDto;
+import com.evolveum.midpoint.web.component.model.delta.ModificationsPanel;
+import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.web.model.LookupPropertyModel;
+import com.evolveum.midpoint.web.page.admin.users.PageUser;
import com.evolveum.midpoint.web.page.admin.users.component.AssociationValueChoicePanel;
+import com.evolveum.midpoint.web.security.SecurityUtils;
+import com.evolveum.midpoint.web.util.DateValidator;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
-
+import com.evolveum.prism.xml.ns._public.types_3.ObjectDeltaType;
+import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType;
import org.apache.commons.lang.ClassUtils;
import org.apache.commons.lang.Validate;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
-import org.apache.wicket.MarkupContainer;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.ajax.markup.html.AjaxLink;
@@ -64,37 +77,14 @@
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;
-import com.evolveum.midpoint.prism.delta.ObjectDelta;
-import com.evolveum.midpoint.prism.path.ItemPath;
-import com.evolveum.midpoint.prism.xml.XsdTypeMapper;
-import com.evolveum.midpoint.schema.DeltaConvertor;
-import com.evolveum.midpoint.schema.GetOperationOptions;
-import com.evolveum.midpoint.schema.RetrieveOption;
-import com.evolveum.midpoint.schema.SelectorOptions;
-import com.evolveum.midpoint.schema.constants.SchemaConstants;
-import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition;
-import com.evolveum.midpoint.schema.processor.ResourceAttribute;
-import com.evolveum.midpoint.schema.result.OperationResult;
-import com.evolveum.midpoint.schema.util.ShadowUtil;
-import com.evolveum.midpoint.task.api.Task;
-import com.evolveum.midpoint.util.DOMUtil;
-import com.evolveum.midpoint.util.exception.SchemaException;
-import com.evolveum.midpoint.util.exception.SystemException;
-import com.evolveum.midpoint.web.component.form.ValueChoosePanel;
-import com.evolveum.midpoint.web.component.input.AutoCompleteTextPanel;
-import com.evolveum.midpoint.web.component.input.DatePanel;
-import com.evolveum.midpoint.web.component.input.PasswordPanel;
-import com.evolveum.midpoint.web.component.input.TextAreaPanel;
-import com.evolveum.midpoint.web.component.input.TextPanel;
-import com.evolveum.midpoint.web.component.input.TriStateComboPanel;
-import com.evolveum.midpoint.web.component.input.UploadDownloadPanel;
-import com.evolveum.midpoint.web.component.model.delta.DeltaDto;
-import com.evolveum.midpoint.web.component.model.delta.ModificationsPanel;
-import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
-import com.evolveum.midpoint.web.util.DateValidator;
-import com.evolveum.midpoint.xml.ns.model.workflow.common_forms_3.AssignmentCreationApprovalFormType;
-import com.evolveum.prism.xml.ns._public.types_3.ObjectDeltaType;
-import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType;
+import javax.xml.datatype.XMLGregorianCalendar;
+import javax.xml.namespace.QName;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
/**
* @author lazyman
@@ -434,14 +424,6 @@ private Panel createTypedInputComponent(String id) {
return new TextAreaPanel(id, new PropertyModel(model, baseExpression));
}
- // the same for requester and approver comments in workflows [mederly] - this is really ugly, as it is specific to each approval form
- if (AssignmentCreationApprovalFormType.F_REQUESTER_COMMENT.equals(definition.getName()) ||
- AssignmentCreationApprovalFormType.F_COMMENT.equals(definition.getName())) {
- return new TextAreaPanel(id, new PropertyModel(model, baseExpression));
- }
-
-
-
if (ActivationType.F_ADMINISTRATIVE_STATUS.equals(definition.getName())) {
return WebComponentUtil.createEnumPanel(ActivationStatusType.class, id, new PropertyModel(model, baseExpression), this);
} else if(ActivationType.F_LOCKOUT_STATUS.equals(definition.getName())){
@@ -454,9 +436,15 @@ private Panel createTypedInputComponent(String id) {
panel = new DatePanel(id, new PropertyModel(model, baseExpression));
} else if (ProtectedStringType.COMPLEX_TYPE.equals(valueType)) {
+ boolean showRemovePasswordButton = true;
+ if (pageBase instanceof PageUser &&
+ ((PageUser) pageBase).getObjectWrapper().getObject() != null &&
+ ((PageUser) pageBase).getObjectWrapper().getObject().getOid() != null &&
+ ((PageUser) pageBase).getObjectWrapper().getObject().getOid().equals(SecurityUtils.getPrincipalUser().getOid())) {
+ showRemovePasswordButton = false;
+ }
panel = new PasswordPanel(id, new PropertyModel(model, baseExpression),
- model.getObject().isReadonly());
-
+ model.getObject().isReadonly(), showRemovePasswordButton);
} else if (DOMUtil.XSD_BOOLEAN.equals(valueType)) {
panel = new TriStateComboPanel(id, new PropertyModel(model, baseExpression));
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/PagePreviewChanges.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/PagePreviewChanges.html
new file mode 100644
index 00000000000..3ea6163359a
--- /dev/null
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/PagePreviewChanges.html
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/PagePreviewChanges.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/PagePreviewChanges.java
new file mode 100644
index 00000000000..059791e9f89
--- /dev/null
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/PagePreviewChanges.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright (c) 2010-2016 Evolveum
+ *
+ * Licensed 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 com.evolveum.midpoint.web.component.prism.show;
+
+import com.evolveum.midpoint.gui.api.page.PageBase;
+import com.evolveum.midpoint.model.api.ModelInteractionService;
+import com.evolveum.midpoint.model.api.context.ModelContext;
+import com.evolveum.midpoint.model.api.context.ModelProjectionContext;
+import com.evolveum.midpoint.model.api.visualizer.Scene;
+import com.evolveum.midpoint.prism.delta.ObjectDelta;
+import com.evolveum.midpoint.security.api.AuthorizationConstants;
+import com.evolveum.midpoint.task.api.Task;
+import com.evolveum.midpoint.util.DebugUtil;
+import com.evolveum.midpoint.util.exception.SchemaException;
+import com.evolveum.midpoint.util.exception.SystemException;
+import com.evolveum.midpoint.util.logging.Trace;
+import com.evolveum.midpoint.util.logging.TraceManager;
+import com.evolveum.midpoint.web.application.AuthorizationAction;
+import com.evolveum.midpoint.web.application.PageDescriptor;
+import com.evolveum.midpoint.web.component.AjaxButton;
+import com.evolveum.midpoint.web.page.admin.home.PageDashboard;
+import com.evolveum.midpoint.web.page.admin.workflow.PageAdminWorkItems;
+import com.evolveum.midpoint.web.util.OnePageParameterEncoder;
+import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.model.AbstractReadOnlyModel;
+import org.apache.wicket.model.IModel;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.apache.commons.collections.CollectionUtils.addIgnoreNull;
+
+/**
+ * @author mederly
+ */
+@PageDescriptor(url = "/admin/workItem", encoder = OnePageParameterEncoder.class, action = {
+ @AuthorizationAction(actionUri = PageAdminWorkItems.AUTH_WORK_ITEMS_ALL,
+ label = PageAdminWorkItems.AUTH_WORK_ITEMS_ALL_LABEL,
+ description = PageAdminWorkItems.AUTH_WORK_ITEMS_ALL_DESCRIPTION),
+ @AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_UI_WORK_ITEM_URL,
+ label = "PageWorkItem.auth.workItem.label",
+ description = "PageWorkItem.auth.workItem.description")})
+public class PagePreviewChanges extends PageAdminWorkItems { // TODO extends
+
+ private static final String ID_PRIMARY_DELTAS_SCENE = "primaryDeltas";
+ private static final String ID_SECONDARY_DELTAS_SCENE = "secondaryDeltas";
+ private static final String ID_BACK = "back";
+
+ private static final Trace LOGGER = TraceManager.getTrace(PagePreviewChanges.class);
+
+ private IModel primaryDeltasModel;
+ private IModel secondaryDeltasModel;
+
+ public PagePreviewChanges(ModelContext extends ObjectType> modelContext, ModelInteractionService modelInteractionService, PageBase previousPage) { // TODO remove previousPage
+ setPreviousPage(previousPage);
+ final List> primaryDeltas = new ArrayList<>();
+ final List> secondaryDeltas = new ArrayList<>();
+ final List extends Scene> primaryScenes;
+ final List extends Scene> secondaryScenes;
+ try {
+ if (modelContext != null) {
+ if (modelContext.getFocusContext() != null) {
+ addIgnoreNull(primaryDeltas, modelContext.getFocusContext().getPrimaryDelta());
+ addIgnoreNull(secondaryDeltas, modelContext.getFocusContext().getSecondaryDelta());
+ }
+ for (ModelProjectionContext projCtx : modelContext.getProjectionContexts()) {
+ addIgnoreNull(primaryDeltas, projCtx.getPrimaryDelta());
+ addIgnoreNull(secondaryDeltas, projCtx.getExecutableDelta());
+ }
+ }
+ LOGGER.info("Primary deltas:\n{}", DebugUtil.debugDump(primaryDeltas));
+ LOGGER.info("Secondary deltas:\n{}", DebugUtil.debugDump(secondaryDeltas));
+
+ Task task = createSimpleTask("visualize");
+ primaryScenes = modelInteractionService.visualizeDeltas(primaryDeltas, task, task.getResult());
+ secondaryScenes = modelInteractionService.visualizeDeltas(secondaryDeltas, task, task.getResult());
+ } catch (SchemaException e) {
+ throw new SystemException(e); // TODO
+ }
+ LOGGER.info("Creating context DTO for primary deltas:\n{}", DebugUtil.debugDump(primaryScenes));
+ LOGGER.info("Creating context DTO for secondary deltas:\n{}", DebugUtil.debugDump(secondaryScenes));
+
+ final WrapperScene primaryScene = new WrapperScene(primaryScenes,
+ primaryDeltas.size() != 1 ? "PagePreviewChanges.primaryChangesMore" : "PagePreviewChanges.primaryChangesOne", primaryDeltas.size());
+ final WrapperScene secondaryScene = new WrapperScene(secondaryScenes,
+ secondaryDeltas.size() != 1 ? "PagePreviewChanges.secondaryChangesMore" : "PagePreviewChanges.secondaryChangesOne", secondaryDeltas.size());
+ final SceneDto primarySceneDto = new SceneDto(primaryScene);
+ final SceneDto secondarySceneDto = new SceneDto(secondaryScene);
+ primaryDeltasModel = new AbstractReadOnlyModel() {
+ @Override
+ public SceneDto getObject() {
+ return primarySceneDto;
+ }
+ };
+ secondaryDeltasModel = new AbstractReadOnlyModel() {
+ @Override
+ public SceneDto getObject() {
+ return secondarySceneDto;
+ }
+ };
+ initLayout();
+ }
+
+ private void initLayout() {
+ Form mainForm = new Form("mainForm");
+ mainForm.setMultiPart(true);
+ add(mainForm);
+
+ mainForm.add(new ScenePanel(ID_PRIMARY_DELTAS_SCENE, primaryDeltasModel));
+ mainForm.add(new ScenePanel(ID_SECONDARY_DELTAS_SCENE, secondaryDeltasModel));
+ initButtons(mainForm);
+ }
+
+ private void initButtons(Form mainForm) {
+ AjaxButton cancel = new AjaxButton(ID_BACK, createStringResource("pageAccount.button.back")) { // TODO key
+ @Override
+ public void onClick(AjaxRequestTarget target) {
+ cancelPerformed(target);
+ }
+ };
+ mainForm.add(cancel);
+ }
+
+ private void cancelPerformed(AjaxRequestTarget target) {
+ goBack(PageDashboard.class);
+ }
+
+}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneButtonPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneButtonPanel.html
new file mode 100644
index 00000000000..3a3ae8104d8
--- /dev/null
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneButtonPanel.html
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneButtonPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneButtonPanel.java
new file mode 100644
index 00000000000..df80f16f94a
--- /dev/null
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneButtonPanel.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2010-2016 Evolveum
+ *
+ * Licensed 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 com.evolveum.midpoint.web.component.prism.show;
+
+import com.evolveum.midpoint.web.component.prism.PrismObjectPanel;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.behavior.AttributeAppender;
+import org.apache.wicket.markup.html.image.Image;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.AbstractReadOnlyModel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.request.resource.PackageResourceReference;
+
+/**
+ * @author mserbak
+ * @author lazyman
+ */
+public class SceneButtonPanel extends Panel {
+
+ public SceneButtonPanel(String id, IModel model) {
+ super(id);
+
+ initLayout(model);
+ }
+
+ private void initLayout(final IModel model) {
+ AjaxLink minimize = new AjaxLink("minimizeButton") {
+
+ @Override
+ public void onClick(AjaxRequestTarget target) {
+ minimizeOnClick(target);
+ }
+ };
+ add(minimize);
+
+ Image minimizeImg = new Image("minimizeImg", new AbstractReadOnlyModel() {
+
+ @Override
+ public Object getObject() {
+ SceneDto dto = model.getObject();
+ if (dto.isMinimized()) {
+ return new PackageResourceReference(PrismObjectPanel.class, "Maximize.png");
+ }
+ return new PackageResourceReference(PrismObjectPanel.class, "Minimize.png");
+ }
+ });
+ minimizeImg.add(new AttributeAppender("title", new AbstractReadOnlyModel() {
+
+ @Override
+ public Object getObject() {
+ SceneDto dto = model.getObject();
+ if (dto.isMinimized()) {
+ return getString("prismOptionButtonPanel.maximize");
+ }
+ return getString("prismOptionButtonPanel.minimize");
+ }
+ }, ""));
+ minimize.add(minimizeImg);
+ }
+
+ public void minimizeOnClick(AjaxRequestTarget target) {
+ }
+}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneDto.java
new file mode 100644
index 00000000000..b37c59bc5cd
--- /dev/null
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneDto.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) 2010-2016 Evolveum
+ *
+ * Licensed 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 com.evolveum.midpoint.web.component.prism.show;
+
+import com.evolveum.midpoint.model.api.visualizer.Name;
+import com.evolveum.midpoint.model.api.visualizer.Scene;
+import com.evolveum.midpoint.model.api.visualizer.SceneDeltaItem;
+import com.evolveum.midpoint.model.api.visualizer.SceneItem;
+import com.evolveum.midpoint.prism.PrismContainerDefinition;
+import com.evolveum.midpoint.prism.PrismObjectDefinition;
+import com.evolveum.midpoint.prism.delta.ChangeType;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author mederly
+ */
+public class SceneDto implements Serializable {
+
+ public static final java.lang.String F_NAME = "name";
+ public static final java.lang.String F_CHANGE_TYPE = "changeType";
+ public static final java.lang.String F_OBJECT_TYPE = "objectType";
+ public static final java.lang.String F_DESCRIPTION = "description";
+ public static final java.lang.String F_ITEMS = "items";
+ public static final java.lang.String F_PARTIAL_SCENES = "partialScenes";
+
+ private Scene scene;
+ private boolean minimized;
+
+ private final List items = new ArrayList<>();
+ private final List partialScenes = new ArrayList<>();
+
+ public SceneDto(Scene scene) {
+ this.scene = scene;
+ for (SceneItem item : scene.getItems()) {
+ if (item != null) {
+ items.add(new SceneItemDto(this, item));
+ }
+ }
+ for (Scene sub : scene.getPartialScenes()) {
+ if (sub != null) {
+ partialScenes.add(new SceneDto(sub));
+ }
+ }
+ }
+
+ public Scene getScene() {
+ return scene;
+ }
+
+ public void setScene(Scene scene) {
+ this.scene = scene;
+ }
+
+ public boolean isMinimized() {
+ return minimized;
+ }
+
+ public void setMinimized(boolean minimized) {
+ this.minimized = minimized;
+ }
+
+ public List getPartialScenes() {
+ return partialScenes;
+ }
+
+ public List getItems() {
+ return items;
+ }
+
+ public String getName() {
+ if (scene.getName() != null) {
+ if (scene.getName().getDisplayName() != null) {
+ return scene.getName().getDisplayName();
+ } else {
+ return scene.getName().getSimpleName();
+ }
+ } else {
+ return "(unnamed)"; // TODO i18n
+ }
+ }
+
+ public String getDescription() {
+ Name name = scene.getName();
+ if (name == null) {
+ return "";
+ }
+ if (scene.getSourceDefinition() != null && !(scene.getSourceDefinition() instanceof PrismObjectDefinition)) {
+ return "";
+ }
+ if (name.getSimpleName() != null && !name.getSimpleName().equals(getName())) {
+ return "(" + name.getSimpleName() + ")";
+ }
+ return "";
+ }
+
+ public ChangeType getChangeType() {
+ return scene.getChangeType();
+ }
+
+ public boolean containsDeltaItems() {
+ for (SceneItem item : scene.getItems()) {
+ if (item instanceof SceneDeltaItem) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean isWrapper() {
+ return scene instanceof WrapperScene;
+ }
+}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneItemDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneItemDto.java
new file mode 100644
index 00000000000..5ae7c8a74b7
--- /dev/null
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneItemDto.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2010-2016 Evolveum
+ *
+ * Licensed 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 com.evolveum.midpoint.web.component.prism.show;
+
+import com.evolveum.midpoint.model.api.visualizer.*;
+import org.apache.commons.lang3.Validate;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * @author mederly
+ */
+public class SceneItemDto implements Serializable {
+
+ public static final String F_NAME = "name";
+ public static final String F_LINES = "lines";
+
+ @NotNull private final SceneItem sceneItem;
+ @NotNull private final SceneDto sceneDto;
+ @NotNull private final List lines;
+
+ public SceneItemDto(@NotNull SceneDto sceneDto, @NotNull SceneItem sceneItem) {
+ Validate.notNull(sceneDto);
+ Validate.notNull(sceneItem);
+ this.sceneDto = sceneDto;
+ this.sceneItem = sceneItem;
+ this.lines = computeLines();
+ }
+
+ public String getName() {
+ Name n = sceneItem.getName();
+ if (n == null) {
+ return "";
+ } else if (n.getDisplayName() != null) {
+ return n.getDisplayName();
+ } else {
+ return n.getSimpleName();
+ }
+ }
+
+ public String getNewValue() {
+ return String.valueOf(sceneItem.getNewValues());
+ }
+
+ public List computeLines() {
+ List rv = new ArrayList<>();
+ int index = 0;
+ if (!isDelta()) {
+ for (SceneItemValue itemValue : sceneItem.getNewValues()) {
+ rv.add(new SceneItemLineDto(this, null, itemValue, index++, false));
+ }
+ } else {
+ SceneDeltaItem deltaItem = (SceneDeltaItem) sceneItem;
+ for (SceneItemValue itemValue : deltaItem.getUnchangedValues()) {
+ rv.add(new SceneItemLineDto(this, null, itemValue, index++, false));
+ }
+ Iterator extends SceneItemValue> deletedValuesIter = deltaItem.getDeletedValues().iterator();
+ Iterator extends SceneItemValue> addedValuesIter = deltaItem.getAddedValues().iterator();
+ while (deletedValuesIter.hasNext() || addedValuesIter.hasNext()) {
+ SceneItemValue deletedValue = deletedValuesIter.hasNext() ? deletedValuesIter.next() : null;
+ SceneItemValue addedValue = addedValuesIter.hasNext() ? addedValuesIter.next() : null;
+ rv.add(new SceneItemLineDto(this, deletedValue, addedValue, index++, true));
+ }
+ }
+ return rv;
+ }
+
+ @NotNull
+ public List getLines() {
+ return lines;
+ }
+
+ public boolean isDelta() {
+ return sceneItem instanceof SceneDeltaItem;
+ }
+
+ public boolean isDeltaScene() {
+ return sceneDto.containsDeltaItems();
+ }
+}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneItemLineDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneItemLineDto.java
new file mode 100644
index 00000000000..316a1f7e39f
--- /dev/null
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneItemLineDto.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2010-2016 Evolveum
+ *
+ * Licensed 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 com.evolveum.midpoint.web.component.prism.show;
+
+import com.evolveum.midpoint.model.api.visualizer.SceneItemValue;
+
+import java.io.Serializable;
+
+/**
+ * @author mederly
+ */
+public class SceneItemLineDto implements Serializable {
+
+ public static final String F_NAME = "name";
+ public static final String F_OLD_VALUE = "oldValue";
+ public static final String F_NEW_VALUE = "newValue";
+ public static final String F_NUMBER_OF_LINES = "numberOfLines";
+
+ private final SceneItemDto sceneItemDto;
+ private final SceneItemValue sceneItemOldValue;
+ private final SceneItemValue sceneItemNewValue;
+ private final int index;
+ private final boolean isDelta;
+
+ public SceneItemLineDto(SceneItemDto sceneItemDto, SceneItemValue sceneItemOldValue, SceneItemValue sceneItemNewValue, int index, boolean isDelta) {
+ this.sceneItemDto = sceneItemDto;
+ this.sceneItemOldValue = sceneItemOldValue;
+ this.sceneItemNewValue = sceneItemNewValue;
+ this.index = index;
+ this.isDelta = isDelta;
+ }
+
+ public String getName() {
+ return sceneItemDto.getName();
+ }
+
+ public String getOldValue() {
+ return sceneItemOldValue != null ? sceneItemOldValue.getText() : null;
+ }
+
+ public String getNewValue() {
+ return sceneItemNewValue != null ? sceneItemNewValue.getText() : null;
+ }
+
+ public Integer getNumberOfLines() {
+ return sceneItemDto.getLines().size();
+ }
+
+ public boolean isFirst() {
+ return index == 0;
+ }
+
+ public boolean isDelta() {
+ return isDelta;
+ }
+
+ public boolean isDeltaScene() {
+ return sceneItemDto.isDeltaScene();
+ }
+}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneItemLinePanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneItemLinePanel.html
new file mode 100644
index 00000000000..ecb997a1087
--- /dev/null
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneItemLinePanel.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+ |
+ |
+ |
+
+
+
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneItemLinePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneItemLinePanel.java
new file mode 100644
index 00000000000..f8da41f8f3c
--- /dev/null
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneItemLinePanel.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2010-2016 Evolveum
+ *
+ * Licensed 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 com.evolveum.midpoint.web.component.prism.show;
+
+import com.evolveum.midpoint.gui.api.component.BasePanel;
+import com.evolveum.midpoint.util.logging.Trace;
+import com.evolveum.midpoint.util.logging.TraceManager;
+import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
+import org.apache.wicket.AttributeModifier;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.model.AbstractReadOnlyModel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.PropertyModel;
+
+/**
+ * @author mederly
+ */
+public class SceneItemLinePanel extends BasePanel {
+
+ private static final String ID_NAME_CONTAINER = "nameContainer";
+ private static final String ID_NAME = "name";
+ private static final String ID_OLD_VALUE_CONTAINER = "oldValueContainer";
+ private static final String ID_OLD_VALUE = "oldValue";
+ private static final String ID_NEW_VALUE_CONTAINER = "newValueContainer";
+ private static final String ID_NEW_VALUE = "newValue";
+
+ private static final Trace LOGGER = TraceManager.getTrace(SceneItemLinePanel.class);
+
+ public SceneItemLinePanel(String id, IModel model) {
+ super(id, model);
+ setOutputMarkupId(true);
+
+ initLayout();
+ }
+
+ private void initLayout() {
+ WebMarkupContainer nameCell = new WebMarkupContainer(ID_NAME_CONTAINER);
+ nameCell.add(new AttributeModifier("rowspan", new PropertyModel(getModel(), SceneItemLineDto.F_NUMBER_OF_LINES)));
+ Label label = new Label("name", new PropertyModel(getModel(), SceneItemLineDto.F_NAME));
+ nameCell.add(label);
+ nameCell.add(new VisibleEnableBehaviour() {
+ @Override
+ public boolean isVisible() {
+ return getModelObject().isFirst();
+ }
+ });
+ add(nameCell);
+
+ WebMarkupContainer oldValueCell = new WebMarkupContainer(ID_OLD_VALUE_CONTAINER);
+ oldValueCell.add(new VisibleEnableBehaviour() {
+ @Override
+ public boolean isVisible() {
+ return getModelObject().isDelta();
+ }
+ });
+ oldValueCell.add(new Label(ID_OLD_VALUE, new PropertyModel(getModel(), SceneItemLineDto.F_OLD_VALUE)));
+ add(oldValueCell);
+
+ WebMarkupContainer newValueCell = new WebMarkupContainer(ID_NEW_VALUE_CONTAINER);
+ newValueCell.add(new Label(ID_NEW_VALUE, new PropertyModel(getModel(), SceneItemLineDto.F_NEW_VALUE)));
+ newValueCell.add(new AttributeModifier("colspan", new AbstractReadOnlyModel() {
+ @Override
+ public Integer getObject() {
+ return !getModelObject().isDelta() && getModelObject().isDeltaScene() ? 2 : 1;
+ }
+ }));
+ newValueCell.add(new AttributeModifier("align", new AbstractReadOnlyModel() {
+ @Override
+ public String getObject() {
+ return !getModelObject().isDelta() && getModelObject().isDeltaScene() ? "center" : null;
+ }
+ }));
+ add(newValueCell);
+ }
+}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneItemPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneItemPanel.html
new file mode 100644
index 00000000000..47bd3070ee1
--- /dev/null
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneItemPanel.html
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneItemPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneItemPanel.java
new file mode 100644
index 00000000000..7e05fd951e6
--- /dev/null
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneItemPanel.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2010-2016 Evolveum
+ *
+ * Licensed 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 com.evolveum.midpoint.web.component.prism.show;
+
+import com.evolveum.midpoint.util.logging.Trace;
+import com.evolveum.midpoint.util.logging.TraceManager;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.PropertyModel;
+
+import java.util.List;
+
+/**
+ * @author lazyman
+ */
+public class SceneItemPanel extends Panel {
+
+ private static final String ID_ITEM_LINES = "itemLines";
+ private static final String ID_ITEM_LINE = "itemLine";
+
+ private static final Trace LOGGER = TraceManager.getTrace(SceneItemPanel.class);
+
+ private boolean showHeader = true;
+
+ public SceneItemPanel(String id, IModel model) {
+ super(id);
+ setOutputMarkupId(true);
+
+ initLayout(model);
+ }
+
+ private void initLayout(final IModel model) {
+ ListView items = new ListView(ID_ITEM_LINES, new PropertyModel>(model, SceneItemDto.F_LINES)) {
+ @Override
+ protected void populateItem(ListItem item) {
+ SceneItemLinePanel panel = new SceneItemLinePanel(ID_ITEM_LINE, item.getModel());
+ panel.setOutputMarkupPlaceholderTag(true);
+ item.add(panel);
+ }
+ };
+ items.setReuseItems(true);
+ add(items);
+ }
+
+}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/ScenePanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/ScenePanel.html
new file mode 100644
index 00000000000..231005cd843
--- /dev/null
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/ScenePanel.html
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/ScenePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/ScenePanel.java
new file mode 100644
index 00000000000..e6c11a3d366
--- /dev/null
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/ScenePanel.java
@@ -0,0 +1,242 @@
+/*
+ * Copyright (c) 2010-2016 Evolveum
+ *
+ * Licensed 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 com.evolveum.midpoint.web.component.prism.show;
+
+import com.evolveum.midpoint.gui.api.component.BasePanel;
+import com.evolveum.midpoint.gui.api.page.PageBase;
+import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
+import com.evolveum.midpoint.model.api.visualizer.Scene;
+import com.evolveum.midpoint.prism.PrismContainerDefinition;
+import com.evolveum.midpoint.prism.PrismObjectDefinition;
+import com.evolveum.midpoint.prism.delta.ChangeType;
+import com.evolveum.midpoint.util.logging.Trace;
+import com.evolveum.midpoint.util.logging.TraceManager;
+import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
+import org.apache.wicket.ajax.AjaxEventBehavior;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.model.AbstractReadOnlyModel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.model.StringResourceModel;
+
+import java.util.List;
+
+/**
+ * @author mederly
+ */
+public class ScenePanel extends BasePanel {
+
+ private static final String STRIPED_CLASS = "striped";
+ private static final String ID_ITEMS_TABLE = "itemsTable";
+ private static final String ID_ITEMS = "items";
+ private static final String ID_ITEM = "item";
+ private static final String ID_PARTIAL_SCENES = "partialScenes";
+ private static final String ID_PARTIAL_SCENE = "partialScene";
+
+ private static final Trace LOGGER = TraceManager.getTrace(ScenePanel.class);
+ public static final String ID_OPTION_BUTTONS = "optionButtons";
+ public static final String ID_HEADER_PANEL = "headerPanel";
+ public static final String ID_HEADER_DESCRIPTION = "description";
+ public static final String ID_HEADER_WRAPPER_DISPLAY_NAME = "wrapperDisplayName";
+ public static final String ID_HEADER_NAME = "name";
+ public static final String ID_HEADER_CHANGE_TYPE = "changeType";
+ public static final String ID_HEADER_OBJECT_TYPE = "objectType";
+ public static final String ID_BODY = "body";
+ public static final String ID_OLD_VALUE_LABEL = "oldValueLabel";
+ public static final String ID_NEW_VALUE_LABEL = "newValueLabel";
+ public static final String ID_VALUE_LABEL = "valueLabel";
+
+ public ScenePanel(String id, IModel model) {
+ super(id, model);
+ setOutputMarkupId(true);
+
+ LOGGER.trace("Creating object panel for {}", model.getObject());
+
+ initLayout();
+ }
+
+ private AjaxEventBehavior createHeaderOnClickBehaviour(final IModel model) {
+ return new AjaxEventBehavior("click") {
+ @Override
+ protected void onEvent(AjaxRequestTarget target) {
+ headerOnClickPerformed(target, model);
+ }
+ };
+ }
+
+ private void initLayout() {
+ final IModel model = getModel();
+
+ WebMarkupContainer headerPanel = new WebMarkupContainer(ID_HEADER_PANEL);
+ add(headerPanel);
+
+ headerPanel.add(new SceneButtonPanel(ID_OPTION_BUTTONS, model) {
+ @Override
+ public void minimizeOnClick(AjaxRequestTarget target) {
+ headerOnClickPerformed(target, model);
+ }
+ });
+
+ Label headerChangeType = new Label(ID_HEADER_CHANGE_TYPE, new ChangeTypeModel());
+ Label headerObjectType = new Label(ID_HEADER_OBJECT_TYPE, new ObjectTypeModel());
+ Label headerName = new Label(ID_HEADER_NAME, new PropertyModel(model, SceneDto.F_NAME));
+ Label headerDescription = new Label(ID_HEADER_DESCRIPTION, new PropertyModel(model, SceneDto.F_DESCRIPTION));
+ Label headerWrapperDisplayName = new Label(ID_HEADER_WRAPPER_DISPLAY_NAME,
+ new AbstractReadOnlyModel() {
+ @Override
+ public String getObject() {
+ String key = ((WrapperScene) getModelObject().getScene()).getDisplayNameKey();
+ Object[] parameters = ((WrapperScene) getModelObject().getScene()).getDisplayNameParameters();
+ return new StringResourceModel(key, this).setModel(null)
+ .setDefaultValue(key)
+ .setParameters(parameters).getObject();
+ }
+ });
+
+ headerPanel.add(headerChangeType);
+ headerPanel.add(headerObjectType);
+ headerPanel.add(headerName);
+ headerPanel.add(headerDescription);
+ headerPanel.add(headerWrapperDisplayName);
+
+ headerChangeType.add(createHeaderOnClickBehaviour(model));
+ headerObjectType.add(createHeaderOnClickBehaviour(model));
+ headerName.add(createHeaderOnClickBehaviour(model));
+ headerDescription.add(createHeaderOnClickBehaviour(model));
+ headerWrapperDisplayName.add(createHeaderOnClickBehaviour(model));
+
+ VisibleEnableBehaviour visibleIfNotWrapper = new VisibleEnableBehaviour() {
+ @Override
+ public boolean isVisible() {
+ return !getModelObject().isWrapper();
+ }
+ };
+ VisibleEnableBehaviour visibleIfWrapper = new VisibleEnableBehaviour() {
+ @Override
+ public boolean isVisible() {
+ return getModelObject().isWrapper();
+ }
+ };
+ headerChangeType.add(visibleIfNotWrapper);
+ headerObjectType.add(visibleIfNotWrapper);
+ headerName.add(visibleIfNotWrapper);
+ headerDescription.add(visibleIfNotWrapper);
+ headerWrapperDisplayName.add(visibleIfWrapper);
+
+ WebMarkupContainer body = new WebMarkupContainer(ID_BODY);
+ body.add(new VisibleEnableBehaviour() {
+
+ @Override
+ public boolean isVisible() {
+ SceneDto wrapper = model.getObject();
+ return !wrapper.isMinimized();
+ }
+ });
+ add(body);
+
+ WebMarkupContainer itemsTable = new WebMarkupContainer(ID_ITEMS_TABLE);
+ itemsTable.add(new VisibleEnableBehaviour() {
+ @Override
+ public boolean isVisible() {
+ return !model.getObject().getItems().isEmpty();
+ }
+ });
+ WebMarkupContainer oldValueLabel = new WebMarkupContainer(ID_OLD_VALUE_LABEL);
+ oldValueLabel.add(new VisibleEnableBehaviour() {
+ @Override
+ public boolean isVisible() {
+ return model.getObject().containsDeltaItems();
+ }
+ });
+ itemsTable.add(oldValueLabel);
+ WebMarkupContainer newValueLabel = new WebMarkupContainer(ID_NEW_VALUE_LABEL);
+ newValueLabel.add(new VisibleEnableBehaviour() {
+ @Override
+ public boolean isVisible() {
+ return model.getObject().containsDeltaItems();
+ }
+ });
+ itemsTable.add(newValueLabel);
+ WebMarkupContainer valueLabel = new WebMarkupContainer(ID_VALUE_LABEL);
+ valueLabel.add(new VisibleEnableBehaviour() {
+ @Override
+ public boolean isVisible() {
+ return !model.getObject().containsDeltaItems();
+ }
+ });
+ itemsTable.add(valueLabel);
+ ListView items = new ListView(ID_ITEMS, new PropertyModel>(model, SceneDto.F_ITEMS)) {
+ @Override
+ protected void populateItem(ListItem item) {
+ SceneItemPanel panel = new SceneItemPanel(ID_ITEM, item.getModel());
+ panel.setOutputMarkupPlaceholderTag(true);
+ item.add(panel);
+ }
+ };
+ items.setReuseItems(true);
+ itemsTable.add(items);
+ body.add(itemsTable);
+
+ ListView partialScenes = new ListView(ID_PARTIAL_SCENES, new PropertyModel>(model, SceneDto.F_PARTIAL_SCENES)) {
+ @Override
+ protected void populateItem(ListItem item) {
+ ScenePanel panel = new ScenePanel(ID_PARTIAL_SCENE, item.getModel());
+ panel.setOutputMarkupPlaceholderTag(true);
+ item.add(panel);
+ }
+ };
+ partialScenes.setReuseItems(true);
+ body.add(partialScenes);
+ }
+
+ public void headerOnClickPerformed(AjaxRequestTarget target, IModel model) {
+ SceneDto dto = model.getObject();
+ dto.setMinimized(!dto.isMinimized());
+ target.add(this);
+ }
+
+ private class ChangeTypeModel extends AbstractReadOnlyModel {
+ @Override
+ public String getObject() {
+ ChangeType changeType = getModel().getObject().getScene().getChangeType();
+ if (changeType == null) {
+ return "";
+ }
+ return WebComponentUtil.createLocalizedModelForEnum(changeType, ScenePanel.this).getObject();
+ }
+ }
+
+ private class ObjectTypeModel extends AbstractReadOnlyModel {
+ @Override
+ public String getObject() {
+ Scene scene = getModel().getObject().getScene();
+ PrismContainerDefinition> def = scene.getSourceDefinition();
+ if (def == null) {
+ return "";
+ }
+ if (def instanceof PrismObjectDefinition) {
+ return PageBase.createStringResourceStatic(ScenePanel.this, "ObjectType." +def.getTypeName().getLocalPart()).getObject();
+ } else {
+ return "";
+ }
+ }
+ }
+}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneUtil.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneUtil.java
new file mode 100644
index 00000000000..d9cde41de04
--- /dev/null
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/SceneUtil.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2010-2016 Evolveum
+ *
+ * Licensed 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 com.evolveum.midpoint.web.component.prism.show;
+
+import com.evolveum.midpoint.model.api.ModelInteractionService;
+import com.evolveum.midpoint.model.api.visualizer.Scene;
+import com.evolveum.midpoint.prism.PrismContext;
+import com.evolveum.midpoint.prism.delta.ObjectDelta;
+import com.evolveum.midpoint.schema.DeltaConvertor;
+import com.evolveum.midpoint.schema.result.OperationResult;
+import com.evolveum.midpoint.task.api.Task;
+import com.evolveum.midpoint.util.exception.SchemaException;
+import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectTreeDeltasType;
+import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
+import com.evolveum.midpoint.xml.ns._public.common.common_3.ProjectionObjectDeltaType;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author mederly
+ */
+public class SceneUtil {
+
+ public static Scene visualizeObjectTreeDeltas(ObjectTreeDeltasType deltas, String displayNameKey,
+ PrismContext prismContext, ModelInteractionService modelInteractionService,
+ Task task, OperationResult result) throws SchemaException {
+ List scenes = new ArrayList<>();
+ if (deltas.getFocusPrimaryDelta() != null) {
+ ObjectDelta extends ObjectType> delta = DeltaConvertor.createObjectDelta(deltas.getFocusPrimaryDelta(), prismContext);
+ scenes.add(modelInteractionService.visualizeDelta(delta, task, result));
+ }
+ for (ProjectionObjectDeltaType projectionObjectDelta : deltas.getProjectionPrimaryDelta()) {
+ ObjectDelta extends ObjectType> delta = DeltaConvertor.createObjectDelta(projectionObjectDelta.getPrimaryDelta(), prismContext);
+ scenes.add(modelInteractionService.visualizeDelta(delta, task, result));
+ }
+ return new WrapperScene(scenes, displayNameKey);
+ }
+}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/WrapperScene.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/WrapperScene.java
new file mode 100644
index 00000000000..f6d242f47b5
--- /dev/null
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/WrapperScene.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright (c) 2010-2016 Evolveum
+ *
+ * Licensed 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 com.evolveum.midpoint.web.component.prism.show;
+
+import com.evolveum.midpoint.model.api.visualizer.Name;
+import com.evolveum.midpoint.model.api.visualizer.Scene;
+import com.evolveum.midpoint.model.api.visualizer.SceneItem;
+import com.evolveum.midpoint.prism.PrismContainerDefinition;
+import com.evolveum.midpoint.prism.PrismContainerValue;
+import com.evolveum.midpoint.prism.delta.ChangeType;
+import com.evolveum.midpoint.prism.delta.ObjectDelta;
+import com.evolveum.midpoint.prism.path.ItemPath;
+import com.evolveum.midpoint.util.DebugUtil;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Artificial implementation of a scene used to hold a list of deltas.
+ * (A bit of hack, unfortunately.)
+ *
+ * @author mederly
+ */
+public class WrapperScene implements Scene {
+
+ private String displayNameKey;
+ private Object[] displayNameParameters;
+ private List extends Scene> partialScenes;
+
+ public WrapperScene(List extends Scene> partialScenes, String displayNameKey, Object... displayNameParameters) {
+ this.partialScenes = partialScenes;
+ this.displayNameKey = displayNameKey;
+ this.displayNameParameters = displayNameParameters;
+ }
+
+ public String getDisplayNameKey() {
+ return displayNameKey;
+ }
+
+ public Object[] getDisplayNameParameters() {
+ return displayNameParameters;
+ }
+
+ @Override
+ public Name getName() {
+ return new Name() {
+
+ @Override
+ public String getSimpleName() {
+ return "";
+ }
+
+ @Override
+ public String getDisplayName() {
+ return null;
+ }
+
+ @Override
+ public String getId() {
+ return null;
+ }
+
+ @Override
+ public String getDescription() {
+ return null;
+ }
+ };
+ }
+
+ @Override
+ public ChangeType getChangeType() {
+ return null;
+ }
+
+ @NotNull
+ @Override
+ public List extends Scene> getPartialScenes() {
+ return partialScenes;
+ }
+
+ @NotNull
+ @Override
+ public List extends SceneItem> getItems() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public boolean isOperational() {
+ return false;
+ }
+
+ @Override
+ public Scene getOwner() {
+ return null;
+ }
+
+ @Override
+ public ItemPath getSourceRelPath() {
+ return null;
+ }
+
+ @Override
+ public ItemPath getSourceAbsPath() {
+ return null;
+ }
+
+ @Override
+ public PrismContainerValue> getSourceValue() {
+ return null;
+ }
+
+ @Override
+ public PrismContainerDefinition> getSourceDefinition() {
+ return null;
+ }
+
+ @Override
+ public ObjectDelta> getSourceDelta() {
+ return null;
+ }
+
+ @Override
+ public String debugDump() {
+ return debugDump(0);
+ }
+
+ @Override
+ public String debugDump(int indent) {
+ return DebugUtil.debugDump(partialScenes, indent);
+ }
+}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/ProgressReporter.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/ProgressReporter.java
index c0c37f8b204..980fee049bf 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/ProgressReporter.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/ProgressReporter.java
@@ -16,10 +16,8 @@
package com.evolveum.midpoint.web.component.progress;
-import com.evolveum.midpoint.model.api.ModelExecuteOptions;
-import com.evolveum.midpoint.model.api.ModelService;
-import com.evolveum.midpoint.model.api.PolicyViolationException;
-import com.evolveum.midpoint.model.api.ProgressListener;
+import com.evolveum.midpoint.model.api.*;
+import com.evolveum.midpoint.model.api.context.ModelContext;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.security.api.SecurityEnforcer;
@@ -42,7 +40,6 @@
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.AjaxSelfUpdatingTimerBehavior;
import org.apache.wicket.behavior.Behavior;
-import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.Model;
import org.apache.wicket.util.time.Duration;
import org.springframework.security.core.Authentication;
@@ -83,8 +80,9 @@ public class ProgressReporter implements Serializable {
private int refreshInterval;
private boolean asynchronousExecution;
private boolean abortEnabled;
-
- public ProgressPanel getProgressPanel() {
+ private ModelContext extends ObjectType> previewResult; // Temporary - TODO rethink this...
+
+ public ProgressPanel getProgressPanel() {
return progressPanel;
}
@@ -132,19 +130,26 @@ public void onSaveSubmit() {
* @param result Operation result.
* @param target AjaxRequestTarget into which any synchronous changes are signalized.
*/
- public void executeChanges(final Collection> deltas, final ModelExecuteOptions options, final Task task, final OperationResult result, AjaxRequestTarget target) {
+ public void executeChanges(final Collection> deltas,
+ final boolean previewOnly, final ModelExecuteOptions options, final Task task, final OperationResult result, AjaxRequestTarget target) {
parentPage.startProcessing(target, result);
ModelService modelService = parentPage.getModelService();
+ ModelInteractionService modelInteractionService = parentPage.getModelInteractionService();
if (asynchronousExecution) {
- executeChangesAsync(deltas, options, task, result, target, modelService);
+ executeChangesAsync(deltas, previewOnly, options, task, result, target, modelService, modelInteractionService);
} else {
- executeChangesSync(deltas, options, task, result, target, modelService);
+ executeChangesSync(deltas, previewOnly, options, task, result, target, modelService, modelInteractionService);
}
}
- private void executeChangesSync(Collection> deltas, ModelExecuteOptions options, Task task, OperationResult result, AjaxRequestTarget target, ModelService modelService) {
+ private void executeChangesSync(Collection> deltas, boolean previewOnly, ModelExecuteOptions options, Task task,
+ OperationResult result, AjaxRequestTarget target, ModelService modelService, ModelInteractionService modelInteractionService) {
try {
- modelService.executeChanges(deltas, options, task, result);
+ if (previewOnly) {
+ previewResult = modelInteractionService.previewChanges(deltas, options, task, result);
+ } else {
+ modelService.executeChanges(deltas, options, task, result);
+ }
result.computeStatusIfUnknown();
} catch (CommunicationException |ObjectAlreadyExistsException |ExpressionEvaluationException |
PolicyViolationException |SchemaException |SecurityViolationException |
@@ -157,7 +162,9 @@ private void executeChangesSync(Collection> de
parentPage.finishProcessing(target, result);
}
- private void executeChangesAsync(final Collection> deltas, final ModelExecuteOptions options, final Task task, final OperationResult result, AjaxRequestTarget target, final ModelService modelService) {
+ private void executeChangesAsync(final Collection> deltas, final boolean previewOnly,
+ final ModelExecuteOptions options, final Task task, final OperationResult result, AjaxRequestTarget target,
+ final ModelService modelService, final ModelInteractionService modelInteractionService) {
final SecurityEnforcer enforcer = parentPage.getSecurityEnforcer();
final Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
@@ -175,7 +182,11 @@ public void run() {
try {
enforcer.setupPreAuthenticatedSecurityContext(authentication);
progressPanel.recordExecutionStart();
- modelService.executeChanges(deltas, options, task, Collections.singleton((ProgressListener) progressListener), result);
+ if (previewOnly) {
+ previewResult = modelInteractionService.previewChanges(deltas, options, task, Collections.singleton((ProgressListener) progressListener), result);
+ } else {
+ modelService.executeChanges(deltas, options, task, Collections.singleton((ProgressListener) progressListener), result);
+ }
} catch (CommunicationException|ObjectAlreadyExistsException|ExpressionEvaluationException|
PolicyViolationException|SchemaException|SecurityViolationException|
ConfigurationException|ObjectNotFoundException|RuntimeException e) {
@@ -313,4 +324,7 @@ public void clearProgressPanel() {
progressPanel.getModelObject().clear();
}
+ public ModelContext extends ObjectType> getPreviewResult() {
+ return previewResult;
+ }
}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/ProgressReportingAwarePage.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/ProgressReportingAwarePage.java
index e3018c2005b..71e77daf0ff 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/ProgressReportingAwarePage.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/ProgressReportingAwarePage.java
@@ -16,6 +16,7 @@
package com.evolveum.midpoint.web.component.progress;
+import com.evolveum.midpoint.model.api.ModelInteractionService;
import com.evolveum.midpoint.model.api.ModelService;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.security.api.SecurityEnforcer;
@@ -46,6 +47,8 @@ public interface ProgressReportingAwarePage {
ModelService getModelService();
+ ModelInteractionService getModelInteractionService();
+
SecurityEnforcer getSecurityEnforcer();
Task createSimpleTask(String name);
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFormPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFormPanel.html
new file mode 100644
index 00000000000..eeaf412e252
--- /dev/null
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFormPanel.html
@@ -0,0 +1,21 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFormPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFormPanel.java
new file mode 100644
index 00000000000..2c020998e83
--- /dev/null
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFormPanel.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2010-2016 Evolveum
+ *
+ * Licensed 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 com.evolveum.midpoint.web.component.search;
+
+import com.evolveum.midpoint.gui.api.component.BasePanel;
+import com.evolveum.midpoint.prism.query.ObjectQuery;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.model.IModel;
+
+/**
+ * @author Viliam Repan (lazyman)
+ */
+public class SearchFormPanel extends BasePanel {
+
+ private static final String ID_SEARCH = "search";
+ private static final String ID_SEARCH_FORM = "searchForm";
+
+ public SearchFormPanel(String id, IModel model) {
+ super(id, model);
+
+ initLayout();
+ }
+
+ private void initLayout() {
+ final Form searchForm = new Form(ID_SEARCH_FORM);
+ add(searchForm);
+ searchForm.setOutputMarkupId(true);
+
+ SearchPanel search = new SearchPanel(ID_SEARCH, getModel()) {
+
+ @Override
+ public void searchPerformed(ObjectQuery query, AjaxRequestTarget target) {
+ SearchFormPanel.this.searchPerformed(query, target);
+ }
+ };
+ searchForm.add(search);
+ }
+
+ protected void searchPerformed(ObjectQuery query, AjaxRequestTarget target) {
+
+ }
+}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchItemPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchItemPanel.java
index 86b0711aaf2..c8d06ca1958 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchItemPanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchItemPanel.java
@@ -25,7 +25,6 @@
import com.evolveum.midpoint.web.component.AjaxButton;
import com.evolveum.midpoint.web.component.AjaxSubmitButton;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
-
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.MarkupContainer;
@@ -447,10 +446,13 @@ public Object getDisplayValue(DisplayableValue object) {
public String getIdValue(DisplayableValue object, int index) {
return Integer.toString(index);
}
-
+
@Override
public DisplayableValue getObject(String id, IModel extends List extends DisplayableValue>> choices) {
- return choices.getObject().get(Integer.parseInt(id));
+ if (StringUtils.isEmpty(id)) {
+ return null;
+ }
+ return choices.getObject().get(Integer.parseInt(id));
}
@Override
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/WfDeltasPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/WfDeltasPanel.java
index 551dbf870f4..b415a5b931f 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/WfDeltasPanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/WfDeltasPanel.java
@@ -18,6 +18,8 @@
import com.evolveum.midpoint.web.component.model.delta.DeltaDto;
import com.evolveum.midpoint.web.component.model.delta.DeltaPanel;
+import com.evolveum.midpoint.web.component.prism.show.SceneDto;
+import com.evolveum.midpoint.web.component.prism.show.ScenePanel;
import com.evolveum.midpoint.web.component.util.SimplePanel;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.web.page.admin.server.dto.TaskDto;
@@ -48,17 +50,17 @@ public WfDeltasPanel(String id, IModel model) {
@Override
protected void initLayout() {
- add(new ListView(ID_DELTA_IN_LIST, new PropertyModel>(getModel(), TaskDto.F_WORKFLOW_DELTAS_IN)) {
+ add(new ListView(ID_DELTA_IN_LIST, new PropertyModel>(getModel(), TaskDto.F_WORKFLOW_DELTAS_IN)) {
@Override
- protected void populateItem(ListItem item) {
- item.add(new DeltaPanel(ID_DELTA_IN, item.getModel()));
+ protected void populateItem(ListItem item) {
+ item.add(new ScenePanel(ID_DELTA_IN, item.getModel()));
}
});
- ListView deltaOutListView = new ListView(ID_DELTA_OUT_LIST, new PropertyModel>(getModel(), TaskDto.F_WORKFLOW_DELTAS_OUT)) {
+ ListView deltaOutListView = new ListView(ID_DELTA_OUT_LIST, new PropertyModel>(getModel(), TaskDto.F_WORKFLOW_DELTAS_OUT)) {
@Override
- protected void populateItem(ListItem item) {
- item.add(new DeltaPanel(ID_DELTA_OUT, item.getModel()));
+ protected void populateItem(ListItem item) {
+ item.add(new ScenePanel(ID_DELTA_OUT, item.getModel()));
}
};
deltaOutListView.add(new VisibleEnableBehaviour() {
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/WfHistoryPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/WfHistoryPanel.java
index ef2d4c6be8e..78948144c61 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/WfHistoryPanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/WfHistoryPanel.java
@@ -42,11 +42,11 @@ public WfHistoryPanel(String id, IModel> model) {
@Override
protected void initLayout() {
- List> columns = new ArrayList>();
+ List> columns = new ArrayList<>();
columns.add(new PropertyColumn(createStringResource("WfHistoryPanel.label.timestamp"), WfHistoryEventDto.F_TIMESTAMP_FORMATTED));
columns.add(new PropertyColumn(createStringResource("WfHistoryPanel.label.event"), WfHistoryEventDto.F_EVENT));
ISortableDataProvider provider = new ListDataProvider(this, getModel());
- add(new TablePanel(ID_HISTORY_TABLE, provider, columns));
+ add(new TablePanel<>(ID_HISTORY_TABLE, provider, columns));
}
}
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/WorkItemsPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/WorkItemsTablePanel.html
similarity index 100%
rename from gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/WorkItemsPanel.html
rename to gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/WorkItemsTablePanel.html
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/WorkItemsPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/WorkItemsTablePanel.java
similarity index 59%
rename from gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/WorkItemsPanel.java
rename to gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/WorkItemsTablePanel.java
index ec3f385ad52..a10d0eab7cb 100644
--- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/WorkItemsPanel.java
+++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/WorkItemsTablePanel.java
@@ -20,20 +20,18 @@
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.security.api.AuthorizationConstants;
+import com.evolveum.midpoint.web.component.data.BoxedTablePanel;
import com.evolveum.midpoint.web.component.data.TablePanel;
+import com.evolveum.midpoint.web.component.data.column.CheckBoxHeaderColumn;
import com.evolveum.midpoint.web.component.data.column.LinkColumn;
-import com.evolveum.midpoint.web.component.util.ListDataProvider;
-import com.evolveum.midpoint.web.page.admin.home.dto.MyWorkItemDto;
import com.evolveum.midpoint.web.page.admin.workflow.PageWorkItem;
+import com.evolveum.midpoint.web.page.admin.workflow.dto.WorkItemDtoProvider;
import com.evolveum.midpoint.web.page.admin.workflow.dto.WorkItemDto;
+import com.evolveum.midpoint.web.session.UserProfileStorage;
import com.evolveum.midpoint.web.util.OnePageParameterEncoder;
-
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.extensions.markup.html.repeater.data.table.IColumn;
-import org.apache.wicket.extensions.markup.html.repeater.data.table.ISortableDataProvider;
-import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.*;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.AbstractReadOnlyModel;
@@ -47,33 +45,38 @@
* @author lazyman
* @author mederly
*/
-public class WorkItemsPanel extends BasePanel> {
+public class WorkItemsTablePanel extends BasePanel {
private static final String ID_WORK_ITEMS_TABLE = "workItemsTable";
- public WorkItemsPanel(String id, IModel> model) {
- super(id, model);
- initLayout(true);
- }
+ private ISortableDataProvider provider;
- public WorkItemsPanel(String id, IModel> model, boolean showAssigned) {
- super(id, model);
- initLayout(showAssigned);
+ public WorkItemsTablePanel(String id, ISortableDataProvider provider,
+ UserProfileStorage.TableId tableId, int pageSize, boolean showAssigned) {
+ super(id);
+ this.provider = provider;
+ initLayout(tableId, pageSize, showAssigned);
}
// this is called locally in order to take showAssigned into account
- private void initLayout(boolean showAssigned) {
- List> columns = new ArrayList>();
+ private void initLayout(UserProfileStorage.TableId tableId, int pageSize, boolean showAssigned) {
+ List> columns = new ArrayList<>();
+
+ // TODO configurable
+ columns.add(new CheckBoxHeaderColumn());
+
+ // TODO clickable links and info icons
+ columns.add(new PropertyColumn(createStringResource("WorkItemsPanel.object"), WorkItemDto.F_OBJECT_NAME));
+ columns.add(new PropertyColumn(createStringResource("WorkItemsPanel.target"), WorkItemDto.F_TARGET_NAME));
+
if (WebComponentUtil.isAuthorized(AuthorizationConstants.AUTZ_UI_WORK_ITEMS_ALL_URL,
AuthorizationConstants.AUTZ_UI_WORK_ITEM_URL)) {
- columns.add(new LinkColumn(createStringResource("WorkItemsPanel.name"), MyWorkItemDto.F_NAME, MyWorkItemDto.F_NAME) {
-
+ columns.add(new LinkColumn(createStringResource("WorkItemsPanel.name"), WorkItemDto.F_NAME, WorkItemDto.F_NAME) {
@Override
public void onClick(AjaxRequestTarget target, IModel rowModel) {
- WorkItemDto workItemDto = rowModel.getObject();
PageParameters parameters = new PageParameters();
- parameters.add(OnePageParameterEncoder.PARAMETER, workItemDto.getWorkItem().getWorkItemId());
- setResponsePage(new PageWorkItem(parameters, (PageBase) WorkItemsPanel.this.getPage()));
+ parameters.add(OnePageParameterEncoder.PARAMETER, rowModel.getObject().getWorkItemId());
+ setResponsePage(new PageWorkItem(parameters, (PageBase) WorkItemsTablePanel.this.getPage()));
}
});
} else {
@@ -82,25 +85,41 @@ public void onClick(AjaxRequestTarget target, IModel rowModel) {
public void populateItem(Item> item, String componentId,
final IModel rowModel) {
item.add(new Label(componentId, new AbstractReadOnlyModel