001 /**
002 *
003 * Licensed to the Apache Software Foundation (ASF) under one or more
004 * contributor license agreements. See the NOTICE file distributed with
005 * this work for additional information regarding copyright ownership.
006 * The ASF licenses this file to You under the Apache License, Version 2.0
007 * (the "License"); you may not use this file except in compliance with
008 * the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018
019 package org.apache.geronimo.util.asn1.x509;
020
021 import java.math.BigInteger;
022
023 import org.apache.geronimo.util.asn1.ASN1Encodable;
024 import org.apache.geronimo.util.asn1.ASN1EncodableVector;
025 import org.apache.geronimo.util.asn1.ASN1Sequence;
026 import org.apache.geronimo.util.asn1.ASN1TaggedObject;
027 import org.apache.geronimo.util.asn1.DERInteger;
028 import org.apache.geronimo.util.asn1.DERObject;
029 import org.apache.geronimo.util.asn1.DERSequence;
030 import org.apache.geronimo.util.asn1.DERTaggedObject;
031
032 public class GeneralSubtree
033 extends ASN1Encodable
034 {
035 private GeneralName base;
036 private DERInteger minimum;
037 private DERInteger maximum;
038
039 public GeneralSubtree(
040 ASN1Sequence seq)
041 {
042 base = GeneralName.getInstance(seq.getObjectAt(0));
043
044 switch (seq.size())
045 {
046 case 1:
047 break;
048 case 2:
049 ASN1TaggedObject o = (ASN1TaggedObject)seq.getObjectAt(1);
050 switch (o.getTagNo())
051 {
052 case 0 :
053 minimum = DERInteger.getInstance(o, false);
054 break;
055 case 1 :
056 maximum = DERInteger.getInstance(o, false);
057 break;
058 default:
059 throw new IllegalArgumentException("Bad tag number: " + o.getTagNo());
060 }
061 break;
062 case 3 :
063 minimum = DERInteger.getInstance((ASN1TaggedObject)seq.getObjectAt(1), false);
064 maximum = DERInteger.getInstance((ASN1TaggedObject)seq.getObjectAt(2), false);
065 break;
066 default:
067 throw new IllegalArgumentException("Bad sequence size: " + seq.size());
068 }
069 }
070
071 public static GeneralSubtree getInstance(
072 ASN1TaggedObject o,
073 boolean explicit)
074 {
075 return new GeneralSubtree(ASN1Sequence.getInstance(o, explicit));
076 }
077
078 public static GeneralSubtree getInstance(
079 Object obj)
080 {
081 if (obj == null)
082 {
083 return null;
084 }
085
086 if (obj instanceof GeneralSubtree)
087 {
088 return (GeneralSubtree)obj;
089 }
090
091 return new GeneralSubtree(ASN1Sequence.getInstance(obj));
092 }
093
094 public GeneralName getBase()
095 {
096 return base;
097 }
098
099 public BigInteger getMinimum()
100 {
101 if (minimum == null)
102 {
103 return BigInteger.valueOf(0);
104 }
105
106 return minimum.getValue();
107 }
108
109 public BigInteger getMaximum()
110 {
111 if (maximum == null)
112 {
113 return null;
114 }
115
116 return maximum.getValue();
117 }
118
119 /*
120 * GeneralSubtree ::= SEQUENCE {
121 * base GeneralName,
122 * minimum [0] BaseDistance DEFAULT 0,
123 * maximum [1] BaseDistance OPTIONAL }
124 */
125 public DERObject toASN1Object()
126 {
127 ASN1EncodableVector v = new ASN1EncodableVector();
128
129 v.add(base);
130
131 if (minimum != null)
132 {
133 v.add(new DERTaggedObject(false, 0, minimum));
134 }
135
136 if (maximum != null)
137 {
138 v.add(new DERTaggedObject(false, 1, maximum));
139 }
140
141 return new DERSequence(v);
142 }
143 }