View Javadoc

1   /*
2    * $Id: Attach.java [Apr 6, 2004]
3    *
4    * Copyright (c) 2004, Ben Fortuna
5    * All rights reserved.
6    *
7    * Redistribution and use in source and binary forms, with or without
8    * modification, are permitted provided that the following conditions
9    * are met:
10   *
11   * 	o Redistributions of source code must retain the above copyright
12   * notice, this list of conditions and the following disclaimer.
13   *
14   * 	o Redistributions in binary form must reproduce the above copyright
15   * notice, this list of conditions and the following disclaimer in the
16   * documentation and/or other materials provided with the distribution.
17   *
18   * 	o Neither the name of Ben Fortuna nor the names of any other contributors
19   * may be used to endorse or promote products derived from this software
20   * without specific prior written permission.
21   *
22   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23   * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24   * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25   * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
26   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27   * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28   * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
29   * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
30   * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
31   * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32   * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33   */
34  package net.fortuna.ical4j.model.property;
35  
36  import java.io.ByteArrayOutputStream;
37  import java.io.IOException;
38  import java.io.OutputStreamWriter;
39  import java.net.URI;
40  import java.net.URISyntaxException;
41  
42  import net.fortuna.ical4j.model.Parameter;
43  import net.fortuna.ical4j.model.ParameterList;
44  import net.fortuna.ical4j.model.Property;
45  import net.fortuna.ical4j.model.ValidationException;
46  import net.fortuna.ical4j.model.parameter.Encoding;
47  import net.fortuna.ical4j.model.parameter.Value;
48  import net.fortuna.ical4j.util.ParameterValidator;
49  
50  /***
51   * Defines an ATTACH iCalendar component property.
52   *
53   * @author benf
54   */
55  public class Attach extends Property {
56  
57      private URI uri;
58  
59      private byte[] binary;
60  
61      /***
62       * @param aList
63       *            a list of parameters for this component
64       * @param aValue
65       *            a value string for this component
66       * @throws IOException
67       *             when there is an error reading the binary stream
68       * @throws URISyntaxException
69       *             where the specified string is not a valid uri
70       */
71      public Attach(final ParameterList aList, final String aValue)
72              throws IOException, URISyntaxException {
73          super(ATTACH, aList);
74  
75          // determine if ATTACH is a URI or an embedded
76          // binary..
77          Parameter encodingParam = getParameters().getParameter(
78                  Parameter.ENCODING);
79          Parameter valueParam = getParameters().getParameter(Parameter.VALUE);
80  
81          if (encodingParam != null
82                  && Encoding.BASE64.equals(encodingParam.getValue())
83                  && valueParam != null
84                  && Value.BINARY.equals(valueParam.getValue())) {
85  
86              ByteArrayOutputStream bout = new ByteArrayOutputStream(aValue
87                      .length());
88  
89              OutputStreamWriter writer = new OutputStreamWriter(bout);
90              writer.write(aValue);
91  
92              binary = bout.toByteArray();
93          }
94          // assume URI..
95          else {
96  
97              uri = new URI(aValue);
98          }
99      }
100 
101     /***
102      * @param aList
103      *            a list of parameters for this component
104      * @param data
105      *            binary data
106      */
107     public Attach(final ParameterList aList, final byte[] data) {
108         super(ATTACH, aList);
109 
110         this.binary = data;
111     }
112 
113     /***
114      * @param aList
115      *            a list of parameters for this component
116      * @param aUri
117      *            a URI
118      */
119     public Attach(final ParameterList aList, final URI aUri) {
120         super(ATTACH, aList);
121 
122         this.uri = aUri;
123     }
124 
125     /***
126      * @see net.fortuna.ical4j.model.Property#validate()
127      */
128     public final void validate() throws ValidationException {
129 
130         /*
131          * ; the following is optional, ; but MUST NOT occur more than once
132          *
133          * (";" fmttypeparam) /
134          */
135         ParameterValidator.getInstance().validateOneOrLess(Parameter.FMTTYPE,
136                 getParameters());
137 
138         /*
139          * ; the following is optional, ; and MAY occur more than once
140          *
141          * (";" xparam)
142          */
143     }
144 
145     /***
146      * @return Returns the binary.
147      */
148     public final byte[] getBinary() {
149         return binary;
150     }
151 
152     /***
153      * @return Returns the uri.
154      */
155     public final URI getUri() {
156         return uri;
157     }
158 
159     /*
160      * (non-Javadoc)
161      *
162      * @see net.fortuna.ical4j.model.Property#getValue()
163      */
164     public String getValue() {
165 
166         if (getUri() != null) {
167             return getUri().toString();
168         }
169         else if (getBinary() != null) { return String.valueOf(getBinary()); }
170 
171         return null;
172     }
173 }