KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > alfresco > jcr > exporter > JCRDocumentXMLExporter


1 /*
2  * Copyright (C) 2005 Alfresco, Inc.
3  *
4  * Licensed under the Mozilla Public License version 1.1
5  * with a permitted attribution clause. You may obtain a
6  * copy of the License at
7  *
8  * http://www.alfresco.org/legal/license.txt
9  *
10  * Unless required by applicable law or agreed to in writing,
11  * software distributed under the License is distributed on an
12  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
13  * either express or implied. See the License for the specific
14  * language governing permissions and limitations under the
15  * License.
16  */

17 package org.alfresco.jcr.exporter;
18
19 import java.io.IOException JavaDoc;
20 import java.io.InputStream JavaDoc;
21 import java.util.ArrayList JavaDoc;
22 import java.util.Collection JavaDoc;
23 import java.util.List JavaDoc;
24
25 import javax.jcr.RepositoryException;
26 import javax.jcr.Value;
27 import javax.jcr.ValueFormatException;
28
29 import org.alfresco.jcr.dictionary.JCRNamespace;
30 import org.alfresco.jcr.item.NodeImpl;
31 import org.alfresco.jcr.item.PropertyImpl;
32 import org.alfresco.jcr.item.property.JCRMixinTypesProperty;
33 import org.alfresco.jcr.item.property.JCRPrimaryTypeProperty;
34 import org.alfresco.jcr.item.property.JCRUUIDProperty;
35 import org.alfresco.jcr.session.SessionImpl;
36 import org.alfresco.service.cmr.repository.ContentData;
37 import org.alfresco.service.cmr.repository.NodeRef;
38 import org.alfresco.service.cmr.repository.NodeService;
39 import org.alfresco.service.cmr.repository.Path;
40 import org.alfresco.service.cmr.security.AccessPermission;
41 import org.alfresco.service.cmr.view.Exporter;
42 import org.alfresco.service.cmr.view.ExporterContext;
43 import org.alfresco.service.cmr.view.ExporterException;
44 import org.alfresco.service.namespace.QName;
45 import org.alfresco.util.Base64;
46 import org.alfresco.util.ISO9075;
47 import org.xml.sax.ContentHandler JavaDoc;
48 import org.xml.sax.SAXException JavaDoc;
49 import org.xml.sax.helpers.AttributesImpl JavaDoc;
50
51
52 /**
53  * Alfresco Implementation of JCR Document XML Exporter
54  *
55  * @author David Caruana
56  */

