]> git.llucax.com Git - z.facultad/75.07/algowars.git/blob - src/auxiliares/ObjetoPersistente.pas
Import inicial después del "/var incident". :(
[z.facultad/75.07/algowars.git] / src / auxiliares / ObjetoPersistente.pas
1 {** Es una clase abstracta para hacer persistente un objeto.\r
2     Básicamente provee métodos para serialización.<br>\r
3     <U>NOTA:</U>\r
4     <PRE>\r
5       Es importante que el ID del objeto sea el primer atributo en la\r
6       serialización, de otra manera puede ser malinterpretado al des-\r
7       serializarlo.\r
8       El orden del resto de los atributos deben ser respetados también.\r
9       Aunque es bastante probable que fucione si están en otro órden,\r
10       no está 100% asegurado y si se hace en otro orden los resultados\r
11       pueden ser inesperados o pueden surgir errores.\r
12     <PRE>}\r
13 unit ObjetoPersistente;\r
14 \r
15 interface\r
16 \r
17 uses\r
18   {$IFDEF DebugAlgoWars}\r
19   Objeto,\r
20   {$ENDIF}\r
21   Sysutils;\r
22 \r
23 type\r
24   {** Excepcion producida si hay un error al serializar.}\r
25   ESerializacion = class( Exception )\r
26   end;\r
27 \r
28   {** Es una clase abstracta para hacer persistente un objeto.\r
29       Básicamente provee métodos para serialización.\r
30       NOTA: Es importante que el ID del objeto sea el primer atributo en la\r
31             serialización, de otra manera puede ser malinterpretado al des-\r
32             serializarlo.}\r
33   cObjetoPersistente = class{$IFDEF DebugAlgoWars}( cObjeto ){$ENDIF}\r
34     private\r
35       aID: string; // Identificación UNICA de la instancia\r
36     protected\r
37       {** Setea la identificacion del objeto}\r
38       procedure mSetID( id: string );\r
39     public\r
40       {** Constructor. Setea el ID.}\r
41       constructor create;\r
42       {** Constructor que crea el objeto a partir de una cadena de texto con\r
43           el objeto serializado.}\r
44       constructor crearDeSerializado( str: string );\r
45       {** Obtiene la identificacion del objeto}\r
46       function mGetID: string;\r
47       {** Devuelve una cadena de texto con el objeto serializado.}\r
48       function mSerializar: string; virtual;\r
49       {** Recrea el objeto a partir de una cadena de texto con el objeto\r
50           serializado.}\r
51       procedure mDesSerializar( str: string ); virtual;\r
52   end;\r
53 \r
54 implementation\r
55 \r
56 uses\r
57   RegExpr;\r
58 \r
59 { cObjetoPersistente }\r
60 \r
61 {** Constructor que crea el objeto a partir de una cadena de texto con\r
62     el objeto serializado.\r
63     @param str cadena de texto con el objeto serializado.}\r
64 constructor cObjetoPersistente.crearDeSerializado(str: string);\r
65 begin\r
66   inherited create;      // Llama al create padre\r
67   mDesSerializar( str ); // Deserializa los datos\r
68 end;\r
69 \r
70 {** Constructor. Setea el ID.}\r
71 constructor cObjetoPersistente.create;\r
72 begin\r
73   inherited;\r
74   aID := IntToHex( integer( self ), 6 );\r
75 end;\r
76 \r
77 {** Obtiene la identificacion del objeto\r
78     @return ID del objeto.}\r
79 function cObjetoPersistente.mGetID: string;\r
80 begin\r
81   result := aID;\r
82 end;\r
83 \r
84 {** Setea la identificacion del objeto\r
85     @param id nuevo ID.}\r
86 procedure cObjetoPersistente.mSetID(id: string);\r
87 begin\r
88   aID := id;\r
89 end;\r
90 \r
91 {** Devuelve una cadena de texto con el objeto serializado.\r
92     @return Cadena de texto con el objeto serializado.}\r
93 function cObjetoPersistente.mSerializar: string;\r
94 begin\r
95   result := '<id>' + aID + '</id>';\r
96 end;\r
97 \r
98 {** Recrea el objeto a partir de una cadena de texto con el objeto\r
99     serializado.\r
100     @param str Cadena de texto con el objeto serializado.}\r
101 procedure cObjetoPersistente.mDesSerializar(str: string);\r
102 var\r
103   r: TRegExpr;\r
104 begin\r
105   r := TRegExpr.create;\r
106   try // prueba que no haya errores con las expresiones regulares\r
107     r.Expression := '<id>\s*([ABCDEFabcdef0-9]{6})\s*</id>';\r
108     if r.Exec ( str ) then\r
109       aID := r.Match[1]\r
110     else\r
111       raise ESerializacion.create( 'No se encontro el ID del Objeto' );\r
112   except\r
113     on e: ERegExpr do begin\r
114       r.Free;\r
115       raise ESerializacion.create( ClassName + ': Error al extraer el ID utilizando expresiones regulares: ' + e.Message );\r
116     end;\r
117   end;\r
118   r.free;\r
119 end;\r
120 \r
121 end.\r