Oracle Coherence for C++ API
Release 3.7.1.0
E22845-01
00001 /* 00002 * PofBufferWriter.hpp 00003 * 00004 * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. 00005 * 00006 * Oracle is a registered trademarks of Oracle Corporation and/or its 00007 * affiliates. 00008 * 00009 * This software is the confidential and proprietary information of Oracle 00010 * Corporation. You shall not disclose such confidential and proprietary 00011 * information and shall use it only in accordance with the terms of the 00012 * license agreement you entered into with Oracle. 00013 * 00014 * This notice may not be removed or altered. 00015 */ 00016 #ifndef COH_POF_BUFFER_WRITER_HPP 00017 #define COH_POF_BUFFER_WRITER_HPP 00018 00019 #include "coherence/lang.ns" 00020 00021 #include "coherence/io/WriteBuffer.hpp" 00022 #include "coherence/io/pof/PofContext.hpp" 00023 #include "coherence/io/pof/PofHelper.hpp" 00024 #include "coherence/io/pof/PofWriter.hpp" 00025 #include "coherence/io/pof/RawDate.hpp" 00026 #include "coherence/io/pof/RawDateTime.hpp" 00027 #include "coherence/io/pof/RawDayTimeInterval.hpp" 00028 #include "coherence/io/pof/RawTime.hpp" 00029 #include "coherence/io/pof/RawTimeInterval.hpp" 00030 #include "coherence/io/pof/RawYearMonthInterval.hpp" 00031 #include "coherence/io/pof/ReferenceLibrary.hpp" 00032 #include "coherence/io/pof/WritingPofHandler.hpp" 00033 #include "coherence/util/Binary.hpp" 00034 #include "coherence/util/Collection.hpp" 00035 #include "coherence/util/LongArray.hpp" 00036 #include "coherence/util/Map.hpp" 00037 00038 COH_OPEN_NAMESPACE3(coherence,io,pof) 00039 00040 using coherence::io::WriteBuffer; 00041 using coherence::util::Binary; 00042 using coherence::util::Collection; 00043 using coherence::util::LongArray; 00044 using coherence::util::Map; 00045 00046 00047 /** 00048 * PofWriter implementation that writes POF-encoded data to a 00049 * WriteBuffer::BufferOutput. 00050 * 00051 * @author jh 2008.04.09 00052 */ 00053 class COH_EXPORT PofBufferWriter 00054 : public class_spec<PofBufferWriter, 00055 extends<PofHelper>, 00056 implements<PofWriter> > 00057 { 00058 friend class factory<PofBufferWriter>; 00059 00060 // ----- constructors --------------------------------------------------- 00061 00062 protected: 00063 /** 00064 * Construct a new PofBufferWriter that will write a POF stream to the 00065 * passed BufferOutput object. 00066 * 00067 * @param hOut the BufferOutput object to write to; must not be NULL 00068 * @param vCtx the PofContext used by the new PofBufferWriter to 00069 * serialize user types; must not be NULL 00070 */ 00071 PofBufferWriter(WriteBuffer::BufferOutput::Handle hOut, 00072 PofContext::View vCtx); 00073 00074 /** 00075 * Construct a new PofBufferWriter that will write a POF stream using 00076 * the passed WritingPofHandler. 00077 * 00078 * @param hHandler the WritingPofHandler used for writing; must not 00079 * be NULL 00080 * @param vCtx the PofContext used by the new PofBufferWriter to 00081 * serialize user types; must not be NULL 00082 */ 00083 PofBufferWriter(WritingPofHandler::Handle hHandler, 00084 PofContext::View vCtx); 00085 00086 00087 // ----- PofWriter interface -------------------------------------------- 00088 00089 public: 00090 /** 00091 * {@inheritDoc} 00092 */ 00093 virtual void writeBoolean(int32_t iProp, bool f); 00094 00095 /** 00096 * {@inheritDoc} 00097 */ 00098 virtual void writeOctet(int32_t iProp, octet_t b); 00099 00100 /** 00101 * {@inheritDoc} 00102 */ 00103 virtual void writeChar16(int32_t iProp, char16_t ch); 00104 00105 /** 00106 * {@inheritDoc} 00107 */ 00108 virtual void writeInt16(int32_t iProp, int16_t n); 00109 00110 /** 00111 * {@inheritDoc} 00112 */ 00113 virtual void writeInt32(int32_t iProp, int32_t n); 00114 00115 /** 00116 * {@inheritDoc} 00117 */ 00118 virtual void writeInt64(int32_t iProp, int64_t l); 00119 00120 /** 00121 * {@inheritDoc} 00122 */ 00123 virtual void writeFloat32(int32_t iProp, float32_t fl); 00124 00125 /** 00126 * {@inheritDoc} 00127 */ 00128 virtual void writeFloat64(int32_t iProp, float64_t dfl); 00129 00130 /** 00131 * {@inheritDoc} 00132 */ 00133 virtual void writeBooleanArray(int32_t iProp, Array<bool>::View vaf); 00134 00135 /** 00136 * {@inheritDoc} 00137 */ 00138 virtual void writeOctetArray(int32_t iProp, Array<octet_t>::View vab); 00139 00140 /** 00141 * {@inheritDoc} 00142 */ 00143 virtual void writeChar16Array(int32_t iProp, Array<char16_t>::View vach); 00144 00145 /** 00146 * {@inheritDoc} 00147 */ 00148 virtual void writeInt16Array(int32_t iProp, Array<int16_t>::View van); 00149 00150 /** 00151 * {@inheritDoc} 00152 */ 00153 virtual void writeInt32Array(int32_t iProp, Array<int32_t>::View van); 00154 00155 /** 00156 * {@inheritDoc} 00157 */ 00158 virtual void writeInt64Array(int32_t iProp, Array<int64_t>::View val); 00159 00160 /** 00161 * {@inheritDoc} 00162 */ 00163 virtual void writeFloat32Array(int32_t iProp, Array<float32_t>::View vafl); 00164 00165 /** 00166 * {@inheritDoc} 00167 */ 00168 virtual void writeFloat64Array(int32_t iProp, Array<float64_t>::View vadfl); 00169 00170 /** 00171 * {@inheritDoc} 00172 */ 00173 virtual void writeBinary(int32_t iProp, Binary::View vBin); 00174 00175 /** 00176 * {@inheritDoc} 00177 */ 00178 virtual void writeString(int32_t iProp, String::View vs); 00179 00180 /** 00181 * {@inheritDoc} 00182 */ 00183 virtual void writeRawDate(int32_t iProp, RawDate::View vDate); 00184 00185 /** 00186 * {@inheritDoc} 00187 */ 00188 virtual void writeRawDateTime(int32_t iProp, RawDateTime::View vdt); 00189 00190 /** 00191 * {@inheritDoc} 00192 */ 00193 virtual void writeRawDayTimeInterval(int32_t iProp, 00194 RawDayTimeInterval::View vInterval); 00195 00196 /** 00197 * {@inheritDoc} 00198 */ 00199 virtual void writeRawTime(int32_t iProp, RawTime::View vTime); 00200 00201 /** 00202 * {@inheritDoc} 00203 */ 00204 virtual void writeRawTimeInterval(int32_t iProp, 00205 RawTimeInterval::View vInterval); 00206 00207 /** 00208 * {@inheritDoc} 00209 */ 00210 virtual void writeRawYearMonthInterval(int32_t iProp, 00211 RawYearMonthInterval::View vInterval); 00212 00213 /** 00214 * {@inheritDoc} 00215 */ 00216 virtual void writeObject(int32_t iProp, Object::View v); 00217 00218 /** 00219 * {@inheritDoc} 00220 */ 00221 virtual void writeObjectArray(int32_t iProp, ObjectArray::View va); 00222 00223 /** 00224 * {@inheritDoc} 00225 */ 00226 virtual void writeObjectArray(int32_t iProp, ObjectArray::View va, 00227 Class::View vClass); 00228 00229 /** 00230 * {@inheritDoc} 00231 */ 00232 virtual void writeLongArray(int32_t iProp, LongArray::View vla); 00233 00234 /** 00235 * {@inheritDoc} 00236 */ 00237 virtual void writeLongArray(int32_t iProp, LongArray::View vla, 00238 Class::View vClass); 00239 00240 /** 00241 * {@inheritDoc} 00242 */ 00243 virtual void writeCollection(int32_t iProp, Collection::View vCol); 00244 00245 /** 00246 * {@inheritDoc} 00247 */ 00248 virtual void writeCollection(int32_t iProp, Collection::View vCol, 00249 Class::View vClass); 00250 00251 /** 00252 * {@inheritDoc} 00253 */ 00254 virtual void writeMap(int32_t iProp, Map::View vMap); 00255 00256 /** 00257 * {@inheritDoc} 00258 */ 00259 virtual void writeMap(int32_t iProp, Map::View vMap, 00260 Class::View vClassKey); 00261 00262 /** 00263 * {@inheritDoc} 00264 */ 00265 virtual void writeMap(int32_t iProp, Map::View vMap, 00266 Class::View vClassKey, Class::View vClassValue); 00267 00268 /** 00269 * {@inheritDoc} 00270 */ 00271 virtual PofContext::View getPofContext() const; 00272 00273 /** 00274 * {@inheritDoc} 00275 */ 00276 virtual void setPofContext(PofContext::View vCtx); 00277 00278 /** 00279 * {@inheritDoc} 00280 */ 00281 virtual int32_t getUserTypeId() const; 00282 00283 /** 00284 * {@inheritDoc} 00285 */ 00286 virtual int32_t getVersionId() const; 00287 00288 /** 00289 * {@inheritDoc} 00290 */ 00291 virtual void setVersionId(int32_t nVersionId); 00292 00293 /** 00294 * {@inheritDoc} 00295 */ 00296 virtual PofWriter::Handle createNestedPofWriter(int32_t iProp); 00297 00298 /** 00299 * {@inheritDoc} 00300 */ 00301 virtual void writeRemainder(Binary::View vBinProps); 00302 00303 00304 // ----- internal methods ----------------------------------------------- 00305 00306 protected: 00307 /** 00308 * Write a property of user defined type to the POF stream. 00309 * 00310 * @param iProp the property index 00311 * @param v the <tt>user type</tt> property value to write 00312 * 00313 * @since Coherence 3.7.1 00314 */ 00315 virtual void writeUserType(int32_t iProp, Object::View v); 00316 00317 /** 00318 * If this writer is contextually within a user type, obtain the writer 00319 * which created this writer in order to write the user type. 00320 * 00321 * @return the containing writer 00322 */ 00323 virtual PofBufferWriter::Handle getParentWriter(); 00324 00325 /** 00326 * If this writer is contextually within a user type, obtain the writer 00327 * which created this writer in order to write the user type. 00328 * 00329 * @return the containing writer 00330 */ 00331 virtual PofBufferWriter::View getParentWriter() const; 00332 00333 /** 00334 * Report that a POF property is about to be written to the POF 00335 * stream. 00336 * 00337 * This method call will be followed by one or more separate calls to 00338 * a "write" method and the property extent will then be terminated by 00339 * a call to {@link #endProperty}. 00340 * 00341 * @param iProp the index of the property being written 00342 * 00343 * @throws IllegalArgumentException if the property index is invalid, 00344 * or is less than or equal to the index of the previous 00345 * property written to the POF stream 00346 * @throws IOException if an I/O error occurs 00347 */ 00348 virtual void beginProperty(int32_t iProp); 00349 00350 /** 00351 * Signifies the termination of the current POF property. 00352 * 00353 * @param iProp the index of the current property 00354 */ 00355 virtual void endProperty(int32_t iProp); 00356 00357 /** 00358 * Assert that a class is equal to another class. 00359 * 00360 * @param vClass the expected class; must not be NULL 00361 * @param vClassTest the class to test for equality; must not be NULL 00362 * 00363 * @throws IllegalStateException if the second class is not equal to 00364 * the first 00365 */ 00366 static void assertEqual(Class::View vClass, Class::View vClassTest); 00367 00368 00369 // ----- accessors ------------------------------------------------------ 00370 00371 public: 00372 /** 00373 * Ensure that references (support for cyclic dependencies) are enabled. 00374 */ 00375 virtual void enableReference(); 00376 00377 /** 00378 * Determine if reference support is enabled. 00379 * 00380 * @return true iff reference support is enabled 00381 * 00382 * @since Coherence 3.7.1 00383 */ 00384 virtual bool isReferenceEnabled(); 00385 00386 protected: 00387 /** 00388 * Return the BufferOutput that this PofBufferWriter writes to. 00389 * 00390 * @return the BufferOutput 00391 */ 00392 virtual WriteBuffer::BufferOutput::Handle getBufferOutput(); 00393 00394 /** 00395 * Return the BufferOutput that this PofBufferWriter writes to. 00396 * 00397 * @return the BufferOutput 00398 */ 00399 virtual WriteBuffer::BufferOutput::View getBufferOutput() const; 00400 00401 /** 00402 * Return the WritingPofHandler used internally by this 00403 * PofBufferWriter to write the POF stream. 00404 * 00405 * @return the PofHandler 00406 */ 00407 virtual WritingPofHandler::Handle getPofHandler(); 00408 00409 /** 00410 * Return the WritingPofHandler used internally by this 00411 * PofBufferWriter to write the POF stream. 00412 * 00413 * @return the PofHandler 00414 */ 00415 virtual WritingPofHandler::View getPofHandler() const; 00416 00417 /** 00418 * Determine if the object to be written is either Evolvable or part of an 00419 * Evolvable object. 00420 * 00421 * @return true iff the object to be written is Evolvable 00422 * 00423 * @since Coherence 3.7.1 00424 */ 00425 virtual bool isEvolvable(); 00426 00427 /** 00428 * Set the Evolvable flag to indicate if the object to be written is 00429 * Evolvable or part of an Evolvable object. 00430 * 00431 * @param fEvolvable true iff the object to be written is Evolvable 00432 * 00433 * @since Coherence 3.7.1 00434 */ 00435 virtual void setEvolvable(bool fEvolvable); 00436 00437 00438 // ----- data members --------------------------------------------------- 00439 00440 protected: 00441 /** 00442 * The BufferOutput object that the PofBufferWriter writes to. 00443 */ 00444 FinalHandle<WriteBuffer::BufferOutput> m_hOut; 00445 00446 /** 00447 * The PofContext used by this PofBufferWriter to serialize user types. 00448 */ 00449 MemberView<PofContext> m_vCtx; 00450 00451 /** 00452 * Indicate if the object to be written is either Evolvable or part of an 00453 * Evolvable object. 00454 */ 00455 bool m_fEvolvable; 00456 00457 /** 00458 * The WritingPofHandler used to write a POF stream. 00459 */ 00460 FinalHandle<WritingPofHandler> m_hHandler; 00461 00462 /** 00463 * If references are used, then this is the ReferenceLibrary. 00464 */ 00465 MemberHandle<ReferenceLibrary> m_hRefs; 00466 00467 00468 // ----- friends -------------------------------------------------------- 00469 00470 friend class UserTypeWriter; 00471 }; 00472 00473 COH_CLOSE_NAMESPACE3 00474 00475 #endif // COH_POF_BUFFER_WRITER_HPP