25
25
public abstract class BundleDeltaClient {
26
26
27
27
private static final String METRO_DELTA_ID_HEADER = "X-Metro-Delta-ID" ;
28
- @ Nullable private String mDeltaId ;
28
+ @ Nullable private String mRevisionId ;
29
29
30
30
public enum ClientType {
31
31
NONE ,
@@ -54,58 +54,59 @@ abstract protected Pair<Boolean, NativeDeltaClient> processDelta(
54
54
BufferedSource body ,
55
55
File outputFile ) throws IOException ;
56
56
57
- final public String extendUrlForDelta (String bundleURL ) {
58
- return mDeltaId != null ? bundleURL + "&deltaBundleId =" + mDeltaId : bundleURL ;
57
+ final public synchronized String extendUrlForDelta (String bundleURL ) {
58
+ return mRevisionId != null ? bundleURL + "&revisionId =" + mRevisionId : bundleURL ;
59
59
}
60
60
61
- public void reset () {
62
- mDeltaId = null ;
61
+ public synchronized void reset () {
62
+ mRevisionId = null ;
63
63
}
64
64
65
- public Pair <Boolean , NativeDeltaClient > processDelta (
65
+ public synchronized Pair <Boolean , NativeDeltaClient > processDelta (
66
66
Headers headers ,
67
67
BufferedSource body ,
68
68
File outputFile ) throws IOException {
69
69
70
- mDeltaId = headers .get (METRO_DELTA_ID_HEADER );
70
+ mRevisionId = headers .get (METRO_DELTA_ID_HEADER );
71
71
return processDelta (body , outputFile );
72
72
}
73
73
74
74
private static class BundleDeltaJavaClient extends BundleDeltaClient {
75
75
76
- final LinkedHashMap < Number , byte []> mPreModules = new LinkedHashMap < Number , byte []>() ;
77
- final LinkedHashMap < Number , byte []> mDeltaModules = new LinkedHashMap < Number , byte []>() ;
78
- final LinkedHashMap <Number , byte []> mPostModules = new LinkedHashMap <Number , byte []>();
76
+ byte [] mPreCode ;
77
+ byte [] mPostCode ;
78
+ final LinkedHashMap <Number , byte []> mModules = new LinkedHashMap <Number , byte []>();
79
79
80
80
@ Override
81
81
public boolean canHandle (ClientType type ) {
82
82
return type == ClientType .DEV_SUPPORT ;
83
83
}
84
84
85
- public void reset () {
85
+ public synchronized void reset () {
86
86
super .reset ();
87
- mDeltaModules . clear () ;
88
- mPreModules . clear () ;
89
- mPostModules .clear ();
87
+ mPreCode = null ;
88
+ mPostCode = null ;
89
+ mModules .clear ();
90
90
}
91
91
92
92
@ Override
93
93
public synchronized Pair <Boolean , NativeDeltaClient > processDelta (
94
94
BufferedSource body ,
95
95
File outputFile ) throws IOException {
96
-
97
96
JsonReader jsonReader = new JsonReader (new InputStreamReader (body .inputStream ()));
98
97
jsonReader .beginObject ();
99
98
int numChangedModules = 0 ;
100
99
101
100
while (jsonReader .hasNext ()) {
102
101
String name = jsonReader .nextName ();
103
102
if (name .equals ("pre" )) {
104
- numChangedModules += patchDelta ( jsonReader , mPreModules );
103
+ mPreCode = jsonReader . nextString (). getBytes ( );
105
104
} else if (name .equals ("post" )) {
106
- numChangedModules += patchDelta (jsonReader , mPostModules );
107
- } else if (name .equals ("delta" )) {
108
- numChangedModules += patchDelta (jsonReader , mDeltaModules );
105
+ mPostCode = jsonReader .nextString ().getBytes ();
106
+ } else if (name .equals ("modules" )) {
107
+ numChangedModules += setModules (jsonReader , mModules );
108
+ } else if (name .equals ("deleted" )) {
109
+ numChangedModules += removeModules (jsonReader , mModules );
109
110
} else {
110
111
jsonReader .skipValue ();
111
112
}
@@ -123,20 +124,16 @@ public synchronized Pair<Boolean, NativeDeltaClient> processDelta(
123
124
FileOutputStream fileOutputStream = new FileOutputStream (outputFile );
124
125
125
126
try {
126
- for (byte [] code : mPreModules .values ()) {
127
- fileOutputStream .write (code );
128
- fileOutputStream .write ('\n' );
129
- }
127
+ fileOutputStream .write (mPreCode );
128
+ fileOutputStream .write ('\n' );
130
129
131
- for (byte [] code : mDeltaModules .values ()) {
130
+ for (byte [] code : mModules .values ()) {
132
131
fileOutputStream .write (code );
133
132
fileOutputStream .write ('\n' );
134
133
}
135
134
136
- for (byte [] code : mPostModules .values ()) {
137
- fileOutputStream .write (code );
138
- fileOutputStream .write ('\n' );
139
- }
135
+ fileOutputStream .write (mPostCode );
136
+ fileOutputStream .write ('\n' );
140
137
} finally {
141
138
fileOutputStream .flush ();
142
139
fileOutputStream .close ();
@@ -145,7 +142,7 @@ public synchronized Pair<Boolean, NativeDeltaClient> processDelta(
145
142
return Pair .create (Boolean .TRUE , null );
146
143
}
147
144
148
- private static int patchDelta (JsonReader jsonReader , LinkedHashMap <Number , byte []> map )
145
+ private static int setModules (JsonReader jsonReader , LinkedHashMap <Number , byte []> map )
149
146
throws IOException {
150
147
jsonReader .beginArray ();
151
148
@@ -155,12 +152,7 @@ private static int patchDelta(JsonReader jsonReader, LinkedHashMap<Number, byte[
155
152
156
153
int moduleId = jsonReader .nextInt ();
157
154
158
- if (jsonReader .peek () == JsonToken .NULL ) {
159
- jsonReader .skipValue ();
160
- map .remove (moduleId );
161
- } else {
162
- map .put (moduleId , jsonReader .nextString ().getBytes ());
163
- }
155
+ map .put (moduleId , jsonReader .nextString ().getBytes ());
164
156
165
157
jsonReader .endArray ();
166
158
numModules ++;
@@ -170,6 +162,24 @@ private static int patchDelta(JsonReader jsonReader, LinkedHashMap<Number, byte[
170
162
171
163
return numModules ;
172
164
}
165
+
166
+ private static int removeModules (JsonReader jsonReader , LinkedHashMap <Number , byte []> map )
167
+ throws IOException {
168
+ jsonReader .beginArray ();
169
+
170
+ int numModules = 0 ;
171
+ while (jsonReader .hasNext ()) {
172
+ int moduleId = jsonReader .nextInt ();
173
+
174
+ map .remove (moduleId );
175
+
176
+ numModules ++;
177
+ }
178
+
179
+ jsonReader .endArray ();
180
+
181
+ return numModules ;
182
+ }
173
183
}
174
184
175
185
private static class BundleDeltaNativeClient extends BundleDeltaClient {
0 commit comments