Integrate plsql file search with Netbeans Ctrl-I search function release701
authorSubhashini Sooriarachchi <subslk@netbeans.org>
Wed, 20 Jun 2012 16:45:57 +0530
branchrelease701
changeset 246e0cd4dd397ab
parent 245 358bb49c1c5f
child 247 348555b6b391
Integrate plsql file search with Netbeans Ctrl-I search function
PLSQL/Navigator/nbproject/project.xml
PLSQL/Navigator/src/org/netbeans/modules/plsql/navigator/Bundle.properties
PLSQL/Navigator/src/org/netbeans/modules/plsql/navigator/PlsqlSearchProvider.java
PLSQL/Navigator/src/org/netbeans/modules/plsql/navigator/layer.xml
     1.1 --- a/PLSQL/Navigator/nbproject/project.xml	Tue Jun 19 17:09:07 2012 +0200
     1.2 +++ b/PLSQL/Navigator/nbproject/project.xml	Wed Jun 20 16:45:57 2012 +0530
     1.3 @@ -7,14 +7,6 @@
     1.4              <suite-component/>
     1.5              <module-dependencies>
     1.6                  <dependency>
     1.7 -                    <code-name-base>org.netbeans.modules.plsql.lexer</code-name-base>
     1.8 -                    <build-prerequisite/>
     1.9 -                    <compile-dependency/>
    1.10 -                    <run-dependency>
    1.11 -                        <specification-version>1.0</specification-version>
    1.12 -                    </run-dependency>
    1.13 -                </dependency>
    1.14 -                <dependency>
    1.15                      <code-name-base>org.jdesktop.layout</code-name-base>
    1.16                      <build-prerequisite/>
    1.17                      <compile-dependency/>
    1.18 @@ -24,6 +16,15 @@
    1.19                      </run-dependency>
    1.20                  </dependency>
    1.21                  <dependency>
    1.22 +                    <code-name-base>org.netbeans.modules.db</code-name-base>
    1.23 +                    <build-prerequisite/>
    1.24 +                    <compile-dependency/>
    1.25 +                    <run-dependency>
    1.26 +                        <release-version>1</release-version>
    1.27 +                        <specification-version>1.44.1.30</specification-version>
    1.28 +                    </run-dependency>
    1.29 +                </dependency>
    1.30 +                <dependency>
    1.31                      <code-name-base>org.netbeans.modules.editor</code-name-base>
    1.32                      <build-prerequisite/>
    1.33                      <compile-dependency/>
    1.34 @@ -69,6 +70,56 @@
    1.35                      </run-dependency>
    1.36                  </dependency>
    1.37                  <dependency>
    1.38 +                    <code-name-base>org.netbeans.modules.plsql.filetype</code-name-base>
    1.39 +                    <build-prerequisite/>
    1.40 +                    <compile-dependency/>
    1.41 +                    <run-dependency>
    1.42 +                        <specification-version>1.8.13</specification-version>
    1.43 +                    </run-dependency>
    1.44 +                </dependency>
    1.45 +                <dependency>
    1.46 +                    <code-name-base>org.netbeans.modules.plsql.lexer</code-name-base>
    1.47 +                    <build-prerequisite/>
    1.48 +                    <compile-dependency/>
    1.49 +                    <run-dependency>
    1.50 +                        <specification-version>1.0</specification-version>
    1.51 +                    </run-dependency>
    1.52 +                </dependency>
    1.53 +                <dependency>
    1.54 +                    <code-name-base>org.netbeans.modules.plsql.utilities</code-name-base>
    1.55 +                    <build-prerequisite/>
    1.56 +                    <compile-dependency/>
    1.57 +                    <run-dependency>
    1.58 +                        <specification-version>1.7.22</specification-version>
    1.59 +                    </run-dependency>
    1.60 +                </dependency>
    1.61 +                <dependency>
    1.62 +                    <code-name-base>org.netbeans.modules.plsqlsupport.db</code-name-base>
    1.63 +                    <build-prerequisite/>
    1.64 +                    <compile-dependency/>
    1.65 +                    <run-dependency>
    1.66 +                        <specification-version>1.8.23</specification-version>
    1.67 +                    </run-dependency>
    1.68 +                </dependency>
    1.69 +                <dependency>
    1.70 +                    <code-name-base>org.netbeans.modules.projectapi</code-name-base>
    1.71 +                    <build-prerequisite/>
    1.72 +                    <compile-dependency/>
    1.73 +                    <run-dependency>
    1.74 +                        <release-version>1</release-version>
    1.75 +                        <specification-version>1.36.1</specification-version>
    1.76 +                    </run-dependency>
    1.77 +                </dependency>
    1.78 +                <dependency>
    1.79 +                    <code-name-base>org.netbeans.modules.projectuiapi</code-name-base>
    1.80 +                    <build-prerequisite/>
    1.81 +                    <compile-dependency/>
    1.82 +                    <run-dependency>
    1.83 +                        <release-version>1</release-version>
    1.84 +                        <specification-version>1.51.2.8</specification-version>
    1.85 +                    </run-dependency>
    1.86 +                </dependency>
    1.87 +                <dependency>
    1.88                      <code-name-base>org.netbeans.modules.settings</code-name-base>
    1.89                      <build-prerequisite/>
    1.90                      <compile-dependency/>
    1.91 @@ -87,11 +138,27 @@
    1.92                      </run-dependency>
    1.93                  </dependency>
    1.94                  <dependency>
    1.95 +                    <code-name-base>org.netbeans.spi.quicksearch</code-name-base>
    1.96 +                    <build-prerequisite/>
    1.97 +                    <compile-dependency/>
    1.98 +                    <run-dependency>
    1.99 +                        <specification-version>1.10.1</specification-version>
   1.100 +                    </run-dependency>
   1.101 +                </dependency>
   1.102 +                <dependency>
   1.103 +                    <code-name-base>org.openide.awt</code-name-base>
   1.104 +                    <build-prerequisite/>
   1.105 +                    <compile-dependency/>
   1.106 +                    <run-dependency>
   1.107 +                        <specification-version>7.31.2</specification-version>
   1.108 +                    </run-dependency>
   1.109 +                </dependency>
   1.110 +                <dependency>
   1.111                      <code-name-base>org.openide.filesystems</code-name-base>
   1.112                      <build-prerequisite/>
   1.113                      <compile-dependency/>
   1.114                      <run-dependency>
   1.115 -                        <specification-version>7.13.1.1.1</specification-version>
   1.116 +                        <specification-version>7.47.1</specification-version>
   1.117                      </run-dependency>
   1.118                  </dependency>
   1.119                  <dependency>
     2.1 --- a/PLSQL/Navigator/src/org/netbeans/modules/plsql/navigator/Bundle.properties	Tue Jun 19 17:09:07 2012 +0200
     2.2 +++ b/PLSQL/Navigator/src/org/netbeans/modules/plsql/navigator/Bundle.properties	Wed Jun 20 16:45:57 2012 +0530
     2.3 @@ -5,4 +5,5 @@
     2.4  OpenIDE-sort-byAlpha=SORT_ALPHA
     2.5  
     2.6  OpenIDE-toolTip-Sort-by-Source=Sort by Source
     2.7 -OpenIDE-toolTip-sort-byAlpha=Sort by Name
     2.8 \ No newline at end of file
     2.9 +OpenIDE-toolTip-sort-byAlpha=Sort by Name
    2.10 +QuickSearch/PL/SQL/org-netbeans-modules-plsql-navigator-PlsqlSearchProvider.instance=PL/SQL
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/PLSQL/Navigator/src/org/netbeans/modules/plsql/navigator/PlsqlSearchProvider.java	Wed Jun 20 16:45:57 2012 +0530
     3.3 @@ -0,0 +1,176 @@
     3.4 +/*
     3.5 + * To change this template, choose Tools | Templates
     3.6 + * and open the template in the editor.
     3.7 + */
     3.8 +package org.netbeans.modules.plsql.navigator;
     3.9 +
    3.10 +import java.io.File;
    3.11 +import java.io.FileFilter;
    3.12 +import java.util.HashMap;
    3.13 +import java.util.HashSet;
    3.14 +import java.util.Map;
    3.15 +import java.util.Set;
    3.16 +import java.util.regex.Pattern;
    3.17 +import org.netbeans.api.db.explorer.DatabaseConnection;
    3.18 +import org.netbeans.api.project.Project;
    3.19 +import org.netbeans.api.project.ui.OpenProjects;
    3.20 +import org.netbeans.modules.plsql.lexer.PlsqlBlockType;
    3.21 +import org.netbeans.modules.plsql.utilities.NotConnectedToDbException;
    3.22 +import org.netbeans.modules.plsql.utilities.PlsqlExecutorService;
    3.23 +import org.netbeans.modules.plsql.utilities.PlsqlFileUtil;
    3.24 +import org.netbeans.modules.plsqlsupport.db.DatabaseConnectionManager;
    3.25 +import org.netbeans.modules.plsqlsupport.db.DatabaseContentManager;
    3.26 +import org.netbeans.spi.quicksearch.SearchProvider;
    3.27 +import org.netbeans.spi.quicksearch.SearchRequest;
    3.28 +import org.netbeans.spi.quicksearch.SearchResponse;
    3.29 +
    3.30 +import org.openide.cookies.OpenCookie;
    3.31 +import org.openide.filesystems.FileObject;
    3.32 +import org.openide.loaders.DataObject;
    3.33 +import org.openide.util.Exceptions;
    3.34 +import org.openide.util.Lookup;
    3.35 +
    3.36 +public class PlsqlSearchProvider implements SearchProvider {
    3.37 +
    3.38 +    final static String MODEL_DIRECTORY_PATH = "#COMPONENT#" + File.separator + "database" + File.separator + "#COMPONENT#";
    3.39 +    private static final PlsqlExecutorService executorService = Lookup.getDefault().lookup(PlsqlExecutorService.class);
    3.40 +
    3.41 +    /**
    3.42 +     * Method is called by infrastructure when search operation was requested.
    3.43 +     * Implementors should evaluate given request and fill response object with
    3.44 +     * apropriate results
    3.45 +     *
    3.46 +     * @param request Search request object that contains information what to search for
    3.47 +     * @param response Search response object that stores search results. Note that it's important to react to return value of SearchResponse.addResult(...) method and stop computation if false value is returned.
    3.48 +     */
    3.49 +    @Override
    3.50 +    public void evaluate(SearchRequest request, SearchResponse response) {
    3.51 +        Project[] projects = OpenProjects.getDefault().getOpenProjects();
    3.52 +
    3.53 +        String query = request.getText().toLowerCase();
    3.54 +        boolean useRegExp = query.contains("*");
    3.55 +        if (useRegExp) {
    3.56 +            query = query.replaceAll("\\.", "\\.");
    3.57 +            query = query.replaceAll("\\*", ".*");
    3.58 +        }
    3.59 +
    3.60 +        final Set<String> fileExtentions = new HashSet<String>();
    3.61 +        fileExtentions.addAll(executorService.getExecutionOrder());
    3.62 +        fileExtentions.add(".body");
    3.63 +        fileExtentions.add("spec");
    3.64 +
    3.65 +        for (Project project : projects) {
    3.66 +            //For Local Files
    3.67 +            for (String fileExtention : fileExtentions) {
    3.68 +                Map<String, String> plsqlObjects = getLocalPlsqlObjects(project, fileExtention);
    3.69 +                for (String plsqlObject : plsqlObjects.keySet()) {
    3.70 +                    boolean match = useRegExp ? Pattern.matches(query, plsqlObject) : plsqlObject.contains(query);
    3.71 +                    if (match) {
    3.72 +                        if (!response.addResult(new OpenLocalPLSQLFile(plsqlObjects.get(plsqlObject)), plsqlObject.toLowerCase() + "(" + project.getProjectDirectory().getName() + ")")) {
    3.73 +                            return;
    3.74 +                        }
    3.75 +                    }
    3.76 +                }
    3.77 +            }
    3.78 +            //for Package files in DB. Do not consider tables, views, etc
    3.79 +            Set<String> DBFiles = getPlsqlFilesFromDB(project);
    3.80 +            for (String DBFile : DBFiles) {
    3.81 +                boolean match = useRegExp ? Pattern.matches(query, DBFile.toLowerCase()) : DBFile.toLowerCase().contains(query);
    3.82 +                if (match) {
    3.83 +                    if (!response.addResult(new OpenPLSQLFileFromDB(DBFile, project), DBFile.toLowerCase() + "(" + project.getProjectDirectory().getName() + ")")) {
    3.84 +                        return;
    3.85 +                    }
    3.86 +                }
    3.87 +            }
    3.88 +        }
    3.89 +    }
    3.90 +
    3.91 +    private Map<String, String> getLocalPlsqlObjects(Project project, final String fileExtention) {
    3.92 +        FileObject workspace = project.getProjectDirectory().getFileObject("workspace");
    3.93 +        Map<String, String> dbObj = new HashMap<String, String>();
    3.94 +        if (workspace != null && workspace.isFolder()) {
    3.95 +            final FileObject[] folders = workspace.getChildren();
    3.96 +            for (FileObject folder : folders) {
    3.97 +                if (folder.isFolder() && !folder.getName().startsWith(".")) {
    3.98 +
    3.99 +                    File filePath = new File(workspace.getPath() + File.separator + MODEL_DIRECTORY_PATH.replaceAll("#COMPONENT#", folder.getName()));
   3.100 +                    if (filePath.exists()) {
   3.101 +                        final FileFilter filter = new FileFilter() {
   3.102 +
   3.103 +                            @Override
   3.104 +                            public boolean accept(final File file) {
   3.105 +                                return (file.isFile() && file.getName().endsWith(fileExtention));
   3.106 +                            }
   3.107 +                        };
   3.108 +                        final File[] objectFiles = filePath.listFiles(filter);
   3.109 +                        if (objectFiles != null) {
   3.110 +                            for (File objectFile : objectFiles) {
   3.111 +                                dbObj.put(objectFile.getName().toString().toLowerCase(), objectFile.getPath().toString().toLowerCase());
   3.112 +                            }
   3.113 +                        }
   3.114 +                    }
   3.115 +                }
   3.116 +            }
   3.117 +            return dbObj;
   3.118 +        }
   3.119 +        return dbObj;
   3.120 +    }
   3.121 +
   3.122 +    private Set<String> getPlsqlFilesFromDB(Project project) {
   3.123 +        DatabaseConnectionManager connectionProvider = project.getLookup().lookup(DatabaseConnectionManager.class);
   3.124 +        DatabaseContentManager cache = DatabaseContentManager.getInstance(connectionProvider.getTemplateConnection());
   3.125 +        Set<String> allPackages = new HashSet<String>();
   3.126 +        if (cache != null) {
   3.127 +            allPackages = (Set<String>) cache.getAllPackages();
   3.128 +        }
   3.129 +        return allPackages;
   3.130 +    }
   3.131 +
   3.132 +    private static class OpenLocalPLSQLFile implements Runnable {
   3.133 +
   3.134 +        File objectFile;
   3.135 +        String filePath;
   3.136 +
   3.137 +        public OpenLocalPLSQLFile(String filePath_) {
   3.138 +            filePath = filePath_;
   3.139 +        }
   3.140 +
   3.141 +        @Override
   3.142 +        public void run() {
   3.143 +            DataObject dataObj = PlsqlFileUtil.getDataObject(filePath);
   3.144 +            if (dataObj != null) {
   3.145 +                OpenCookie openCookie = dataObj.getCookie(OpenCookie.class);
   3.146 +                openCookie.open();
   3.147 +            }
   3.148 +        }
   3.149 +    }
   3.150 +
   3.151 +    private static class OpenPLSQLFileFromDB implements Runnable {
   3.152 +
   3.153 +        File objectFile;
   3.154 +        String packageName;
   3.155 +        Project project;
   3.156 +
   3.157 +        public OpenPLSQLFileFromDB(String packageName_, Project project_) {
   3.158 +            packageName = packageName_;
   3.159 +            project = project_;
   3.160 +        }
   3.161 +
   3.162 +        @Override
   3.163 +        public void run() {
   3.164 +            final DatabaseConnectionManager connectionProvider = DatabaseConnectionManager.getInstance(project);
   3.165 +            DatabaseConnection databaseConnection = connectionProvider.getPooledDatabaseConnection(false);
   3.166 +            DataObject dataObj;
   3.167 +            try {
   3.168 +                dataObj = dataObj = PlsqlFileUtil.fetchAsTempFile(packageName, PlsqlBlockType.PACKAGE_BODY, databaseConnection, project, null);
   3.169 +
   3.170 +                if (dataObj != null) {
   3.171 +                    OpenCookie openCookie = dataObj.getCookie(OpenCookie.class);
   3.172 +                    openCookie.open();
   3.173 +                }
   3.174 +            } catch (NotConnectedToDbException ex) {
   3.175 +                Exceptions.printStackTrace(ex);
   3.176 +            }
   3.177 +        }
   3.178 +    }
   3.179 +}
     4.1 --- a/PLSQL/Navigator/src/org/netbeans/modules/plsql/navigator/layer.xml	Tue Jun 19 17:09:07 2012 +0200
     4.2 +++ b/PLSQL/Navigator/src/org/netbeans/modules/plsql/navigator/layer.xml	Wed Jun 20 16:45:57 2012 +0530
     4.3 @@ -1,5 +1,5 @@
     4.4  <?xml version="1.0" encoding="UTF-8"?>
     4.5 -<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
     4.6 +<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.2//EN" "http://www.netbeans.org/dtds/filesystem-1_2.dtd">
     4.7  <filesystem>
     4.8      <folder name="Navigator">
     4.9          <folder name="Panels">
    4.10 @@ -10,4 +10,15 @@
    4.11              </folder>
    4.12          </folder>
    4.13      </folder>
    4.14 +    <folder name="QuickSearch">
    4.15 +        <folder name="Database Files">
    4.16 +            <folder name="SQL">
    4.17 +                <attr name="command" stringvalue="nb"/>
    4.18 +                <attr name="position" intvalue="0"/>
    4.19 +                <file name="org-netbeans-modules-plsql-navigator-PlsqlSearchProvider.instance">
    4.20 +                    <attr name="displayName" bundlevalue="org.netbeans.modules.plsql.navigator.Bundle#QuickSearch/PL/SQL/org-netbeans-modules-plsql-navigator-PlsqlSearchProvider.instance"/>
    4.21 +                </file>
    4.22 +            </folder>
    4.23 +        </folder>
    4.24 +    </folder>
    4.25  </filesystem>