KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tc > object > applicator > LinkedHashMapApplicator


1 /*
2  * All content copyright (c) 2003-2006 Terracotta, Inc., except as may otherwise be noted in a separate copyright notice. All rights reserved.
3  */

4 package com.tc.object.applicator;
5
6 import com.tc.object.ClientObjectManager;
7 import com.tc.object.SerializationUtil;
8 import com.tc.object.TCObject;
9 import com.tc.object.dna.api.DNA;
10 import com.tc.object.dna.api.DNACursor;
11 import com.tc.object.dna.api.DNAWriter;
12 import com.tc.object.dna.api.LogicalAction;
13 import com.tc.object.dna.api.PhysicalAction;
14 import com.tc.object.dna.impl.DNAEncoding;
15 import com.tc.util.Assert;
16 import com.tc.util.FieldUtils;
17
18 import java.io.IOException JavaDoc;
19 import java.lang.reflect.Field JavaDoc;
20 import java.util.LinkedHashMap JavaDoc;
21
22 /**
23  * Apply a logical action to an object
24  */

25 public class LinkedHashMapApplicator extends PartialHashMapApplicator {
26   private static final String JavaDoc ACCESS_ORDER_FIELDNAME = "java.util.LinkedHashMap.accessOrder";
27   private static final Field JavaDoc ACCESS_ORDER_FIELD;
28
29   static {
30     try {
31       ACCESS_ORDER_FIELD = LinkedHashMap JavaDoc.class.getDeclaredField("accessOrder");
32       ACCESS_ORDER_FIELD.setAccessible(true);
33     } catch (Exception JavaDoc e) {
34       throw new RuntimeException JavaDoc(e);
35     }
36   }
37
38   public LinkedHashMapApplicator(DNAEncoding encoding) {
39     super(encoding);
40   }
41
42   public void hydrate(ClientObjectManager objectManager, TCObject tcObject, DNA dna, Object JavaDoc pojo) throws IOException JavaDoc,
43       ClassNotFoundException JavaDoc {
44     DNACursor cursor = dna.getCursor();
45     while (cursor.next(encoding)) {
46       Object JavaDoc action = cursor.getAction();
47       if (action instanceof PhysicalAction) {
48         PhysicalAction physicalAction = (PhysicalAction) action;
49         Assert.assertEquals(ACCESS_ORDER_FIELDNAME, physicalAction.getFieldName());
50         setAccessOrder(pojo, physicalAction.getObject());
51       } else {
52         LogicalAction logicalAction = (LogicalAction) action;
53         int method = logicalAction.getMethod();
54         Object JavaDoc[] params = logicalAction.getParameters();
55         apply(objectManager, pojo, method, params);
56       }
57     }
58   }
59
60   private void setAccessOrder(Object JavaDoc target, Object JavaDoc value) {
61     try {
62       FieldUtils.tcSet(target, value, ACCESS_ORDER_FIELD);
63     } catch (Exception JavaDoc e) {
64       throw new RuntimeException JavaDoc(e);
65     }
66   }
67
68   protected void apply(ClientObjectManager objectManager, Object JavaDoc pojo, int method, Object JavaDoc[] params) throws ClassNotFoundException JavaDoc {
69     switch (method) {
70       case SerializationUtil.GET:
71         ((LinkedHashMap JavaDoc) pojo).get(params[0]);
72         break;
73       default:
74         super.apply(objectManager, pojo, method, params);
75     }
76   }
77
78   private boolean getAccessOrder(Object JavaDoc pojo) {
79     try {
80       return ACCESS_ORDER_FIELD.getBoolean(pojo);
81     } catch (Exception JavaDoc e) {
82       throw new RuntimeException JavaDoc(e);
83     }
84   }
85
86   public void dehydrate(ClientObjectManager objectManager, TCObject tcObject, DNAWriter writer, Object JavaDoc pojo) {
87     writer.addPhysicalAction(ACCESS_ORDER_FIELDNAME, new Boolean JavaDoc(getAccessOrder(pojo)));
88     super.dehydrate(objectManager, tcObject, writer, pojo);
89   }
90
91   public Object JavaDoc getNewInstance(ClientObjectManager objectManager, DNA dna) throws IOException JavaDoc, ClassNotFoundException JavaDoc {
92     DNACursor cursor = dna.getCursor();
93     if (!cursor.next(encoding)) { throw new AssertionError JavaDoc(
94                                                            "Cursor is empty in LinkedHashMapApplicator.getNewInstance()"); }
95     PhysicalAction physicalAction = cursor.getPhysicalAction();
96
97     return new LinkedHashMap JavaDoc(1, 0.75f, ((Boolean JavaDoc) physicalAction.getObject()).booleanValue());
98   }
99 }
100
Popular Tags