Project

General

Profile

1 145 bojilova
/**
2 168 jones
 *      Name: AccessionNumber.java
3
 *   Purpose: A class that gets Accession Number, check for uniqueness
4
 *            and register it into db
5
 * Copyright: 2000 Regents of the University of California and the
6
 *            National Center for Ecological Analysis and Synthesis
7
 *   Authors: Jivka Bojilova
8 145 bojilova
 *
9 168 jones
 *   Version: '$Id$'
10 145 bojilova
 */
11
12
package edu.ucsb.nceas.metacat;
13
14
import java.net.*;
15
import java.sql.*;
16 160 bojilova
import java.util.PropertyResourceBundle;
17 145 bojilova
18 147 bojilova
/**
19
 * A class that gets Accession Number, check for uniqueness and register it
20
 * into db connection
21
 */
22 145 bojilova
public class AccessionNumber  {
23
24 171 bojilova
    /**
25
     * This method gets Accession Number (if any), check for uniqueness
26
     * and register it into new db connection
27
     * @param accNumber - accession # if provided or null if not
28
     * @param action - INSERT, UPDATE or DELETE.
29
     * When "INSERT" and accession # provided is not unique, get next one.
30
     * If it is unique, use it.
31
     * When "INSERT" and accession # is null, get a new one.
32
     * When "UPDATE", accession # is required.
33
     * When "DELETE", accession # is required.
34
     */
35 160 bojilova
    public static String generate (String accNumber, String action)
36 168 jones
        throws ClassNotFoundException, StringIndexOutOfBoundsException,
37
               SQLException
38 160 bojilova
    {
39 145 bojilova
40 160 bojilova
        String globalName = null;
41
        String localId = null;
42
        PropertyResourceBundle options = null;
43
44 165 jones
        options = (PropertyResourceBundle)
45
            PropertyResourceBundle.getBundle("edu.ucsb.nceas.metacat.metacat");
46 160 bojilova
        String dbDriver = (String)options.handleGetObject("dbDriver");
47
        String defaultDB = (String)options.handleGetObject("defaultDB");
48
        String user = (String)options.handleGetObject("user");
49
        String password = (String)options.handleGetObject("password");
50 168 jones
        String defaultGlobalName =
51
               (String)options.handleGetObject("defaultGlobalName");
52 160 bojilova
        String sep = (String)options.handleGetObject("accNumberSeparator");
53
54
55
        try {
56
            // Open a new connection to the database
57 168 jones
            Connection conn = MetaCatUtil.openDBConnection(dbDriver,
58
                              defaultDB, user, password);
59 160 bojilova
            conn.setAutoCommit(true);
60
61
            // split the acc # in 2 parts - global name & local id
62
            if ( accNumber != null ) {
63
                globalName = getGlobalName(accNumber, sep);
64
                localId = getLocalId(accNumber, sep);
65
            }
66
67
            // register unique acc #
68
            if ( action == "INSERT" )
69
                if ( accNumber == null )
70
                    return put(conn, defaultGlobalName, null, sep);
71
                else
72
                    return put(conn, globalName, localId, sep);
73 171 bojilova
74
            conn.close();
75 160 bojilova
76
        } catch (SQLException e) {
77 168 jones
            System.out.println(
78
                       "Error on AccessionNumber.genAccessionNumber(): " +
79
                       e.getMessage());
80 160 bojilova
            throw e;
81
        }
82
83
        return null;
84 145 bojilova
    }
85 160 bojilova
86 171 bojilova
    /** put unique accession # into db connection */
87 168 jones
    private static String put (Connection conn, String globalName,
88
                String localId, String sep)
89 160 bojilova
                throws SQLException
90
    {
91
92
        Integer l = null;
93
        try {
94
            if ( localId == null )
95
                l = new Integer(get(conn, globalName) + 1);
96 171 bojilova
            else if ( exist(conn, globalName, localId) )
97 160 bojilova
                l = new Integer(get(conn, globalName) + 1);
98
            else
99
                l = new Integer(localId);
100
101
            // insert globalName & l
102
            PreparedStatement pstmt;
103 168 jones
            pstmt = conn.prepareStatement(
104
                    "INSERT INTO xml_acc_numbers (global_name, local_id) " +
105
                    "VALUES (?, ?)");
106 160 bojilova
            pstmt.setString(1,globalName);
107
            pstmt.setString(2,l.toString());
108
            pstmt.execute();
109
110 171 bojilova
            pstmt.close();
111
112 160 bojilova
        } catch (SQLException e) {
113 168 jones
            System.out.println(
114
                   "Error on AccessionNumber.put(conn, globalName, localId): "
115
                   + e.getMessage());
116 160 bojilova
            throw e;
117
        }
118
        return globalName + sep + l;
119
    }
120
121 145 bojilova
    /** check for existance of Accesssion Number */
122 171 bojilova
    private static boolean exist (Connection conn, String globalName,
123 168 jones
                String localId) throws SQLException
124 160 bojilova
    {
125 145 bojilova
126
        boolean hasAccNumber = false;
127
128
        try {
129
            PreparedStatement pstmt;
130 168 jones
            pstmt = conn.prepareStatement(
131
                    "SELECT 'x' FROM xml_acc_numbers " +
132
                    "WHERE global_name LIKE ? AND local_id = ?");
133 145 bojilova
            pstmt.setString(1,globalName);
134
            pstmt.setString(2,localId);
135
            pstmt.execute();
136
            ResultSet rs = pstmt.getResultSet();
137
            hasAccNumber = rs.next();
138
            pstmt.close();
139
140
        } catch (SQLException e) {
141 169 jones
            System.out.println("Error on AccessionNumber.unique(globalName, " +
142
                               "localId): " + e.getMessage());
143 160 bojilova
            throw e;
144 145 bojilova
        }
145
146
        return hasAccNumber;
147
    }
148
149 171 bojilova
    /** get the last in order local ID by a given global name */
150 160 bojilova
    private static int get (Connection conn, String globalName)
151
                throws SQLException
152
    {
153 145 bojilova
        try {
154
            PreparedStatement pstmt;
155 168 jones
            pstmt = conn.prepareStatement(
156
                    "SELECT max(local_id) FROM xml_acc_numbers " +
157
                    "WHERE global_name LIKE ?");
158 145 bojilova
            pstmt.setString(1,globalName);
159
            pstmt.execute();
160
            ResultSet rs = pstmt.getResultSet();
161
            boolean hasLocalId = rs.next();
162
163
            if (hasLocalId)
164
                return rs.getInt(1);
165
166
            pstmt.close();
167
        } catch (SQLException e) {
168 168 jones
            System.out.println(
169
                   "Error on AccessionNumber.get(): " + e.getMessage());
170 160 bojilova
            throw e;
171 145 bojilova
        }
172
173 160 bojilova
        return 0;
174 145 bojilova
    }
175
176
177
    // get the global part of the accession number
178 160 bojilova
    private static String getGlobalName (String accNumber, String sep)
179 145 bojilova
        throws StringIndexOutOfBoundsException {
180
181 160 bojilova
        return accNumber.substring(0, accNumber.lastIndexOf(sep));
182 145 bojilova
    }
183
184
    // get the local part of the accession number
185 160 bojilova
    private static String getLocalId (String accNumber, String sep)
186 145 bojilova
        throws StringIndexOutOfBoundsException {
187
188 160 bojilova
        return accNumber.substring(accNumber.lastIndexOf(sep)+1);
189 145 bojilova
    }
190
191
}