PageRenderTime 27ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/servers/sip-presence/xdm/server/core/xcap-control/sbb/src/main/java/org/openxdm/xcap/server/slee/AggregationProxySbb.java

http://mobicents.googlecode.com/
Java | 586 lines | 406 code | 106 blank | 74 comment | 44 complexity | 0ee2654444be089acdafab41034c7fee MD5 | raw file
Possible License(s): LGPL-3.0, GPL-3.0, LGPL-2.1, GPL-2.0, CC-BY-SA-3.0, CC0-1.0, Apache-2.0, BSD-3-Clause
  1. /*
  2. * JBoss, Home of Professional Open Source
  3. * Copyright 2011, Red Hat, Inc. and individual contributors
  4. * by the @authors tag. See the copyright.txt in the distribution for a
  5. * full listing of individual contributors.
  6. *
  7. * This is free software; you can redistribute it and/or modify it
  8. * under the terms of the GNU Lesser General Public License as
  9. * published by the Free Software Foundation; either version 2.1 of
  10. * the License, or (at your option) any later version.
  11. *
  12. * This software is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with this software; if not, write to the Free
  19. * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  20. * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  21. */
  22. package org.openxdm.xcap.server.slee;
  23. import java.io.IOException;
  24. import java.io.PrintWriter;
  25. import java.util.Iterator;
  26. import java.util.Map;
  27. import javax.servlet.http.HttpServletRequest;
  28. import javax.servlet.http.HttpServletResponse;
  29. import javax.slee.ActivityContextInterface;
  30. import javax.slee.RolledBackContext;
  31. import javax.slee.SbbContext;
  32. import javax.slee.facilities.Tracer;
  33. import net.java.slee.resource.http.events.HttpServletRequestEvent;
  34. import org.mobicents.slee.ChildRelationExt;
  35. import org.mobicents.slee.xdm.server.ServerConfiguration;
  36. import org.openxdm.xcap.common.error.BadRequestException;
  37. import org.openxdm.xcap.common.error.ConflictException;
  38. import org.openxdm.xcap.common.error.InternalServerErrorException;
  39. import org.openxdm.xcap.common.error.MethodNotAllowedException;
  40. import org.openxdm.xcap.common.error.NoParentConflictException;
  41. import org.openxdm.xcap.common.error.NotAuthorizedRequestException;
  42. import org.openxdm.xcap.common.error.NotFoundException;
  43. import org.openxdm.xcap.common.error.PreconditionFailedException;
  44. import org.openxdm.xcap.common.error.UnsupportedMediaTypeException;
  45. import org.openxdm.xcap.common.http.HttpConstant;
  46. import org.openxdm.xcap.common.resource.Resource;
  47. import org.openxdm.xcap.common.uri.ParseException;
  48. import org.openxdm.xcap.common.uri.Parser;
  49. import org.openxdm.xcap.common.uri.ResourceSelector;
  50. import org.openxdm.xcap.server.etag.ETagValidator;
  51. import org.openxdm.xcap.server.etag.IfMatchETagValidator;
  52. import org.openxdm.xcap.server.etag.IfNoneMatchETagValidator;
  53. import org.openxdm.xcap.server.result.ReadResult;
  54. import org.openxdm.xcap.server.result.WriteResult;
  55. /**
  56. *
  57. * @author martins
  58. * @author aayush.bhatnagar
  59. *
  60. */
  61. public abstract class AggregationProxySbb implements javax.slee.Sbb {
  62. private SbbContext sbbContext = null;
  63. private static Tracer logger;
  64. public void setSbbContext(SbbContext context) {
  65. this.sbbContext = context;
  66. if (logger == null) {
  67. logger = sbbContext.getTracer(this.getClass().getSimpleName());
  68. }
  69. }
  70. public void unsetSbbContext() {
  71. this.sbbContext = null;
  72. }
  73. public void sbbCreate() throws javax.slee.CreateException {
  74. }
  75. public void sbbPostCreate() throws javax.slee.CreateException {
  76. }
  77. public void sbbActivate() {
  78. }
  79. public void sbbPassivate() {
  80. }
  81. public void sbbRemove() {
  82. }
  83. public void sbbLoad() {
  84. }
  85. public void sbbStore() {
  86. }
  87. public void sbbExceptionThrown(Exception exception, Object event,
  88. ActivityContextInterface activity) {
  89. if (logger.isFineEnabled())
  90. logger.fine("sbbExceptionThrown(exception=" + exception.toString()
  91. + ",event=" + event.toString() + ",activity="
  92. + activity.toString() + ")");
  93. }
  94. public void sbbRolledBack(RolledBackContext sbbRolledBack) {
  95. if (logger.isFineEnabled())
  96. logger.fine("sbbRolledBack(sbbRolledBack="
  97. + sbbRolledBack.toString() + ")");
  98. }
  99. protected SbbContext getSbbContext() {
  100. return sbbContext;
  101. }
  102. // CHILD RELATIONS & RA ABSTRACTIONS
  103. // ################################################################
  104. public abstract ChildRelationExt getRequestProcessorChildRelation();
  105. protected RequestProcessorSbbLocalObject getRequestProcessor() {
  106. try {
  107. return (RequestProcessorSbbLocalObject) getRequestProcessorChildRelation()
  108. .create(ChildRelationExt.DEFAULT_CHILD_NAME);
  109. } catch (Exception e) {
  110. logger.severe("Failed to create child sbb", e);
  111. return null;
  112. }
  113. }
  114. // added by aayush here: Child relation and child sbb creation
  115. // for Authentication Proxy.
  116. public abstract ChildRelationExt getAuthenticationProxyChildRelation();
  117. protected AuthenticationProxySbbLocalObject getAuthenticationProxy() {
  118. try {
  119. return (AuthenticationProxySbbLocalObject) getAuthenticationProxyChildRelation()
  120. .create(ChildRelationExt.DEFAULT_CHILD_NAME);
  121. } catch (Exception e) {
  122. logger.severe("Failed to create child sbb", e);
  123. return null;
  124. }
  125. }
  126. public void onDelete(HttpServletRequestEvent event,
  127. ActivityContextInterface aci) {
  128. // detach from the activity
  129. aci.detach(sbbContext.getSbbLocalObject());
  130. HttpServletRequest request = event.getRequest();
  131. HttpServletResponse response = event.getResponse();
  132. try {
  133. PrintWriter responseWriter = response.getWriter();
  134. try {
  135. // get xcap root from config
  136. String xcapRoot = ServerConfiguration.getInstance()
  137. .getXcapRoot();
  138. // create resource selector from request's uri & query
  139. // string
  140. ResourceSelector resourceSelector = Parser
  141. .parseResourceSelector(xcapRoot,
  142. request.getRequestURI(),
  143. request.getQueryString());
  144. // user authentication
  145. String user = getAuthenticationProxy().authenticate(request,
  146. response);
  147. if (response.isCommitted()) {
  148. // authentication proxy replied, stop processing request
  149. return;
  150. }
  151. // check conditional request headers
  152. // get ifMatch eTag
  153. ETagValidator eTagValidator = null;
  154. String eTag = request.getHeader(HttpConstant.HEADER_IF_MATCH);
  155. if (eTag != null) {
  156. eTagValidator = new IfMatchETagValidator(eTag);
  157. } else {
  158. eTag = request.getHeader(HttpConstant.HEADER_IF_NONE_MATCH);
  159. if (eTag != null) {
  160. eTagValidator = new IfNoneMatchETagValidator(eTag);
  161. }
  162. }
  163. // delete in data source
  164. if (logger.isInfoEnabled()) {
  165. logger.info("delete(resourceSelector=" + resourceSelector
  166. + ",eTagValidator=" + eTagValidator + ",xcapRoot="
  167. + xcapRoot + ",user=" + user + ")");
  168. }
  169. WriteResult result = getRequestProcessor().delete(
  170. resourceSelector, eTagValidator, xcapRoot, user);
  171. // set response status
  172. response.setStatus(result.getResponseStatus());
  173. // set response entity tag if provided
  174. if (result.getResponseEntityTag() != null) {
  175. response.setHeader(HttpConstant.HEADER_ETAG,
  176. result.getResponseEntityTag());
  177. }
  178. } catch (ParseException e) {
  179. NotFoundException ne = new NotFoundException();
  180. if (logger.isFineEnabled())
  181. logger.fine(
  182. "invalid xcap uri, replying , replying "
  183. + ne.getResponseStatus(), e);
  184. response.setStatus(ne.getResponseStatus());
  185. } catch (NotFoundException e) {
  186. if (logger.isFineEnabled())
  187. logger.fine(
  188. "doc/elem/attrib not found, replying "
  189. + e.getResponseStatus(), e);
  190. response.setStatus(e.getResponseStatus());
  191. } catch (ConflictException e) {
  192. if (logger.isFineEnabled())
  193. logger.fine(
  194. "conflict exception, replying "
  195. + e.getResponseStatus(), e);
  196. response.setStatus(e.getResponseStatus());
  197. responseWriter.print(e.getResponseContent());
  198. } catch (MethodNotAllowedException e) {
  199. if (logger.isFineEnabled())
  200. logger.fine(
  201. "method not allowed, replying "
  202. + e.getResponseStatus(), e);
  203. response.setStatus(e.getResponseStatus());
  204. // add all exception headers
  205. Map<String, String> exceptionHeaders = e.getResponseHeaders();
  206. for (Iterator<String> i = exceptionHeaders.keySet().iterator(); i
  207. .hasNext();) {
  208. String headerName = i.next();
  209. String headerValue = exceptionHeaders.get(headerName);
  210. response.setHeader(headerName, headerValue);
  211. }
  212. } catch (PreconditionFailedException e) {
  213. if (logger.isFineEnabled())
  214. logger.fine(
  215. "precondition failed on etags, replying "
  216. + e.getResponseStatus(), e);
  217. response.setStatus(e.getResponseStatus());
  218. } catch (InternalServerErrorException e) {
  219. logger.warning("internal server error: " + e.getMessage()
  220. + ", replying " + e.getResponseStatus(), e);
  221. response.setStatus(e.getResponseStatus());
  222. } catch (BadRequestException e) {
  223. if (logger.isFineEnabled())
  224. logger.fine(
  225. "bad request, replying " + e.getResponseStatus(), e);
  226. response.setStatus(e.getResponseStatus());
  227. } catch (NotAuthorizedRequestException e) {
  228. if (logger.isFineEnabled())
  229. logger.fine(
  230. "not authorized, replying " + e.getResponseStatus(),
  231. e);
  232. response.setStatus(e.getResponseStatus());
  233. }
  234. // send to client
  235. responseWriter.close();
  236. } catch (Throwable e) {
  237. logger.severe("Error processing onDelete()", e);
  238. }
  239. }
  240. public void onGet(HttpServletRequestEvent event,
  241. ActivityContextInterface aci) {
  242. // detach from the activity
  243. aci.detach(sbbContext.getSbbLocalObject());
  244. HttpServletRequest request = event.getRequest();
  245. HttpServletResponse response = event.getResponse();
  246. try {
  247. PrintWriter responseWriter = response.getWriter();
  248. try {
  249. // create jxcap resource selector from request's uri & query
  250. // string
  251. ResourceSelector resourceSelector = Parser
  252. .parseResourceSelector(ServerConfiguration
  253. .getInstance().getXcapRoot(), request
  254. .getRequestURI(), request.getQueryString());
  255. // user authentication
  256. String user = getAuthenticationProxy().authenticate(request,
  257. response);
  258. if (response.isCommitted()) {
  259. // authentication proxy replied, stop processing request
  260. return;
  261. }
  262. // read result from data source
  263. if (logger.isInfoEnabled()) {
  264. logger.info("get(resourceSelector=" + resourceSelector
  265. + ",user=" + user + ")");
  266. }
  267. ReadResult result = getRequestProcessor().get(resourceSelector,
  268. user);
  269. // get data object from result
  270. Resource dataObject = result.getResponseDataObject();
  271. // set response content type
  272. response.setContentType(dataObject.getMimetype());
  273. // set response entity tag
  274. response.setHeader(HttpConstant.HEADER_ETAG,
  275. result.getResponseEntityTag());
  276. // add response content
  277. responseWriter.println(dataObject.toXML());
  278. } catch (ParseException e) {
  279. NotFoundException ne = new NotFoundException();
  280. logger.warning(
  281. "invalid xcap uri, replying " + ne.getResponseStatus(),
  282. e);
  283. response.setStatus(ne.getResponseStatus());
  284. } catch (NotFoundException e) {
  285. if (logger.isFineEnabled())
  286. logger.fine(
  287. "doc/elem/attrib not found, replying "
  288. + e.getResponseStatus(), e);
  289. response.setStatus(e.getResponseStatus());
  290. } catch (InternalServerErrorException e) {
  291. logger.warning("internal server error: " + e.getMessage()
  292. + ", replying " + e.getResponseStatus(), e);
  293. response.setStatus(e.getResponseStatus());
  294. } catch (BadRequestException e) {
  295. if (logger.isFineEnabled())
  296. logger.fine(
  297. "bad request, replying " + e.getResponseStatus(), e);
  298. response.setStatus(e.getResponseStatus());
  299. } catch (NotAuthorizedRequestException e) {
  300. if (logger.isFineEnabled())
  301. logger.fine(
  302. "not authorized, replying " + e.getResponseStatus(),
  303. e);
  304. response.setStatus(e.getResponseStatus());
  305. }
  306. // send to client
  307. responseWriter.close();
  308. } catch (Throwable e) {
  309. logger.severe("Error processing onGet()", e);
  310. }
  311. }
  312. public void onPut(HttpServletRequestEvent event,
  313. ActivityContextInterface aci) {
  314. // detach from the activity
  315. aci.detach(sbbContext.getSbbLocalObject());
  316. HttpServletRequest request = event.getRequest();
  317. HttpServletResponse response = event.getResponse();
  318. try {
  319. PrintWriter responseWriter = response.getWriter();
  320. try {
  321. // create resource selector from request's uri & query
  322. // string
  323. ResourceSelector resourceSelector = Parser
  324. .parseResourceSelector(ServerConfiguration
  325. .getInstance().getXcapRoot(), request
  326. .getRequestURI(), request.getQueryString());
  327. // user authentication
  328. String user = getAuthenticationProxy().authenticate(request,
  329. response);
  330. if (response.isCommitted()) {
  331. // authentication proxy replied, stop processing request
  332. return;
  333. }
  334. // check conditional request headers
  335. // get ifMatch eTag
  336. ETagValidator eTagValidator = null;
  337. String eTag = request.getHeader(HttpConstant.HEADER_IF_MATCH);
  338. if (eTag != null) {
  339. eTagValidator = new IfMatchETagValidator(eTag);
  340. } else {
  341. eTag = request.getHeader(HttpConstant.HEADER_IF_NONE_MATCH);
  342. if (eTag != null) {
  343. eTagValidator = new IfNoneMatchETagValidator(eTag);
  344. }
  345. }
  346. // get content mimetype
  347. String mimetype = request.getContentType();
  348. if (logger.isInfoEnabled()) {
  349. logger.info("put(resourceSelector=" + resourceSelector
  350. + ",mimetype=" + mimetype + ",eTagValidator="
  351. + eTagValidator + ",xcapRoot="
  352. + ServerConfiguration.getInstance().getXcapRoot()
  353. + ",user=" + user + ")");
  354. }
  355. // put object in data source
  356. WriteResult result = getRequestProcessor().put(
  357. resourceSelector, mimetype, request.getInputStream(),
  358. eTagValidator,
  359. ServerConfiguration.getInstance().getXcapRoot(), user);
  360. // set response status
  361. response.setStatus(result.getResponseStatus());
  362. // set response entity tag with new one on result
  363. response.setHeader(HttpConstant.HEADER_ETAG,
  364. result.getResponseEntityTag());
  365. } catch (ParseException e) {
  366. // invalid resource selector
  367. BadRequestException bre = new BadRequestException();
  368. if (logger.isFineEnabled())
  369. logger.fine(
  370. "invalid xcap uri, replying "
  371. + bre.getResponseStatus(), e);
  372. response.setStatus(bre.getResponseStatus());
  373. } catch (IOException e) {
  374. InternalServerErrorException ie = new InternalServerErrorException(
  375. e.getMessage(), e);
  376. logger.warning("internal server error: " + e.getMessage()
  377. + ", replying " + ie.getResponseStatus(), e);
  378. response.setStatus(ie.getResponseStatus());
  379. } catch (NoParentConflictException e) {
  380. // add base uri
  381. e.setSchemeAndAuthorityURI(ServerConfiguration.getInstance()
  382. .getSchemeAndAuthority());
  383. // add query string if exists
  384. if (request.getQueryString() != null) {
  385. e.setQueryComponent(request.getQueryString());
  386. }
  387. if (logger.isFineEnabled())
  388. logger.fine(
  389. "no parent conflict exception, replying "
  390. + e.getResponseStatus(), e);
  391. response.setStatus(e.getResponseStatus());
  392. responseWriter.print(e.getResponseContent());
  393. } catch (ConflictException e) {
  394. if (logger.isFineEnabled())
  395. logger.fine(
  396. "conflict exception, replying "
  397. + e.getResponseStatus(), e);
  398. response.setStatus(e.getResponseStatus());
  399. responseWriter.print(e.getResponseContent());
  400. } catch (MethodNotAllowedException e) {
  401. if (logger.isFineEnabled())
  402. logger.fine(
  403. "method not allowed, replying "
  404. + e.getResponseStatus(), e);
  405. response.setStatus(e.getResponseStatus());
  406. // add all exception headers
  407. Map<String, String> exceptionHeaders = e.getResponseHeaders();
  408. for (Iterator<String> i = exceptionHeaders.keySet().iterator(); i
  409. .hasNext();) {
  410. String headerName = i.next();
  411. String headerValue = exceptionHeaders.get(headerName);
  412. response.setHeader(headerName, headerValue);
  413. }
  414. } catch (UnsupportedMediaTypeException e) {
  415. if (logger.isFineEnabled())
  416. logger.fine(
  417. "unsupported media exception, replying "
  418. + e.getResponseStatus(), e);
  419. response.setStatus(e.getResponseStatus());
  420. } catch (InternalServerErrorException e) {
  421. logger.warning("internal server error: " + e.getMessage()
  422. + ", replying " + e.getResponseStatus(), e);
  423. response.setStatus(e.getResponseStatus());
  424. } catch (PreconditionFailedException e) {
  425. if (logger.isFineEnabled())
  426. logger.fine(
  427. "precondition failed on etags, replying "
  428. + e.getResponseStatus(), e);
  429. response.setStatus(e.getResponseStatus());
  430. } catch (BadRequestException e) {
  431. if (logger.isFineEnabled())
  432. logger.fine(
  433. "invalid xcap uri, replying "
  434. + e.getResponseStatus(), e);
  435. response.setStatus(e.getResponseStatus());
  436. } catch (NotAuthorizedRequestException e) {
  437. if (logger.isFineEnabled())
  438. logger.fine(
  439. "not authorized, replying " + e.getResponseStatus(),
  440. e);
  441. response.setStatus(e.getResponseStatus());
  442. }
  443. // send to client
  444. responseWriter.close();
  445. } catch (Throwable e) {
  446. logger.severe("Error processing onPut()", e);
  447. }
  448. }
  449. // ######################################## NOT SUPPORTED METHODS
  450. public void onPost(HttpServletRequestEvent event,
  451. ActivityContextInterface aci) {
  452. sendUnsupportedRequestErrorResponse(event, aci);
  453. }
  454. public void onHead(HttpServletRequestEvent event,
  455. ActivityContextInterface aci) {
  456. sendUnsupportedRequestErrorResponse(event, aci);
  457. }
  458. public void onOptions(HttpServletRequestEvent event,
  459. ActivityContextInterface aci) {
  460. sendUnsupportedRequestErrorResponse(event, aci);
  461. }
  462. public void onTrace(HttpServletRequestEvent event,
  463. ActivityContextInterface aci) {
  464. sendUnsupportedRequestErrorResponse(event, aci);
  465. }
  466. private void sendUnsupportedRequestErrorResponse(
  467. HttpServletRequestEvent event, ActivityContextInterface aci) {
  468. // detach from the activity
  469. aci.detach(sbbContext.getSbbLocalObject());
  470. // method not allowed, set right sc and allow header then send response
  471. try {
  472. HttpServletResponse response = event.getResponse();
  473. response.setStatus(MethodNotAllowedException.RESPONSE_STATUS);
  474. response.setHeader(HttpConstant.HEADER_ALLOW, "GET, PUT, DELETE");
  475. response.flushBuffer();
  476. } catch (Exception e) {
  477. logger.severe("unable to send response", e);
  478. }
  479. }
  480. }