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