From 3f7949f81dd64ad93eeef85bb668046bf7684547 Mon Sep 17 00:00:00 2001 From: Fabian Prasser Date: Fri, 13 Dec 2024 17:16:29 +0100 Subject: [PATCH 1/2] Update pmd.yml --- .github/workflows/pmd.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pmd.yml b/.github/workflows/pmd.yml index 6e0a96dc8..8b38f7a1e 100644 --- a/.github/workflows/pmd.yml +++ b/.github/workflows/pmd.yml @@ -32,7 +32,7 @@ jobs: distribution: 'temurin' - name: Run PMD id: pmd - uses: pmd/pmd-github-action@40392a149b9cfa24bf4c03989cc762e6814668bd + uses: pmd/pmd-github-action@v2 with: rulesets: 'ruleset.xml' sourcePath: 'src/main' From 02d96887e95d821bb7f10f7371fb33369853a23a Mon Sep 17 00:00:00 2001 From: Fabian Prasser Date: Fri, 13 Dec 2024 17:42:12 +0100 Subject: [PATCH 2/2] Support using g/s factor through UI when doing local anonymizations (#463) * Support using g/s factor through UI when doing local anonymizations * Fix bug with checkboxes --- .../org/deidentifier/arx/gui/Controller.java | 6 ++--- .../ModelAnonymizationConfiguration.java | 24 ++++++++++++++++- .../arx/gui/resources/messages.properties | 1 + .../view/impl/menu/DialogAnonymization.java | 27 +++++++++++++++++-- .../arx/gui/worker/WorkerAnonymize.java | 9 ++++++- 5 files changed, 60 insertions(+), 7 deletions(-) diff --git a/src/gui/org/deidentifier/arx/gui/Controller.java b/src/gui/org/deidentifier/arx/gui/Controller.java index 7b2a90157..5e1e1a013 100644 --- a/src/gui/org/deidentifier/arx/gui/Controller.java +++ b/src/gui/org/deidentifier/arx/gui/Controller.java @@ -604,7 +604,7 @@ public void actionMenuEditAnonymize() { } // Open configuration dialog - ModelAnonymizationConfiguration configuration = this.actionShowLocalAnonymizationDialog(); + ModelAnonymizationConfiguration configuration = this.actionShowAnonymizationDialog(); if (configuration == null) { return; } @@ -1817,11 +1817,11 @@ public String actionShowInputDialog(final Shell shell, } /** - * Shows a dialog for configuration of local anonymization. + * Shows a dialog for configuration of anonymization. * @return Returns the parameters selected by the user. Returns a pair. * First: max. time per iteration. Second: min. records per iteration. */ - public ModelAnonymizationConfiguration actionShowLocalAnonymizationDialog() { + public ModelAnonymizationConfiguration actionShowAnonymizationDialog() { return main.showLocalAnonymizationDialog(model); } diff --git a/src/gui/org/deidentifier/arx/gui/model/ModelAnonymizationConfiguration.java b/src/gui/org/deidentifier/arx/gui/model/ModelAnonymizationConfiguration.java index e60edd2de..99ebc9190 100644 --- a/src/gui/org/deidentifier/arx/gui/model/ModelAnonymizationConfiguration.java +++ b/src/gui/org/deidentifier/arx/gui/model/ModelAnonymizationConfiguration.java @@ -60,6 +60,8 @@ public static enum TransformationType { private ModelAnonymizationConfiguration.TransformationType transformationType = TransformationType.GLOBAL; /** Limits */ private Boolean stepLimitEnabled = false; + /** Code model settings*/ + private Boolean useCodingModelSettings = false; /** * Creates a new instance @@ -143,6 +145,18 @@ public boolean isTimeLimitEnabled() { return !isStepLimitEnabled(); } + /** + * Use coding model settings from main UI + * @return + */ + public boolean isUseCodingModelSettings() { + // Backwards compatibility + if (this.useCodingModelSettings == null) { + this.useCodingModelSettings = false; + } + return this.useCodingModelSettings; + } + /** * @param heuristicSearchStepLimit the heuristicSearchStepLimit to set */ @@ -156,7 +170,7 @@ public void setHeuristicSearchStepLimit(int heuristicSearchStepLimit) { public void setHeuristicSearchTimeLimit(double heuristicSearchTimeLimit) { model.setHeuristicSearchTimeLimit((int)(heuristicSearchTimeLimit * 1000d)); } - + /** * @param numIterations the numIterations to set */ @@ -191,4 +205,12 @@ public void setTimeLimitEnabled(boolean timeLimitEnabled) { public void setTransformationType(ModelAnonymizationConfiguration.TransformationType transformationType) { this.transformationType = transformationType; } + + /** + * Set use coding model + * @param useCodingModelSettings + */ + public void setUseCodingModelSettings(boolean useCodingModelSettings) { + this.useCodingModelSettings = useCodingModelSettings; + } } \ No newline at end of file diff --git a/src/gui/org/deidentifier/arx/gui/resources/messages.properties b/src/gui/org/deidentifier/arx/gui/resources/messages.properties index e6584b908..8c6f8ef65 100644 --- a/src/gui/org/deidentifier/arx/gui/resources/messages.properties +++ b/src/gui/org/deidentifier/arx/gui/resources/messages.properties @@ -1494,6 +1494,7 @@ DialogAnonymization.19=Best-effort, binary DialogAnonymization.20=Best-effort, top down DialogAnonymization.21=No algorithm has been selected DialogAnonymization.22=No transformation type has been selected +DialogAnonymization.23=Use coding model settings PaginationTable.0=Previous PaginationTable.1=Next PaginationTable.2=Items {0}-{1} of {2} diff --git a/src/gui/org/deidentifier/arx/gui/view/impl/menu/DialogAnonymization.java b/src/gui/org/deidentifier/arx/gui/view/impl/menu/DialogAnonymization.java index a9a2f2517..82c1408eb 100644 --- a/src/gui/org/deidentifier/arx/gui/view/impl/menu/DialogAnonymization.java +++ b/src/gui/org/deidentifier/arx/gui/view/impl/menu/DialogAnonymization.java @@ -75,6 +75,8 @@ public class DialogAnonymization extends TitleAreaDialog { private Text txtHeuristicSearchStepLimit; /** View */ private Text textNumIterations; + /** Button */ + private Button btnUseCodingModelSettings; /** View */ private Button radioTimeLimit; /** View */ @@ -185,6 +187,10 @@ private void checkAndUpdateModel() { configuration.setNumIterations(getNumIterations()); } + // Handle parameter + configuration.setUseCodingModelSettings(this.btnUseCodingModelSettings.getSelection()); + + // Handle parameters if (btnLocalTransformation.isEnabled() && btnLocalTransformation.getSelection()) { configuration.setTransformationType(TransformationType.LOCAL); } else if (btnGlobalTransformation.isEnabled() && btnGlobalTransformation.getSelection()) { @@ -380,12 +386,12 @@ protected Control createDialogArea(Composite parent) { GridData data3 = SWTUtil.createFillGridData(); data3.horizontalIndent = 5; group3.setLayoutData(data3); - group3.setLayout(GridLayoutFactory.swtDefaults().numColumns(2).create()); + group3.setLayout(GridLayoutFactory.swtDefaults().numColumns(3).create()); // Radio - global transformation this.btnGlobalTransformation = new Button(group3, SWT.RADIO); this.btnGlobalTransformation.setText(Resources.getMessage("DialogAnonymization.10")); //$NON-NLS-1$ - this.btnGlobalTransformation.setLayoutData(GridDataFactory.swtDefaults().span(2, 1).create()); + this.btnGlobalTransformation.setLayoutData(GridDataFactory.swtDefaults().span(3, 1).create()); // Radio - local transformation this.btnLocalTransformation = new Button(group3, SWT.RADIO); @@ -394,6 +400,10 @@ protected Control createDialogArea(Composite parent) { // Tet - number iterations this.textNumIterations = new Text(group3, SWT.BORDER); this.textNumIterations.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create()); + + this.btnUseCodingModelSettings = new Button(group3, SWT.CHECK); + this.btnUseCodingModelSettings.setText(Resources.getMessage("DialogAnonymization.23")); //$NON-NLS-1$ + this.btnUseCodingModelSettings.setLayoutData(GridDataFactory.swtDefaults().create()); /* * Set initial values @@ -425,6 +435,7 @@ protected Control createDialogArea(Composite parent) { case LOCAL: btnLocalTransformation.setSelection(true); break; } this.textNumIterations.setText(String.valueOf(configuration.getNumIterations())); + this.btnUseCodingModelSettings.setSelection(configuration.isUseCodingModelSettings()); /* * Customize according to currently available settings @@ -438,6 +449,7 @@ protected Control createDialogArea(Composite parent) { this.btnGlobalTransformation.setSelection(true); this.configuration.setTransformationType(TransformationType.GLOBAL); this.textNumIterations.setEnabled(false); + this.btnUseCodingModelSettings.setEnabled(false); createMessage(group3, 2, Resources.getMessage("DialogAnonymization.12")); //$NON-NLS-1$ } @@ -566,6 +578,7 @@ public void widgetSelected(SelectionEvent arg0) { @Override public void modifyText(ModifyEvent arg0) { radioStepLimit.setSelection(true); + radioTimeLimit.setSelection(false); checkAndUpdateModel(); } }); @@ -574,6 +587,7 @@ public void modifyText(ModifyEvent arg0) { @Override public void modifyText(ModifyEvent arg0) { radioTimeLimit.setSelection(true); + radioStepLimit.setSelection(false); checkAndUpdateModel(); } }); @@ -601,6 +615,15 @@ public void modifyText(ModifyEvent arg0) { } }); + this.btnUseCodingModelSettings.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent arg0) { + btnLocalTransformation.setSelection(true); + btnGlobalTransformation.setSelection(false); + checkAndUpdateModel(); + } + }); + // Done applyDialogFont(base); checkAndUpdateModel(); diff --git a/src/gui/org/deidentifier/arx/gui/worker/WorkerAnonymize.java b/src/gui/org/deidentifier/arx/gui/worker/WorkerAnonymize.java index 62b0dadac..a2802cf4c 100644 --- a/src/gui/org/deidentifier/arx/gui/worker/WorkerAnonymize.java +++ b/src/gui/org/deidentifier/arx/gui/worker/WorkerAnonymize.java @@ -111,7 +111,14 @@ public void run(final IProgressMonitor monitor) throws InvocationTargetException // Overwrite user-defined settings to prepare local recoding if (transformationType == TransformationType.LOCAL) { MetricConfiguration metricConfig = config.getQualityModel().getConfiguration(); - metricConfig.setGsFactor(0d); + + // Use user-defined gs factor, if configured + if (model.getAnonymizationConfiguration().isUseCodingModelSettings()) { + metricConfig.setGsFactor(model.getMetricConfiguration().getGsFactor()); + // Default is 0 + } else { + metricConfig.setGsFactor(0d); + } config.setQualityModel(config.getQualityModel().getDescription().createInstance(metricConfig)); config.setSuppressionLimit(1d - (1d / (double)model.getLocalRecodingModel().getNumIterations())); }