Merge branch 'release/5.42.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / preference / ListComponent.java
old mode 100755 (executable)
new mode 100644 (file)
index 9a5b1a9..196ba6f
@@ -8,15 +8,26 @@
 */
 package eu.etaxonomy.taxeditor.preference;
 
-
 import java.awt.Toolkit;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
 import java.net.URL;
+import java.util.ArrayList;
+import java.util.Iterator;
 
 import javax.swing.event.DocumentEvent;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.eclipse.equinox.internal.p2.ui.misc.StringMatcher;
+import org.eclipse.jface.fieldassist.ComboContentAdapter;
+import org.eclipse.jface.fieldassist.ContentProposalAdapter;
+import org.eclipse.jface.fieldassist.IContentProposal;
+import org.eclipse.jface.fieldassist.IContentProposalProvider;
 import org.eclipse.jface.resource.JFaceResources;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CLabel;
 import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.events.MouseEvent;
@@ -24,22 +35,24 @@ import org.eclipse.swt.events.MouseListener;
 import org.eclipse.swt.graphics.Rectangle;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.List;
 import org.eclipse.swt.widgets.Text;
 
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
 import eu.etaxonomy.cdm.model.metadata.CdmPreference;
 import eu.etaxonomy.cdm.model.metadata.PreferencePredicate;
 import eu.etaxonomy.taxeditor.l10n.Messages;
 import eu.etaxonomy.taxeditor.preference.menu.CdmPreferencePage;
 
