General Actions:
Log-in
Wiki:
Courses
▼
:
Document Index
»
Space:
DSSF2008
▼
:
Document Index
»
Page:
KennethsTestArea
Search
DSSF2008
:
KennethsTestArea
Page Actions:
Export
▼
:
Export as PDF
Export as RTF
Export as HTML
More actions
▼
:
Print preview
View Source
KennethsTestArea
Wiki source code of
KennethsTestArea
Last modified by
Hal Eden
on 2010/08/20 11:06
Content
·
Comments
(0)
·
Attachments
(2)
·
History
·
Information
Hide line numbers
1: $request.number 2: 1. $request.assignmentId 3: 4: <% 5: import java.util.StringTokenizer 6: import java.util.HashMap 7: import com.xpn.xwiki.doc.XWikiAttachment 8: import groovy.xml.MarkupBuilder 9: 10: if (xwiki.hasAdminRights()) { 11: def attachmentName = "userdistances-weightedtimes.txt" 12: 13: 14: 15: if(request.get("updaterelations") != null) { 16: 17: //common edits user relations 18: def sql = ", BaseObject as obj where obj.name=doc.fullName and obj.className='XWiki.XWikiUsers'" 19: def usersArray = [] 20: 21: for (item in xwiki.searchDocuments(sql)) { 22: def username = xwiki.getUserName(item) 23: def user = xwiki.getUser(item) 24: 25: if (user.isUserInGroup("XWiki.DCNM2009")) { 26: //TODO: different periods for the revision criteria 27: def last_week_period = xwiki.criteriaService.periodFactory.createSinceWeeksPeriod(1) 28: def previous_period = xwiki.criteriaService.periodFactory.createPeriod(xwiki.criteriaService.periodFactory.getALL_TIME().getStart(), last_week_period.getStart()) 29: 30: def criteria_new = xwiki.criteriaService.revisionCriteriaFactory.createRevisionCriteria(item, last_week_period) 31: def criteria_old = xwiki.criteriaService.revisionCriteriaFactory.createRevisionCriteria(item, previous_period) 32: usersArray.add([item, criteria_new, criteria_old, [], 0]) 33: } 34: } 35: 36: 37: sql = ", BaseObject as obj where doc.web='DCNM2009'" 38: 39: def test = 0 40: 41: for (item in xwiki.searchDocuments(sql)) { 42: 43: def currDocument = xwiki.getDocument(item) 44: //checks if each user has editing this doc 45: for(currUser in usersArray) { 46: def revisions_old = currDocument.getRevisions(currUser[2]) 47: def revisions_new = currDocument.getRevisions(currUser[1]) 48: 49: if(revisions_new.size() > 0) { 50: currUser[3].add(2) //revisions_new.size() 51: currUser[4] += 2 52: }else if(revisions_old.size() > 0) { 53: currUser[3].add(1) //revisions_old.size() 54: currUser[4] += 1 55: } 56: else { 57: currUser[3].add(0) 58: } 59: } 60: } 61: 62: def distanceArray = [] 63: def dimension = usersArray.size() 64: for(i in 0..(dimension - 1)) { 65: def row = new double[dimension] 66: distanceArray.add(row) 67: 68: //fill in previously calculated distances (symmetric matrix) 69: for(prev in 0..(i-1)) { 70: distanceArray[i][prev] = distanceArray[prev][i] 71: } 72: 73: //calculate distances 74: if(i < (dimension - 1)) { 75: for(next in (i+1)..(dimension - 1)) { 76: 77: 78: /* 79: //euclidean distance normalized so that 1 = the same point, 0 = separate 80: def ss = 0 81: for(k in 0..(usersArray[i][3].size() - 1)) { 82: def dim = usersArray[i][3][k] - usersArray[next][3][k] 83: ss += dim * dim 84: } 85: distanceArray[i][next] = 1 / (1 + Math.sqrt(ss)) 86: 87: 88: */ 89: //tanimoto distance 90: //calculate cross product of usersArray[i][2] and usersArray[next][2] 91: def totalShared = 0 92: for(k in 0..(usersArray[i][3].size() - 1)) { 93: //if(usersArray[i][3][k] * usersArray[next][3][k] > 0) { 94: totalShared += Math.min(usersArray[i][3][k], usersArray[next][3][k]) 95: } 96: 97: def denom = (double)(usersArray[next][4]+ usersArray[i][4] - totalShared) 98: if(denom != 0) { 99: distanceArray[i][next] = totalShared / denom 100: } 101: else { 102: distanceArray[i][next] = 0 103: } 104: 105: } 106: } 107: } 108: 109: //write out connection matrix to an attachment 110: def writer = new StringWriter() 111: writer.write(distanceArray.size() + "\n") 112: for(i in 0..(usersArray.size()-1)) { 113: writer.write(usersArray[i][0]) 114: if(i < usersArray.size()-1) { 115: writer.write(",") 116: } 117: } 118: writer.write("\n") 119: for(i in 0..(distanceArray.size()-1)) { 120: for(j in 0..(distanceArray.size()-1)) { 121: writer.write("" + distanceArray[i][j]) 122: if(j < distanceArray.size()-1) { 123: writer.write(",") 124: } 125: } 126: writer.write("\n") 127: } 128: 129: //MOVED TO TOP: def attachmentName = "userdistances-weightedtimes.txt" 130: def attachment = doc.getDocument().getAttachment(attachmentName) 131: if (!attachment){ 132: attachment = new XWikiAttachment(doc.getDocument(), attachmentName) 133: doc.getDocument().getAttachmentList().add(attachment) 134: } 135: 136: attachment.setContent(writer.toString().getBytes()) 137: doc.getDocument().saveAttachmentContent(attachment, context.getContext()) 138: doc.save() 139: 140: println "Finished updating user relations." 141: 142: println "[View top relations per user>" + doc.fullName + "?viewtoprelations=1]" 143: } 144: else if(request.get("viewtoprelations") != null){ 145: //MOVED TO TOP: def attachmentName = "userdistances.txt" 146: def attachment = doc.getAttachment(attachmentName) 147: if (!attachment){ 148: println "No user relations file found." 149: } 150: else { 151: def content = attachment.getContentAsString() 152: def reader = new BufferedReader(new StringReader(content)) 153: def size = Integer.parseInt(reader.readLine()) 154: def users = [] 155: def userListStr = new StringTokenizer(reader.readLine(), ",") 156: for(i in 1..size) { 157: users.add(userListStr.nextToken()) 158: } 159: def sortedDistanceMatrix = [] 160: for(i in 1..size) { 161: def distanceStr = new StringTokenizer(reader.readLine(), ",") 162: def row = [] 163: for(j in 1..size) { 164: row.add([users[j-1],Double.parseDouble(distanceStr.nextToken())]) 165: } 166: 167: //sort the row 168: for(j in 1..(size-1)) { 169: def valueC = row[j][1] 170: def valueN = row[j][0] 171: def k = j-1 172: while(k >= 0 && row[k][1] < valueC) { 173: row[k + 1][0] = row[k][0] 174: row[k + 1][1] = row[k][1] 175: k = k-1 176: } 177: row[k+1][0] = valueN 178: row[k+1][1] = valueC 179: } 180: 181: //prints users' top five connected people if they exist 182: print users[i-1] + ": " 183: for(j in 0..4) { 184: if(row[j][1] > 0) { 185: if(j > 0) { 186: print ", " 187: } 188: print xwiki.getUserName(row[j][0]) 189: } 190: } 191: println "\n" 192: 193: sortedDistanceMatrix.add(row) 194: } 195: 196: 197: } 198: } 199: else { 200: println "[Update the User Relations>" + doc.fullName + "?updaterelations=1]" 201: println "[View top relations per user>" + doc.fullName + "?viewtoprelations=1]" 202: } 203: } 204: 205: 206: //Old code 207: //interests user relations------------------------------- 208: /* 209: def sql = ", BaseObject as obj where obj.name=doc.fullName and obj.className='XWiki.XWikiUsers'" 210: def interestArray = [] 211: 212: for (item in xwiki.searchDocuments(sql)) { 213: def userdoc = xwiki.getDocument(item) 214: def userobj = userdoc.getObject("XWiki.XWikiUsers") 215: def interests = userobj.getProperty("research_interests") 216: 217: def username = xwiki.getUserName(item) 218: def user = xwiki.getUser(item) 219: 220: if (interests != null && user.isUserInGroup("XWiki.DCNM2009")) { 221: 222: def st = new StringTokenizer(interests.getValue(), ",\n\r") 223: def interestsList = [] 224: while(st.hasMoreTokens()) { 225: interestsList.add(st.nextToken().toLowerCase()) 226: } 227: def userNameAndInterests = [username, interestsList] 228: interestArray.add(userNameAndInterests) 229: } 230: 231: } 232: 233: def distanceArray = [] 234: def dimension = interestArray.size() 235: for(i in 0..(dimension - 1)) { 236: def row = new double[dimension] 237: distanceArray.add(row) 238: 239: //fill in previously calculated distances (symmetric matrix) 240: for(prev in 0..(i-1)) { 241: distanceArray[i][prev] = distanceArray[prev][i] 242: } 243: 244: //calculate distances 245: if(i < (dimension - 1)) { 246: for(next in (i+1)..(dimension - 1)) { 247: //calculate distance between interestArray[i][1] and interestArray[next][1] 248: //tanimoto distance 249: def totalShared = 0 250: for(interestItem in interestArray[i][1]) { 251: for(compareInterestItem in interestArray[next][1]) { 252: 253: 254: if(interestItem.equalsIgnoreCase(compareInterestItem)) { 255: 256: totalShared = totalShared + 1 257: break 258: } 259: } 260: } 261: def denom = (double)(interestArray[next][1].size() + interestArray[i][1].size() - totalShared) 262: if(denom != 0) { 263: distanceArray[i][next] = totalShared / denom 264: } 265: else { 266: distanceArray[i][next] = 0 267: } 268: } 269: } 270: } 271: 272: for(i in 0..(distanceArray.size()-1)) { 273: for(j in 0..(distanceArray.size()-1)) { 274: print distanceArray[i][j] + ", " 275: } 276: print "<br>" 277: }*/ 278: //----------------------------------------- 279: 280: %>
Course Pages
Home
Roster
Assignments
Schedule and Syllabus
Course Announcement
Lecture Material
Relevant Resources
Questionnaires
Independent Research Projects
Blog
Search
Search query
Recently Modified
MSC Final Project ...
MakeShiftCrew Proj...
Embedding Content
Human-Centered Com...
Assignment12KyleMa...
See More Changes
Recent Comments
Recently Created
WebPreferences
|
RatingStats
|
palen
|
ksiek
|
kena