From 6c8ce65959a09d41e02412ebf37823b113c478e8 Mon Sep 17 00:00:00 2001 From: Viacheslav Pavlov Date: Tue, 9 Jul 2019 15:49:17 +0300 Subject: [PATCH] Settings: ignored INSTCODEs --- .../java/org/genesys2/anno/gui/AppWindow.java | 10 ++ .../org/genesys2/anno/gui/PushDialog.java | 16 +- .../org/genesys2/anno/gui/SettingsDialog.java | 159 ++++++++++++++++++ .../genesys2/anno/model/InstCodeSettings.java | 59 +++++++ .../genesys2/anno/model/LoadableSettings.java | 12 ++ .../org/genesys2/anno/model/Settings.java | 27 ++- 6 files changed, 279 insertions(+), 4 deletions(-) create mode 100644 anno-gui/src/main/java/org/genesys2/anno/model/InstCodeSettings.java create mode 100644 anno-gui/src/main/java/org/genesys2/anno/model/LoadableSettings.java diff --git a/anno-gui/src/main/java/org/genesys2/anno/gui/AppWindow.java b/anno-gui/src/main/java/org/genesys2/anno/gui/AppWindow.java index 9512c6e..e1bfea7 100644 --- a/anno-gui/src/main/java/org/genesys2/anno/gui/AppWindow.java +++ b/anno-gui/src/main/java/org/genesys2/anno/gui/AppWindow.java @@ -82,6 +82,7 @@ import org.genesys2.anno.model.ColumnDef; import org.genesys2.anno.model.Settings; import org.json.JSONException; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; @@ -109,6 +110,9 @@ public class AppWindow { @Autowired private Settings settings; + + @Value("${genesys.magic.workspace}") + protected String workspacePath; private ExecutorService threadPool = Executors.newFixedThreadPool(4); @@ -305,6 +309,12 @@ public class AppWindow { createContents(); shlGenesysMagic.open(); shlGenesysMagic.layout(); + try { + System.err.println("Trying to load props"); + settings.load(workspacePath + "/local.properties"); + } catch (IOException e) { + System.err.println("Failed to load props: " + e.getMessage()); + } while (!shlGenesysMagic.isDisposed()) { if (!display.readAndDispatch()) { diff --git a/anno-gui/src/main/java/org/genesys2/anno/gui/PushDialog.java b/anno-gui/src/main/java/org/genesys2/anno/gui/PushDialog.java index 3b5d1e6..d625725 100644 --- a/anno-gui/src/main/java/org/genesys2/anno/gui/PushDialog.java +++ b/anno-gui/src/main/java/org/genesys2/anno/gui/PushDialog.java @@ -432,6 +432,8 @@ public class PushDialog extends Dialog { if (count % 100 == 0) _log.debug("Examining data at row " + count); + final Set instCodesFilter = settings.getInstCodeSettings().getInstCodes(); + final boolean isBlackList = settings.getInstCodeSettings().isBlackList(); for (Object[] row : rows) { count++; @@ -442,6 +444,14 @@ public class PushDialog extends Dialog { // Check for instCode accnJson.get(Api1Constants.Accession.INSTCODE).textValue(); + final String accessionInstCode = (String) accnMap.get(RdfMCPD.INSTCODE); + + // If filtering, check INSTCODE is listed + if (instCodesFilter.size() > 0 && !(isBlackList ^ instCodesFilter.contains(accessionInstCode))) { + _log.info("Ignoring accessions with inst code : " + accessionInstCode); + continue; + } + } catch (Throwable e) { _log.info("Error in row " + count + ". " + e.getMessage() + ": " + ArrayUtils.toString(row)); } @@ -618,7 +628,8 @@ public class PushDialog extends Dialog { genesysClient.me(); // Filter only for specific INSTCODES - final Set instCodesFilter = new HashSet<>(); + final Set instCodesFilter = settings.getInstCodeSettings().getInstCodes(); + final boolean isBlackList = settings.getInstCodeSettings().isBlackList(); _log.warn("Running upload for " + instCodesFilter.toString()); @@ -664,7 +675,8 @@ public class PushDialog extends Dialog { final String accessionInstCode = (String) accnMap.get(RdfMCPD.INSTCODE); // If filtering, check INSTCODE is listed - if (instCodesFilter.size() > 0 && ! instCodesFilter.contains(accessionInstCode)) { + if (instCodesFilter.size() > 0 && !(isBlackList ^ instCodesFilter.contains(accessionInstCode))) { + _log.info("Ignoring accessions with inst code : " + accessionInstCode); continue; } diff --git a/anno-gui/src/main/java/org/genesys2/anno/gui/SettingsDialog.java b/anno-gui/src/main/java/org/genesys2/anno/gui/SettingsDialog.java index 730b05f..73709fe 100644 --- a/anno-gui/src/main/java/org/genesys2/anno/gui/SettingsDialog.java +++ b/anno-gui/src/main/java/org/genesys2/anno/gui/SettingsDialog.java @@ -26,6 +26,8 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.events.FocusAdapter; import org.eclipse.swt.events.FocusEvent; +import org.eclipse.swt.events.KeyAdapter; +import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; @@ -33,14 +35,18 @@ import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Dialog; import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.TabFolder; import org.eclipse.swt.widgets.TabItem; import org.eclipse.swt.widgets.Text; +import org.genesys2.anno.model.InstCodeSettings; import org.genesys2.anno.model.OAuthSettings; import org.genesys2.anno.model.Settings; import org.genesys2.client.oauth.GenesysApiException; @@ -50,9 +56,12 @@ import org.genesys2.client.oauth.OAuthAuthenticationException; import org.genesys2.client.oauth.PleaseRetryException; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import swing2swt.layout.BorderLayout; +import java.io.IOException; import java.util.Arrays; +import java.util.Set; public class SettingsDialog extends Dialog { @@ -66,6 +75,9 @@ public class SettingsDialog extends Dialog { private static final Logger _log = Logger.getLogger(SettingsDialog.class); private DataBindingContext m_bindingContext; + @Value("${genesys.magic.workspace}") + protected String workspacePath; + @Autowired private Settings settings; @@ -80,6 +92,8 @@ public class SettingsDialog extends Dialog { private Text txtClientKey; private Text txtClientSecret; private Text txtScope; + private Text txtInstCodesToIgnore; + private Composite grpInstCodes; /** * Create the dialog. @@ -125,6 +139,7 @@ public class SettingsDialog extends Dialog { TabItem tbtmGenesysApi = new TabItem(tabFolder, SWT.NONE); tbtmGenesysApi.setText("Genesys API"); + renderAdvancedSection(tabFolder); ScrolledComposite scrolledComposite = new ScrolledComposite(tabFolder, SWT.V_SCROLL); scrolledComposite.setShowFocusedControl(true); tbtmGenesysApi.setControl(scrolledComposite); @@ -178,6 +193,150 @@ public class SettingsDialog extends Dialog { m_bindingContext = initDataBindings(); } + private void renderAdvancedSection(TabFolder tabFolder) { + InstCodeSettings instCodeSettings = settings.getInstCodeSettings(); + + TabItem advancedTab = new TabItem(tabFolder, SWT.NONE); + advancedTab.setText("Advanced"); + + ScrolledComposite tabContents = new ScrolledComposite(tabFolder, SWT.V_SCROLL); + tabContents.setExpandHorizontal(true); + tabContents.setShowFocusedControl(true); + advancedTab.setControl(tabContents); + + Composite composite = new Composite(tabContents, SWT.NONE); + composite.setLayout(new GridLayout(1, false)); + composite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1)); + + renderAdvancedControllSection(composite); + + Group instCodesGroup = new Group(composite, SWT.BORDER); + instCodesGroup.setLayout(new GridLayout()); + instCodesGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + instCodesGroup.setText("Selected institute codes"); + + grpInstCodes = new Composite(instCodesGroup, SWT.FILL); + grpInstCodes.setLayout(new GridLayout(6, true)); + grpInstCodes.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true)); + + renderInstCodesList(composite); + + composite.pack(); + tabContents.setContent(composite); + tabContents.setMinSize(composite.computeSize(SWT.FILL, SWT.FILL)); + } + + private void renderAdvancedControllSection(Composite composite) { + InstCodeSettings instCodeSettings = settings.getInstCodeSettings(); + + Group controlSection = new Group(composite, SWT.BORDER); + controlSection.setLayout(new GridLayout(1, false)); + controlSection.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + controlSection.setText("Institute codes filtering"); + + Composite radioButtonsComposite = new Composite(controlSection, SWT.NONE); + radioButtonsComposite.setLayout(new GridLayout(2, false)); + + Button isWhitelistButton = new Button(radioButtonsComposite, SWT.RADIO); + isWhitelistButton.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + instCodeSettings.setBlackList(false); + } + }); + isWhitelistButton.setSelection(!instCodeSettings.isBlackList()); + isWhitelistButton.setText("Whitelist"); + + Button isBlacklitButton = new Button(radioButtonsComposite, SWT.RADIO); + isBlacklitButton.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + instCodeSettings.setBlackList(true); + } + }); + isBlacklitButton.setSelection(instCodeSettings.isBlackList()); + isBlacklitButton.setText("Blacklist"); + + Button saveBtn = new Button(composite, SWT.NONE); + saveBtn.setLayoutData(new GridData(SWT.END, SWT.CENTER, false, false)); + saveBtn.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent event) { + try { + settings.save(workspacePath + "/local.properties"); + } catch (IOException err) { + System.err.println("Failed to load props: " + err.getMessage()); + } + } + }); + saveBtn.setText("Save"); + + txtInstCodesToIgnore = new Text(controlSection, SWT.BORDER); + txtInstCodesToIgnore.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + txtInstCodesToIgnore.setTextLimit(6); + txtInstCodesToIgnore.addListener(SWT.FocusOut, new Listener() { + @Override + public void handleEvent(Event event) { + if (!txtInstCodesToIgnore.getText().trim().isEmpty()) { + instCodeSettings.getInstCodes().add(txtInstCodesToIgnore.getText().trim()); + txtInstCodesToIgnore.setText(""); + renderInstCodesList(composite); + + } + } + }); + + txtInstCodesToIgnore.addKeyListener(new KeyAdapter() { + @Override + public void keyReleased(KeyEvent e) { + final int ENTER_KEY_CODE = 13; + if (e.keyCode == ENTER_KEY_CODE && !txtInstCodesToIgnore.getText().trim().isEmpty()) { + instCodeSettings.getInstCodes().add(txtInstCodesToIgnore.getText().trim()); + txtInstCodesToIgnore.setText(""); + renderInstCodesList(composite); + + } + } + }); + } + + private void renderInstCodesList(Composite parent) { + InstCodeSettings instCodeSettings = settings.getInstCodeSettings(); + Set instCodes = instCodeSettings.getInstCodes(); + + if (grpInstCodes != null) { + for (Control control : grpInstCodes.getChildren()) { + control.dispose(); + } + } + + for (String instCode : instCodes) { + Group someGroup = new Group(grpInstCodes, SWT.FILL); + someGroup.setLayout(new GridLayout(2, false)); + someGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + Label lblGenesysServer = new Label(someGroup, SWT.NONE); + lblGenesysServer.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, true, false)); + lblGenesysServer.setText(instCode); + + Button removeInstCodeButton = new Button(someGroup, SWT.PUSH); + removeInstCodeButton.setData(instCode); + removeInstCodeButton.setLayoutData(new GridData(SWT.END, SWT.CENTER, true, true)); + removeInstCodeButton.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + instCodes.remove(instCode); + renderInstCodesList(parent); + } + }); + removeInstCodeButton.setData(instCode); + removeInstCodeButton.setText("X"); + } + grpInstCodes.pack(); + parent.pack(); + shell.layout(true, true); + } + private void renderServerSection(Group grpGenesysServer, Group grpGenesysApiConfiguration) { OAuthSettings oauthSettings = settings.getOauthSettings(); diff --git a/anno-gui/src/main/java/org/genesys2/anno/model/InstCodeSettings.java b/anno-gui/src/main/java/org/genesys2/anno/model/InstCodeSettings.java new file mode 100644 index 0000000..6b634e8 --- /dev/null +++ b/anno-gui/src/main/java/org/genesys2/anno/model/InstCodeSettings.java @@ -0,0 +1,59 @@ +package org.genesys2.anno.model; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Arrays; +import java.util.Properties; +import java.util.Set; +import java.util.TreeSet; + +public class InstCodeSettings extends LoadableSettings { + + private static String instCodesPropName = "instCodes"; + private static String isBlackListPropName = "isBlackList"; + + private Set instCodes = new TreeSet<>(); + private boolean isBlackList = false; + + public Set getInstCodes() { + return instCodes; + } + + public void setInstCodes(Set instCodes) { + firePropertyChange("instCodes", null, this.instCodes); + this.instCodes = instCodes; + } + + public boolean isBlackList() { + return isBlackList; + } + + public void setBlackList(boolean blackList) { + firePropertyChange("isBlackList", null, this.isBlackList); + isBlackList = blackList; + } + + @Override + public void save(String propFilePath) throws IOException { + firePropertyChange("instCodeSettings", null, this); + + Properties prop = new Properties(); + prop.setProperty(instCodesPropName, this.getInstCodes().toString()); + prop.setProperty(isBlackListPropName, String.valueOf(this.isBlackList())); + prop.store(new FileOutputStream(propFilePath), "Inst codes filtering saved"); + } + + @Override + public LoadableSettings load(String propFilePath) throws IOException { + Properties prop = new Properties(); + prop.load(new FileInputStream(propFilePath)); + + if (!prop.isEmpty()) { + this.instCodes = new TreeSet<>(Arrays.asList(prop.getProperty(instCodesPropName).replaceAll("[,\\[\\]]", "").split(" +"))); + this.isBlackList = Boolean.valueOf(prop.getProperty(isBlackListPropName)); + } + firePropertyChange("instCodeSettings", null, this); + return this; + } +} diff --git a/anno-gui/src/main/java/org/genesys2/anno/model/LoadableSettings.java b/anno-gui/src/main/java/org/genesys2/anno/model/LoadableSettings.java new file mode 100644 index 0000000..7d96203 --- /dev/null +++ b/anno-gui/src/main/java/org/genesys2/anno/model/LoadableSettings.java @@ -0,0 +1,12 @@ +package org.genesys2.anno.model; + +import org.genesys2.anno.gui.AbstractModelObject; + +import java.io.IOException; + +public abstract class LoadableSettings extends AbstractModelObject { + + public abstract void save(String propFilePath) throws IOException; + + public abstract LoadableSettings load(String propFilePath) throws IOException; +} diff --git a/anno-gui/src/main/java/org/genesys2/anno/model/Settings.java b/anno-gui/src/main/java/org/genesys2/anno/model/Settings.java index 67ab51a..992c255 100644 --- a/anno-gui/src/main/java/org/genesys2/anno/model/Settings.java +++ b/anno-gui/src/main/java/org/genesys2/anno/model/Settings.java @@ -15,10 +15,12 @@ */ package org.genesys2.anno.model; -import org.genesys2.anno.gui.AbstractModelObject; +import java.io.IOException; + +public class Settings extends LoadableSettings { -public class Settings extends AbstractModelObject { private OAuthSettings oauthSettings = new OAuthSettings(); + private InstCodeSettings instCodeSettings = new InstCodeSettings(); public OAuthSettings getOauthSettings() { return oauthSettings; @@ -28,4 +30,25 @@ public class Settings extends AbstractModelObject { this.oauthSettings = oauthSettings; firePropertyChange("oauthSettings", null, this.oauthSettings); } + + public InstCodeSettings getInstCodeSettings() { + return instCodeSettings; + } + + public void setInstCodeSettings(InstCodeSettings instCodeSettings) { + firePropertyChange("instCodeSettings", null, this.instCodeSettings); + this.instCodeSettings = instCodeSettings; + } + + @Override + public void save(String propFilePath) throws IOException { + instCodeSettings.save(propFilePath); + } + + @Override + public LoadableSettings load(String propFilePath) throws IOException { + setInstCodeSettings((InstCodeSettings)instCodeSettings.load(propFilePath)); + + return this; + } } -- GitLab