Index: event/event-impl/impl/src/java/org/sakaiproject/event/impl/ClusterEventTracking.java =================================================================== --- event/event-impl/impl/src/java/org/sakaiproject/event/impl/ClusterEventTracking.java (revision 33542) +++ event/event-impl/impl/src/java/org/sakaiproject/event/impl/ClusterEventTracking.java (working copy) @@ -37,6 +37,7 @@ import org.sakaiproject.db.api.SqlService; import org.sakaiproject.event.api.Event; import org.sakaiproject.event.api.NotificationService; +import org.sakaiproject.event.cover.EventTrackingService; import org.sakaiproject.time.api.Time; import org.sakaiproject.time.api.TimeService; import org.sakaiproject.util.StringUtil; @@ -85,7 +86,7 @@ * @return the TimeService collaborator. */ protected abstract TimeService timeService(); - + /********************************************************************************************************************************************************************************************************************************************************** * Configuration *********************************************************************************************************************************************************************************************************************************************************/ @@ -263,7 +264,7 @@ String statement = insertStatement(); // collect the fields - Object fields[] = new Object[5]; + Object fields[] = new Object[6]; bindValues(event, fields); // process the insert @@ -298,7 +299,7 @@ // common preparation for each insert String statement = insertStatement(); - Object fields[] = new Object[5]; + Object fields[] = new Object[6]; // write all events for (Iterator i = events.iterator(); i.hasNext();) @@ -362,7 +363,7 @@ String statement; if ("oracle".equals(sqlService().getVendor())) { - statement = "insert into SAKAI_EVENT" + " (EVENT_ID,EVENT_DATE,EVENT,REF,SESSION_ID,EVENT_CODE)" + " values (" + statement = "insert into SAKAI_EVENT" + " (EVENT_ID,EVENT_DATE,EVENT,REF,SESSION_ID,EVENT_CODE,CONTEXT)" + " values (" // form the id based on the sequence + " SAKAI_EVENT_SEQ.NEXTVAL," // date @@ -374,8 +375,10 @@ // session id + " ?," // code + + " ?," + // context + " ?" - + + " )"; } else if ("mysql".equals(sqlService().getVendor())) @@ -381,7 +384,7 @@ else if ("mysql".equals(sqlService().getVendor())) { // leave out the EVENT_ID as it will be automatically generated on the server - statement = "insert into SAKAI_EVENT" + " (EVENT_DATE,EVENT,REF,SESSION_ID,EVENT_CODE)" + " values (" + statement = "insert into SAKAI_EVENT" + " (EVENT_DATE,EVENT,REF,SESSION_ID,EVENT_CODE,CONTEXT)" + " values (" // date + " ?," // event @@ -391,6 +394,8 @@ // session id + " ?," // code + + " ?," + // context + " ?" + " )"; @@ -398,7 +403,7 @@ else // if ("hsqldb".equals(sqlService().getVendor())) { - statement = "insert into SAKAI_EVENT" + " (EVENT_ID,EVENT_DATE,EVENT,REF,SESSION_ID,EVENT_CODE)" + " values (" + statement = "insert into SAKAI_EVENT" + " (EVENT_ID,EVENT_DATE,EVENT,REF,SESSION_ID,EVENT_CODE,CONTEXT)" + " values (" // form the id based on the sequence + " NEXT VALUE FOR SAKAI_EVENT_SEQ," // date @@ -410,6 +415,8 @@ // session id + " ?," // code + + " ?," + // context + " ?" + " )"; @@ -445,7 +452,75 @@ fields[2] = event.getResource(); fields[3] = reportId; fields[4] = (event.getModify() ? "m" : "a"); + + + String context = parseSiteId(fixMalFormedEvents(event).getResource()); + + + + fields[5] = context; + } + + private Event fixMalFormedEvents(Event e){ + String event = e.getEvent(); + String resource = e.getResource(); + + // fix bad reference (resource) format + if(!resource.startsWith("/")) + resource = '/' + resource; + + // fix event ids already in use + String parts[] = resource.split("\\/"); + /* handle MessageCenter special case */ + if(event.startsWith("content.") && parts[1].equals("MessageCenter")) + return EventTrackingService.newEvent( + event.replaceFirst("content.", "msgcntr."), + resource, + false); + + // all ok, return + return e; + } + + + private String parseSiteId(String ref){ + try{ + String[] parts = ref.split("/"); + if(parts == null) + return null; + if(parts.length == 1){ + // try with OLD MessageCenter syntax (MessageCenter::SITE_ID::...) + parts = ref.split("::"); + return parts.length > 1 ? parts[1] : null; + } + if(parts[0].equals("MessageCenter")){ + // MessageCenter without initial '/' + return parts[2]; + } + if(parts[0].equals("")){ + if(parts[1].equals("presence")) + // try with presence syntax (/presence/SITE_ID-presence) + if(parts[2].endsWith("-presence")) + return parts[2].substring(0,parts[2].length()-9); + else + return null; + else if(parts[1].equals("syllabus")) + // try with Syllabus syntax (/syllabus/SITE_ID/...) + return parts[2]; + else if(parts[1].equals("site")) + // try with Section Info syntax (/site/SITE_ID/...) + return parts[2]; + else + // try with most common syntax (/abc/cde/SITE_ID/...) + return parts[3]; + } + }catch(Exception e){ + M_log.debug("Unable to parse site ID from "+ref, e); + } + return null; + } + /********************************************************************************************************************************************************************************************************************************************************** * Runnable