Change behavior of SelectiveType(ASN1Type) constructor.
Add hashCode method for BIT_STRING, OCTET_STRING and NULL.
import java.io.InputStream;
import java.math.BigInteger;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
import jp.bitmeister.asn1.codec.ASN1Decoder;
*
* @see jp.bitmeister.asn1.codec.ASN1Decoder#decode()
*/
- @Override
public ASN1Type decode() throws ASN1DecodingException {
return decodeImpl(null);
}
*
* @see jp.bitmeister.asn1.codec.ASN1Decoder#decode(java.lang.Class)
*/
- @Override
public <T extends ASN1Type> T decode(Class<T> type)
throws ASN1DecodingException {
T data = ASN1Type.instantiate(type);
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.builtintype
* .BOOLEAN)
*/
- @Override
public Void visit(BOOLEAN data) throws ASN1DecodingException {
data.set(readStream(readLength())[0] != 0x00);
return null;
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .IntegerType)
*/
- @Override
public Void visit(INTEGER data) throws ASN1DecodingException {
data.set(new BigInteger(readStream(readLength())));
return null;
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .EnumeratedType)
*/
- @Override
public Void visit(ENUMERATED data) throws ASN1DecodingException {
visit((INTEGER) data);
return null;
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .RealType)
*/
- @Override
public Void visit(REAL data) throws ASN1DecodingException {
byte[] octets = readStream(readLength());
if (octets.length == 0) {
exponent |= octets[2] & 0xff;
index++;
}
- long mantissa = new BigInteger(Arrays.copyOfRange(octets, index,
- octets.length)).longValue();
+ byte[] tmp = new byte[octets.length - index];
+ System.arraycopy(octets, index, tmp, 0, octets.length - index);
+ long mantissa = new BigInteger(tmp).longValue();
data.set(mantissa * Math.pow(2, scaling) * Math.pow(base, exponent)
* sign);
} else if ((octets[0] & 0x40) == 0) {
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .BitStringType)
*/
- @Override
public Void visit(BIT_STRING data) throws ASN1DecodingException {
if (isConstructed) {
processConcatenatable(data);
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .OctetStringType)
*/
- @Override
public Void visit(OCTET_STRING data) throws ASN1DecodingException {
if (isConstructed) {
processConcatenatable(data);
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .NullType)
*/
- @Override
public Void visit(NULL data) throws ASN1DecodingException {
if (readLength() != 0) {
ASN1DecodingException ex = new ASN1DecodingException();
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .SequenceType)
*/
- @Override
public Void visit(final SEQUENCE data) throws ASN1DecodingException {
final ElementSpecification[] elements = data.getElementTypeList();
processMultipleOctets(readLength(), new ElementProcessor() {
private int index = 0;
- @Override
public void process() throws ASN1DecodingException {
readTag();
for (; index < elements.length; index++) {
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .SequenceOfType)
*/
- @Override
public Void visit(final SEQUENCE_OF<? extends ASN1Type> data)
throws ASN1DecodingException {
processCollection(data);
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .SetType)
*/
- @Override
public Void visit(final SET data) throws ASN1DecodingException {
processMultipleOctets(readLength(), new ElementProcessor() {
- @Override
public void process() throws ASN1DecodingException {
readTag();
for (ElementSpecification e : data.getElementTypeList()) {
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .SetOfType)
*/
- @Override
public Void visit(SET_OF<? extends ASN1Type> data)
throws ASN1DecodingException {
processCollection(data);
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .ChoiceType)
*/
- @Override
public Void visit(CHOICE data) throws ASN1DecodingException {
processComponent(data, data.alternative(tagClass, tagNumber));
return null;
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .ObjectIdentifierType)
*/
- @Override
public Void visit(OBJECT_IDENTIFIER data) throws ASN1DecodingException {
int length = readLength();
final List<Integer> oids = new ArrayList<Integer>();
/* (non-Javadoc)
* @see jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type.builtin.RELATIVE_OID)
*/
- @Override
public Void visit(RELATIVE_OID data) throws ASN1DecodingException {
List<Integer> oids = new ArrayList<Integer>();
decodeOids(oids, readLength());
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .base.StringType)
*/
- @Override
public Void visit(StringType data) throws ASN1DecodingException {
visit((OCTET_STRING) data);
return null;
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .TimeType)
*/
- @Override
public Void visit(TimeType data) throws ASN1DecodingException {
data.set(new String(readStream(readLength())));
return null;
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.builtintype
* .ANY)
*/
- @Override
public Void visit(ANY data) throws ASN1DecodingException {
if (data.value() == null) {
data.set(ASN1ModuleManager.instantiate(module, tagClass, tagNumber));
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .UnknownType)
*/
- @Override
public Void visit(UnknownType data) throws ASN1DecodingException {
data.set(readStream(readLength()));
return null;
* @throws ASN1EncodingException
* When an error occurred while the encoding process.
*/
- @Override
public int encode(ASN1Type data) throws ASN1EncodingException {
try {
data.validate();
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.BOOLEAN)
*/
- @Override
public EncodedOctets visit(BOOLEAN data) {
return newPrimitiveOctets(data.value() ? (byte) 0xff : (byte) 0x00);
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.INTEGER)
*/
- @Override
public EncodedOctets visit(INTEGER data) {
return newPrimitiveOctets(data.value().toByteArray());
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.ENUMERATED)
*/
- @Override
public EncodedOctets visit(ENUMERATED data) {
return visit((INTEGER) data);
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.REAL)
*/
- @Override
public EncodedOctets visit(REAL data) {
byte[] encoded;
if (data.value() == 0) { // zero.
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.BIT_STRING)
*/
- @Override
public EncodedOctets visit(BIT_STRING data) {
if (data.value().length == 0) {
return newPrimitiveOctets((byte) 0x00);
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.OCTET_STRING)
*/
- @Override
public EncodedOctets visit(OCTET_STRING data) throws ASN1EncodingException {
return newPrimitiveOctets(data.value());
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.NULL)
*/
- @Override
public EncodedOctets visit(NULL data) throws ASN1EncodingException {
return newPrimitiveOctets();
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.SEQUENCE)
*/
- @Override
public EncodedOctets visit(SEQUENCE data) throws ASN1EncodingException {
return processConstructive(data);
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.SEQUENCE_OF)
*/
- @Override
public EncodedOctets visit(SEQUENCE_OF<? extends ASN1Type> data)
throws ASN1EncodingException {
return processCollection(data);
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.SET)
*/
- @Override
public ConstructedOctets visit(SET data) throws ASN1EncodingException {
return processConstructive(data);
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.SET_OF)
*/
- @Override
public ConstructedOctets visit(SET_OF<? extends ASN1Type> data)
throws ASN1EncodingException {
return processCollection(data);
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.CHOICE)
*/
- @Override
public EncodedOctets visit(CHOICE data) throws ASN1EncodingException {
return encode(data.selectedValue(), data.selectedTag(), null);
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.OBJECT_IDENTIFIER)
*/
- @Override
public EncodedOctets visit(OBJECT_IDENTIFIER data)
throws ASN1EncodingException {
if (data.value().size() < 2 || data.value().get(0) < 0
/* (non-Javadoc)
* @see jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type.builtin.RELATIVE_OID)
*/
- @Override
public EncodedOctets visit(RELATIVE_OID data) throws ASN1EncodingException {
byte[] encoded = new byte[calculateEncodedOidSize(data, 0)];
encodeOid(data, encoded, 0, 0);
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .StringType)
*/
- @Override
public EncodedOctets visit(StringType data) throws ASN1EncodingException {
return newPrimitiveOctets(data.value());
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .TimeType)
*/
- @Override
public EncodedOctets visit(TimeType data) throws ASN1EncodingException {
return newPrimitiveOctets(data.value());
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.ANY)
*/
- @Override
public EncodedOctets visit(ANY data) throws ASN1EncodingException {
return encode(data.value(), null, null);
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .UnknownType)
*/
- @Override
public EncodedOctets visit(UnknownType data) throws ASN1EncodingException {
EncodedOctets octets = newPrimitiveOctets(data.value());
octets.fix(data.tagClass(), data.tagNumber());
*
* @see jp.bitmeister.asn1.codec.ber.BerOctets#isConstructed()
*/
- @Override
public boolean isConstructed() {
return false;
}
* @see
* jp.bitmeister.asn1.codec.ber.BerEncoder2.BerOctets#contentsLength()
*/
- @Override
public int contentsLength() {
return contents.length;
}
* jp.bitmeister.asn1.codec.ber.BerEncoder2.BerOctets#writeContents(
* java.io.OutputStream)
*/
- @Override
void writeContents(OutputStream out) throws IOException {
out.write(contents);
}
*
* @see jp.bitmeister.asn1.codec.ber.BerOctets#isConstructed()
*/
- public @Override
- boolean isConstructed() {
+ public boolean isConstructed() {
return true;
}
*
* @see jp.bitmeister.asn1.codec.ber.BerOctets#octetsLength()
*/
- @Override
public int contentsLength() {
return length;
}
* jp.bitmeister.asn1.codec.ber.BerEncoder.BerOctets#writeContents(java
* .io.OutputStream)
*/
- @Override
void writeContents(OutputStream out) throws IOException {
for (EncodedOctets e : elements) {
e.write(out);
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.BIT_STRING)
*/
- @Override
+ @Override
public EncodedOctets visit(BIT_STRING data) {
if (data.hasNamedBits()) {
data.contract();
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.SET)
*/
- @Override
+ @Override
public ConstructedOctets visit(SET data) throws ASN1EncodingException {
return ((DerConstructedOctets)super.visit(data)).sortByTag();
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.SET_OF)
*/
- @Override
+ @Override
public ConstructedOctets visit(SET_OF<? extends ASN1Type> data)
throws ASN1EncodingException {
return ((DerConstructedOctets)super.visit(data)).sortByContents();
* @see java.util.Comparator#compare(java.lang.Object,
* java.lang.Object)
*/
- @Override
public int compare(DerOctets o1, DerOctets o2) {
if (o1.tagClass != o2.tagClass) {
return o1.tagClass.ordinal() - o2.tagClass.ordinal();
* @see java.util.Comparator#compare(java.lang.Object,
* java.lang.Object)
*/
- @Override
public int compare(DerOctets o1, DerOctets o2) {
if (o1.encodedOctets.length != o2.encodedOctets.length) {
return o1.encodedOctets.length - o2.encodedOctets.length;
*
* @see jp.bitmeister.asn1.codec.ber.BerOctets#isConstructed()
*/
- @Override
public boolean isConstructed() {
return false;
}
* @see
* jp.bitmeister.asn1.codec.ber.BerEncoder2.BerOctets#contentsLength()
*/
- @Override
public int contentsLength() {
return contents.length;
}
/* (non-Javadoc)
* @see jp.bitmeister.asn1.codec.ber.DerEncoder.DerOctets#getContents()
*/
- @Override
byte[][] getContents() {
return new byte[][] {contents};
}
/* (non-Javadoc)
* @see jp.bitmeister.asn1.codec.ber.DerEncoder.DerOctets#clearContents()
*/
- @Override
void clearContents() {
contents = null;
}
*
* @see jp.bitmeister.asn1.codec.ber.BerOctets#isConstructed()
*/
- public @Override
- boolean isConstructed() {
+ public boolean isConstructed() {
return true;
}
*
* @see jp.bitmeister.asn1.codec.ber.BerOctets#octetsLength()
*/
- @Override
public int contentsLength() {
return length;
}
/* (non-Javadoc)
* @see jp.bitmeister.asn1.codec.ber.DerEncoder.DerOctets#getContents()
*/
- @Override
byte[][] getContents() {
byte[][] contents = new byte[elements.size()][];
for (int i = 0; i < elements.size(); i++) {
/* (non-Javadoc)
* @see jp.bitmeister.asn1.codec.ber.DerEncoder.DerOctets#clearContents()
*/
- @Override
void clearContents() {
// nothing to do.
}
import java.io.InputStream;
import java.math.BigInteger;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
import jp.bitmeister.asn1.codec.ASN1Decoder;
* jp.bitmeister.asn1.codec.xer.XerDecoder.ElementDecoder#startElement
* (java.lang.String)
*/
- @Override
public void startElement(String qName) throws SAXException {
if (qName.equals(tagName)) {
decoder.startElement(qName);
* jp.bitmeister.asn1.codec.xer.XerDecoder.ElementDecoder#endElement
* (java.lang.String)
*/
- @Override
public boolean endElement(String qName) {
if (qName.equals(tagName)) {
decoder.endElement();
* jp.bitmeister.asn1.codec.xer.XerDecoder.ElementDecoder#startElement
* (java.lang.String)
*/
- @Override
public void startElement(String qName) throws SAXException {
decoder.startElement(qName);
decoder.startChildElement(qName);
* jp.bitmeister.asn1.codec.xer.XerDecoder.ElementDecoder#endElement
* (java.lang.String)
*/
- @Override
public boolean endElement(String qName) {
decoder.endChildElement(qName);
decoder.endElement();
*/
@Override
public void characters(char[] ch, int start, int length) {
- decoder.characters(String.valueOf(Arrays.copyOfRange(ch, start,
- start + length)));
+ char[] tmp = new char[length];
+ System.arraycopy(ch, start, tmp, 0, length);
+ decoder.characters(String.valueOf(tmp));
}
/*
*
* @see jp.bitmeister.asn1.codec.ASN1Decoder#decode(java.lang.Class)
*/
- @Override
public <T extends ASN1Type> T decode(final Class<T> type)
throws ASN1DecodingException {
XerHandler<T> handler = new XerHandler<T>() {
* jp.bitmeister.asn1.codec.xer.XerDecoder.XerHandler#initializeData
* (java.lang.String)
*/
- @Override
void initializeData(String qName) throws SAXException {
data = ASN1Type.instantiate(type);
if (module == null) {
*
* @see jp.bitmeister.asn1.codec.ASN1Decoder#decode()
*/
- @Override
public ASN1Type decode() throws ASN1DecodingException {
XerHandler<ASN1Type> handler = new XerHandler<ASN1Type>() {
* jp.bitmeister.asn1.codec.xer.XerDecoder.XerHandler#initializeData
* (java.lang.String)
*/
- @Override
void initializeData(String qName) {
data = ASN1ModuleManager.instantiate(module, qName);
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.BOOLEAN)
*/
- @Override
public DataDecoder visit(final BOOLEAN data) {
return new DataDecoder() {
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.INTEGER)
*/
- @Override
public DataDecoder visit(final INTEGER data) {
return new DataDecoder() {
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.BIT_STRING)
*/
- @Override
public DataDecoder visit(final BIT_STRING data) {
return new DataDecoder() {
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.OCTET_STRING)
*/
- @Override
public DataDecoder visit(final OCTET_STRING data) {
return new DataDecoder() {
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.NULL)
*/
- @Override
public DataDecoder visit(NULL data) {
return new DataDecoder() {
};
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.OBJECT_IDENTIFIER)
*/
- @Override
public DataDecoder visit(final OBJECT_IDENTIFIER data) {
return new DataDecoder() {
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.REAL)
*/
- @Override
public DataDecoder visit(final REAL data) {
return new DataDecoder() {
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.ENUMERATED)
*/
- @Override
public DataDecoder visit(ENUMERATED data) {
return visit((INTEGER) data);
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.RELATIVE_OID)
*/
- @Override
public DataDecoder visit(RELATIVE_OID data) {
return visit((OBJECT_IDENTIFIER) data);
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.ANY)
*/
- @Override
public DataDecoder visit(final ANY data) {
return new DataDecoder() {
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.CHOICE)
*/
- @Override
public DataDecoder visit(CHOICE data) {
return decoderForStructuredType(data);
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.SEQUENCE_OF)
*/
- @Override
public DataDecoder visit(SEQUENCE_OF<? extends ASN1Type> data) {
return decoderForCollectionType(data);
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.SEQUENCE)
*/
- @Override
public DataDecoder visit(SEQUENCE data) {
return decoderForStructuredType(data);
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.SET_OF)
*/
- @Override
public DataDecoder visit(SET_OF<? extends ASN1Type> data) {
return decoderForCollectionType(data);
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.SET)
*/
- @Override
public DataDecoder visit(SET data) {
return decoderForStructuredType(data);
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .StringType)
*/
- @Override
public DataDecoder visit(final StringType data) {
return new DataDecoder() {
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .TimeType)
*/
- @Override
public DataDecoder visit(TimeType data) {
return visit((StringType) data);
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .UnknownType)
*/
- @Override
public DataDecoder visit(UnknownType data) throws SAXException {
throw new SAXException("UnkownType is not supported by XerDecoder.");
}
* @return The size of encoded octets.
* @throws ASN1EncodingException
* When an error occurred while the encoding process.
- */
- @Override
+ */
public int encode(ASN1Type data) throws ASN1EncodingException {
if (module == null) {
module = data.specification().module();
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.BOOLEAN)
*/
- @Override
public String visit(BOOLEAN data) {
return TAG_START + (data.value() ? BOOLEAN_TRUE : BOOLEAN_FALSE)
+ SINGLE_TAG_END;
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.INTEGER)
*/
- @Override
public String visit(INTEGER data) {
String numberId = data.identifier();
if (numberId != null) {
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.BIT_STRING)
*/
- @Override
public String visit(BIT_STRING data) {
if (data.hasNamedBits()) {
StringBuilder builder = new StringBuilder();
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.OCTET_STRING)
*/
- @Override
public String visit(OCTET_STRING data) {
return new HexString(data.value()).string();
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.NULL)
*/
- @Override
public String visit(NULL data) {
return "";
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.OBJECT_IDENTIFIER)
*/
- @Override
public String visit(OBJECT_IDENTIFIER data) {
StringBuilder builder = new StringBuilder();
if (data.value().size() > 0) {
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.RELATIVE_OID)
*/
- @Override
public String visit(RELATIVE_OID data) {
return visit((OBJECT_IDENTIFIER) data);
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.REAL)
*/
- @Override
public String visit(REAL data) {
if (data.value().isInfinite()) {
return TAG_START
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.ENUMERATED)
*/
- @Override
public String visit(ENUMERATED data) {
return visit((INTEGER) data);
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.ANY)
*/
- @Override
public String visit(ANY data) throws ASN1EncodingException {
encodeImpl(data.value(),
data.value().specification().xmlTypeName(module));
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.CHOICE)
*/
- @Override
public String visit(CHOICE data) throws ASN1EncodingException {
StringBuilder enclosure = builder;
builder = new StringBuilder();
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.SEQUENCE_OF)
*/
- @Override
public String visit(SEQUENCE_OF<? extends ASN1Type> data)
throws ASN1EncodingException {
return processCollection(data);
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.SEQUENCE)
*/
- @Override
public String visit(SEQUENCE data) throws ASN1EncodingException {
return processConstructive(data);
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.SET_OF)
*/
- @Override
public String visit(SET_OF<? extends ASN1Type> data)
throws ASN1EncodingException {
return processCollection(data);
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.SET)
*/
- @Override
public String visit(SET data) throws ASN1EncodingException {
return processConstructive(data);
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .StringType)
*/
- @Override
public String visit(StringType data) throws ASN1EncodingException {
try {
return new String(XerStringEscapeUtil.escape(data.stringValue())
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .TimeType)
*/
- @Override
public String visit(TimeType data) throws ASN1EncodingException {
return data.stringValue();
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .UnknownType)
*/
- @Override
public String visit(UnknownType data) throws ASN1EncodingException {
ASN1EncodingException ex = new ASN1EncodingException();
ex.setMessage("Can't encode unknown type.", null, data.getClass(),
* The ASN.1 data.
* @return A string representation of the ASN.1 data.
*/
- @Override
public String process(ASN1Type data) {
indent = 0;
builder = new StringBuilder();
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.BOOLEAN)
*/
- @Override
public Void visit(BOOLEAN data) {
builder.append(data.value() ? "TRUE" : "FALSE");
return null;
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.INTEGER)
*/
- @Override
public Void visit(INTEGER data) {
String numberId = data.identifier();
if (numberId != null) {
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.ENUMERATED)
*/
- @Override
public Void visit(ENUMERATED data) {
visit((INTEGER) data);
return null;
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.REAL)
*/
- @Override
public Void visit(REAL data) {
builder.append(NUMBER_OPEN).append(data.value()).append(NUMBER_CLOSE);
return null;
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.BIT_STRING)
*/
- @Override
public Void visit(BIT_STRING data) {
if (data.hasNamedBits()) {
builder.append(NAMED_BITS_OPEN);
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.OCTET_STRING)
*/
- @Override
public Void visit(OCTET_STRING data) {
builder.append(new HexString(data.value()).toString());
return null;
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.NULL)
*/
- @Override
public Void visit(NULL data) {
builder.append(NULL);
return null;
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.SEQUENCE)
*/
- @Override
public Void visit(SEQUENCE data) {
writeConstructive(data);
return null;
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.SEQUENCE_OF)
*/
- @Override
public Void visit(SEQUENCE_OF<? extends ASN1Type> data) {
writeCollection(data);
return null;
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.SET)
*/
- @Override
public Void visit(SET data) {
writeConstructive(data);
return null;
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.SET_OF)
*/
- @Override
public Void visit(SET_OF<? extends ASN1Type> data) {
writeCollection(data);
return null;
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.CHOICE)
*/
- @Override
public Void visit(CHOICE data) {
indent();
if (!data.hasValue()) {
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.OBJECT_IDENTIFIER)
*/
- @Override
public Void visit(OBJECT_IDENTIFIER data) {
builder.append(OID_OPEN);
if (data.value().size() > 0) {
/* (non-Javadoc)
* @see jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type.builtin.RELATIVE_OID)
*/
- @Override
public Void visit(RELATIVE_OID data) {
return visit((OBJECT_IDENTIFIER)data);
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .StringType)
*/
- @Override
public Void visit(StringType data) {
try {
String value = data.stringValue();
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .TimeType)
*/
- @Override
public Void visit(TimeType data) {
visit((StringType)data);
builder.append(SPACE).append(DATE_FORMAT.get().format(data.date()));
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.ANY)
*/
- @Override
public Void visit(ANY data) {
write(data.value());
return null;
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .UnknownType)
*/
- @Override
public Void visit(UnknownType data) {
for (int i = 0; i < data.value().length; i++) {
if (i % 16 == 0) {
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.BOOLEAN)
*/
- @Override
public R visit(BOOLEAN data) throws E {
return null;
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.INTEGER)
*/
- @Override
public R visit(INTEGER data) throws E {
return null;
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.BIT_STRING)
*/
- @Override
public R visit(BIT_STRING data) throws E {
return null;
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.OCTET_STRING)
*/
- @Override
public R visit(OCTET_STRING data) throws E {
return null;
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.NULL)
*/
- @Override
public R visit(NULL data) throws E {
return null;
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.OBJECT_IDENTIFIER)
*/
- @Override
public R visit(OBJECT_IDENTIFIER data) throws E {
return null;
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.REAL)
*/
- @Override
public R visit(REAL data) throws E {
return null;
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.ENUMERATED)
*/
- @Override
public R visit(ENUMERATED data) throws E {
return null;
}
/* (non-Javadoc)
* @see jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type.builtin.RELATIVE_OID)
*/
- @Override
public R visit(RELATIVE_OID data) throws E {
return null;
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.ANY)
*/
- @Override
public R visit(ANY data) throws E {
return null;
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.CHOICE)
*/
- @Override
public R visit(CHOICE data) throws E {
return null;
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.SEQUENCE_OF)
*/
- @Override
public R visit(SEQUENCE_OF<? extends ASN1Type> data) throws E {
return null;
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.SEQUENCE)
*/
- @Override
public R visit(SEQUENCE data) throws E {
return null;
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.SET_OF)
*/
- @Override
public R visit(SET_OF<? extends ASN1Type> data) throws E {
return null;
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .builtin.SET)
*/
- @Override
public R visit(SET data) throws E {
return null;
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .StringType)
*/
- @Override
public R visit(StringType data) throws E {
return null;
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .TimeType)
*/
- @Override
public R visit(TimeType data) throws E {
return null;
}
* jp.bitmeister.asn1.processor.ASN1Visitor#visit(jp.bitmeister.asn1.type
* .UnknownType)
*/
- @Override
public R visit(UnknownType data) throws E {
return null;
}
*
* @see jp.bitmeister.asn1.type.SizeCountable#size()
*/
- @Override
public int size() {
return collection.size();
}
*
* @see java.lang.Comparable#compareTo(T)
*/
- @Override
public int compareTo(NamedTypeSpecification compared) {
return order - compared.order;
}
}
/**
- * Instantiates a {@code SelectiveType} and initialize it with the
- * parameter. The ASN.1 tag that assigned to the type of the data is used
- * for select a field.
+ * Instantiates a {@code SelectiveType} and initialize it with the
+ * parameter. The type of the data is used for select alternative. If this
+ * {@code SelectiveType} has two or more alternatives that are defined as
+ * same type, the result of this constructor is undefined.
*
* @param data
* The ASN.1 data assigned to this instance.
*/
public SelectiveType(ASN1Type data) {
- if (!data.specification().tagged()) {
- ASN1IllegalArgument ex = new ASN1IllegalArgument();
- ex.setMessage(
- "The type of the data has no ASN.1 tag for specifying alternative.",
- null, getClass(), null, data);
- throw ex;
+ for (NamedTypeSpecification e : getAlternativeTypeList(getClass())) {
+ if (e.type() == data.getClass()) {
+ set(e, data);
+ return;
+ }
}
- ASN1TagValue tag = data.specification().tag();
- set(alternative(tag.tagClass(), tag.tagNumber()), data);
+ ASN1IllegalArgument ex = new ASN1IllegalArgument();
+ ex.setMessage("Can't select alternative by the type of the data.",
+ null, getClass(), null, data);
+ throw ex;
}
/**
* Instantiates a {@code SelectiveType} and initialize it with parameters.
*
* @param tagClass
- * The tag class used for select a field.
+ * The tag class used for select an alternative.
* @param tagNumber
- * The tag number used for select a field.
+ * The tag number used for select an alternative.
* @param data
* The data to be assigned.
*/
}
/**
+ * Instantiates a {@code SelectiveType} and initialize it with parameters.
+ *
+ * @param elementName
+ * The element name used for select an alternative.
+ * @param data
+ * The data to be assigned.
+ */
+ public SelectiveType(String elementName, ASN1Type data) {
+ set(elementName, data);
+ }
+
+ /**
* Returns the element specified by the ASN.1 tag class and number.
*
* @param tagClass
public ASN1Type get(String elementName) {
return getElement(elementName).retrieve(this);
}
-
- /* (non-Javadoc)
+
+ /*
+ * (non-Javadoc)
+ *
* @see jp.bitmeister.asn1.type.StructuredType#getElement(java.lang.String)
*/
@Override
}
}
ASN1IllegalArgument ex = new ASN1IllegalArgument();
- ex.setMessage("No such alternative '" + elementName + "' in this type.",
+ ex.setMessage(
+ "No such alternative '" + elementName + "' in this type.",
null, getClass(), null, null);
throw ex;
}
*/
package jp.bitmeister.asn1.type;
+import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.regex.Pattern;
import jp.bitmeister.asn1.exception.ASN1IllegalArgument;
+import jp.bitmeister.asn1.exception.ASN1RuntimeException;
import jp.bitmeister.asn1.processor.ASN1Visitor;
import jp.bitmeister.asn1.type.builtin.OCTET_STRING;
*/
public void set(String value) {
checkCharacters(value);
- set(value.getBytes(charset()));
+ try {
+ set(value.getBytes(charset().displayName()));
+ } catch (UnsupportedEncodingException e) {
+ ASN1RuntimeException ex = new ASN1RuntimeException();
+ ex.setMessage("Character set unsupported.", e, getClass(), null, this);
+ throw ex;
+ }
}
/**
* @return The string value assigned to this instance.
*/
public String stringValue() {
- return new String(value(), charset());
+ try {
+ return new String(value(), charset().displayName());
+ } catch (UnsupportedEncodingException e) {
+ ASN1RuntimeException ex = new ASN1RuntimeException();
+ ex.setMessage("Character set unsupported.", e, getClass(), null, this);
+ throw ex;
+ }
}
/**
return true;
}
+ /*
+ * (non-Javadoc)
+ *
+ * @see jp.bitmeister.asn1.type.PrimitiveType#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return 0;
+ }
+
/*
* (non-Javadoc)
*
*
* @see jp.bitmeister.asn1.type.Concatenatable#concatenate(null)
*/
- @Override
public void concatenate(BIT_STRING data) {
if (data == null) {
return;
*
* @see jp.bitmeister.asn1.type.SizeCountable#size()
*/
- @Override
public int size() {
if (value() == null) {
return 0;
return false;
}
+ /*
+ * (non-Javadoc)
+ *
+ * @see jp.bitmeister.asn1.type.PrimitiveType#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return Arrays.hashCode(value());
+ }
+
/*
* (non-Javadoc)
*
/**
* Instantiates a {@code CHOICE} and initialize it with the parameter. The
- * ASN.1 tag that assigned to the type of the data is used for select a
- * field.
+ * ASN.1 tag that assigned to the type of the data is used for select an
+ * alternative.
*
* @param data
* The data to be assigned.
* Instantiates a {@code CHOICE} and initialize it with parameters.
*
* @param tagClass
- * The tag class used for select a field.
+ * The tag class used for select an alternative.
* @param tagNumber
- * The tag number used for select a field.
+ * The tag number used for select an alternative.
* @param data
* The data to be assigned.
*/
super(tagClass, tagNumber, data);
}
+ /**
+ * Instantiates a {@code CHOICE} and initialize it with parameters.
+ *
+ * @param elementName
+ * The element name used for select an alternative.
+ * @param data
+ * The data to be assigned.
+ */
+ public CHOICE(String elementName, ASN1Type data) {
+ super(elementName, data);
+ }
+
/*
* (non-Javadoc)
*
* ASN1Visitor)
*/
@Override
- public <R, E extends Throwable> R accept(ASN1Visitor<R, E> visitor) throws E {
+ public <R, E extends Throwable> R accept(ASN1Visitor<R, E> visitor)
+ throws E {
return visitor.visit(this);
}
-
+
}
* jp.bitmeister.asn1.type.ValueComparable#compareTo(jp.bitmeister.asn1.
* type.ASN1Type)
*/
- @Override
public int compareTo(ASN1Type other) {
return value().compareTo(((INTEGER) other).value());
}
*
* @see jp.bitmeister.asn1.type.Concatenatable#concatenate(null)
*/
- @Override
public void concatenate(OCTET_STRING data) {
if (data == null) {
return;
*
* @see jp.bitmeister.asn1.type.SizeCountable#size()
*/
- @Override
public int size() {
return value().length;
}
return false;
}
+ /*
+ * (non-Javadoc)
+ *
+ * @see jp.bitmeister.asn1.type.PrimitiveType#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return Arrays.hashCode(value());
+ }
+
/*
* (non-Javadoc)
*
* jp.bitmeister.asn1.type.ValueComparable#compareTo(jp.bitmeister.asn1.
* type.ASN1Type)
*/
- @Override
public int compareTo(ASN1Type other) {
return value().compareTo(((REAL) other).value());
}
*
* @return An array of {@code boolean}.
*/
- @Override
public boolean[] toBinArray() {
boolean[] array = new boolean[string.length()];
for (int i = 0; i < array.length; i++) {
*
* @return An array of {@code byte}.
*/
- @Override
public byte[] toByteArray() {
byte[] array = new byte[string.length() / 8 + 1];
int index = 0, shift = 7;
*
* @return An array of {@code boolean}.
*/
- @Override
public boolean[] toBinArray() {
boolean[] array = new boolean[string.length() * 4];
int index = 0, mask = 0;
*
* @return An array of {@code byte}.
*/
- @Override
public byte[] toByteArray() {
byte[] array = new byte[string.length() / 2 + string.length() % 2];
byte octet = 0;