]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.debug.ui/src/org/simantics/debug/ui/ResourceSearch.java
Externalize strings in org.simantics.debug.ui
[simantics/platform.git] / bundles / org.simantics.debug.ui / src / org / simantics / debug / ui / ResourceSearch.java
index b61f966e2baaae537498fd7f65a5650ef594a621..0032a98fbf4290004d87d9fca91fc007dbe73515 100644 (file)
-/*******************************************************************************\r
- * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
- * in Industry THTH ry.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- *     VTT Technical Research Centre of Finland - initial API and implementation\r
- *     Semantum Oy - index based searching (#4255)\r
- *******************************************************************************/\r
-package org.simantics.debug.ui;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.Collections;\r
-import java.util.HashSet;\r
-import java.util.LinkedList;\r
-import java.util.List;\r
-import java.util.Set;\r
-import java.util.regex.Pattern;\r
-\r
-import org.simantics.db.ReadGraph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.Statement;\r
-import org.simantics.db.common.request.Queries;\r
-import org.simantics.db.common.request.ReadRequest;\r
-import org.simantics.db.common.utils.NameUtils;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.db.request.Read;\r
-import org.simantics.layer0.Layer0;\r
-import org.simantics.utils.strings.EString;\r
-import org.simantics.utils.threads.IThreadWorkQueue;\r
-\r
-public class ResourceSearch extends ReadRequest {\r
-\r
-    public static final IResourceFilter FILTER_ALL = new IResourceFilter() {\r
-        @Override\r
-        public boolean acceptResource(ReadGraph g, Resource r) {\r
-            return true;\r
-        }\r
-    };\r
-\r
-    public static final IResourceFilter FILTER_RELATIONS = new IResourceFilter() {\r
-        @Override\r
-        public boolean acceptResource(ReadGraph g, Resource r) throws DatabaseException {\r
-            return g.isInstanceOf(r, Layer0.getInstance(g).Relation);\r
-        }\r
-    };\r
-\r
-    public static final IResourceFilter FILTER_TYPES = new IResourceFilter() {\r
-        @Override\r
-        public boolean acceptResource(ReadGraph g, Resource r) throws DatabaseException {\r
-            Layer0 L0 = Layer0.getInstance(g);\r
-            return g.isInstanceOf(r, L0.Type) && !g.isInstanceOf(r, L0.Relation);\r
-        }\r
-    };\r
-\r
-    /**\r
-     * Create filter that matches URI, ID and NAME using wildcard compare\r
-     * @param txt\r
-     * @return\r
-     */\r
-    public static final IResourceFilter createFilter(String txt) {\r
-        final Pattern p = EString.compileSimplePattern(txt);\r
-        return new IResourceFilter() {\r
-            @Override\r
-            public boolean acceptResource(ReadGraph g, Resource r) {\r
-                try {\r
-                    String uri = g.syncRequest(Queries.possibleUri(r));\r
-                    if (uri != null && p.matcher(uri).matches())\r
-                        return true;\r
-                } catch (Throwable t) {}\r
-\r
-                try {\r
-                    String name = NameUtils.getSafeName(g, r);\r
-                    if (p.matcher(name).matches())\r
-                        return true;\r
-                } catch (Throwable t) {}\r
-\r
-                String id = Long.toString(r.getResourceId());\r
-                if (p.matcher(id).matches())\r
-                    return true;\r
-\r
-                return false;\r
-            }\r
-        };\r
-    }\r
-\r
-    public interface IResourceFilter {\r
-        boolean acceptResource(ReadGraph g, Resource r) throws DatabaseException;\r
-    }\r
-\r
-    public interface SearchListener {\r
-        /**\r
-         * \r
-         * @param s\r
-         * @param r\r
-         * @param g graph if listening is not async, if so then null\r
-         */\r
-        void onResourceFound(Read<?> s, Collection<Resource> r, ReadGraph g) throws DatabaseException;\r
-        void onSearchComplete(Read<?> s);\r
-        void onError(Read<?> s, Throwable e);\r
-    }\r
-\r
-    boolean canceled = false;\r
-    IResourceFilter filter;\r
-    SearchListener listener;\r
-    IThreadWorkQueue listenerThread;\r
-    ResFoundQueue resFoundQueue;\r
-    boolean asyncListening;\r
-\r
-    public ResourceSearch(IResourceFilter f, SearchListener l, IThreadWorkQueue listenerThread, boolean asyncListening)\r
-    {\r
-        assert(f!=null && l!=null);\r
-        this.filter = f;\r
-        this.listener = l;\r
-        this.listenerThread = listenerThread;\r
-        this.asyncListening = asyncListening;\r
-        if (listenerThread!=null)\r
-            resFoundQueue = new ResFoundQueue();\r
-    }\r
-\r
-    public void cancel() {\r
-        canceled = true;\r
-    }\r
-\r
-    public boolean isCanceled() {\r
-        return canceled;\r
-    }\r
-\r
-    private class ResFoundQueue implements Runnable {\r
-        ReadGraph g;\r
-        List<Resource> list = new ArrayList<Resource>();\r
-        /**\r
-         * add res to queue\r
-         * @param r\r
-         * @return true if other resources are still unhandled\r
-         */\r
-        synchronized boolean addResource(Resource r) {\r
-            list.add(r);\r
-            return list.size()>1;\r
-        }\r
-        @Override\r
-        public void run() {\r
-            try {\r
-                Collection<Resource> l = null;\r
-                synchronized(this) {\r
-                    if (list.size()==0) return;\r
-                    if (list.size()<10) {\r
-                        listener.onResourceFound(ResourceSearch.this, list, g);\r
-                        list.clear();\r
-                        return;\r
-                    }\r
-                    l = new ArrayList<Resource>(list);\r
-                    list.clear();\r
-                }\r
-                listener.onResourceFound(ResourceSearch.this, l, g);\r
-            } catch (DatabaseException e) {\r
-\r
-            }\r
-        }\r
-    }\r
-\r
-    @Override\r
-    public void run(ReadGraph g) {\r
-        try {\r
-            if (!asyncListening && resFoundQueue!=null) resFoundQueue.g = g;\r
-            Resource root = g.getResource("http:/");\r
-            Layer0 L0 = Layer0.getInstance(g);\r
-            LinkedList<Resource> queue = new LinkedList<Resource>();\r
-            queue.add(root);\r
-            Set<Resource> queued = new HashSet<Resource>();\r
-            while(!queue.isEmpty() && !canceled) {\r
-                Resource r = queue.removeFirst();\r
-                if (filter.acceptResource(g, r)) {\r
-                    if (listenerThread==null)\r
-                        listener.onResourceFound(ResourceSearch.this, Collections.singletonList(r), g);\r
-                    else {\r
-                        if (!resFoundQueue.addResource(r)) {\r
-                            if (asyncListening)\r
-                                listenerThread.asyncExec(resFoundQueue);\r
-                            else\r
-                                listenerThread.syncExec(resFoundQueue);\r
-                        }\r
-                    }\r
-                }\r
-                for (Statement stm : g.getStatements(r, L0.IsWeaklyRelatedTo))\r
-                {\r
-                    Resource n = stm.getPredicate();\r
-                    if (!queued.contains(n)) {\r
-                        queue.add(n);\r
-                        queued.add(n);\r
-                    }\r
-\r
-                    n = stm.getObject();\r
-                    if (!queued.contains(n)) {\r
-                        queue.add(n);\r
-                        queued.add(n);\r
-                    }\r
-                }\r
-                if (listenerThread==null)\r
-                    listener.onSearchComplete(ResourceSearch.this);\r
-                else {\r
-                    Runnable run = new Runnable() {\r
-                        @Override\r
-                        public void run() {\r
-                            ResourceSearch.this.listener.onSearchComplete(ResourceSearch.this);\r
-                        }};\r
-                        if (asyncListening)\r
-                            listenerThread.asyncExec(run);\r
-                        else\r
-                            listenerThread.syncExec(run);\r
-                }\r
-            }\r
-        } catch (final Throwable e) {\r
-            if (listenerThread==null)\r
-                listener.onError(ResourceSearch.this, e);\r
-            else {\r
-                Runnable r = new Runnable() {\r
-                    @Override\r
-                    public void run() {\r
-                        listener.onError(ResourceSearch.this, e);\r
-                    }};\r
-                    if (asyncListening)\r
-                        listenerThread.asyncExec(r);\r
-                    else\r
-                        listenerThread.syncExec(r);\r
-            }\r
-        }\r
-    }\r
-\r
-}\r
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management
+ * in Industry THTH ry.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     VTT Technical Research Centre of Finland - initial API and implementation
+ *     Semantum Oy - index based searching (#4255)
+ *******************************************************************************/
+package org.simantics.debug.ui;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import org.simantics.db.ReadGraph;
+import org.simantics.db.Resource;
+import org.simantics.db.Statement;
+import org.simantics.db.common.request.Queries;
+import org.simantics.db.common.request.ReadRequest;
+import org.simantics.db.common.utils.NameUtils;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.request.Read;
+import org.simantics.layer0.Layer0;
+import org.simantics.utils.strings.EString;
+import org.simantics.utils.threads.IThreadWorkQueue;
+
+public class ResourceSearch extends ReadRequest {
+
+    public static final IResourceFilter FILTER_ALL = new IResourceFilter() {
+        @Override
+        public boolean acceptResource(ReadGraph g, Resource r) {
+            return true;
+        }
+    };
+
+    public static final IResourceFilter FILTER_RELATIONS = new IResourceFilter() {
+        @Override
+        public boolean acceptResource(ReadGraph g, Resource r) throws DatabaseException {
+            return g.isInstanceOf(r, Layer0.getInstance(g).Relation);
+        }
+    };
+
+    public static final IResourceFilter FILTER_TYPES = new IResourceFilter() {
+        @Override
+        public boolean acceptResource(ReadGraph g, Resource r) throws DatabaseException {
+            Layer0 L0 = Layer0.getInstance(g);
+            return g.isInstanceOf(r, L0.Type) && !g.isInstanceOf(r, L0.Relation);
+        }
+    };
+
+    /**
+     * Create filter that matches URI, ID and NAME using wildcard compare
+     * @param txt
+     * @return
+     */
+    public static final IResourceFilter createFilter(String txt) {
+        final Pattern p = EString.compileSimplePattern(txt);
+        return new IResourceFilter() {
+            @Override
+            public boolean acceptResource(ReadGraph g, Resource r) {
+                try {
+                    String uri = g.syncRequest(Queries.possibleUri(r));
+                    if (uri != null && p.matcher(uri).matches())
+                        return true;
+                } catch (Throwable t) {}
+
+                try {
+                    String name = NameUtils.getSafeName(g, r);
+                    if (p.matcher(name).matches())
+                        return true;
+                } catch (Throwable t) {}
+
+                String id = Long.toString(r.getResourceId());
+                if (p.matcher(id).matches())
+                    return true;
+
+                return false;
+            }
+        };
+    }
+
+    public interface IResourceFilter {
+        boolean acceptResource(ReadGraph g, Resource r) throws DatabaseException;
+    }
+
+    public interface SearchListener {
+        /**
+         * 
+         * @param s
+         * @param r
+         * @param g graph if listening is not async, if so then null
+         */
+        void onResourceFound(Read<?> s, Collection<Resource> r, ReadGraph g) throws DatabaseException;
+        void onSearchComplete(Read<?> s);
+        void onError(Read<?> s, Throwable e);
+    }
+
+    boolean canceled = false;
+    IResourceFilter filter;
+    SearchListener listener;
+    IThreadWorkQueue listenerThread;
+    ResFoundQueue resFoundQueue;
+    boolean asyncListening;
+
+    public ResourceSearch(IResourceFilter f, SearchListener l, IThreadWorkQueue listenerThread, boolean asyncListening)
+    {
+        assert(f!=null && l!=null);
+        this.filter = f;
+        this.listener = l;
+        this.listenerThread = listenerThread;
+        this.asyncListening = asyncListening;
+        if (listenerThread!=null)
+            resFoundQueue = new ResFoundQueue();
+    }
+
+    public void cancel() {
+        canceled = true;
+    }
+
+    public boolean isCanceled() {
+        return canceled;
+    }
+
+    private class ResFoundQueue implements Runnable {
+        ReadGraph g;
+        List<Resource> list = new ArrayList<Resource>();
+        /**
+         * add res to queue
+         * @param r
+         * @return true if other resources are still unhandled
+         */
+        synchronized boolean addResource(Resource r) {
+            list.add(r);
+            return list.size()>1;
+        }
+        @Override
+        public void run() {
+            try {
+                Collection<Resource> l = null;
+                synchronized(this) {
+                    if (list.size()==0) return;
+                    if (list.size()<10) {
+                        listener.onResourceFound(ResourceSearch.this, list, g);
+                        list.clear();
+                        return;
+                    }
+                    l = new ArrayList<Resource>(list);
+                    list.clear();
+                }
+                listener.onResourceFound(ResourceSearch.this, l, g);
+            } catch (DatabaseException e) {
+
+            }
+        }
+    }
+
+    @Override
+    public void run(ReadGraph g) {
+        try {
+            if (!asyncListening && resFoundQueue!=null) resFoundQueue.g = g;
+            Resource root = g.getResource("http:/"); //$NON-NLS-1$
+            Layer0 L0 = Layer0.getInstance(g);
+            LinkedList<Resource> queue = new LinkedList<Resource>();
+            queue.add(root);
+            Set<Resource> queued = new HashSet<Resource>();
+            while(!queue.isEmpty() && !canceled) {
+                Resource r = queue.removeFirst();
+                if (filter.acceptResource(g, r)) {
+                    if (listenerThread==null)
+                        listener.onResourceFound(ResourceSearch.this, Collections.singletonList(r), g);
+                    else {
+                        if (!resFoundQueue.addResource(r)) {
+                            if (asyncListening)
+                                listenerThread.asyncExec(resFoundQueue);
+                            else
+                                listenerThread.syncExec(resFoundQueue);
+                        }
+                    }
+                }
+                for (Statement stm : g.getStatements(r, L0.IsWeaklyRelatedTo))
+                {
+                    Resource n = stm.getPredicate();
+                    if (!queued.contains(n)) {
+                        queue.add(n);
+                        queued.add(n);
+                    }
+
+                    n = stm.getObject();
+                    if (!queued.contains(n)) {
+                        queue.add(n);
+                        queued.add(n);
+                    }
+                }
+                if (listenerThread==null)
+                    listener.onSearchComplete(ResourceSearch.this);
+                else {
+                    Runnable run = new Runnable() {
+                        @Override
+                        public void run() {
+                            ResourceSearch.this.listener.onSearchComplete(ResourceSearch.this);
+                        }};
+                        if (asyncListening)
+                            listenerThread.asyncExec(run);
+                        else
+                            listenerThread.syncExec(run);
+                }
+            }
+        } catch (final Throwable e) {
+            if (listenerThread==null)
+                listener.onError(ResourceSearch.this, e);
+            else {
+                Runnable r = new Runnable() {
+                    @Override
+                    public void run() {
+                        listener.onError(ResourceSearch.this, e);
+                    }};
+                    if (asyncListening)
+                        listenerThread.asyncExec(r);
+                    else
+                        listenerThread.syncExec(r);
+            }
+        }
+    }
+
+}