-
 /**
  * @author k.luther
  * @date 20.04.2017
- *
  */
 public class ListComponent implements ModifyListener
                       {
@@ -48,16 +61,36 @@ public class ListComponent implements ModifyListener
     private static final String addString = Messages.ListComponent_ADD_PROVIDER;
     private static final String removeString = Messages.ListComponent_REMOVE_PROVIDER;
     private static final String noProvider = Messages.ListComponent_NO_PROVIDER_AVAILABLE;
+    private static final String serverSidePreference = "Server Side Preference:";
     private Button removeButton;
-    private Text providerURI;
+    private Combo providerURI;
     protected Label labelException;
     boolean isAdmin = false;
     CdmPreferencePage preferencePage;
+    CdmPreference providerListPreference;
+    String providerList;
+    java.util.List<String> items;
 
+    public CdmPreference getProviderListPreference() {
+        return providerListPreference;
+    }
+
+    public void setProviderListPreference(CdmPreference providerListPreference) {
+        this.providerListPreference = providerListPreference;
+    }
 
     public ListComponent(Composite parent, int style, boolean isAdmin, CdmPreferencePage parentPage) {
         this.isAdmin= isAdmin;
         this.preferencePage = parentPage;
+
+        providerListPreference = PreferencesUtil.getPreferenceFromDB(PreferencePredicate.BioCaseProvider);
+        if (!isAdmin && providerListPreference != null && !providerListPreference.isAllowOverride()){
+            Label editingNotAllowed = new Label(parent, style);
+            editingNotAllowed.setText(Messages.AbcdImportProvider_description_not_available);
+            return ;
+        }
+        final CLabel description = new CLabel(parent, SWT.NULL);
+        description.setText(Messages.AbcdImportProvider_description);
         list = new List(parent, SWT.BORDER |  SWT.V_SCROLL);
         GridData gridData = new GridData(SWT.FILL, SWT.CENTER, true, true, 2, 3);
         gridData.grabExcessHorizontalSpace = true;
@@ -66,23 +99,29 @@ public class ListComponent implements ModifyListener
         Rectangle clientArea = parent.getShell().getClientArea ();
         list.setBounds (clientArea.x, clientArea.y, 50, 500);
 
-        CdmPreference providerListPreference = PreferencesUtil.getPreferenceFromDB(PreferencePredicate.BioCaseProvider);
-        String allProviderString = ""; //$NON-NLS-1$
-        if (!isAdmin && (providerListPreference != null && providerListPreference.isAllowOverride())){
-            allProviderString = PreferencesUtil.getStringValue(PreferencePredicate.BioCaseProvider.getKey(), true);
+
+        providerList = null; //$NON-NLS-1$
+        String allProviderStringDB = "";
+
+        if (!isAdmin && ((providerListPreference != null && providerListPreference.isAllowOverride()) || providerListPreference == null)){
+            providerList = PreferencesUtil.getStringValue(PreferencePredicate.BioCaseProvider.getKey(), true);
+
         }else{
             if (providerListPreference != null){
-                allProviderString  = providerListPreference.getValue();
+                providerList  = providerListPreference.getValue();
             }
         }
-//         = PreferencesUtil.getPreferenceStore().getString(IPreferenceKeys.BIOCASE_PROVIDER_LIST);
+
         //the string is structured like this: http://ww3.bgbm.org/biocase/pywrapper.cgi?dsa=DNA_Bank;http:...;
-        String[] providerArray = allProviderString.split(";"); //$NON-NLS-1$
-        for (String providerString : providerArray){
-            if (!StringUtils.isBlank(providerString)){
-                list.add(providerString);
+        if (providerList != null){
+            String[] providerArray = providerList.split(";"); //$NON-NLS-1$
+            for (String providerString : providerArray){
+                if (!StringUtils.isBlank(providerString)){
+                    list.add(providerString);
+                }
             }
         }
+
         if (list.getItemCount() == 0){
             list.add(noProvider);
         }
@@ -93,22 +132,85 @@ public class ListComponent implements ModifyListener
         dataList.horizontalAlignment = GridData.FILL;
         dataList.horizontalSpan = 3;
 
-
 //        dataList.grabExcessVerticalSpace = true;
 
         list.setLayoutData(dataList);
 
+        providerURI = new Combo(parent, SWT.BORDER);
+
+        URL url;
+        String response = null;
+        try {
+            url = new URL("https://www.biocase.org/whats_biocase/gbif_biocase.cgi");
+
+            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+            conn.setRequestProperty("Accept", "application/json");
+    //        conn.setConnectTimeout(TIMEOUT*9);
+    //        conn.setReadTimeout(TIMEOUT*9);
+
+            if (conn.getResponseCode() != 200) {
+                throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
+            }
+            BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
+
+            StringBuilder  builder = new StringBuilder();
+            String line;
+            while ((line = br.readLine()) != null) {
+                builder.append(line);
+            }
+            conn.disconnect();
+            response = builder.toString();
+        } catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        java.util.List<BiocaseProvideConfig> listProvider = null;
+        ObjectMapper mapper = new ObjectMapper();
+        try {
+            listProvider = mapper.readValue(response, new TypeReference<java.util.List<BiocaseProvideConfig>>(){});
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        items = new ArrayList<>();
+        for (BiocaseProvideConfig conf: listProvider) {
+            items.add(conf.getService_url());
+            providerURI.add(conf.getService_url());
+        }
 
-        providerURI = new Text(parent, SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION);
         GridData dataProviderUri = new GridData();
         dataProviderUri.horizontalAlignment = GridData.FILL;
         dataProviderUri.horizontalSpan = 3;
         providerURI.setLayoutData(dataProviderUri);
-        providerURI.addModifyListener(this);
+      //  providerURI.setVisible(false);
+
+        ContentProposalAdapter adapter = new ContentProposalAdapter(providerURI, new ComboContentAdapter(), getProposalProvider(), null, null);
+        adapter.setPropagateKeys(true);
+        adapter.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE);
+//        String[] proposals = new String[providerURI.getItems().length];
+//
+//        for (int i = 0; i < providerURI.getItems().length; i++) {
+//            proposals[i] = providerURI.getItem(i);
+//        }
+//
+//        ComboViewer comboViewer = new ComboViewer(parent, SWT.NONE);
+//        comboViewer.setContentProvider(new ArrayContentProvider());
+//        comboViewer.setLabelProvider(new LabelProvider(){
+//            @Override
+//            public String getText(final Object element){
+//              if(element instanceof String){
+//                return (String) element;
+//              }
+//              return element.toString();
+//            }
+//        });
+//        comboViewer.setInput(proposals);
+//        // additionally, configure the comboViewer arbitrary
+//        AutoCompleteField field = new AutoCompleteField(comboViewer.getCombo(), new ComboContentAdapter(), proposals);
+
+        //providerURI.addModifyListener(this);
         labelException = new Label(parent, SWT.NULL);
         labelException.setText("");
 
-
         labelException.setLayoutData(dataProviderUri);
 
         Button addButton = new Button(parent, SWT.NULL);
@@ -121,6 +223,68 @@ public class ListComponent implements ModifyListener
         removeButton.addMouseListener(new RemoveListener());
     }
 
+    IContentProposalProvider getProposalProvider() {
+        return new IContentProposalProvider() {
+            @Override
+            public IContentProposal[] getProposals(String contents, int position) {
+                //String[] items = getStringItems();
+                if (contents.length() == 0 || items.isEmpty()) {
+                    return new IContentProposal[0];
+                }
+                StringMatcher matcher = new StringMatcher("*" + contents + "*", true, false); //$NON-NLS-1$ //$NON-NLS-2$
+                java.util.List<String> matches = new ArrayList<>();
+                Iterator<String> itemsIterator = items.iterator();
+                String nextItem = null;
+                while (itemsIterator.hasNext()) {
+                    nextItem = itemsIterator.next();
+                    if (matcher.match(nextItem) ) {
+                        matches.add(nextItem);
+                    }
+                }
+
+                // We don't want to autoactivate if the only proposal exactly matches
+                // what is in the combo.  This prevents the popup from
+                // opening when the user is merely scrolling through the combo values or
+                // has accepted a combo value.
+                if (matches.size() == 1 && matches.get(0).equals(providerURI.getText())) {
+                    return new IContentProposal[0];
+                }
+
+                if (matches.isEmpty()) {
+                    return new IContentProposal[0];
+                }
+
+                // Make the proposals
+                IContentProposal[] proposals = new IContentProposal[matches.size()];
+                for (int i = 0; i < matches.size(); i++) {
+                    final String proposal = matches.get(i);
+                    proposals[i] = new IContentProposal() {
+
+                        @Override
+                        public String getContent() {
+                            return proposal;
+                        }
+
+                        @Override
+                        public int getCursorPosition() {
+                            return proposal.length();
+                        }
+
+                        @Override
+                        public String getDescription() {
+                            return null;
+                        }
+
+                        @Override
+                        public String getLabel() {
+                            return null;
+                        }
+                    };
+                }
+                return proposals;
+            }
+        };
+    }
 
     public boolean isAdmin() {
         return isAdmin;
@@ -137,23 +301,34 @@ public class ListComponent implements ModifyListener
             //there's a valid selection
             //so go ahead and remove whatever's selected.
             int index = list.getSelectionIndex();
-            list.remove(index);
+            try{
+                String item = list.getItem(index);
+                if (item.equals(serverSidePreference)) {
+                    return;
+                }
+                list.remove(index);
 
-            int size = list.getItemCount();
 
-            if (size == 0) { //Nothing's left, disable removing.
-                removeButton.setEnabled(false);
+                int size = list.getItemCount();
 
-            } else { //Select an index.
-                if (index == size) {
-                    //removed item in last position
-                    index--;
-                }
+                if (size == 0) { //Nothing's left, disable removing.
+                    removeButton.setEnabled(false);
+
+                } else { //Select an index.
+                    if (index == size) {
+                        //removed item in last position
+                        index--;
+                    }
 
-                list.setSelection(index-1);
-                preferencePage.setApply(true);
+                    list.setSelection(index-1);
+                    preferencePage.setApply(true);
 
+                }
+            }catch(IllegalArgumentException iae){
+                //nothing was selected
+                return;
             }
+
         }
         /**
          * {@inheritDoc}
@@ -235,7 +410,7 @@ public class ListComponent implements ModifyListener
             //User didn't type in a unique name...
             if (name.equals("") || alreadyInList(name) || !StringUtils.isBlank(labelException.getText())) { //$NON-NLS-1$
                 Toolkit.getDefaultToolkit().beep();
-                providerURI.selectAll();
+                //providerURI.selectAll();
                 return;
             }
 
@@ -269,9 +444,9 @@ public class ListComponent implements ModifyListener
         String allProviderString = null;
         boolean first = true;
         for (String item: list.getItems()){
-            if (item.equals(noProvider)){
+            if (item.equals(noProvider) || item.equals(serverSidePreference)){
                 //do nothing
-            }else if (first || allProviderString == null || allProviderString == ""){ //$NON-NLS-1$
+            }else if (first || StringUtils.isBlank(allProviderString)){ //$NON-NLS-1$
                 allProviderString = item.trim();
                 first = false;
             }else {