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
Recently Visited
AndrewHepler
|
A8MakeshiftCrew
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