Commit MetaInfo

Revisionc3650a61e0a6e1923cb7c5e5a4ef7509e0bf2478 (tree)
Time2012-02-16 11:35:51
Authorjwat <jwat@user...>
Commiterjwat

Log Message

Made thread safe.

Change Summary

Incremental Difference

--- a/jp/bitmeister/asn1/processor/ASN1StringBuilder.java
+++ b/jp/bitmeister/asn1/processor/ASN1StringBuilder.java
@@ -63,8 +63,7 @@ import jp.bitmeister.asn1.value.HexString;
6363 * @see ASN1Type
6464 */
6565 public class ASN1StringBuilder implements
66- ASN1Processor<String, ASN1RuntimeException>,
67- ASN1Visitor<Void, ASN1RuntimeException> {
66+ ASN1Processor<String, ASN1RuntimeException> {
6867
6968 private static final String NEW_LINE = System.getProperty("line.separator");
7069 private static final String SPACE = " ";
@@ -100,10 +99,6 @@ public class ASN1StringBuilder implements
10099 }
101100 };
102101
103- private StringBuilder builder;
104-
105- private int indent;
106-
107102 /**
108103 * Instantiates an {@code ASN1StringBuilder}.
109104 */
@@ -118,401 +113,420 @@ public class ASN1StringBuilder implements
118113 * @return A string representation of the ASN.1 data.
119114 */
120115 public String process(ASN1Type data) {
121- indent = 0;
122- builder = new StringBuilder();
123- write(data);
124- return builder.toString();
116+ return new InternalProcessor().process(data);
125117 }
126-
127- /**
128- * Writes descriptions of the data to the 'builder'.
129- *
130- * @param data
131- * The ASN.1 data.
132- */
133- private void write(ASN1Type data) {
134- TypeSpecification specification = data.specification();
135- while (true) {
136- if (specification.hasIdentifier()) {
137- builder.append(specification.identifier());
138- if (specification.reference() == null) {
139- if (data instanceof CollectionType<?, ?>) {
140- CollectionType<?, ?> collection = (CollectionType<?, ?>) data;
141- if (!collection.componentType().equals(ANY.class)) {
142- builder.append(COLLECTION_OF).append(
143- collection.componentSpecification()
144- .identifier());
118+
119+ private class InternalProcessor implements ASN1Visitor<Void, ASN1RuntimeException> {
120+
121+ private StringBuilder builder;
122+
123+ private int indent;
124+
125+ /**
126+ * Returns a string representation of the ASN.1 data.
127+ *
128+ * @param data
129+ * The ASN.1 data.
130+ * @return A string representation of the ASN.1 data.
131+ */
132+ private String process(ASN1Type data) {
133+ indent = 0;
134+ builder = new StringBuilder();
135+ write(data);
136+ return builder.toString();
137+ }
138+
139+ /**
140+ * Writes descriptions of the data to the 'builder'.
141+ *
142+ * @param data
143+ * The ASN.1 data.
144+ */
145+ private void write(ASN1Type data) {
146+ TypeSpecification specification = data.specification();
147+ while (true) {
148+ if (specification.hasIdentifier()) {
149+ builder.append(specification.identifier());
150+ if (specification.reference() == null) {
151+ if (data instanceof CollectionType<?, ?>) {
152+ CollectionType<?, ?> collection = (CollectionType<?, ?>) data;
153+ if (!collection.componentType().equals(ANY.class)) {
154+ builder.append(COLLECTION_OF).append(
155+ collection.componentSpecification()
156+ .identifier());
157+ }
158+ }
159+ break;
160+ } else {
161+ builder.append(ASSIGN);
162+ if (specification.tag() != null) {
163+ writeTag(specification.tag());
164+ builder.append(SPACE);
145165 }
146- }
147- break;
148- } else {
149- builder.append(ASSIGN);
150- if (specification.tag() != null) {
151- writeTag(specification.tag());
152- builder.append(SPACE);
153166 }
154167 }
168+ specification = specification.reference();
155169 }
156- specification = specification.reference();
157- }
158- if (data instanceof PrimitiveType<?>) {
159- builder.append(VALUE_OPEN);
160- if (data.hasValue()) {
161- data.accept(this);
170+ if (data instanceof PrimitiveType<?>) {
171+ builder.append(VALUE_OPEN);
172+ if (data.hasValue()) {
173+ data.accept(this);
174+ } else {
175+ builder.append(NOT_SET);
176+ }
177+ builder.append(VALUE_CLOSE);
162178 } else {
163- builder.append(NOT_SET);
179+ builder.append(CONSTRUCTIVE_OPEN);
180+ indent++;
181+ data.accept(this);
182+ indent--;
183+ builder.append(CONSTRUCTIVE_CLOSE);
164184 }
165- builder.append(VALUE_CLOSE);
166- } else {
167- builder.append(CONSTRUCTIVE_OPEN);
168- indent++;
169- data.accept(this);
170- indent--;
171- builder.append(CONSTRUCTIVE_CLOSE);
172185 }
173- }
174186
175- /*
176- * (non-Javadoc)
177- *
178- * @see
179- * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
180- * .builtin.BOOLEAN)
181- */
182- public Void visit(BOOLEAN data) {
183- builder.append(data.value() ? "TRUE" : "FALSE");
184- return null;
185- }
187+ /*
188+ * (non-Javadoc)
189+ *
190+ * @see
191+ * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
192+ * .builtin.BOOLEAN)
193+ */
194+ public Void visit(BOOLEAN data) {
195+ builder.append(data.value() ? "TRUE" : "FALSE");
196+ return null;
197+ }
186198
187- /*
188- * (non-Javadoc)
189- *
190- * @see
191- * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
192- * .builtin.INTEGER)
193- */
194- public Void visit(INTEGER data) {
195- String numberId = data.identifier();
196- if (numberId != null) {
197- builder.append(numberId);
199+ /*
200+ * (non-Javadoc)
201+ *
202+ * @see
203+ * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
204+ * .builtin.INTEGER)
205+ */
206+ public Void visit(INTEGER data) {
207+ String numberId = data.identifier();
208+ if (numberId != null) {
209+ builder.append(numberId);
210+ }
211+ builder.append(NUMBER_OPEN).append(data.value()).append(NUMBER_CLOSE);
212+ return null;
198213 }
199- builder.append(NUMBER_OPEN).append(data.value()).append(NUMBER_CLOSE);
200- return null;
201- }
202214
203- /*
204- * (non-Javadoc)
205- *
206- * @see
207- * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
208- * .builtin.ENUMERATED)
209- */
210- public Void visit(ENUMERATED data) {
211- visit((INTEGER) data);
212- return null;
213- }
215+ /*
216+ * (non-Javadoc)
217+ *
218+ * @see
219+ * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
220+ * .builtin.ENUMERATED)
221+ */
222+ public Void visit(ENUMERATED data) {
223+ visit((INTEGER) data);
224+ return null;
225+ }
214226
215- /*
216- * (non-Javadoc)
217- *
218- * @see
219- * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
220- * .builtin.REAL)
221- */
222- public Void visit(REAL data) {
223- builder.append(NUMBER_OPEN).append(data.value()).append(NUMBER_CLOSE);
224- return null;
225- }
227+ /*
228+ * (non-Javadoc)
229+ *
230+ * @see
231+ * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
232+ * .builtin.REAL)
233+ */
234+ public Void visit(REAL data) {
235+ builder.append(NUMBER_OPEN).append(data.value()).append(NUMBER_CLOSE);
236+ return null;
237+ }
226238
227- /*
228- * (non-Javadoc)
229- *
230- * @see
231- * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
232- * .builtin.BIT_STRING)
233- */
234- public Void visit(BIT_STRING data) {
235- if (data.hasNamedBits()) {
236- builder.append(NAMED_BITS_OPEN);
237- boolean trailing = false;
238- for (int i = 0; i < data.size(); i++) {
239- if (data.bit(i)) {
240- String identifier = data.nameOfBit(i);
241- if (identifier != null) {
242- if (trailing) {
243- builder.append(NAMED_BITS_SEPARATOR).append(SPACE);
244- } else {
245- builder.append(SPACE);
246- trailing = true;
239+ /*
240+ * (non-Javadoc)
241+ *
242+ * @see
243+ * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
244+ * .builtin.BIT_STRING)
245+ */
246+ public Void visit(BIT_STRING data) {
247+ if (data.hasNamedBits()) {
248+ builder.append(NAMED_BITS_OPEN);
249+ boolean trailing = false;
250+ for (int i = 0; i < data.size(); i++) {
251+ if (data.bit(i)) {
252+ String identifier = data.nameOfBit(i);
253+ if (identifier != null) {
254+ if (trailing) {
255+ builder.append(NAMED_BITS_SEPARATOR).append(SPACE);
256+ } else {
257+ builder.append(SPACE);
258+ trailing = true;
259+ }
260+ builder.append(identifier);
247261 }
248- builder.append(identifier);
249262 }
250263 }
264+ builder.append(SPACE).append(NAMED_BITS_CLOSE).append(SEPARATOR);
251265 }
252- builder.append(SPACE).append(NAMED_BITS_CLOSE).append(SEPARATOR);
266+ builder.append(new BinString(data.value()).toString());
267+ return null;
253268 }
254- builder.append(new BinString(data.value()).toString());
255- return null;
256- }
257269
258- /*
259- * (non-Javadoc)
260- *
261- * @see
262- * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
263- * .builtin.OCTET_STRING)
264- */
265- public Void visit(OCTET_STRING data) {
266- builder.append(new HexString(data.value()).toString());
267- return null;
268- }
270+ /*
271+ * (non-Javadoc)
272+ *
273+ * @see
274+ * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
275+ * .builtin.OCTET_STRING)
276+ */
277+ public Void visit(OCTET_STRING data) {
278+ builder.append(new HexString(data.value()).toString());
279+ return null;
280+ }
269281
270- /*
271- * (non-Javadoc)
272- *
273- * @see
274- * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
275- * .builtin.NULL)
276- */
277- public Void visit(NULL data) {
278- builder.append(NULL);
279- return null;
280- }
282+ /*
283+ * (non-Javadoc)
284+ *
285+ * @see
286+ * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
287+ * .builtin.NULL)
288+ */
289+ public Void visit(NULL data) {
290+ builder.append(NULL);
291+ return null;
292+ }
281293
282- /*
283- * (non-Javadoc)
284- *
285- * @see
286- * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
287- * .builtin.SEQUENCE)
288- */
289- public Void visit(SEQUENCE data) {
290- writeConstructive(data);
291- return null;
292- }
294+ /*
295+ * (non-Javadoc)
296+ *
297+ * @see
298+ * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
299+ * .builtin.SEQUENCE)
300+ */
301+ public Void visit(SEQUENCE data) {
302+ writeConstructive(data);
303+ return null;
304+ }
293305
294- /*
295- * (non-Javadoc)
296- *
297- * @see
298- * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
299- * .builtin.SEQUENCE_OF)
300- */
301- public Void visit(SEQUENCE_OF<?> data) {
302- writeCollection(data);
303- return null;
304- }
306+ /*
307+ * (non-Javadoc)
308+ *
309+ * @see
310+ * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
311+ * .builtin.SEQUENCE_OF)
312+ */
313+ public Void visit(SEQUENCE_OF<?> data) {
314+ writeCollection(data);
315+ return null;
316+ }
305317
306- /*
307- * (non-Javadoc)
308- *
309- * @see
310- * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
311- * .builtin.SET)
312- */
313- public Void visit(SET data) {
314- writeConstructive(data);
315- return null;
316- }
318+ /*
319+ * (non-Javadoc)
320+ *
321+ * @see
322+ * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
323+ * .builtin.SET)
324+ */
325+ public Void visit(SET data) {
326+ writeConstructive(data);
327+ return null;
328+ }
317329
318- /*
319- * (non-Javadoc)
320- *
321- * @see
322- * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
323- * .builtin.SET_OF)
324- */
325- public Void visit(SET_OF<?> data) {
326- writeCollection(data);
327- return null;
328- }
330+ /*
331+ * (non-Javadoc)
332+ *
333+ * @see
334+ * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
335+ * .builtin.SET_OF)
336+ */
337+ public Void visit(SET_OF<?> data) {
338+ writeCollection(data);
339+ return null;
340+ }
329341
330- /*
331- * (non-Javadoc)
332- *
333- * @see
334- * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
335- * .builtin.CHOICE)
336- */
337- public Void visit(CHOICE data) {
338- indent();
339- if (!data.hasValue()) {
340- builder.append(NOT_SET);
341- } else {
342- builder.append(data.selectedIdentifier());
343- if (data.selectedTag() != null) {
342+ /*
343+ * (non-Javadoc)
344+ *
345+ * @see
346+ * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
347+ * .builtin.CHOICE)
348+ */
349+ public Void visit(CHOICE data) {
350+ indent();
351+ if (!data.hasValue()) {
352+ builder.append(NOT_SET);
353+ } else {
354+ builder.append(data.selectedIdentifier());
355+ if (data.selectedTag() != null) {
356+ builder.append(SEPARATOR);
357+ writeTag(data.selectedTag());
358+ }
344359 builder.append(SEPARATOR);
345- writeTag(data.selectedTag());
360+ write(data.selectedValue());
346361 }
347- builder.append(SEPARATOR);
348- write(data.selectedValue());
362+ return null;
349363 }
350- return null;
351- }
352364
353- /*
354- * (non-Javadoc)
355- *
356- * @see
357- * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
358- * .builtin.OBJECT_IDENTIFIER)
359- */
360- public Void visit(OBJECT_IDENTIFIER data) {
361- builder.append(OID_OPEN);
362- if (data.value().size() > 0) {
363- builder.append(SPACE).append(data.value().get(0));
364- for (int i = 1; i < data.value().size(); i++) {
365- builder.append('.').append(data.value().get(i));
365+ /*
366+ * (non-Javadoc)
367+ *
368+ * @see
369+ * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
370+ * .builtin.OBJECT_IDENTIFIER)
371+ */
372+ public Void visit(OBJECT_IDENTIFIER data) {
373+ builder.append(OID_OPEN);
374+ if (data.value().size() > 0) {
375+ builder.append(SPACE).append(data.value().get(0));
376+ for (int i = 1; i < data.value().size(); i++) {
377+ builder.append('.').append(data.value().get(i));
378+ }
379+ builder.append(SPACE);
366380 }
367- builder.append(SPACE);
381+ builder.append(OID_CLOSE);
382+ return null;
368383 }
369- builder.append(OID_CLOSE);
370- return null;
371- }
372-
373- /* (non-Javadoc)
374- * @see jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type.builtin.RELATIVE_OID)
375- */
376- public Void visit(RELATIVE_OID data) {
377- return visit((OBJECT_IDENTIFIER)data);
378- }
379384
380- /*
381- * (non-Javadoc)
382- *
383- * @see
384- * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
385- * .StringType)
386- */
387- public Void visit(StringType data) {
388- try {
389- String value = data.stringValue();
390- builder.append(STRING_OPEN).append(value).append(STRING_CLOSE);
391- } catch (Exception e) {
392- builder.append(new HexString(data.value()).toString());
385+ /* (non-Javadoc)
386+ * @see jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type.builtin.RELATIVE_OID)
387+ */
388+ public Void visit(RELATIVE_OID data) {
389+ return visit((OBJECT_IDENTIFIER)data);
393390 }
394- return null;
395- }
396391
397- /*
398- * (non-Javadoc)
399- *
400- * @see
401- * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
402- * .TimeType)
403- */
404- public Void visit(TimeType data) {
405- visit((StringType)data);
406- builder.append(SPACE).append(DATE_FORMAT.get().format(data.date()));
407- return null;
408- }
392+ /*
393+ * (non-Javadoc)
394+ *
395+ * @see
396+ * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
397+ * .StringType)
398+ */
399+ public Void visit(StringType data) {
400+ try {
401+ String value = data.stringValue();
402+ builder.append(STRING_OPEN).append(value).append(STRING_CLOSE);
403+ } catch (Exception e) {
404+ builder.append(new HexString(data.value()).toString());
405+ }
406+ return null;
407+ }
409408
410- /*
411- * (non-Javadoc)
412- *
413- * @see
414- * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
415- * .builtin.ANY)
416- */
417- public Void visit(ANY data) {
418- write(data.value());
419- return null;
420- }
409+ /*
410+ * (non-Javadoc)
411+ *
412+ * @see
413+ * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
414+ * .TimeType)
415+ */
416+ public Void visit(TimeType data) {
417+ visit((StringType)data);
418+ builder.append(SPACE).append(DATE_FORMAT.get().format(data.date()));
419+ return null;
420+ }
421421
422- /*
423- * (non-Javadoc)
424- *
425- * @see
426- * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
427- * .UnknownType)
428- */
429- public Void visit(UnknownType data) {
430- for (int i = 0; i < data.value().length; i++) {
431- if (i % 16 == 0) {
432- indent();
433- }
434- builder.append(String.format("%02X", data.value()[i]));
435- builder.append(i % 16 == 15 ? NEW_LINE : SPACE);
422+ /*
423+ * (non-Javadoc)
424+ *
425+ * @see
426+ * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
427+ * .builtin.ANY)
428+ */
429+ public Void visit(ANY data) {
430+ write(data.value());
431+ return null;
436432 }
437- return null;
438- }
439433
440- /**
441- * Writes descriptions of each element of {@code ConstructiveType}.
442- *
443- * @param data
444- * The constructive data.
445- */
446- private void writeConstructive(ConstructiveType data) {
447- ElementSpecification[] elements = data.getElementTypeList();
448- for (int i = 0; i < elements.length; i++) {
449- if (i != 0) {
450- builder.append(CONSTRUCTIVE_SEPARATOR);
451- }
452- indent();
453- builder.append(elements[i].identifier()).append(SEPARATOR);
454- if (elements[i].tag() != null) {
455- writeTag(elements[i].tag());
456- builder.append(SEPARATOR);
457- }
458- ASN1Type element = data.getComponent(elements[i]);
459- if (element == null) {
460- builder.append(NOT_SET);
461- } else {
462- write(element);
463- }
464- if (elements[i].optional()) {
465- builder.append(OPTIONAL);
434+ /*
435+ * (non-Javadoc)
436+ *
437+ * @see
438+ * jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
439+ * .UnknownType)
440+ */
441+ public Void visit(UnknownType data) {
442+ for (int i = 0; i < data.value().length; i++) {
443+ if (i % 16 == 0) {
444+ indent();
445+ }
446+ builder.append(String.format("%02X", data.value()[i]));
447+ builder.append(i % 16 == 15 ? NEW_LINE : SPACE);
466448 }
449+ return null;
467450 }
468- }
469451
470- /**
471- * Writes descriptions of each member of {@code CollectionType}.
472- *
473- * @param data
474- * The collection data.
475- */
476- private void writeCollection(CollectionType<? extends ASN1Type, ?> data) {
477- Iterator<? extends ASN1Type> itr = data.collection().iterator();
478- if (itr.hasNext()) {
479- while (true) {
452+ /**
453+ * Writes descriptions of each element of {@code ConstructiveType}.
454+ *
455+ * @param data
456+ * The constructive data.
457+ */
458+ private void writeConstructive(ConstructiveType data) {
459+ ElementSpecification[] elements = data.getElementTypeList();
460+ for (int i = 0; i < elements.length; i++) {
461+ if (i != 0) {
462+ builder.append(CONSTRUCTIVE_SEPARATOR);
463+ }
480464 indent();
481- write(itr.next());
482- if (!itr.hasNext()) {
483- return;
465+ builder.append(elements[i].identifier()).append(SEPARATOR);
466+ if (elements[i].tag() != null) {
467+ writeTag(elements[i].tag());
468+ builder.append(SEPARATOR);
469+ }
470+ ASN1Type element = data.getComponent(elements[i]);
471+ if (element == null) {
472+ builder.append(NOT_SET);
473+ } else {
474+ write(element);
475+ }
476+ if (elements[i].optional()) {
477+ builder.append(OPTIONAL);
484478 }
485- builder.append(CONSTRUCTIVE_SEPARATOR);
486479 }
487480 }
488- indent();
489- builder.append(NOT_SET);
490- }
491481
492- /**
493- * Writes tag description.
494- *
495- * @param tag
496- * The tag.
497- */
498- private void writeTag(ASN1TagValue tag) {
499- builder.append(TAG_OPEN);
500- if (tag.tagClass() != ASN1TagClass.CONTEXT_SPECIFIC) {
501- builder.append(tag.tagClass()).append(SPACE);
482+ /**
483+ * Writes descriptions of each member of {@code CollectionType}.
484+ *
485+ * @param data
486+ * The collection data.
487+ */
488+ private void writeCollection(CollectionType<? extends ASN1Type, ?> data) {
489+ Iterator<? extends ASN1Type> itr = data.collection().iterator();
490+ if (itr.hasNext()) {
491+ while (true) {
492+ indent();
493+ write(itr.next());
494+ if (!itr.hasNext()) {
495+ return;
496+ }
497+ builder.append(CONSTRUCTIVE_SEPARATOR);
498+ }
499+ }
500+ indent();
501+ builder.append(NOT_SET);
502502 }
503- builder.append(tag.tagNumber()).append(TAG_CLOSE);
504- if (tag.tagMode() == ASN1TagMode.IMPLICIT) {
505- builder.append(IMPLICIT);
503+
504+ /**
505+ * Writes tag description.
506+ *
507+ * @param tag
508+ * The tag.
509+ */
510+ private void writeTag(ASN1TagValue tag) {
511+ builder.append(TAG_OPEN);
512+ if (tag.tagClass() != ASN1TagClass.CONTEXT_SPECIFIC) {
513+ builder.append(tag.tagClass()).append(SPACE);
514+ }
515+ builder.append(tag.tagNumber()).append(TAG_CLOSE);
516+ if (tag.tagMode() == ASN1TagMode.IMPLICIT) {
517+ builder.append(IMPLICIT);
518+ }
506519 }
507- }
508520
509- /**
510- * Writes indents.
511- */
512- private void indent() {
513- for (int i = 0; i < indent; i++) {
514- builder.append(INDENT);
521+ /**
522+ * Writes indents.
523+ */
524+ private void indent() {
525+ for (int i = 0; i < indent; i++) {
526+ builder.append(INDENT);
527+ }
515528 }
529+
516530 }
517-
531+
518532 }
Show on old repository browser