Revision 734
Added by bojilova over 23 years ago
src/edu/ucsb/nceas/metacat/DocumentImpl.java | ||
---|---|---|
722 | 722 |
} |
723 | 723 |
} |
724 | 724 |
|
725 |
// DOCTITLE attr cleared from the db |
|
726 |
// /** |
|
727 |
// * Get the document title |
|
728 |
// */ |
|
729 |
// public String getTitle() { |
|
730 |
// return doctitle; |
|
731 |
// } |
|
732 |
|
|
733 |
// DOCTITLE attr cleared from the db |
|
734 |
// /** |
|
735 |
// * Set the document title |
|
736 |
// * |
|
737 |
// * @param title the new title for the document |
|
738 |
// */ |
|
739 |
// public void setTitle( String title ) { |
|
740 |
// this.doctitle = title; |
|
741 |
// try { |
|
742 |
// PreparedStatement pstmt; |
|
743 |
// pstmt = conn.prepareStatement( |
|
744 |
// "UPDATE xml_documents " + |
|
745 |
// " SET doctitle = ? " + |
|
746 |
// "WHERE docid = ?"); |
|
747 |
// |
|
748 |
// // Bind the values to the query |
|
749 |
// pstmt.setString(1, doctitle); |
|
750 |
// pstmt.setString(2, docid); |
|
751 |
// |
|
752 |
// // Do the insertion |
|
753 |
// pstmt.execute(); |
|
754 |
// pstmt.close(); |
|
755 |
// } catch (SQLException e) { |
|
756 |
// System.out.println("Error in DocumentImpl.setTitle: " + e.getMessage()); |
|
757 |
// } |
|
758 |
// } |
|
759 |
|
|
760 | 725 |
/** |
761 | 726 |
* Write an XML file to the database, given a filename |
762 | 727 |
* |
... | ... | |
840 | 805 |
* @param xml the xml stream to be loaded into the database |
841 | 806 |
* @param pub flag for public "read" access on xml document |
842 | 807 |
* @param dtd the dtd to be uploaded on server's file system |
843 |
* @param action the action to be performed (INSERT OR UPDATE)
|
|
844 |
* @param docid the docid to use for the INSERT OR UPDATE
|
|
808 |
* @param action the action to be performed (INSERT or UPDATE)
|
|
809 |
* @param accnum the docid + rev# to use on INSERT or UPDATE
|
|
845 | 810 |
* @param user the user that owns the document |
846 | 811 |
* @param group the group to which user belongs |
847 | 812 |
* @param serverCode the serverid from xml_replication on which this document |
... | ... | |
854 | 819 |
*/ |
855 | 820 |
|
856 | 821 |
public static String write( Connection conn,Reader xml,String pub,Reader dtd, |
857 |
String action, String docid, String user,
|
|
822 |
String action, String accnum, String user,
|
|
858 | 823 |
String group, int serverCode, boolean override, |
859 | 824 |
boolean validate) |
860 | 825 |
throws Exception |
861 | 826 |
{ |
862 |
//MOVED DOWN IN RelationHandler obj before write of relations |
|
863 |
//if(action.equals("UPDATE")) |
|
864 |
//{ |
|
865 |
// RelationHandler.deleteRelations(docid); |
|
866 |
//} |
|
827 |
String rev = "1"; |
|
828 |
String docid = null; |
|
829 |
MetaCatUtil util = new MetaCatUtil(); |
|
830 |
String sep = util.getOption("accNumSeparator"); |
|
867 | 831 |
|
868 |
int updaterev; |
|
869 |
MetaCatUtil util = new MetaCatUtil(); |
|
870 |
// Determine if the docid is OK for INSERT or UPDATE |
|
832 |
if ( accnum != null ) { |
|
833 |
// check the correctness of accnum; |
|
834 |
// split accnum in docid and rev in order to |
|
835 |
// preserve the current implementation of processing and storing, |
|
836 |
// but show the whole accnum to the client. |
|
837 |
DocumentIdentifier id = new DocumentIdentifier(accnum); |
|
838 |
docid = id.getIdentifier(); |
|
839 |
rev = id.getRev(); |
|
840 |
sep = id.getSeparator(); |
|
841 |
} |
|
842 |
|
|
843 |
// Determine if the docid,rev are OK for INSERT or UPDATE |
|
844 |
// Generate new docid on INSERT, if one is not provided. |
|
871 | 845 |
AccessionNumber ac = new AccessionNumber(conn); |
872 |
String newdocid = ac.generate(docid, action);
|
|
846 |
docid = ac.generate(docid, rev, action);
|
|
873 | 847 |
|
874 | 848 |
MetaCatUtil.debugMessage("action: " + action + " servercode: " + |
875 | 849 |
serverCode + " override: " + override); |
... | ... | |
882 | 856 |
//merge the differences manually. |
883 | 857 |
int istreamInt; |
884 | 858 |
char istreamChar; |
885 |
DocumentImpl newdoc = new DocumentImpl(conn, docid); |
|
886 |
updaterev = newdoc.getRev(); |
|
859 |
// NOT NEEDED |
|
860 |
//DocumentImpl newdoc = new DocumentImpl(conn, docid); |
|
861 |
//updaterev = newdoc.getRev(); |
|
862 |
String updaterev = rev; |
|
887 | 863 |
String server = MetacatReplication.getServer(serverCode); |
888 |
MetacatReplication.replLog("attempting to lock " + docid);
|
|
864 |
MetacatReplication.replLog("attempting to lock " + accnum);
|
|
889 | 865 |
URL u = new URL("http://" + server + "?action=getlock&updaterev=" + |
890 | 866 |
updaterev + "&docid=" + docid); |
891 | 867 |
System.out.println("sending message: " + u.toString()); |
... | ... | |
896 | 872 |
{//the lock was granted go ahead with the insert |
897 | 873 |
try |
898 | 874 |
{ |
899 |
MetacatReplication.replLog("lock granted for " + docid + " from " +
|
|
875 |
MetacatReplication.replLog("lock granted for " + accnum + " from " +
|
|
900 | 876 |
server); |
901 |
XMLReader parser = initializeParser(conn, action, newdocid, validate,
|
|
877 |
XMLReader parser = initializeParser(conn, action, docid, validate, |
|
902 | 878 |
user, group, pub, serverCode, dtd); |
903 | 879 |
conn.setAutoCommit(false); |
904 | 880 |
parser.parse(new InputSource(xml)); |
... | ... | |
916 | 892 |
//to come get a copy from here. |
917 | 893 |
ForceReplicationHandler frh = new ForceReplicationHandler(docid); |
918 | 894 |
|
919 |
if ( (docid != null) && !(newdocid.equals(docid)) ) |
|
920 |
{ |
|
921 |
return new String("New document ID generated:" + newdocid); |
|
922 |
} |
|
923 |
else |
|
924 |
{ |
|
925 |
return newdocid; |
|
926 |
} |
|
895 |
return (docid + sep + rev); |
|
927 | 896 |
} |
897 |
|
|
928 | 898 |
else if(openingtag.equals("<filelocked>")) |
929 | 899 |
{//the file is currently locked by another user |
930 | 900 |
//notify our user to wait a few minutes, check out a new copy and try |
931 | 901 |
//again. |
932 | 902 |
//System.out.println("file locked"); |
933 |
MetacatReplication.replLog("lock denied for " + docid + " on " +
|
|
903 |
MetacatReplication.replLog("lock denied for " + accnum + " on " +
|
|
934 | 904 |
server + " reason: file already locked"); |
935 | 905 |
throw new Exception("The file specified is already locked by another " + |
936 | 906 |
"user. Please wait 30 seconds, checkout the " + |
... | ... | |
941 | 911 |
{//our file is outdated. notify our user to check out a new copy of the |
942 | 912 |
//file and merge his version with the new version. |
943 | 913 |
//System.out.println("outdated file"); |
944 |
MetacatReplication.replLog("lock denied for " + docid + " on " +
|
|
914 |
MetacatReplication.replLog("lock denied for " + accnum + " on " +
|
|
945 | 915 |
server + " reason: local file outdated"); |
946 | 916 |
throw new Exception("The file you are trying to update is an outdated" + |
947 | 917 |
" version. Please checkout the newest document, " + |
... | ... | |
954 | 924 |
|
955 | 925 |
if ( !hasPermission(conn, user, group, docid) ) { |
956 | 926 |
throw new Exception("User " + user + |
957 |
" does not have permission to update XML Document #" + docid);
|
|
927 |
" does not have permission to update XML Document #" + accnum);
|
|
958 | 928 |
} |
959 | 929 |
} |
960 | 930 |
|
961 | 931 |
try |
962 | 932 |
{ |
963 |
XMLReader parser = initializeParser(conn, action, newdocid, validate,
|
|
933 |
XMLReader parser = initializeParser(conn, action, docid, validate, |
|
964 | 934 |
user, group, pub, serverCode, dtd); |
965 | 935 |
conn.setAutoCommit(false); |
966 | 936 |
parser.parse(new InputSource(xml)); |
... | ... | |
977 | 947 |
//force replicate out the new document to each server in our server list. |
978 | 948 |
if(serverCode == 1) |
979 | 949 |
{ //start the thread to replicate this new document out to the other servers |
980 |
ForceReplicationHandler frh = new ForceReplicationHandler(newdocid, |
|
981 |
action); |
|
950 |
ForceReplicationHandler frh = new ForceReplicationHandler(docid, action); |
|
982 | 951 |
} |
983 | 952 |
|
984 |
if ( (docid != null) && !(newdocid.equals(docid)) ) |
|
985 |
{ |
|
986 |
return new String("New document ID generated:" + newdocid); |
|
987 |
} |
|
988 |
else |
|
989 |
{ |
|
990 |
return newdocid; |
|
991 |
} |
|
953 |
return (docid + sep + rev); |
|
992 | 954 |
} |
993 | 955 |
|
994 | 956 |
/** |
... | ... | |
997 | 959 |
* |
998 | 960 |
* @param docid the ID of the document to be deleted from the database |
999 | 961 |
*/ |
1000 |
public static void delete( Connection conn, String docid,
|
|
962 |
public static void delete( Connection conn, String accnum,
|
|
1001 | 963 |
String user, String group ) |
1002 |
throws Exception { |
|
1003 |
DocumentIdentifier id = new DocumentIdentifier(docid); |
|
1004 |
docid = id.getSiteCode() + id.getSeparator() + id.getUniqueId(); |
|
964 |
throws Exception |
|
965 |
{ |
|
966 |
DocumentIdentifier id = new DocumentIdentifier(accnum); |
|
967 |
String docid = id.getIdentifier(); |
|
968 |
String rev = id.getRev(); |
|
1005 | 969 |
|
1006 |
// Determine if the docid is OK for DELETE
|
|
970 |
// Determine if the docid,rev are OK for DELETE
|
|
1007 | 971 |
AccessionNumber ac = new AccessionNumber(conn); |
1008 |
String newdocid = ac.generate(docid, "DELETE");
|
|
972 |
docid = ac.generate(docid, rev, "DELETE");
|
|
1009 | 973 |
|
1010 | 974 |
// check for 'write' permission for 'user' to delete this document |
1011 | 975 |
if ( !hasPermission(conn, user, group, docid) ) { |
1012 | 976 |
throw new Exception("User " + user + |
1013 |
" does not have permission to delete XML Document #" + docid);
|
|
977 |
" does not have permission to delete XML Document #" + accnum);
|
|
1014 | 978 |
} |
1015 | 979 |
|
1016 | 980 |
conn.setAutoCommit(false); |
... | ... | |
1033 | 997 |
//if the deleted document is a package document its relations should |
1034 | 998 |
//no longer be active if it has been deleted from the system. |
1035 | 999 |
|
1036 |
// MOVED UP IN THE TRANSACTION |
|
1037 |
// RelationHandler.deleteRelations(docid); |
|
1038 | 1000 |
} |
1039 | 1001 |
|
1040 | 1002 |
/** |
src/edu/ucsb/nceas/metacat/AccessionNumber.java | ||
---|---|---|
49 | 49 |
* Construct an AccessionNumber |
50 | 50 |
*/ |
51 | 51 |
public AccessionNumber () |
52 |
throws SQLException, ClassNotFoundException {
|
|
53 |
|
|
52 |
throws SQLException, ClassNotFoundException |
|
53 |
{ |
|
54 | 54 |
MetaCatUtil util = new MetaCatUtil(); |
55 | 55 |
|
56 | 56 |
this.sitecode = util.getOption("sitecode"); |
... | ... | |
65 | 65 |
* |
66 | 66 |
* @param conn the db connection to read from and write Accession# to |
67 | 67 |
*/ |
68 |
public AccessionNumber (Connection conn) {
|
|
69 |
|
|
68 |
public AccessionNumber (Connection conn) |
|
69 |
{ |
|
70 | 70 |
MetaCatUtil util = new MetaCatUtil(); |
71 | 71 |
|
72 | 72 |
this.sitecode = util.getOption("sitecode"); |
73 | 73 |
this.sep = util.getOption("accNumSeparator"); |
74 | 74 |
this.conn = conn; |
75 |
|
|
76 | 75 |
} |
77 | 76 |
|
78 | 77 |
/** |
79 | 78 |
* Generate an Accession Number of form <sidecode>.<createdate> |
80 | 79 |
*/ |
81 |
public String generate(String accNumber, String action)
|
|
80 |
public String generate(String docid, String rev, String action)
|
|
82 | 81 |
throws AccessionNumberException, SQLException |
83 | 82 |
{ |
84 | 83 |
try { |
85 | 84 |
// INSERT |
86 | 85 |
if ( action.equals("INSERT")) { |
87 | 86 |
|
88 |
// get a new Accession#
|
|
89 |
if ( accNumber == null ) {
|
|
87 |
// get a new docid
|
|
88 |
if ( docid == null ) {
|
|
90 | 89 |
String sitecode = getSitecode(); |
91 | 90 |
String uniqueid = getUniqueID(); |
92 | 91 |
|
93 | 92 |
return sitecode + sep + uniqueid; |
94 | 93 |
|
95 |
// Accession# is not used; return it |
|
96 |
} else if ( !accNumberUsed(accNumber) ) { |
|
97 |
return accNumber; |
|
98 |
|
|
99 |
// Accession# is used; throw an exception to prevent the insertion |
|
94 |
// docid is used; throw an exception to prevent the insertion |
|
95 |
} else if ( accNumberUsed(docid) ) { |
|
96 |
throw new AccessionNumberException |
|
97 |
("Accession number " + docid + " is already in use."); |
|
98 |
// rev is <> 1; throw an exception to prevent the insertion |
|
99 |
} else if ( !rev.equals("1") ) { |
|
100 |
throw new AccessionNumberException |
|
101 |
("Revision number must be 1."); |
|
102 |
// docid is not used and rev=1; return it |
|
100 | 103 |
} else { |
101 |
throw new AccessionNumberException |
|
102 |
("Accession number " + accNumber + " is already in use."); |
|
104 |
return docid; |
|
103 | 105 |
} |
104 | 106 |
|
105 | 107 |
// UPDATE or DELETE |
106 | 108 |
} else if ( action.equals("UPDATE") || action.equals("DELETE")) { |
107 | 109 |
|
108 | 110 |
// Accession# is not provided; throw an exception to prevent the action |
109 |
if ( accNumber == null ) {
|
|
111 |
if ( docid == null ) {
|
|
110 | 112 |
throw new AccessionNumberException("Accession number is required."); |
111 | 113 |
|
112 | 114 |
// Accession# is not current (not in xml_documents); throw an exception |
113 |
} else if ( !accNumberIsCurrent(accNumber) ) {
|
|
115 |
} else if ( !accNumberIsCurrent(docid) ) {
|
|
114 | 116 |
throw new AccessionNumberException |
115 |
("Document not found for Accession number " + accNumber);
|
|
117 |
("Document not found for Accession number " + docid);
|
|
116 | 118 |
|
119 |
// Revision number is not the recent one; throw an exception |
|
120 |
} else if ( !rev.equals(getLastRevision(docid)) ) { |
|
121 |
throw new AccessionNumberException |
|
122 |
("Revision number must be the recent."); |
|
123 |
|
|
117 | 124 |
// Accession# is current (present in xml_documents); return it |
118 | 125 |
} else { |
119 |
return accNumber;
|
|
126 |
return docid;
|
|
120 | 127 |
} |
121 | 128 |
} |
122 | 129 |
|
123 | 130 |
} catch (SQLException e) { |
124 | 131 |
throw new SQLException |
125 |
("Error on AccessionNumber.generate(accNumber, action): "+e.getMessage());
|
|
132 |
("Error on AccessionNumber.generate(): " + e.getMessage());
|
|
126 | 133 |
} |
127 | 134 |
|
128 | 135 |
// never comes here |
... | ... | |
189 | 196 |
return hasAccNumber; |
190 | 197 |
} |
191 | 198 |
|
192 |
/** check for existence of Accesssion Number in xml_documents table */
|
|
199 |
// check for existence of Accesssion Number in xml_documents table
|
|
193 | 200 |
private boolean accNumberIsCurrent(String accNumber) throws SQLException { |
194 | 201 |
|
195 | 202 |
boolean hasCurrentAccNumber = false; |
... | ... | |
214 | 221 |
return hasCurrentAccNumber; |
215 | 222 |
} |
216 | 223 |
|
224 |
// get the recent revision number for docid |
|
225 |
private String getLastRevision(String docid) throws SQLException |
|
226 |
{ |
|
227 |
String rev = ""; |
|
228 |
|
|
229 |
try { |
|
230 |
PreparedStatement pstmt; |
|
231 |
pstmt = conn.prepareStatement |
|
232 |
("SELECT rev FROM xml_documents WHERE docid='" + docid + "'"); |
|
233 |
pstmt.execute(); |
|
234 |
|
|
235 |
ResultSet rs = pstmt.getResultSet(); |
|
236 |
boolean hasRow = rs.next(); |
|
237 |
rev = rs.getString(1); |
|
238 |
pstmt.close(); |
|
239 |
|
|
240 |
} catch (SQLException e) { |
|
241 |
throw new SQLException( |
|
242 |
"Error on AccessionNumber.getLastRevision(): " + e.getMessage()); |
|
243 |
} |
|
244 |
|
|
245 |
return rev; |
|
246 |
} |
|
247 |
|
|
217 | 248 |
} |
src/edu/ucsb/nceas/metacat/DocumentIdentifier.java | ||
---|---|---|
51 | 51 |
public DocumentIdentifier(String docid) throws AccessionNumberException |
52 | 52 |
{ |
53 | 53 |
this.docid = docid; |
54 |
//int numSeps = countSeparator(); |
|
55 |
//if(numSeps > 2 || numSeps < 1) |
|
56 |
//{ |
|
57 |
// throw new AccessionNumberException("Accession number can contain " + |
|
58 |
// "no more than 2 and no fewer than 1 separators."); |
|
59 |
//} |
|
60 |
if(docid.endsWith(".")) |
|
54 |
this.separator = util.getOption("accNumSeparator"); |
|
55 |
|
|
56 |
if(docid.endsWith(this.separator)) |
|
61 | 57 |
{ |
62 | 58 |
throw new AccessionNumberException("Accession number cannot end with " + |
63 | 59 |
"a seperator."); |
64 | 60 |
} |
65 |
if(docid.startsWith("."))
|
|
61 |
if(docid.startsWith(this.separator))
|
|
66 | 62 |
{ |
67 | 63 |
throw new AccessionNumberException("Accession number cannot begin with " + |
68 | 64 |
"a seperator."); |
... | ... | |
76 | 72 |
*/ |
77 | 73 |
private void parseDocid() |
78 | 74 |
{ |
79 |
separator = util.getOption("accNumSeparator"); |
|
80 |
|
|
81 | 75 |
int firstIndex = docid.indexOf(separator); |
82 | 76 |
int lastIndex = docid.lastIndexOf(separator); |
83 | 77 |
if(firstIndex != lastIndex) |
Also available in: Unified diff
- changes to expect revisionid to come from the client on INSERT/UPDATE/DELETE;
now the client should send accession# as:
sitecode.uniqueid.revisionid
INSERT checks if sitecode.uniqueid part does not exist in xml_documents and xml_revisions and revisionid=1
UPDATE/DELETE check if sitecode.uniqueid part is in xml_document and revisionid is the recent number
- keep the old implementation where the client can send accession# without revisionid