View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   * http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.chemistry.opencmis.server.impl.atompub;
20  
21  import org.apache.chemistry.opencmis.commons.impl.Constants;
22  
23  import org.apache.commons.codec.binary.Base64;
24  
25  import java.io.UnsupportedEncodingException;
26  
27  import java.math.BigInteger;
28  
29  import java.net.URLEncoder;
30  
31  import java.text.SimpleDateFormat;
32  
33  import java.util.GregorianCalendar;
34  import java.util.Locale;
35  import java.util.TimeZone;
36  
37  import javax.xml.stream.XMLStreamException;
38  import javax.xml.stream.XMLStreamWriter;
39  
40  
41  /**
42   * Atom base class.
43   */
44  public abstract class AtomDocumentBase extends XMLDocumentBase
45  {
46      private static final String ID_PREFIX = "http://chemistry.apache.org/";
47      private static final String ID_DUMMY = "http://chemistry.apache.org/no-id";
48      private SimpleDateFormat dateFormater;
49  
50      /**
51       * Formats a DateTime.
52       */
53      public String formatDate( long millis )
54      {
55          if ( dateFormater == null )
56          {
57              dateFormater = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US );
58              dateFormater.setTimeZone( TimeZone.getTimeZone( "UTC" ) );
59          }
60  
61          return dateFormater.format( millis );
62      }
63  
64      /**
65       * Generates a valid Atom id.
66       */
67      public String generateAtomId( String input )
68      {
69          if ( input == null )
70          {
71              return ID_DUMMY;
72          }
73  
74          try
75          {
76              return ID_PREFIX + ( new String( Base64.encodeBase64( input.getBytes( "UTF-8" ) ) ) );
77          }
78          catch ( UnsupportedEncodingException e )
79          {
80              return ID_DUMMY;
81          }
82      }
83  
84      /**
85       * Writes a simple tag.
86       */
87      public void writeSimpleTag( String namespace, String name, String value )
88          throws XMLStreamException
89      {
90          if ( value == null )
91          {
92              return;
93          }
94  
95          XMLStreamWriter xsw = getWriter(  );
96  
97          xsw.writeStartElement( namespace, name );
98          xsw.writeCharacters( value );
99          xsw.writeEndElement(  );
100     }
101 
102     /**
103      * Writes a simple date tag.
104      */
105     public void writeSimpleDate( String namespace, String name, GregorianCalendar value )
106         throws XMLStreamException
107     {
108         if ( value == null )
109         {
110             return;
111         }
112 
113         writeSimpleTag( namespace, name, formatDate( value.getTimeInMillis(  ) ) );
114     }
115 
116     /**
117      * Writes a simple date tag.
118      */
119     public void writeSimpleDate( String namespace, String name, long millis )
120         throws XMLStreamException
121     {
122         writeSimpleTag( namespace, name, formatDate( millis ) );
123     }
124 
125     /**
126      * Writes an Atom id tag.
127      */
128     public void writeId( String id ) throws XMLStreamException
129     {
130         writeSimpleTag( Constants.NAMESPACE_ATOM, "id", id );
131     }
132 
133     /**
134      * Writes an Atom title tag.
135      */
136     public void writeTitle( String title ) throws XMLStreamException
137     {
138         writeSimpleTag( Constants.NAMESPACE_ATOM, "title", title );
139     }
140 
141     /**
142      * Writes an Atom author tag.
143      */
144     public void writeAuthor( String author ) throws XMLStreamException
145     {
146         XMLStreamWriter xsw = getWriter(  );
147 
148         xsw.writeStartElement( Constants.NAMESPACE_ATOM, "author" );
149         writeSimpleTag( Constants.NAMESPACE_ATOM, "name", author );
150         xsw.writeEndElement(  );
151     }
152 
153     /**
154      * Writes an Atom updated tag.
155      */
156     public void writeUpdated( GregorianCalendar updated )
157         throws XMLStreamException
158     {
159         writeSimpleDate( Constants.NAMESPACE_APP, "edited", updated );
160         writeSimpleDate( Constants.NAMESPACE_ATOM, "updated", updated );
161     }
162 
163     /**
164      * Writes an Atom updated tag.
165      */
166     public void writeUpdated( long updated ) throws XMLStreamException
167     {
168         writeSimpleDate( Constants.NAMESPACE_APP, "edited", updated );
169         writeSimpleDate( Constants.NAMESPACE_ATOM, "updated", updated );
170     }
171 
172     /**
173      * Writes an Atom published tag.
174      */
175     public void writePublished( GregorianCalendar published )
176         throws XMLStreamException
177     {
178         writeSimpleDate( Constants.NAMESPACE_ATOM, "published", published );
179     }
180 
181     /**
182      * Writes an Atom published tag.
183      */
184     public void writePublished( long published ) throws XMLStreamException
185     {
186         writeSimpleDate( Constants.NAMESPACE_ATOM, "published", published );
187     }
188 
189     /**
190      * Writes a CMIS pathSegment tag.
191      */
192     public void writePathSegment( String pathSegment )
193         throws XMLStreamException
194     {
195         writeSimpleTag( Constants.NAMESPACE_RESTATOM, "pathSegment", pathSegment );
196     }
197 
198     /**
199      * Writes a CMIS relativePathSegment tag.
200      */
201     public void writeRelativePathSegment( String relativePathSegment )
202         throws XMLStreamException
203     {
204         writeSimpleTag( Constants.NAMESPACE_RESTATOM, "relativePathSegment", relativePathSegment );
205     }
206 
207     /**
208      * Writes an Atom collection.
209      */
210     public void writeCollection( String href, String collectionType, String text, String... accept )
211         throws XMLStreamException
212     {
213         XMLStreamWriter xsw = getWriter(  );
214 
215         xsw.writeStartElement( Constants.NAMESPACE_APP, "collection" );
216         xsw.writeAttribute( "href", href );
217 
218         if ( collectionType != null )
219         {
220             xsw.writeStartElement( Constants.NAMESPACE_RESTATOM, "collectionType" );
221             xsw.writeCharacters( collectionType );
222             xsw.writeEndElement(  );
223         }
224 
225         xsw.writeStartElement( Constants.NAMESPACE_ATOM, "title" );
226         xsw.writeAttribute( "type", "text" );
227         xsw.writeCharacters( text );
228         xsw.writeEndElement(  );
229 
230         for ( String ct : accept )
231         {
232             xsw.writeStartElement( Constants.NAMESPACE_APP, "accept" );
233             xsw.writeCharacters( ct );
234             xsw.writeEndElement(  );
235         }
236 
237         xsw.writeEndElement(  );
238     }
239 
240     /**
241      * Writes a link.
242      */
243     public void writeLink( String rel, String href, String type, String id )
244         throws XMLStreamException
245     {
246         XMLStreamWriter xsw = getWriter(  );
247 
248         xsw.writeStartElement( Constants.NAMESPACE_ATOM, "link" );
249 
250         xsw.writeAttribute( "rel", rel );
251         xsw.writeAttribute( "href", href );
252 
253         if ( type != null )
254         {
255             xsw.writeAttribute( "type", type );
256         }
257 
258         if ( id != null )
259         {
260             xsw.writeAttribute( Constants.NAMESPACE_RESTATOM, "id", id );
261         }
262 
263         xsw.writeEndElement(  );
264     }
265 
266     public void writeServiceLink( String href, String repositoryId )
267         throws XMLStreamException
268     {
269         try
270         {
271             writeLink( Constants.REL_SERVICE, href + "?repositoryId=" + URLEncoder.encode( repositoryId, "UTF-8" ),
272                 Constants.MEDIATYPE_SERVICE, null );
273         }
274         catch ( UnsupportedEncodingException e )
275         {
276         }
277     }
278 
279     public void writeSelfLink( String href, String id )
280         throws XMLStreamException
281     {
282         writeLink( Constants.REL_SELF, href, Constants.MEDIATYPE_ENTRY, id );
283     }
284 
285     public void writeEnclosureLink( String href ) throws XMLStreamException
286     {
287         writeLink( Constants.REL_ENCLOSURE, href, Constants.MEDIATYPE_ENTRY, null );
288     }
289 
290     public void writeEditLink( String href ) throws XMLStreamException
291     {
292         writeLink( Constants.REL_EDIT, href, Constants.MEDIATYPE_ENTRY, null );
293     }
294 
295     public void writeAlternateLink( String href, String type, String kind, String title, BigInteger length )
296         throws XMLStreamException
297     {
298         XMLStreamWriter xsw = getWriter(  );
299 
300         xsw.writeStartElement( Constants.NAMESPACE_ATOM, "link" );
301 
302         xsw.writeAttribute( "rel", Constants.REL_ALTERNATE );
303         xsw.writeAttribute( "href", href );
304 
305         if ( type != null )
306         {
307             xsw.writeAttribute( "type", type );
308         }
309 
310         if ( kind != null )
311         {
312             xsw.writeAttribute( Constants.NAMESPACE_RESTATOM, "renditionKind", kind );
313         }
314 
315         if ( title != null )
316         {
317             xsw.writeAttribute( "title", title );
318         }
319 
320         if ( length != null )
321         {
322             xsw.writeAttribute( "length", length.toString(  ) );
323         }
324 
325         xsw.writeEndElement(  );
326     }
327 
328     public void writeWorkingCopyLink( String href ) throws XMLStreamException
329     {
330         writeLink( Constants.REL_WORKINGCOPY, href, Constants.MEDIATYPE_ENTRY, null );
331     }
332 
333     public void writeUpLink( String href, String type )
334         throws XMLStreamException
335     {
336         writeLink( Constants.REL_UP, href, type, null );
337     }
338 
339     public void writeDownLink( String href, String type )
340         throws XMLStreamException
341     {
342         writeLink( Constants.REL_DOWN, href, type, null );
343     }
344 
345     public void writeVersionHistoryLink( String href )
346         throws XMLStreamException
347     {
348         writeLink( Constants.REL_VERSIONHISTORY, href, Constants.MEDIATYPE_FEED, null );
349     }
350 
351     public void writeCurrentVerionsLink( String href )
352         throws XMLStreamException
353     {
354         writeLink( Constants.REL_CURRENTVERSION, href, Constants.MEDIATYPE_ENTRY, null );
355     }
356 
357     public void writeEditMediaLink( String href, String type )
358         throws XMLStreamException
359     {
360         writeLink( Constants.REL_EDITMEDIA, href, type, null );
361     }
362 
363     public void writeDescribedByLink( String href ) throws XMLStreamException
364     {
365         writeLink( Constants.REL_DESCRIBEDBY, href, Constants.MEDIATYPE_ENTRY, null );
366     }
367 
368     public void writeAllowableActionsLink( String href )
369         throws XMLStreamException
370     {
371         writeLink( Constants.REL_ALLOWABLEACTIONS, href, Constants.MEDIATYPE_ALLOWABLEACTION, null );
372     }
373 
374     public void writeAclLink( String href ) throws XMLStreamException
375     {
376         writeLink( Constants.REL_ACL, href, Constants.MEDIATYPE_ACL, null );
377     }
378 
379     public void writePoliciesLink( String href ) throws XMLStreamException
380     {
381         writeLink( Constants.REL_POLICIES, href, Constants.MEDIATYPE_FEED, null );
382     }
383 
384     public void writeRelationshipsLink( String href ) throws XMLStreamException
385     {
386         writeLink( Constants.REL_RELATIONSHIPS, href, Constants.MEDIATYPE_FEED, null );
387     }
388 
389     public void writeRelationshipSourceLink( String href )
390         throws XMLStreamException
391     {
392         writeLink( Constants.REL_SOURCE, href, Constants.MEDIATYPE_ENTRY, null );
393     }
394 
395     public void writeRelationshipTargetLink( String href )
396         throws XMLStreamException
397     {
398         writeLink( Constants.REL_TARGET, href, Constants.MEDIATYPE_ENTRY, null );
399     }
400 
401     public void writeFolderTreeLink( String href ) throws XMLStreamException
402     {
403         writeLink( Constants.REL_FOLDERTREE, href, Constants.MEDIATYPE_DESCENDANTS, null );
404     }
405 
406     public void writeTypeUpLink( String href, String type )
407         throws XMLStreamException
408     {
409         writeLink( Constants.REL_UP, href, type, null );
410     }
411 
412     public void writeTypeDownLink( String href, String type )
413         throws XMLStreamException
414     {
415         writeLink( Constants.REL_DOWN, href, type, null );
416     }
417 
418     public void writeViaLink( String href ) throws XMLStreamException
419     {
420         writeLink( Constants.REL_VIA, href, Constants.MEDIATYPE_ENTRY, null );
421     }
422 
423     public void writeFirstLink( String href ) throws XMLStreamException
424     {
425         writeLink( Constants.REL_FIRST, href, Constants.MEDIATYPE_FEED, null );
426     }
427 
428     public void writeLastLink( String href ) throws XMLStreamException
429     {
430         writeLink( Constants.REL_LAST, href, Constants.MEDIATYPE_FEED, null );
431     }
432 
433     public void writePreviousLink( String href ) throws XMLStreamException
434     {
435         writeLink( Constants.REL_PREV, href, Constants.MEDIATYPE_FEED, null );
436     }
437 
438     public void writeNextLink( String href ) throws XMLStreamException
439     {
440         writeLink( Constants.REL_NEXT, href, Constants.MEDIATYPE_FEED, null );
441     }
442 }