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.text.ParsePosition; 022 import java.text.SimpleDateFormat; 023 import java.util.Date; 024 import java.util.SimpleTimeZone; 025 026 import org.apache.geronimo.util.asn1.ASN1Choice; 027 import org.apache.geronimo.util.asn1.ASN1Encodable; 028 import org.apache.geronimo.util.asn1.ASN1TaggedObject; 029 import org.apache.geronimo.util.asn1.DERGeneralizedTime; 030 import org.apache.geronimo.util.asn1.DERObject; 031 import org.apache.geronimo.util.asn1.DERUTCTime; 032 033 public class Time 034 extends ASN1Encodable 035 implements ASN1Choice 036 { 037 DERObject time; 038 039 public static Time getInstance( 040 ASN1TaggedObject obj, 041 boolean explicit) 042 { 043 return getInstance(obj.getObject()); // must be explicitly tagged 044 } 045 046 public Time( 047 DERObject time) 048 { 049 if (!(time instanceof DERUTCTime) 050 && !(time instanceof DERGeneralizedTime)) 051 { 052 throw new IllegalArgumentException("unknown object passed to Time"); 053 } 054 055 this.time = time; 056 } 057 058 /** 059 * creates a time object from a given date - if the date is between 1950 060 * and 2049 a UTCTime object is generated, otherwise a GeneralizedTime 061 * is used. 062 */ 063 public Time( 064 Date date) 065 { 066 SimpleTimeZone tz = new SimpleTimeZone(0, "Z"); 067 SimpleDateFormat dateF = new SimpleDateFormat("yyyyMMddHHmmss"); 068 069 dateF.setTimeZone(tz); 070 071 String d = dateF.format(date) + "Z"; 072 int year = Integer.parseInt(d.substring(0, 4)); 073 074 if (year < 1950 || year > 2049) 075 { 076 time = new DERGeneralizedTime(d); 077 } 078 else 079 { 080 time = new DERUTCTime(d.substring(2)); 081 } 082 } 083 084 public static Time getInstance( 085 Object obj) 086 { 087 if (obj instanceof Time) 088 { 089 return (Time)obj; 090 } 091 else if (obj instanceof DERUTCTime) 092 { 093 return new Time((DERUTCTime)obj); 094 } 095 else if (obj instanceof DERGeneralizedTime) 096 { 097 return new Time((DERGeneralizedTime)obj); 098 } 099 100 throw new IllegalArgumentException("unknown object in factory"); 101 } 102 103 public String getTime() 104 { 105 if (time instanceof DERUTCTime) 106 { 107 return ((DERUTCTime)time).getAdjustedTime(); 108 } 109 else 110 { 111 return ((DERGeneralizedTime)time).getTime(); 112 } 113 } 114 115 public Date getDate() 116 { 117 SimpleDateFormat dateF = new SimpleDateFormat("yyyyMMddHHmmssz"); 118 119 return dateF.parse(this.getTime(), new ParsePosition(0)); 120 } 121 122 /** 123 * Produce an object suitable for an ASN1OutputStream. 124 * <pre> 125 * Time ::= CHOICE { 126 * utcTime UTCTime, 127 * generalTime GeneralizedTime } 128 * </pre> 129 */ 130 public DERObject toASN1Object() 131 { 132 return time; 133 } 134 }