Changeset 5031


Ignore:
Timestamp:
24/02/09 16:33:24 (10 years ago)
Author:
sdonegan
Message:

made a copy

Location:
TI01-discovery/branches/ws-Discovery2-MSI/discoveryUpgrade
Files:
3 edited
16 copied

Legend:

Unmodified
Added
Removed
  • TI01-discovery/branches/ws-Discovery2-MSI/discoveryUpgrade/.classpath

    r3984 r5031  
    6565        <classpathentry kind="lib" path="/misc/humid1/cbyrom/opt/axis2-1.4/lib/xml-resolver-1.2.jar"/> 
    6666        <classpathentry kind="lib" path="/misc/humid1/cbyrom/opt/axis2-1.4/lib/XmlSchema-1.4.2.jar"/> 
     67        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/activation-1.1.jar"/> 
     68        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/annogen-0.1.0.jar"/> 
     69        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/axiom-api-1.2.7.jar"/> 
     70        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/axiom-dom-1.2.7.jar"/> 
     71        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/axiom-impl-1.2.7.jar"/> 
     72        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/axis2-adb-1.4.1.jar"/> 
     73        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/axis2-adb-codegen-1.4.1.jar"/> 
     74        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/axis2-ant-plugin-1.4.1.jar"/> 
     75        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/axis2-clustering-1.4.1.jar"/> 
     76        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/axis2-codegen-1.4.1.jar"/> 
     77        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/axis2-corba-1.4.1.jar"/> 
     78        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/axis2-fastinfoset-1.4.1.jar"/> 
     79        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/axis2-java2wsdl-1.4.1.jar"/> 
     80        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/axis2-jaxbri-1.4.1.jar"/> 
     81        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/axis2-jaxws-1.4.1.jar"/> 
     82        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/axis2-jaxws-api-1.4.1.jar"/> 
     83        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/axis2-jibx-1.4.1.jar"/> 
     84        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/axis2-json-1.4.1.jar"/> 
     85        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/axis2-jws-api-1.4.1.jar"/> 
     86        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/axis2-kernel-1.4.1.jar"/> 
     87        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/axis2-metadata-1.4.1.jar"/> 
     88        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/axis2-mtompolicy-1.4.1.jar"/> 
     89        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/axis2-saaj-1.4.1.jar"/> 
     90        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/axis2-saaj-api-1.4.1.jar"/> 
     91        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/axis2-spring-1.4.1.jar"/> 
     92        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/axis2-xmlbeans-1.4.1.jar"/> 
     93        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/backport-util-concurrent-3.1.jar"/> 
     94        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/commons-codec-1.3.jar"/> 
     95        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/commons-fileupload-1.2.jar"/> 
     96        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/commons-httpclient-3.1.jar"/> 
     97        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/commons-io-1.4.jar"/> 
     98        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/commons-logging-1.1.1.jar"/> 
     99        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/geronimo-annotation_1.0_spec-1.1.jar"/> 
     100        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/geronimo-stax-api_1.0_spec-1.0.1.jar"/> 
     101        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/httpcore-4.0-beta1.jar"/> 
     102        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/httpcore-nio-4.0-beta1.jar"/> 
     103        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/jalopy-1.5rc3.jar"/> 
     104        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/jaxb-api-2.1.jar"/> 
     105        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/jaxb-impl-2.1.6.jar"/> 
     106        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/jaxb-xjc-2.1.6.jar"/> 
     107        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/jaxen-1.1.1.jar"/> 
     108        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/jettison-1.0-RC2.jar"/> 
     109        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/jibx-bind-1.1.5.jar"/> 
     110        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/jibx-run-1.1.5.jar"/> 
     111        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/log4j-1.2.15.jar"/> 
     112        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/mail-1.4.jar"/> 
     113        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/mex-1.4.1.jar"/> 
     114        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/neethi-2.0.4.jar"/> 
     115        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/soapmonitor-1.4.1.jar"/> 
     116        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/woden-api-1.0M8.jar"/> 
     117        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/woden-impl-dom-1.0M8.jar"/> 
     118        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/wsdl4j-1.6.2.jar"/> 
     119        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/wstx-asl-3.2.4.jar"/> 
     120        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/xalan-2.7.0.jar"/> 
     121        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/xercesImpl-2.8.1.jar"/> 
     122        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/xml-apis-1.3.04.jar"/> 
     123        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/xmlbeans-2.3.0.jar"/> 
     124        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/xml-resolver-1.2.jar"/> 
     125        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/XmlSchema-1.4.2.jar"/> 
     126        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/Copy of activation-1.1.jar"/> 
     127        <classpathentry kind="lib" path="D:/SOFTWARE/axis2/axis2-1.4.1/lib/Copy (2) of activation-1.1.jar"/> 
    67128        <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/> 
    68129        <classpathentry kind="lib" path="srcgen/build/lib/XBeans-packaged.jar"/> 
     130        <classpathentry kind="lib" path="resources"/> 
     131        <classpathentry kind="lib" path="D:/workspace/MSI/LoggingFramework/basicDevelopment/log4j-1.2.15.jar"/> 
    69132        <classpathentry kind="output" path="bin"/> 
    70133</classpath> 
  • TI01-discovery/branches/ws-Discovery2-MSI/discoveryUpgrade/.project

    r3951 r5031  
    11<?xml version="1.0" encoding="UTF-8"?> 
    22<projectDescription> 
    3         <name>DiscoveryWS</name> 
     3        <name>discoveryUpgrade</name> 
    44        <comment></comment> 
    55        <projects> 
  • TI01-discovery/branches/ws-Discovery2-MSI/discoveryUpgrade/src/ndg/services/discovery/DBProperties.java

    r4817 r5031  
    9494        { 
    9595                                 
    96                 Boolean update; 
     96                boolean update; 
    9797                 
    9898                logger.info("Setting up DBSearch Logging Client using config info from properties file..."); 
     
    119119                Class.forName("org.postgresql.Driver").newInstance();           
    120120                Connection con = DriverManager.getConnection(propertiesSearchDb.getProperty("jdbc.searchLoggingUri"), props);  
    121                 Statement stmt = con.createStatement();                         
     121                 
     122                /*Statement stmt = con.createStatement();                       
     123                stmt.executeUpdate(updateString);       */ 
     124                 
     125                update = updateDB(con, updateString);            
     126 
     127                        return update; 
     128                 
     129                } catch (Exception E) { 
     130                         
     131                        logger.error("Problem preparing & submitting update statement " + E); 
     132                         
     133                        return false; 
     134                }                
     135        } 
     136         
     137         
     138        /** 
     139         * Submit an update statement to a database returning true/false depending on success of query 
     140         * @param con - jdbc connection object 
     141         * @param query - query string 
     142         * @return Boolean - true/false depending on success 
     143         */ 
     144        public static Boolean updateDB(Connection con, String updateString){ 
     145                 
     146                boolean update; 
     147                 
     148                try { 
     149                        Statement stmt = con.createStatement();                         
    122150                stmt.executeUpdate(updateString);        
    123151                 
    124152                update = true; 
    125                  
    126                 } catch (Exception E) { 
    127153                         
    128                         logger.info("Could not Update search logger database!"); 
    129                         logger.error(E); 
     154                } catch (Exception E){ 
     155                         
     156                        logger.error("Could not Update search logger database! " + E); 
    130157                         
    131158                        update = false; 
  • TI01-discovery/branches/ws-Discovery2-MSI/discoveryUpgrade/src/ndg/services/discovery/InterfaceDBClient.java

    r3957 r5031  
    3131 
    3232        /** 
     33         * Run a specified SQL UPDATE query against the DB connection but returns only Boolean 
     34         * @param sqlQuery 
     35         * @return 
     36         * @throws DiscoveryDBException 
     37         */ 
     38        public abstract Boolean runUpdateQuery(String sqlQuery) 
     39        throws DiscoveryDBException; 
     40         
     41                 
     42        /** 
    3343         * Close the established DB connection 
    3444         * @throws DiscoveryDBException  
  • TI01-discovery/branches/ws-Discovery2-MSI/discoveryUpgrade/src/ndg/services/discovery/PostgresDBClient.java

    r4795 r5031  
    152152         
    153153         
     154        /* (non-Javadoc) 
     155         * @see ndg.services.discovery.InterfaceDBClient#runQuery(java.lang.String) 
     156         */ 
     157        public Boolean runUpdateQuery(String sqlQuery) throws DiscoveryDBException 
     158        { 
     159            logger.info("Executing the UPDATE command: " + sqlQuery); 
     160             
     161            try  
     162            {               
     163                    sql.execute(sqlQuery); 
     164                    
     165                    return true; 
     166                } 
     167            catch (SQLException e)  
     168            { 
     169                logger.error("Problem updating results inclusion counter! " + e); 
     170                handleSQLException(e); 
     171                return false; 
     172                } 
     173        } 
     174         
     175         
    154176        /** 
    155177         * Handle any SQLExceptions thrown by the JDBC library in a uniform way 
  • TI01-discovery/branches/ws-Discovery2-MSI/discoveryUpgrade/src/ndg/services/discovery/SearchAgent.java

    r4817 r5031  
    88import java.math.BigInteger; // needed because xmlbeans uses this for xsd:positiveInteger 
    99import java.math.BigDecimal; // needed because xmlbeans uses this for xsd:decimal 
    10 import java.util.Calendar;  // needed because xmlbeans uses this for xsd:date 
     10import java.util.Calendar; // needed because xmlbeans uses this for xsd:date 
    1111import org.apache.log4j.Logger; 
    1212 
     
    1414 
    1515/** 
    16  *  Agent class for full-text search 
    17  * 
    18  *  @author    Matt Pritchard <m.j.pritchard@rl.ac.uk> 
     16 * Agent class for full-text search 
     17 *  
     18 * @author Matt Pritchard <m.j.pritchard@rl.ac.uk> 
    1919 */ 
    20 public class SearchAgent  
    21 { 
    22     private static Logger logger = Logger.getLogger(SearchAgent.class.getName()); 
     20public class SearchAgent { 
     21        private static Logger logger = Logger 
     22                        .getLogger(SearchAgent.class.getName()); 
    2323 
    2424        // Internal defaults 
    25     private String termType = null; 
    26      
     25        private String termType = null; 
     26 
    2727        // Initialise input parameters, setting values to internal defaults 
    28         private BigInteger start = new BigInteger("0"); // what row of results to start retrieval from 
    29         private BigInteger howMany = new BigInteger("30");      // how many results to display in result set 
     28        private BigInteger start = new BigInteger("0"); // what row of results to 
     29                                                                                                        // start retrieval from 
     30 
     31        private BigInteger howMany = new BigInteger("30"); // how many results to 
     32                                                                                                                // display in result set 
     33 
    3034        private String term = ""; 
    31         private String orderByField = null;     // representation used in WSDL e.g. "date", "dataCentre" 
    32         private String orderByDirection = "ASC";        //default orderBy direction 
     35 
     36        private String orderByField = null; // representation used in WSDL e.g. 
     37                                                                                // "date", "dataCentre" 
     38 
     39        private String orderByDirection = "ASC"; // default orderBy direction 
    3340 
    3441        Vector<String> scopes = new Vector<String>(); 
     42 
    3543        private String spatialOperator = DiscoveryServiceSkeleton.OVERLAPS_OPERATOR_TYPE; 
    3644 
    3745        private BigDecimal limitWest; 
     46 
    3847        private BigDecimal limitSouth; 
     48 
    3949        private BigDecimal limitEast; 
     50 
    4051        private BigDecimal limitNorth; 
     52 
    4153        private Calendar dateRangeStart; 
     54 
    4255        private Calendar dateRangeEnd; 
    4356 
    4457        int hits; 
    45          
     58 
    4659        private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
    47          
     60 
    4861        /** 
    4962         * Default no-argument constructor. 
    5063         */ 
    51         public SearchAgent() {} 
     64        public SearchAgent() { 
     65        } 
    5266 
    5367        /** 
    5468         * Sets the start position of result set. 
    55          * <p>Value should be BigInteger > 0, else defaults to howManyDefault. 
    56          * @param i position of first result to fetch 
    57          */ 
    58         public void setStart(BigInteger i) 
    59         { 
    60                 if ( i.intValue() > 0) 
    61                 { 
    62 //                      NB, historically, the indexes started at 1 - which was appropriate 
    63 //                      for the eXist DB - this needs to be corrected for postgres ops 
     69         * <p> 
     70         * Value should be BigInteger > 0, else defaults to howManyDefault. 
     71         *  
     72         * @param i 
     73         *            position of first result to fetch 
     74         */ 
     75        public void setStart(BigInteger i) { 
     76                if (i.intValue() > 0) { 
     77                        // NB, historically, the indexes started at 1 - which was 
     78                        // appropriate 
     79                        // for the eXist DB - this needs to be corrected for postgres ops 
    6480                        this.start = i.subtract(new BigInteger("1")); 
    6581                } 
     
    6884        /** 
    6985         * Sets how many results to fetch. 
    70          * <p>Value should be BigInteger > 0, else defaults to howManyDefault. 
    71          * @param i position of first result to fetch 
    72          */ 
    73         public void setHowMany(BigInteger i) 
    74         { 
    75                 if ( i.intValue() > 0) 
    76                 { 
     86         * <p> 
     87         * Value should be BigInteger > 0, else defaults to howManyDefault. 
     88         *  
     89         * @param i 
     90         *            position of first result to fetch 
     91         */ 
     92        public void setHowMany(BigInteger i) { 
     93                if (i.intValue() > 0) { 
    7794                        this.howMany = i; 
    7895                } 
     
    8198        /** 
    8299         * Sets the search term. 
    83          * @param s String 
    84          */ 
    85         public void setTerm(String s) 
    86         { 
     100         *  
     101         * @param s 
     102         *            String 
     103         */ 
     104        public void setTerm(String s) { 
    87105                this.term = s; 
    88106        } 
    89107 
    90         public String getTerm() {               return term;    } 
     108        public String getTerm() { 
     109                return term; 
     110        } 
    91111 
    92112        /** 
    93113         * Sets the field by which to sort the result set 
    94          * @param s String, one of "date", "dataCentre", list defined in <code>orderByFieldList</code> returned by <code>getList</code> operation. 
    95          */ 
    96         public void setOrderByField(String orderByField)  
    97         { 
     114         *  
     115         * @param s 
     116         *            String, one of "date", "dataCentre", list defined in 
     117         *            <code>orderByFieldList</code> returned by 
     118         *            <code>getList</code> operation. 
     119         */ 
     120        public void setOrderByField(String orderByField) { 
    98121                this.orderByField = orderByField; 
    99122        } 
    100123 
    101         public String getOrderByField()  
    102         { 
     124        public String getOrderByField() { 
    103125                return orderByField; 
    104126        } 
     
    106128        /** 
    107129         * Sets the direction in which to sort the result set 
    108          * @param s String, one of "ascending", "descending". 
     130         *  
     131         * @param s 
     132         *            String, one of "ascending", "descending". 
    109133         * @see DiscoveryServiceSkeleton 
    110134         */ 
    111         public void setOrderByDirection(String s) 
    112         { 
     135        public void setOrderByDirection(String s) { 
    113136                if (s != null && s.equals("descending")) 
    114137                        this.orderByDirection = "DESC"; 
     
    117140        } 
    118141 
    119         public String getOrderByDirection()  
    120         { 
     142        public String getOrderByDirection() { 
    121143                return orderByDirection; 
    122144        } 
    123145 
    124146        /** 
    125          * Adds new scope item to the search, telling Agent to search only documents containing these keywords 
    126          * @param s String, values in list <code>scopeList</code> returned by <code>getList</code> operation. 
     147         * Adds new scope item to the search, telling Agent to search only documents 
     148         * containing these keywords 
     149         *  
     150         * @param s 
     151         *            String, values in list <code>scopeList</code> returned by 
     152         *            <code>getList</code> operation. 
    127153         * @see DiscoveryServiceSkeleton 
    128154         */ 
    129         public void addNewScope(String s) 
    130         { 
     155        public void addNewScope(String s) { 
    131156                s = s.replace("_", DiscoveryServiceSkeleton.UNDERSCORE_REPLACEMENT); 
    132157                this.scopes.add(s); 
     
    135160        /** 
    136161         * Returns the Vector of search scopes 
     162         *  
    137163         * @return scopes containing String elements like NERC-DDC etc 
    138164         */ 
    139         public Vector<String> getScopes() 
    140         { 
    141                  
     165        public Vector<String> getScopes() { 
     166 
    142167                return this.scopes; 
    143168        } 
     
    148173         * @return String containing scope keywords separated by '&'s 
    149174         */ 
    150         public String getScopesAsString() 
    151         { 
     175        public String getScopesAsString() { 
    152176                StringBuilder scopesStr = new StringBuilder(); 
    153177                Iterator<String> it = this.scopes.iterator(); 
    154                 while ( it.hasNext() ) 
    155                 { 
     178                while (it.hasNext()) { 
    156179                        if (scopesStr.length() > 0) 
    157180                                scopesStr.append(" & "); 
    158                          
     181 
    159182                        scopesStr.append(it.next()); 
    160183                } 
     
    164187        /** 
    165188         * Sets north bound of BoundingBox. 
    166          * @param f BigDecimal value of north bound of search box 
    167          */ 
    168         public void setLimitNorth(BigDecimal f) 
    169         { 
    170                 if ( f.floatValue() <= 90.0 && f.floatValue() >= -90.0 ) 
    171                 { 
     189         *  
     190         * @param f 
     191         *            BigDecimal value of north bound of search box 
     192         */ 
     193        public void setLimitNorth(BigDecimal f) { 
     194                if (f.floatValue() <= 90.0 && f.floatValue() >= -90.0) { 
    172195                        this.limitNorth = f; 
    173196                } 
     
    176199        /** 
    177200         * Sets south bound of BoundingBox. 
    178          * @param f BigDecimal value of south bound of search box 
    179          */ 
    180         public void setLimitSouth(BigDecimal f) 
    181         { 
    182                 if ( f.floatValue() <= 90.0 && f.floatValue() >= -90.0 ) 
    183                 { 
     201         *  
     202         * @param f 
     203         *            BigDecimal value of south bound of search box 
     204         */ 
     205        public void setLimitSouth(BigDecimal f) { 
     206                if (f.floatValue() <= 90.0 && f.floatValue() >= -90.0) { 
    184207                        this.limitSouth = f; 
    185208                } 
    186209        } 
    187          
     210 
    188211        /** 
    189212         * Sets south bound of BoundingBox. 
    190          * @param f BigDecimal value of west bound of search box 
    191          */ 
    192         public void setLimitWest(BigDecimal f) 
    193         { 
    194                 if ( f.floatValue() <= 180.0 && f.floatValue() >= -180.0 ) 
    195                 { 
     213         *  
     214         * @param f 
     215         *            BigDecimal value of west bound of search box 
     216         */ 
     217        public void setLimitWest(BigDecimal f) { 
     218                if (f.floatValue() <= 180.0 && f.floatValue() >= -180.0) { 
    196219                        this.limitWest = f; 
    197220                } 
     
    200223        /** 
    201224         * Sets south bound of BoundingBox. 
    202          * @param f BigDecimal value of west bound of search box 
    203          */ 
    204         public void setLimitEast(BigDecimal f) 
    205         { 
    206                 if ( f.floatValue() <= 180.0 && f.floatValue() >= -180.0 ) 
    207                 { 
     225         *  
     226         * @param f 
     227         *            BigDecimal value of west bound of search box 
     228         */ 
     229        public void setLimitEast(BigDecimal f) { 
     230                if (f.floatValue() <= 180.0 && f.floatValue() >= -180.0) { 
    208231                        this.limitEast = f; 
    209232                } 
     
    212235        /** 
    213236         * Sets start of date range. 
    214          * @param c Calendar value of start date of date range 
    215          */ 
    216         public void setDateRangeStart(Calendar c) 
    217         { 
     237         *  
     238         * @param c 
     239         *            Calendar value of start date of date range 
     240         */ 
     241        public void setDateRangeStart(Calendar c) { 
    218242                this.dateRangeStart = c; 
    219243        } 
     
    221245        /** 
    222246         * Sets start of date range. 
    223          * @param c Calendar value of end date of date range 
    224          */ 
    225         public void setDateRangeEnd(Calendar c) 
    226         { 
     247         *  
     248         * @param c 
     249         *            Calendar value of end date of date range 
     250         */ 
     251        public void setDateRangeEnd(Calendar c) { 
    227252                this.dateRangeEnd = c; 
    228253        } 
     
    230255        /** 
    231256         * Sets operator used for spatial search 
    232          * @param s String spatial operator to be applied,  
    233          *      must be member of list <code>spatialOperatorsList</code> returned by <code>getList</code> operation. 
    234          * @throws DiscoveryWSException if not correct value of getList list 
    235         */ 
    236         public void setSpatialOperator(String s) throws DiscoveryWSException 
    237         { 
    238                 if (s.equals(DiscoveryServiceSkeleton.OVERLAPS_OPERATOR_TYPE) ||  
    239                                 s.equals(DiscoveryServiceSkeleton.WITHIN_OPERATOR_TYPE) || 
    240                                 s.equals(DiscoveryServiceSkeleton.NO_OVERLAP_OPERATOR_TYPE)) 
    241                 { 
     257         *  
     258         * @param s 
     259         *            String spatial operator to be applied, must be member of list 
     260         *            <code>spatialOperatorsList</code> returned by 
     261         *            <code>getList</code> operation. 
     262         * @throws DiscoveryWSException 
     263         *             if not correct value of getList list 
     264         */ 
     265        public void setSpatialOperator(String s) throws DiscoveryWSException { 
     266                if (s.equals(DiscoveryServiceSkeleton.OVERLAPS_OPERATOR_TYPE) 
     267                                || s.equals(DiscoveryServiceSkeleton.WITHIN_OPERATOR_TYPE) 
     268                                || s.equals(DiscoveryServiceSkeleton.NO_OVERLAP_OPERATOR_TYPE)) { 
    242269                        this.spatialOperator = s; 
    243                 } 
    244                 else 
    245                 { 
    246                         String errorMessage = "Invalid spatial operator, " + s + 
    247                                 " - please use getListNames to get the valid list of spatial operator types"; 
     270                } else { 
     271                        String errorMessage = "Invalid spatial operator, " 
     272                                        + s 
     273                                        + " - please use getListNames to get the valid list of spatial operator types"; 
    248274                        logger.warn(errorMessage); 
    249275                        throw new DiscoveryWSException(errorMessage); 
     
    254280        /** 
    255281         * Gets operator used for spatial search 
     282         *  
    256283         * @return String containing value of spatial operator 
    257284         */ 
    258         public String getSpatialOperator() 
    259         { 
     285        public String getSpatialOperator() { 
    260286                return this.spatialOperator; 
    261287        } 
    262288 
    263         public BigDecimal getLimitWest() {              return limitWest;       } 
    264  
    265         public BigDecimal getLimitSouth() {             return limitSouth;      } 
    266  
    267         public BigDecimal getLimitEast() {              return limitEast;       } 
    268  
    269         public BigDecimal getLimitNorth() {             return limitNorth;      } 
    270  
    271         public Calendar getDateRangeStart() {           return dateRangeStart;  } 
    272  
    273         public Calendar getDateRangeEnd() {             return dateRangeEnd;    } 
    274  
    275         public BigInteger getHowMany() {                return howMany;         } 
    276  
    277         public String getTermType() {           return termType;        } 
    278  
    279         public BigInteger getStart() {          return start;   } 
    280  
    281         /** 
    282          * Set the type of the term to search on; NB, this must be either 'fullText', 'parameter' or 'author' 
    283          * - if not an exception is thrown 
     289        public BigDecimal getLimitWest() { 
     290                return limitWest; 
     291        } 
     292 
     293        public BigDecimal getLimitSouth() { 
     294                return limitSouth; 
     295        } 
     296 
     297        public BigDecimal getLimitEast() { 
     298                return limitEast; 
     299        } 
     300 
     301        public BigDecimal getLimitNorth() { 
     302                return limitNorth; 
     303        } 
     304 
     305        public Calendar getDateRangeStart() { 
     306                return dateRangeStart; 
     307        } 
     308 
     309        public Calendar getDateRangeEnd() { 
     310                return dateRangeEnd; 
     311        } 
     312 
     313        public BigInteger getHowMany() { 
     314                return howMany; 
     315        } 
     316 
     317        public String getTermType() { 
     318                return termType; 
     319        } 
     320 
     321        public BigInteger getStart() { 
     322                return start; 
     323        } 
     324 
     325        /** 
     326         * Set the type of the term to search on; NB, this must be either 
     327         * 'fullText', 'parameter' or 'author' - if not an exception is thrown 
    284328         *  
    285329         * @param termType 
    286330         */ 
    287         public void setTermType(String termType) throws DiscoveryWSException 
    288         { 
    289                 if (termType.equals(DiscoveryServiceSkeleton.FULL_TEXT_TERM_TYPE) ||  
    290                                 termType.equals(DiscoveryServiceSkeleton.AUTHOR_TERM_TYPE) || 
    291                                 termType.equals(DiscoveryServiceSkeleton.PARAMETER_TERM_TYPE)) 
    292                 { 
     331        public void setTermType(String termType) throws DiscoveryWSException { 
     332                if (termType.equals(DiscoveryServiceSkeleton.FULL_TEXT_TERM_TYPE) 
     333                                || termType.equals(DiscoveryServiceSkeleton.AUTHOR_TERM_TYPE) 
     334                                || termType 
     335                                                .equals(DiscoveryServiceSkeleton.PARAMETER_TERM_TYPE)) { 
    293336                        this.termType = termType; 
    294                 } 
    295                 else 
    296                 { 
    297                         String errorMessage = "Invalid termType, " + termType + 
    298                                 " - please use getListNames to get the valid list of term types"; 
     337                } else { 
     338                        String errorMessage = "Invalid termType, " 
     339                                        + termType 
     340                                        + " - please use getListNames to get the valid list of term types"; 
    299341                        logger.warn(errorMessage); 
    300342                        throw new DiscoveryWSException(errorMessage); 
     
    302344        } 
    303345 
    304  
    305346        /** 
    306347         * Executes the search and returns a SearchSummary object 
     348         *  
    307349         * @return SearchSummary object containing result of search 
    308          * @throws DiscoveryDBException  
    309          */ 
    310         public SearchSummary doSearch() throws DiscoveryDBException  
    311         { 
     350         * @throws DiscoveryDBException 
     351         */ 
     352        public SearchSummary doSearch() throws DiscoveryDBException { 
    312353 
    313354                SearchSummary result = null; 
     
    315356                // firstly prepare the search query string 
    316357                String sqlQuery = constructSearchQuery(); 
    317                  
     358 
    318359                logger.info("Search sql: " + sqlQuery); 
    319                  
     360 
    320361                // now run the query using the db client configured appropriately 
    321362                InterfaceDBClient client = DBProperties.setupDBClient(); 
    322363                String[][] results = client.runQuery(sqlQuery); 
    323364                client.closeConnection(); 
    324                  
     365 
    325366                // now extract the results data 
    326367                result = processResults(results); 
    327                                  
     368 
    328369                return result; 
    329370        } 
    330371 
    331          
    332372        /** 
    333373         * Take the results set returned from a call to doSearch and extract the 
    334          * data into a SearchSummary object 
    335          * NB, only return the number of docs requested 
    336          *  
    337          * @param results - a 2D string array of results from the doSearch call  
     374         * data into a SearchSummary object NB, only return the number of docs 
     375         * requested 
     376         *  
     377         * @param results - 
     378         *            a 2D string array of results from the doSearch call 
    338379         * @return SearchSummary object wrappering the results set 
    339380         */ 
    340         private SearchSummary processResults(String[][] results)  
    341         { 
     381        private SearchSummary processResults(String[][] results) { 
    342382                logger.info("Extracting results"); 
    343383                SearchSummary result = new SearchSummary(); 
    344384                result.setHits(0); // NB ensure this is 0 if not data returned 
    345385                ArrayList<String> docs = new ArrayList<String>(); 
    346                  
    347                 if (results.length > 0) 
    348                 { 
    349                         // if the requested number of docs to be returned is less than 
    350                         // the total number of results, restrict the number 
    351                         int resultsNumber =  
    352                                 (results.length > this.getHowMany().intValue() ? 
    353                                                 this.getHowMany().intValue() : results.length); 
     386 
     387                // set up another DB connection to query and update record access 
     388                try { 
     389                        InterfaceDBClient client = DBProperties.setupDBClient(); 
     390 
     391                        if (results.length > 0) { 
     392                                // if the requested number of docs to be returned is less than 
     393                                // the total number of results, restrict the number 
     394                                int resultsNumber = (results.length > this.getHowMany() 
     395                                                .intValue() ? this.getHowMany().intValue() 
     396                                                : results.length); 
     397 
     398                                Vector<Hashtable<String, String>> documents = new Vector<Hashtable<String, String>>(); 
     399 
     400                                // counter to ensure the proper number of hits are returned 
     401                                int duplicateDocs = 0; 
     402                                Integer numIncluded; 
     403                                for (int i = 0; i < resultsNumber; i++) { 
     404                                        Hashtable<String, String> thisDoc = new Hashtable<String, String>(); 
     405                                        // avoid duplicate results - NB, this could be done using 
     406                                        // the DISTINCT SQL keyword but 
     407                                        // this would require the 'order by' clause to change so 
     408                                        // would necessitate a much more 
     409                                        // complex sql query construction 
     410                                        if (!docs.contains(results[i][0])) { 
     411                                                logger.info("Found matching document - adding this to results"); 
     412                                                docs.add(results[i][0]); 
     413                                                thisDoc.put("name", results[i][0]); 
     414         
     415                                                // increment relevant access count in the Discovery DB 
    354416                                                 
    355                         Vector<Hashtable<String, String>> documents = new Vector<Hashtable<String, String>>(); 
    356                         // counter to ensure the proper number of hits are returned 
    357                         int duplicateDocs = 0; 
    358                         for (int i=0; i < resultsNumber; i++) 
    359                         { 
    360                                 Hashtable<String, String> thisDoc = new Hashtable<String, String>(); 
    361                                 // avoid duplicate results - NB, this could be done using the DISTINCT SQL keyword but 
    362                                 // this would require the 'order by' clause to change so would necessitate a much more 
    363                                 // complex sql query construction 
    364                                 if (! docs.contains(results[i][0])) 
    365                                 { 
    366                                         logger.info("Found matching document - adding this to results"); 
    367                                         docs.add(results[i][0]); 
    368                                         thisDoc.put("name", results[i][0]); 
    369                                          
    370                                         // TODO: these next two are not used anywhere - remove or use? 
    371                                         thisDoc.put("matches", String.valueOf(1)); 
    372                                         thisDoc.put("position", String.valueOf(i)); 
    373                                         documents.add( thisDoc ); 
     417                                                //get current dataset access count & increment 
     418                                                String[][] numIncludedArr = client.runQuery(getCurrentAccessCount(results[i][0])); 
     419                                                 
     420                                                if (numIncludedArr[0][0] == null){ 
     421                                                        numIncluded = 1; 
     422                                                } else { 
     423                                                        numIncluded  = Integer.parseInt(numIncludedArr[0][0])+1; 
     424                                                } 
     425                                                 
     426                                                //reset relevant column 
     427                                                if (client.runUpdateQuery(updateResultSetQueryString(results[i][0],numIncluded))){ 
     428                                                        logger.info("Successfully UPDATED dataset access counter!"); 
     429                                                } else { 
     430                                                        logger.warn("Could NOT update dataset access counter!"); 
     431                                                } 
     432                                                 
     433                                                // TODO: these next two are not used anywhere - remove 
     434                                                // or use? 
     435                                                thisDoc.put("matches", String.valueOf(1)); 
     436                                                thisDoc.put("position", String.valueOf(i)); 
     437                                                documents.add(thisDoc); 
     438                                        } else { 
     439                                                logger.info("Duplicate document found - ignoring"); 
     440                                                duplicateDocs++; 
     441                                        } 
    374442                                } 
    375                                 else 
    376                                 { 
    377                                         logger.info("Duplicate document found - ignoring"); 
    378                                         duplicateDocs++; 
    379                                 } 
    380                         } 
    381                         result.setStatus( true ); 
    382                         result.setStatusMessage( "Success" ); 
    383                         result.setDocuments( documents ); 
    384                         result.setHits(results.length - duplicateDocs + this.getStart().intValue()); 
    385                         logger.info("Results added to search summary"); 
    386                 } 
    387                 else 
    388                 { 
    389                         result.setStatus( false ); 
    390                         String outMessage = "Search was successful but generated no results."; 
    391                         result.setStatusMessage(outMessage); 
    392                         logger.info(outMessage); 
    393                 } 
    394                  
     443                                 
     444                                client.closeConnection(); 
     445                                 
     446                                result.setStatus(true); 
     447                                result.setStatusMessage("Success"); 
     448                                result.setDocuments(documents); 
     449                                result.setHits(results.length - duplicateDocs 
     450                                                + this.getStart().intValue()); 
     451                                logger.info("Results added to search summary"); 
     452                        } else { 
     453                                result.setStatus(false); 
     454                                String outMessage = "Search was successful but generated no results."; 
     455                                result.setStatusMessage(outMessage); 
     456                                logger.info(outMessage); 
     457                        } 
     458                } catch (Exception E) { 
     459 
     460                } 
     461 
    395462                return result; 
    396463        } 
     
    401468         * @return String - SQL command 
    402469         */ 
    403         private String constructSearchQuery()  
    404         { 
     470        private String constructSearchQuery() { 
    405471                logger.info("Creating search query"); 
    406472                logger.info("search term detected is: " + this.term); 
    407                  
     473 
    408474                // NB, we use the postgres text search function to do term searches 
    409                 StringBuffer fromSqlCmd = new StringBuffer("SELECT " +  
    410                                 DBProperties.ORIGINAL_DOCUMENT_FILENAME + " FROM " +  
    411                                 DBProperties.ORIGINAL_DOCUMENT_TABLE + " "); 
     475                StringBuffer fromSqlCmd = new StringBuffer("SELECT " 
     476                                + DBProperties.ORIGINAL_DOCUMENT_FILENAME + " FROM " 
     477                                + DBProperties.ORIGINAL_DOCUMENT_TABLE + " "); 
    412478                StringBuffer whereSqlCmd = new StringBuffer(); 
    413                  
     479 
    414480                String termColumn = null; 
    415                 if (Utilities.isStringDefined(this.getTerm())) 
    416                 { 
    417                         termColumn = DBProperties.DOCUMENT_TS_VECTOR; // default column to use - i.e. a full text search 
     481                if (Utilities.isStringDefined(this.getTerm())) { 
     482                        termColumn = DBProperties.DOCUMENT_TS_VECTOR; // default column to 
     483                                                                                                                        // use - i.e. a full 
     484                                                                                                                        // text search 
    418485                        // NB, if no term type provided, assume full text search 
    419                         if (Utilities.isStringDefined(this.getTermType())) 
    420                         { 
    421                                 logger.info("Adjusting query for " + this.getTermType() + " type search"); 
    422                                  
    423                                 if (this.getTermType().equals(DiscoveryServiceSkeleton.AUTHOR_TERM_TYPE)) 
    424                                 { 
     486                        if (Utilities.isStringDefined(this.getTermType())) { 
     487                                logger.info("Adjusting query for " + this.getTermType() 
     488                                                + " type search"); 
     489 
     490                                if (this.getTermType().equals( 
     491                                                DiscoveryServiceSkeleton.AUTHOR_TERM_TYPE)) { 
    425492                                        termColumn = DBProperties.AUTHORS_TS_VECTOR; 
    426                                 } 
    427                                 else if (this.getTermType().equals(DiscoveryServiceSkeleton.PARAMETER_TERM_TYPE)) 
    428                                 { 
     493                                } else if (this.getTermType().equals( 
     494                                                DiscoveryServiceSkeleton.PARAMETER_TERM_TYPE)) { 
    429495                                        termColumn = DBProperties.PARAMETERS_TS_VECTOR; 
    430496                                } 
    431497                        } 
    432498 
    433                         // NB, historically, limited wildcard searches were possible with eXist 
    434                         // DB - so allow them here - although this will remove the associated 
     499                        // NB, historically, limited wildcard searches were possible with 
     500                        // eXist 
     501                        // DB - so allow them here - although this will remove the 
     502                        // associated 
    435503                        // benefits of text searching 
    436                         if (isPOSIXWildcardSeach()) 
    437                         { 
     504                        if (isPOSIXWildcardSeach()) { 
    438505                                convertWildcardTerm(); 
    439506                                // since author + param data is stored as vectors, requires a 
    440507                                // slight fudge to convert to a searchable string 
    441                                 if (termColumn.equals(DBProperties.DOCUMENT_TS_VECTOR)) 
    442                                 { 
    443                                         appendWhereClause(whereSqlCmd,  
    444                                                         DBProperties.ORIGINAL_DOCUMENT + " ~ '" + this.term + "'"); 
     508                                if (termColumn.equals(DBProperties.DOCUMENT_TS_VECTOR)) { 
     509                                        appendWhereClause(whereSqlCmd, 
     510                                                        DBProperties.ORIGINAL_DOCUMENT + " ~ '" + this.term 
     511                                                                        + "'"); 
     512                                } else { 
     513                                        appendWhereClause(whereSqlCmd, "strip(" + termColumn 
     514                                                        + ")::text ~ '" + this.term + "'"); 
    445515                                } 
    446                                 else { 
    447                                         appendWhereClause(whereSqlCmd, "strip(" + termColumn + ")::text ~ '" + 
    448                                                         this.term + "'"); 
    449                                 } 
    450                                  
    451                         } 
    452                         else 
    453                         { 
    454                                 // if spaces are specified, these need to be turned into '&' joins 
    455                                 this.term = this.term.replaceAll("(\\w)(\\s+)([!\\w])", "$1 & $3"); 
    456                                 fromSqlCmd.append(", to_tsquery('" + this.term + "') AS query "); 
    457                                 appendWhereClause(whereSqlCmd, "query @@ COALESCE(" + termColumn + ", '') "); 
    458                         } 
    459                 } 
    460  
    461                 if (this.getScopes() != null && this.getScopes().size() > 0) 
    462                 { 
     516 
     517                        } else { 
     518                                // if spaces are specified, these need to be turned into '&' 
     519                                // joins 
     520                                this.term = this.term.replaceAll("(\\w)(\\s+)([!\\w])", 
     521                                                "$1 & $3"); 
     522                                fromSqlCmd 
     523                                                .append(", to_tsquery('" + this.term + "') AS query "); 
     524                                appendWhereClause(whereSqlCmd, "query @@ COALESCE(" 
     525                                                + termColumn + ", '') "); 
     526                        } 
     527                } 
     528 
     529                if (this.getScopes() != null && this.getScopes().size() > 0) { 
    463530                        logger.info("Adding scopes data to query"); 
    464                         appendWhereClause(whereSqlCmd, " to_tsquery('" + this.getScopesAsString() + "') @@ scope_ts_vector "); 
     531                        appendWhereClause(whereSqlCmd, " to_tsquery('" 
     532                                        + this.getScopesAsString() + "') @@ scope_ts_vector "); 
    465533                } 
    466534 
    467535                // Construct the search clause for spatio temporal search, if necessary 
    468                 if (isSpatialSearch()) 
    469                 { 
     536                if (isSpatialSearch()) { 
    470537                        logger.info("Adding spatial data to query"); 
    471538                        // set up the bounding box geometry for the search 
    472                         String bbox = "SetSRID('BOX3D(" + this.getLimitWest().floatValue() + " " + this.getLimitSouth().floatValue() + 
    473                                 ", " + this.getLimitEast().floatValue() + " " + this.getLimitNorth().floatValue() + ")'::box3d, 4326)"; 
     539                        String bbox = "SetSRID('BOX3D(" + this.getLimitWest().floatValue() 
     540                                        + " " + this.getLimitSouth().floatValue() + ", " 
     541                                        + this.getLimitEast().floatValue() + " " 
     542                                        + this.getLimitNorth().floatValue() + ")'::box3d, 4326)"; 
    474543 
    475544                        fromSqlCmd.append(", " + DBProperties.SPATIAL_DATA_TABLE); 
    476545                        String spatialPart = DBProperties.SPATIAL_DATA_TABLE + ".geometry "; 
    477                         if (spatialOperator.equals(DiscoveryServiceSkeleton.OVERLAPS_OPERATOR_TYPE)) 
    478                         { 
     546                        if (spatialOperator 
     547                                        .equals(DiscoveryServiceSkeleton.OVERLAPS_OPERATOR_TYPE)) { 
    479548                                spatialPart += "&& " + bbox + " "; 
    480                         } 
    481                         else if ( spatialOperator.equals(DiscoveryServiceSkeleton.WITHIN_OPERATOR_TYPE) ) 
    482                         { 
    483                                 spatialPart +="@ " + bbox + " "; 
    484                         } 
    485                         else if ( spatialOperator.equals("doesNotOverlap") ) 
    486                         { 
     549                        } else if (spatialOperator 
     550                                        .equals(DiscoveryServiceSkeleton.WITHIN_OPERATOR_TYPE)) { 
     551                                spatialPart += "@ " + bbox + " "; 
     552                        } else if (spatialOperator.equals("doesNotOverlap")) { 
    487553                                spatialPart = "NOT " + spatialPart + "&& " + bbox + " "; 
    488554                        } 
    489555                        appendWhereClause(whereSqlCmd, spatialPart); 
    490                         appendWhereClause(whereSqlCmd, DBProperties.SPATIAL_DATA_TABLE + ".spatial_data_id = " + 
    491                                         DBProperties.SPATIAL_TEMPORAL_DATA_TABLE + ".spatial_data_id"); 
    492                 } 
    493  
    494                 if (isTemporalSearch() || isOrderedByDate()) 
    495                 { 
     556                        appendWhereClause(whereSqlCmd, DBProperties.SPATIAL_DATA_TABLE 
     557                                        + ".spatial_data_id = " 
     558                                        + DBProperties.SPATIAL_TEMPORAL_DATA_TABLE 
     559                                        + ".spatial_data_id"); 
     560                } 
     561 
     562                if (isTemporalSearch() || isOrderedByDate()) { 
    496563                        logger.info("Adding temporal data to query"); 
    497564                        fromSqlCmd.append(", " + DBProperties.TEMPORAL_DATA_TABLE); 
    498                         if (isTemporalSearch()) 
    499                         { 
    500                                 appendWhereClause(whereSqlCmd, " (" + DBProperties.TEMPORAL_DATA_TABLE + ".start_time, " + 
    501                                                 DBProperties.TEMPORAL_DATA_TABLE + ".end_time) OVERLAPS (DATE '" +  
    502                                         this.sdf.format(this.getDateRangeStart().getTime()) +  
    503                                         "', DATE '" + this.sdf.format(this.getDateRangeEnd().getTime() ) + "')"); 
    504                                  
    505                         } 
    506                         appendWhereClause(whereSqlCmd, DBProperties.TEMPORAL_DATA_TABLE + ".temporal_data_id = " + 
    507                                 DBProperties.SPATIAL_TEMPORAL_DATA_TABLE + ".temporal_data_id"); 
    508                 } 
    509                  
    510                 // if either or both spatial and temporal data is searched on, need to join this with the main 
     565                        if (isTemporalSearch()) { 
     566                                appendWhereClause(whereSqlCmd, " (" 
     567                                                + DBProperties.TEMPORAL_DATA_TABLE + ".start_time, " 
     568                                                + DBProperties.TEMPORAL_DATA_TABLE 
     569                                                + ".end_time) OVERLAPS (DATE '" 
     570                                                + this.sdf.format(this.getDateRangeStart().getTime()) 
     571                                                + "', DATE '" 
     572                                                + this.sdf.format(this.getDateRangeEnd().getTime()) 
     573                                                + "')"); 
     574 
     575                        } 
     576                        appendWhereClause(whereSqlCmd, DBProperties.TEMPORAL_DATA_TABLE 
     577                                        + ".temporal_data_id = " 
     578                                        + DBProperties.SPATIAL_TEMPORAL_DATA_TABLE 
     579                                        + ".temporal_data_id"); 
     580                } 
     581 
     582                // if either or both spatial and temporal data is searched on, need to 
     583                // join this with the main 
    511584                // orig doc search query - NB, also need for date ordering 
    512                 if (isTemporalSearch() || isSpatialSearch() || isOrderedByDate()) 
    513                 { 
     585                if (isTemporalSearch() || isSpatialSearch() || isOrderedByDate()) { 
    514586                        fromSqlCmd.append(", " + DBProperties.SPATIAL_TEMPORAL_DATA_TABLE); 
    515                         whereSqlCmd.append(" AND " + DBProperties.SPATIAL_TEMPORAL_DATA_TABLE + ".original_document_id = " + 
    516                                         DBProperties.ORIGINAL_DOCUMENT_TABLE + ".original_document_id"); 
    517                 } 
    518                  
     587                        whereSqlCmd.append(" AND " 
     588                                        + DBProperties.SPATIAL_TEMPORAL_DATA_TABLE 
     589                                        + ".original_document_id = " 
     590                                        + DBProperties.ORIGINAL_DOCUMENT_TABLE 
     591                                        + ".original_document_id"); 
     592                } 
     593 
    519594                // add the WHERE statement, if required 
    520595                if (whereSqlCmd.length() > 0) 
    521596                        whereSqlCmd.insert(0, DBProperties.WHERE_STATEMENT); 
    522                  
     597 
    523598                // add order by, and direction, if required 
    524599                logger.info("Adding ordering info to query"); 
    525                 if (this.getOrderByField() != null) 
    526                 { 
     600                if (this.getOrderByField() != null) { 
    527601                        logger.info("- adding specified order by parameter"); 
    528                         if (isOrderedByDate()) 
    529                         { 
     602                        if (isOrderedByDate()) { 
    530603                                logger.info("NB, refine date ordering: order by 'start_time'"); 
    531604                                this.setOrderByField(DBProperties.START_TIME); 
    532                         } 
    533                         else if (this.getOrderByField().equals(DiscoveryServiceSkeleton.DATACENTRE_ORDER)) 
    534                         { 
    535                                 //TODO: need to decide what this order by should actually be done on 
    536                                 // - i.e. on full name of org or just the ID - until this is done, just 
    537                                 // use the slight fudge here - otherwise will need to add an appropriate 
     605                        } else if (this.getOrderByField().equals( 
     606                                        DiscoveryServiceSkeleton.DATACENTRE_ORDER)) { 
     607                                // TODO: need to decide what this order by should actually be 
     608                                // done on 
     609                                // - i.e. on full name of org or just the ID - until this is 
     610                                // done, just 
     611                                // use the slight fudge here - otherwise will need to add an 
     612                                // appropriate 
    538613                                // additional column in the DB to store this info 
    539                                 logger.info("NB, fudging datacentre order - order by discovery ID"); 
     614                                logger 
     615                                                .info("NB, fudging datacentre order - order by discovery ID"); 
    540616                                this.setOrderByField(DBProperties.DISCOVERY_ID); 
    541617                        } 
    542                         whereSqlCmd.append(DBProperties.ORDERBY_STATEMENT + this.getOrderByField() + " " + this.getOrderByDirection()); 
    543                 } 
    544                 else if (termColumn != null) 
    545                 { 
     618                        whereSqlCmd 
     619                                        .append(DBProperties.ORDERBY_STATEMENT 
     620                                                        + this.getOrderByField() + " " 
     621                                                        + this.getOrderByDirection()); 
     622                } else if (termColumn != null) { 
    546623                        // check if wildcard search being done 
    547                         if (isPOSIXWildcardSeach()) 
    548                         { 
     624                        if (isPOSIXWildcardSeach()) { 
    549625                                logger.info("Ordering by filename"); 
    550                                 whereSqlCmd.append(DBProperties.ORDERBY_STATEMENT + " " +  
    551                                                 DBProperties.ORIGINAL_DOCUMENT_FILENAME + " " +  
    552                                                 this.getOrderByDirection()); 
    553                         } 
    554                         else 
    555                         { 
    556                                 // use natural ordering of results according to statistics worked out by the text search facility, if appropriate 
     626                                whereSqlCmd.append(DBProperties.ORDERBY_STATEMENT + " " 
     627                                                + DBProperties.ORIGINAL_DOCUMENT_FILENAME + " " 
     628                                                + this.getOrderByDirection()); 
     629                        } else { 
     630                                // use natural ordering of results according to statistics 
     631                                // worked out by the text search facility, if appropriate 
    557632                                logger.info("- order according to rank of search result"); 
    558                                 whereSqlCmd.append(DBProperties.ORDERBY_STATEMENT + " ts_rank(" +  
    559                                                 termColumn + ", query) " + this.getOrderByDirection()); 
    560                         } 
    561                 } 
    562                  
     633                                whereSqlCmd 
     634                                                .append(DBProperties.ORDERBY_STATEMENT + " ts_rank(" 
     635                                                                + termColumn + ", query) " 
     636                                                                + this.getOrderByDirection()); 
     637                        } 
     638                } 
     639 
    563640                // lastly, add the size limit and offset of the returned data set 
    564641                logger.info("Adding size limit and offset of results set"); 
    565642                whereSqlCmd.append(DBProperties.OFFSET_STATEMENT + this.getStart()); 
    566                  
     643 
    567644                String fullCmd = fromSqlCmd.toString() + whereSqlCmd.toString() + ";"; 
    568645                logger.info("SQL query generated"); 
    569646                logger.info("Value: " + fullCmd); 
    570                  
     647 
    571648                return fullCmd; 
    572649        } 
    573650 
    574          
    575         /** 
    576          * If a term is found to contain wildcards, do some simple tidying of it 
    577          * to allow it is handled ok in the SQL query 
    578          */ 
    579         private void convertWildcardTerm()  
    580         { 
     651        /** 
     652         * If a term is found to contain wildcards, do some simple tidying of it to 
     653         * allow it is handled ok in the SQL query 
     654         */ 
     655        private void convertWildcardTerm() { 
    581656                this.setTerm(this.getTerm().replaceAll("\\*", ".*")); 
    582657        } 
     
    587662         * @return true if wildcards found, false otherwise 
    588663         */ 
    589         private boolean isPOSIXWildcardSeach()  
    590         { 
     664        private boolean isPOSIXWildcardSeach() { 
    591665                logger.info("Checking for wildcards in search term"); 
    592                 for (int i = 0, is = this.getTerm().length(); i < is; i++)  
    593                 { 
     666                for (int i = 0, is = this.getTerm().length(); i < is; i++) { 
    594667                        char c = this.getTerm().charAt(i); 
    595668                        switch (c) { 
    596669                        case '*': 
    597670                        case '?': 
    598 //                      case '(': 
    599 //                      case ')': 
     671                                // case '(': 
     672                                // case ')': 
    600673                        case '[': 
    601674                        case ']': 
     
    605678                        case '{': 
    606679                        case '}': 
    607 //                      case '|': 
     680                                // case '|': 
    608681                        case '\\': 
    609682                                logger.info("- found wildcards - treat as a regexp search"); 
     
    617690        } 
    618691 
    619  
    620692        /** 
    621693         * Append to 'where' clause in sql statement, ensuring 'AND' joins are added 
     
    627699         *            string sql clause to add to buffer 
    628700         */ 
    629         private void appendWhereClause(StringBuffer whereSqlCmd, String clause)  
    630         { 
     701        private void appendWhereClause(StringBuffer whereSqlCmd, String clause) { 
    631702                if (whereSqlCmd.length() > 0) 
    632703                        whereSqlCmd.append(" AND "); 
     
    639710         * @return true, if search to be order by date, false otherwise 
    640711         */ 
    641         private boolean isOrderedByDate()  
    642         { 
    643                 logger.info("Checking if we're ordering by date" + this.getOrderByField()); 
    644                 if (this.getOrderByField() != null && 
    645                                 this.getOrderByField().equals(DiscoveryServiceSkeleton.DATE_ORDER)) 
    646                 { 
     712        private boolean isOrderedByDate() { 
     713                logger.info("Checking if we're ordering by date" 
     714                                + this.getOrderByField()); 
     715                if (this.getOrderByField() != null 
     716                                && this.getOrderByField().equals( 
     717                                                DiscoveryServiceSkeleton.DATE_ORDER)) { 
    647718                        logger.info("- yes we are"); 
    648719                        return true; 
    649                 } 
    650                 else 
    651                 { 
     720                } else { 
    652721                        logger.info(" - no we are not"); 
    653722                        return false; 
     
    659728         *  
    660729         * @return true if includes temporal search, false otherwise 
    661          * @throws UnsupportedOperationException if  
    662          */ 
    663         private boolean isTemporalSearch() throws UnsupportedOperationException  
    664         { 
     730         * @throws UnsupportedOperationException 
     731         *             if 
     732         */ 
     733        private boolean isTemporalSearch() throws UnsupportedOperationException { 
    665734                logger.info("Checking if valid temporal data specified"); 
    666                 if (this.getDateRangeStart() != null && this.getDateRangeEnd() != null) 
    667                 { 
    668                         if (dateRangeEnd.getTimeInMillis() >= dateRangeStart.getTimeInMillis()) 
    669                         { 
     735                if (this.getDateRangeStart() != null && this.getDateRangeEnd() != null) { 
     736                        if (dateRangeEnd.getTimeInMillis() >= dateRangeStart 
     737                                        .getTimeInMillis()) { 
    670738                                logger.info("Valid temporal data specified"); 
    671739                                return true; 
    672                         } 
    673                         else 
    674                         { 
     740                        } else { 
    675741                                String errorMessage = "Invalid temporal data: End date before start date."; 
    676742                                logger.warn(errorMessage); 
     
    683749 
    684750        /** 
    685          * Determine whether the search has any spatial data specified 
    686          * NB, checks that global limits aren't specified - if so, this is semantically 
     751         * Determine whether the search has any spatial data specified NB, checks 
     752         * that global limits aren't specified - if so, this is semantically 
    687753         * equivalent to a non spatial search, so treat as such 
    688754         *  
    689755         * @return true if includes spatial search, false otherwise 
    690756         */ 
    691         private boolean isSpatialSearch()  
    692         { 
     757        private boolean isSpatialSearch() { 
    693758                logger.info("Checking if valid spatial data specified"); 
    694                 if (this.getLimitEast() != null && this.getLimitWest() != null && 
    695                         this.getLimitNorth() != null && this.getLimitSouth() != null) 
    696                 { 
    697                         if (this.getLimitEast().intValue() == 180 && this.getLimitWest().intValue() == -180 && 
    698                                         this.getLimitNorth().intValue() == 90 && this.getLimitSouth().intValue() == -90) 
    699                         { 
    700                                 logger.info("Spatial data is equivalent to global search - will ignore in search"); 
     759                if (this.getLimitEast() != null && this.getLimitWest() != null 
     760                                && this.getLimitNorth() != null && this.getLimitSouth() != null) { 
     761                        if (this.getLimitEast().intValue() == 180 
     762                                        && this.getLimitWest().intValue() == -180 
     763                                        && this.getLimitNorth().intValue() == 90 
     764                                        && this.getLimitSouth().intValue() == -90) { 
     765                                logger 
     766                                                .info("Spatial data is equivalent to global search - will ignore in search"); 
    701767                                return false; 
    702768                        } 
     
    707773                return false; 
    708774        } 
     775 
     776        /** 
     777         * Prepare an sql statement to extract the current access count from a 
     778         * record from the Discovery DB 
     779         *  
     780         * @param originalDocumentID - 
     781         *            String 
     782         * @return String : sql insert statement 
     783         */ 
     784        public static String getCurrentAccessCount(String originalDocumentFilename) { 
     785 
     786                String sqlQuery = "SELECT resultset_count FROM original_document WHERE original_document_filename = '" 
     787                                + originalDocumentFilename + "';"; 
     788 
     789                return sqlQuery; 
     790        } 
     791 
     792        /** 
     793         * Prepare an INSERT sql statement to submit to Discovery DB to increment 
     794         * resultsetAccess count 
     795         *  
     796         * @param originalDocumentFilename - 
     797         *            String 
     798         * @param updatedCountVal - 
     799         *            Integer 
     800         * @return String : sql insert statement 
     801         */ 
     802        public static String updateResultSetQueryString(String originalDocumentFilename, 
     803                        Integer updatedCountVal) { 
     804 
     805                //UPDATE original_document SET resultset_count = '1' WHERE original_document_filename='badc.nerc.ac.uk__DIF__badc.nerc.ac.uk-DIF-dataent_11642968801511608.xml'; 
     806                String statementStringBuild = "UPDATE original_document SET resultset_count = '" + updatedCountVal.toString() + "' WHERE original_document_filename = '" 
     807                                + originalDocumentFilename + "';";                   
     808 
     809                return statementStringBuild; 
     810        } 
    709811} 
Note: See TracChangeset for help on using the changeset viewer.