57 public class JCRDocumentXMLExporter implements Exporter
58 {
59
60     private SessionImpl session;
61     private ContentHandler JavaDoc contentHandler;
62     private List JavaDoc<QName> currentProperties = new ArrayList JavaDoc<QName>();
63     private List JavaDoc<Object JavaDoc> currentValues = new ArrayList JavaDoc<Object JavaDoc>();
64     
65
66     /**
67      * Construct
68      *
69      * @param namespaceService namespace service
70      * @param nodeService node service
71      * @param contentHandler content handler
72      */

73     public JCRDocumentXMLExporter(SessionImpl session, ContentHandler JavaDoc contentHandler)
74     {
75         this.session = session;
76         this.contentHandler = contentHandler;
77     }
78     
79     
80     /* (non-Javadoc)
81      * @see org.alfresco.service.cmr.view.Exporter#start()
82      */

83     public void start(ExporterContext exportNodeRef)
84     {
85         try
86         {
87             contentHandler.startDocument();
88         }
89         catch (SAXException JavaDoc e)
90         {
91             throw new ExporterException("Failed to process export start event", e);
92         }
93     }
94
95     /* (non-Javadoc)
96      * @see org.alfresco.service.cmr.view.Exporter#startNamespace(java.lang.String, java.lang.String)
97      */

98     public void startNamespace(String JavaDoc prefix, String JavaDoc uri)
99     {
100         try
101         {
102             contentHandler.startPrefixMapping(prefix, uri);
103         }
104         catch (SAXException JavaDoc e)
105         {
106             throw new ExporterException("Failed to process start namespace event - prefix " + prefix + " uri " + uri, e);
107         }
108     }
109
110     /* (non-Javadoc)
111      * @see org.alfresco.service.cmr.view.Exporter#endNamespace(java.lang.String)
112      */

113     public void endNamespace(String JavaDoc prefix)
114     {
115         try
116         {
117             contentHandler.endPrefixMapping(prefix);
118         }
119         catch (SAXException JavaDoc e)
120         {
121             throw new ExporterException("Failed to process end namespace event - prefix " + prefix, e);
122         }
123     }
124
125     /* (non-Javadoc)
126      * @see org.alfresco.service.cmr.view.Exporter#startNode(org.alfresco.service.cmr.repository.NodeRef)
127      */

128     public void startNode(NodeRef nodeRef)
129     {
130     }
131     
132     /* (non-Javadoc)
133      * @see org.alfresco.service.cmr.view.Exporter#endNode(org.alfresco.service.cmr.repository.NodeRef)
134      */

135     public void endNode(NodeRef nodeRef)
136     {
137         try
138         {
139             QName nodeName = getNodeName(nodeRef);
140             contentHandler.endElement(nodeName.getNamespaceURI(), nodeName.getLocalName(), toPrefixString(nodeName));
141         }
142         catch (SAXException JavaDoc e)
143         {
144             throw new ExporterException("Failed to process end node event - node ref " + nodeRef.toString(), e);
145         }
146     }
147
148     /* (non-Javadoc)
149      * @see org.alfresco.service.cmr.view.Exporter#startAspects(org.alfresco.service.cmr.repository.NodeRef)
150      */

151     public void startAspects(NodeRef nodeRef)
152     {
153     }
154
155     /* (non-Javadoc)
156      * @see org.alfresco.service.cmr.view.Exporter#endAspects(org.alfresco.service.cmr.repository.NodeRef)
157      */

158     public void endAspects(NodeRef nodeRef)
159     {
160     }
161
162     /* (non-Javadoc)
163      * @see org.alfresco.service.cmr.view.Exporter#startAspect(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.namespace.QName)
164      */

165     public void startAspect(NodeRef nodeRef, QName aspect)
166     {
167     }
168
169     /* (non-Javadoc)
170      * @see org.alfresco.service.cmr.view.Exporter#endAspect(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.namespace.QName)
171      */

172     public void endAspect(NodeRef nodeRef, QName aspect)
173     {
174     }
175
176     /* (non-Javadoc)
177      * @see org.alfresco.service.cmr.view.Exporter#startACL(org.alfresco.service.cmr.repository.NodeRef)
178      */

179     public void startACL(NodeRef nodeRef)
180     {
181     }
182
183     /* (non-Javadoc)
184      * @see org.alfresco.service.cmr.view.Exporter#permission(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.security.AccessPermission)
185      */

186     public void permission(NodeRef nodeRef, AccessPermission permission)
187     {
188     }
189
190     /* (non-Javadoc)
191      * @see org.alfresco.service.cmr.view.Exporter#endACL(org.alfresco.service.cmr.repository.NodeRef)
192      */

193     public void endACL(NodeRef nodeRef)
194     {
195     }
196     
197     /* (non-Javadoc)
198      * @see org.alfresco.service.cmr.view.Exporter#startProperties(org.alfresco.service.cmr.repository.NodeRef)
199      */

200     public void startProperties(NodeRef nodeRef)
201     {
202         currentProperties.clear();
203         currentValues.clear();
204     }
205
206     /* (non-Javadoc)
207      * @see org.alfresco.service.cmr.view.Exporter#endProperties(org.alfresco.service.cmr.repository.NodeRef)
208      */

209     public void endProperties(NodeRef nodeRef)
210     {
211         try
212         {
213             // create node attributes
214
AttributesImpl JavaDoc attrs = new AttributesImpl JavaDoc();
215             
216             // primary type
217
NodeImpl nodeImpl = new NodeImpl(session, nodeRef);
218             PropertyImpl primaryType = new JCRPrimaryTypeProperty(nodeImpl);
219             attrs.addAttribute(JCRPrimaryTypeProperty.PROPERTY_NAME.getNamespaceURI(), JCRPrimaryTypeProperty.PROPERTY_NAME.getLocalName(),
220                 toPrefixString(JCRPrimaryTypeProperty.PROPERTY_NAME), null, getValue(primaryType.getValue().getString()));
221             
222             // mixin type
223
PropertyImpl mixinTypes = new JCRMixinTypesProperty(nodeImpl);
224             Collection JavaDoc<String JavaDoc> mixins = new ArrayList JavaDoc<String JavaDoc>();
225             for (Value value : mixinTypes.getValues())
226             {
227                 mixins.add(value.getString());
228             }
229             attrs.addAttribute(JCRMixinTypesProperty.PROPERTY_NAME.getNamespaceURI(), JCRMixinTypesProperty.PROPERTY_NAME.getLocalName(),
230                 toPrefixString(JCRMixinTypesProperty.PROPERTY_NAME), null, getCollectionValue(mixins));
231
232             // uuid (for mix:referencable)
233
attrs.addAttribute(JCRUUIDProperty.PROPERTY_NAME.getNamespaceURI(), JCRUUIDProperty.PROPERTY_NAME.getLocalName(),
234                 toPrefixString(JCRUUIDProperty.PROPERTY_NAME), null, getValue(nodeRef.getId()));
235             
236             // node properties
237
for (int i = 0; i < currentProperties.size(); i++)
238             {
239                 Object JavaDoc value = currentValues.get(i);
240                 String JavaDoc strValue = (value instanceof Collection JavaDoc) ? getCollectionValue((Collection JavaDoc)value) : getValue(value);
241                 QName propName = currentProperties.get(i);
242                 propName = encodeQName(propName);
243                 attrs.addAttribute(propName.getNamespaceURI(), propName.getLocalName(), toPrefixString(propName), null, strValue);
244             }
245             
246             // emit node element
247
QName nodeName = getNodeName(nodeRef);
248             contentHandler.startElement(nodeName.getNamespaceURI(), nodeName.getLocalName(), toPrefixString(nodeName), attrs);
249         }
250         catch (ValueFormatException e)
251         {
252             throw new ExporterException("Failed to process properties event - nodeRef " + nodeRef);
253         }
254         catch (RepositoryException e)
255         {
256             throw new ExporterException("Failed to process properties event - nodeRef " + nodeRef);
257         }
258         catch (SAXException JavaDoc e)
259         {
260             throw new ExporterException("Failed to process properties event - nodeRef " + nodeRef);
261         }
262     }
263     
264     /* (non-Javadoc)
265      * @see org.alfresco.service.cmr.view.Exporter#startProperty(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.namespace.QName)
266      */

267     public void startProperty(NodeRef nodeRef, QName property)
268     {
269     }
270
271     /* (non-Javadoc)
272      * @see org.alfresco.service.cmr.view.Exporter#endProperty(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.namespace.QName)
273      */

274     public void endProperty(NodeRef nodeRef, QName property)
275     {
276     }
277
278     /* (non-Javadoc)
279      * @see org.alfresco.service.cmr.view.Exporter#value(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.namespace.QName, java.io.Serializable)
280      */

281     public void value(NodeRef nodeRef, QName property, Object JavaDoc value)
282     {
283         currentProperties.add(property);
284         currentValues.add(value);
285     }
286
287     /* (non-Javadoc)
288      * @see org.alfresco.service.cmr.view.Exporter#value(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.namespace.QName, java.util.Collection)
289      */

290     public void value(NodeRef nodeRef, QName property, Collection JavaDoc values)
291     {
292         currentProperties.add(property);
293         currentValues.add(values);
294     }
295     
296     /* (non-Javadoc)
297      * @see org.alfresco.service.cmr.view.Exporter#content(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.namespace.QName, java.io.InputStream)
298      */

299     public void content(NodeRef nodeRef, QName property, InputStream JavaDoc content, ContentData contentData)
300     {
301         try
302         {
303             StringBuffer JavaDoc strValue = new StringBuffer JavaDoc(9 * 1024);
304             if (content != null)
305             {
306                 // emit base64 encoded content
307
InputStream JavaDoc base64content = new Base64.InputStream(content, Base64.ENCODE | Base64.DONT_BREAK_LINES);
308                 byte[] buffer = new byte[9 * 1024];
309                 int read;
310                 while ((read = base64content.read(buffer, 0, buffer.length)) > 0)
311                 {
312                     String JavaDoc characters = new String JavaDoc(buffer, 0, read);
313                     strValue.append(characters);
314                 }
315             }
316             currentProperties.add(property);
317             currentValues.add(strValue.toString());
318         }
319         catch (IOException JavaDoc e)
320         {
321             throw new ExporterException("Failed to process content event - nodeRef " + nodeRef + "; property " + toPrefixString(property));
322         }
323     }
324
325     /* (non-Javadoc)
326      * @see org.alfresco.service.cmr.view.Exporter#startAssoc(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.namespace.QName)
327      */

328     public void startAssoc(NodeRef nodeRef, QName assoc)
329     {
330     }
331
332     /* (non-Javadoc)
333      * @see org.alfresco.service.cmr.view.Exporter#endAssoc(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.namespace.QName)
334      */

335     public void endAssoc(NodeRef nodeRef, QName assoc)
336     {
337     }
338
339     /* (non-Javadoc)
340      * @see org.alfresco.service.cmr.view.Exporter#startAssocs(org.alfresco.service.cmr.repository.NodeRef)
341      */

342     public void startAssocs(NodeRef nodeRef)
343     {
344     }
345
346     /* (non-Javadoc)
347      * @see org.alfresco.service.cmr.view.Exporter#endAssocs(org.alfresco.service.cmr.repository.NodeRef)
348      */

349     public void endAssocs(NodeRef nodeRef)
350     {
351     }
352
353     /* (non-Javadoc)
354      * @see org.alfresco.service.cmr.view.Exporter#startReference(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.namespace.QName)
355      */

356     public void startReference(NodeRef nodeRef, QName childName)
357     {
358     }
359
360     /* (non-Javadoc)
361      * @see org.alfresco.service.cmr.view.Exporter#endReference(org.alfresco.service.cmr.repository.NodeRef)
362      */

363     public void endReference(NodeRef nodeRef)
364     {
365     }
366     
367     /* (non-Javadoc)
368      * @see org.alfresco.service.cmr.view.Exporter#warning(java.lang.String)
369      */

370     public void warning(String JavaDoc warning)
371     {
372     }
373     
374     /* (non-Javadoc)
375      * @see org.alfresco.service.cmr.view.Exporter#end()
376      */

377     public void end()
378     {
379         try
380         {
381             contentHandler.endDocument();
382         }
383         catch (SAXException JavaDoc e)
384         {
385             throw new ExporterException("Failed to process end export event", e);
386         }
387     }
388
389     /**
390      * Get the prefix for the specified URI
391      * @param uri the URI
392      * @return the prefix (or null, if one is not registered)
393      */

394     private String JavaDoc toPrefixString(QName qname)
395     {
396         return qname.toPrefixString(session.getNamespaceResolver());
397     }
398     
399     /**
400      * Get name of Node
401      *
402      * @param nodeRef node reference
403      * @return node name
404      */

405     private QName getNodeName(NodeRef nodeRef)
406     {
407         // establish name of node
408
QName childQName = null;
409         NodeService nodeService = session.getRepositoryImpl().getServiceRegistry().getNodeService();
410         NodeRef rootNode = nodeService.getRootNode(nodeRef.getStoreRef());
411         if (rootNode.equals(nodeRef))
412         {
413             childQName = QName.createQName(JCRNamespace.JCR_URI, "root");
414         }
415         else
416         {
417             Path path = nodeService.getPath(nodeRef);
418             String JavaDoc childName = path.last().getElementString();
419             childQName = QName.createQName(childName);
420             childQName = encodeQName(childQName);
421         }
422         
423         return childQName;
424     }
425     
426     /**
427      * Get single-valued property
428      *
429      * @param value
430      * @return
431      */

432     private String JavaDoc getValue(Object JavaDoc value)
433         throws RepositoryException
434     {
435         String JavaDoc strValue = session.getTypeConverter().convert(String JavaDoc.class, value);
436         return encodeBlanks(strValue);
437     }
438     
439     
440     /**
441      * Get multi-valued property
442      *
443      * @param values
444      * @return
445      */

446     private String JavaDoc getCollectionValue(Collection JavaDoc values)
447     {
448         Collection JavaDoc<String JavaDoc> strValues = session.getTypeConverter().getConverter().convert(String JavaDoc.class, values);
449         StringBuffer JavaDoc buffer = new StringBuffer JavaDoc();
450         int i = 0;
451         for (String JavaDoc strValue : strValues)
452         {
453             buffer.append(encodeBlanks(strValue));
454             i++;
455             if (i < strValues.size())
456             {
457                 buffer.append(" ");
458             }
459         }
460         return buffer.toString();
461     }
462
463     /**
464      * Encode Name for Document View Output
465      *
466      * @param name name to encode
467      * @return encoded name
468      */

469     private QName encodeQName(QName name)
470     {
471         return QName.createQName(name.getNamespaceURI(), ISO9075.encode(name.getLocalName()));
472     }
473
474     /**
475      * Encode blanks in value
476      *
477      * @param value
478      * @return
479      */

480     private String JavaDoc encodeBlanks(String JavaDoc value)
481     {
482         return value.replaceAll(" ", "_x0020_");
483     }
484
485 }
486
Popular Tags