1. /*
  2. * @(#)BufferManagerFactory.java 1.15 04/06/21
  3. *
  4. * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
  5. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
  6. */
  7. package com.sun.corba.se.impl.encoding;
  8. import com.sun.corba.se.impl.encoding.BufferManagerRead;
  9. import com.sun.corba.se.impl.encoding.BufferManagerReadGrow;
  10. import com.sun.corba.se.impl.encoding.BufferManagerReadStream;
  11. import com.sun.corba.se.impl.encoding.BufferManagerWrite;
  12. import com.sun.corba.se.impl.protocol.giopmsgheaders.Message;
  13. import com.sun.corba.se.impl.logging.ORBUtilSystemException;
  14. import com.sun.corba.se.spi.logging.CORBALogDomains;
  15. import com.sun.corba.se.spi.ior.iiop.GIOPVersion;
  16. import com.sun.corba.se.spi.orb.ORB;
  17. import org.omg.CORBA.INTERNAL;
  18. /**
  19. * Creates read/write buffer managers to handle over/under flow
  20. * in CDR*putStream.
  21. */
  22. public class BufferManagerFactory
  23. {
  24. public static final int GROW = 0;
  25. public static final int COLLECT = 1;
  26. public static final int STREAM = 2;
  27. // The next two methods allow creation of BufferManagers based on GIOP version.
  28. // We may want more criteria to be involved in this decision.
  29. // These are only used for sending messages (so could be fragmenting)
  30. public static BufferManagerRead newBufferManagerRead(
  31. GIOPVersion version, byte encodingVersion, ORB orb) {
  32. // REVISIT - On the reading side, shouldn't we monitor the incoming
  33. // fragments on a given connection to determine what fragment size
  34. // they're using, then use that ourselves?
  35. if (encodingVersion != Message.CDR_ENC_VERSION) {
  36. return new BufferManagerReadGrow(orb);
  37. }
  38. switch (version.intValue())
  39. {
  40. case GIOPVersion.VERSION_1_0:
  41. return new BufferManagerReadGrow(orb);
  42. case GIOPVersion.VERSION_1_1:
  43. case GIOPVersion.VERSION_1_2:
  44. // The stream reader can handle fragmented and
  45. // non fragmented messages
  46. return new BufferManagerReadStream(orb);
  47. default:
  48. // REVISIT - what is appropriate?
  49. throw new INTERNAL("Unknown GIOP version: "
  50. + version);
  51. }
  52. }
  53. public static BufferManagerRead newBufferManagerRead(
  54. int strategy, byte encodingVersion, ORB orb) {
  55. if (encodingVersion != Message.CDR_ENC_VERSION) {
  56. if (strategy != BufferManagerFactory.GROW) {
  57. ORBUtilSystemException wrapper =
  58. ORBUtilSystemException.get((ORB)orb,
  59. CORBALogDomains.RPC_ENCODING);
  60. throw wrapper.invalidBuffMgrStrategy("newBufferManagerRead");
  61. }
  62. return new BufferManagerReadGrow(orb);
  63. }
  64. switch (strategy) {
  65. case BufferManagerFactory.GROW:
  66. return new BufferManagerReadGrow(orb);
  67. case BufferManagerFactory.COLLECT:
  68. throw new INTERNAL("Collect strategy invalid for reading");
  69. case BufferManagerFactory.STREAM:
  70. return new BufferManagerReadStream(orb);
  71. default:
  72. throw new INTERNAL("Unknown buffer manager read strategy: "
  73. + strategy);
  74. }
  75. }
  76. public static BufferManagerWrite newBufferManagerWrite(
  77. int strategy, byte encodingVersion, ORB orb) {
  78. if (encodingVersion != Message.CDR_ENC_VERSION) {
  79. if (strategy != BufferManagerFactory.GROW) {
  80. ORBUtilSystemException wrapper =
  81. ORBUtilSystemException.get((ORB)orb,
  82. CORBALogDomains.RPC_ENCODING);
  83. throw wrapper.invalidBuffMgrStrategy("newBufferManagerWrite");
  84. }
  85. return new BufferManagerWriteGrow(orb);
  86. }
  87. switch (strategy) {
  88. case BufferManagerFactory.GROW:
  89. return new BufferManagerWriteGrow(orb);
  90. case BufferManagerFactory.COLLECT:
  91. return new BufferManagerWriteCollect(orb);
  92. case BufferManagerFactory.STREAM:
  93. return new BufferManagerWriteStream(orb);
  94. default:
  95. throw new INTERNAL("Unknown buffer manager write strategy: "
  96. + strategy);
  97. }
  98. }
  99. public static BufferManagerWrite newBufferManagerWrite(
  100. GIOPVersion version, byte encodingVersion, ORB orb) {
  101. if (encodingVersion != Message.CDR_ENC_VERSION) {
  102. return new BufferManagerWriteGrow(orb);
  103. }
  104. return BufferManagerFactory.newBufferManagerWrite(
  105. orb.getORBData().getGIOPBuffMgrStrategy(version),
  106. encodingVersion, orb);
  107. }
  108. public static BufferManagerRead defaultBufferManagerRead(ORB orb) {
  109. return new BufferManagerReadGrow(orb);
  110. }
  111. }