001: /**
002: * LibreSource
003: * Copyright (C) 2004-2008 Artenum SARL / INRIA
004: * http://www.libresource.org - contact@artenum.com
005: *
006: * This file is part of the LibreSource software,
007: * which can be used and distributed under license conditions.
008: * The license conditions are provided in the LICENSE.TXT file
009: * at the root path of the packaging that enclose this file.
010: * More information can be found at
011: * - http://dev.libresource.org/home/license
012: *
013: * Initial authors :
014: *
015: * Guillaume Bort / INRIA
016: * Francois Charoy / Universite Nancy 2
017: * Julien Forest / Artenum
018: * Claude Godart / Universite Henry Poincare
019: * Florent Jouille / INRIA
020: * Sebastien Jourdain / INRIA / Artenum
021: * Yves Lerumeur / Artenum
022: * Pascal Molli / Universite Henry Poincare
023: * Gerald Oster / INRIA
024: * Mariarosa Penzi / Artenum
025: * Gerard Sookahet / Artenum
026: * Raphael Tani / INRIA
027: *
028: * Contributors :
029: *
030: * Stephane Bagnier / Artenum
031: * Amadou Dia / Artenum-IUP Blois
032: * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
033: */package org.libresource.core.ejb;
034:
035: import org.libresource.Libresource;
036: import org.libresource.LibresourceEvent;
037: import org.libresource.LibresourceResourceIdentifier;
038:
039: import org.libresource.core.interfaces.TimelineResourceLocal;
040:
041: import org.libresource.kernel.KernelConstants;
042: import org.libresource.kernel.interfaces.KernelService;
043:
044: import org.libresource.membership.MembershipConstants;
045: import org.libresource.membership.interfaces.MembershipService;
046:
047: import java.net.URI;
048:
049: import java.sql.Connection;
050: import java.sql.PreparedStatement;
051: import java.sql.ResultSet;
052:
053: import javax.ejb.MessageDrivenBean;
054: import javax.ejb.MessageDrivenContext;
055:
056: import javax.jms.Message;
057: import javax.jms.MessageListener;
058:
059: /**
060: * @ejb.bean name="TimelinesDispatcher"
061: * transaction-type="Container"
062: * acknowledge-mode="Auto-acknowledge"
063: * destination-type="javax.jms.Topic"
064: * subscription-durability="NonDurable"
065: * message-selector="eventType NOT LIKE 'libresourceWeb%'"
066: *
067: * @jonas.bean ejb-name="TimelinesDispatcher"
068: *
069: * @jonas.message-driven-destination jndi-name="libresource.events"
070: *
071: * @jboss.destination-jndi-name name="topic/libresource.events"
072: *
073: * @ejb.transaction type="NotSupported"
074: */
075: public class TimelinesDispatcherBean implements MessageDrivenBean,
076: MessageListener {
077: private transient MessageDrivenContext mdbContext;
078: private transient KernelService kernelService;
079: private transient MembershipService membershipService;
080: private transient URI unauthentifiedUserURI;
081:
082: public void onMessage(Message message) {
083: Connection connection = null;
084: PreparedStatement st = null;
085: ResultSet rs = null;
086:
087: try {
088: LibresourceEvent libresourceEvent = LibresourceEvent
089: .toLibresourceEvent(message);
090:
091: URI fromUri = libresourceEvent.getFromResource();
092: connection = Libresource.getDatasource().getConnection();
093:
094: String uriPath = fromUri.getPath();
095: st = connection
096: .prepareStatement(org.libresource.Libresource
097: .getLibresourceConfiguration("sql.timeline.query"));
098: st.setString(1, uriPath);
099:
100: rs = st.executeQuery();
101:
102: while (rs.next()) {
103: String id = rs
104: .getString(org.libresource.Libresource
105: .getLibresourceConfiguration("sql.timeline.id"));
106: TimelineResourceLocal timelineResourceLocal = (TimelineResourceLocal) Libresource
107: .findResource(new LibresourceResourceIdentifier(
108: "LibresourceCore", "Timeline", id));
109:
110: if (timelineResourceLocal.getLoggedEvents().contains(
111: libresourceEvent.getEventType())) {
112: if (timelineResourceLocal.getPublicEvents()) {
113: if (getKernelService().checkSecurity(
114: getUnauthentifiedUserURI(), fromUri,
115: KernelConstants.SECURITY_READ)) {
116: timelineResourceLocal.log(libresourceEvent);
117: }
118: } else {
119: timelineResourceLocal.log(libresourceEvent);
120: }
121: }
122: }
123: } catch (Exception e) {
124: e.printStackTrace();
125: } finally {
126: try {
127: if (rs != null) {
128: rs.close();
129: }
130: } catch (Exception e) {
131: }
132:
133: try {
134: if (st != null) {
135: st.close();
136: }
137: } catch (Exception e) {
138: }
139:
140: try {
141: if (connection != null) {
142: connection.close();
143: }
144: } catch (Exception e) {
145: }
146: }
147: }
148:
149: // standard call back methods
150: public void setMessageDrivenContext(MessageDrivenContext ctx) {
151: mdbContext = ctx;
152: }
153:
154: public void ejbRemove() {
155: }
156:
157: public void ejbCreate() {
158: }
159:
160: private KernelService getKernelService() throws Exception {
161: if (kernelService == null) {
162: kernelService = (KernelService) Libresource
163: .getService(KernelConstants.SERVICE);
164: }
165:
166: return kernelService;
167: }
168:
169: private MembershipService getMembershipService() throws Exception {
170: if (membershipService == null) {
171: membershipService = (MembershipService) Libresource
172: .getService(MembershipConstants.SERVICE);
173: }
174:
175: return membershipService;
176: }
177:
178: private URI getUnauthentifiedUserURI() throws Exception {
179: if (unauthentifiedUserURI == null) {
180: unauthentifiedUserURI = new URI(getMembershipService()
181: .getUsersRootURI()
182: + "/"
183: + getMembershipService().getUnauthentifiedUserId());
184: }
185:
186: return unauthentifiedUserURI;
187: }
188: }
|