View Javadoc
1   /**
2    * Redistribution and use of this software and associated documentation ("Software"), with or
3    * without modification, are permitted provided that the following conditions are met:
4    *
5    * 1. Redistributions of source code must retain copyright statements and notices. Redistributions
6    * must also contain a copy of this document.
7    *
8    * 2. Redistributions in binary form must reproduce the above copyright notice, this list of
9    * conditions and the following disclaimer in the documentation and/or other materials provided with
10   * the distribution.
11   *
12   * 3. The name "Exolab" must not be used to endorse or promote products derived from this Software
13   * without prior written permission of Intalio, Inc. For written permission, please contact
14   * info@exolab.org.
15   *
16   * 4. Products derived from this Software may not be called "Exolab" nor may "Exolab" appear in
17   * their names without prior written permission of Intalio, Inc. Exolab is a registered trademark of
18   * Intalio, Inc.
19   *
20   * 5. Due credit should be given to the Exolab Project (http://www.exolab.org/).
21   *
22   * THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR
23   * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
24   * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTALIO, INC. OR ITS
25   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27   * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28   * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
29   * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30   *
31   * Copyright 1999 (C) Intalio, Inc. All Rights Reserved.
32   *
33   * $Id$
34   */
35  
36  
37  package org.exolab.castor.dsml;
38  
39  
40  import org.xml.sax.DocumentHandler;
41  import org.xml.sax.SAXException;
42  import org.xml.sax.helpers.AttributeListImpl;
43  
44  
45  /**
46   *
47   *
48   * @author <a href="mailto:arkin@intalio.com">Assaf Arkin</a>
49   * @version $Revision$ $Date: 2006-04-25 15:08:23 -0600 (Tue, 25 Apr 2006) $
50   */
51  public abstract class Producer {
52  
53  
54    protected DocumentHandler _docHandler;
55  
56  
57    private boolean _namespace;
58  
59  
60    private boolean _insideDirectory;
61  
62  
63    private boolean _insideSchema;
64  
65  
66  
67    public Producer(DocumentHandler docHandler, boolean namespace) {
68      _docHandler = docHandler;
69      _namespace = namespace;
70    }
71  
72  
73    public void startDocument() throws SAXException {
74      AttributeListImpl attrList;
75  
76      attrList = new AttributeListImpl();
77      if (_namespace)
78        attrList.addAttribute("xmlns:" + XML.Namespace.PREFIX, "CDATA", XML.Namespace.URI);
79      else
80        attrList.addAttribute("xmlns", "CDATA", XML.Namespace.URI);
81      _docHandler.startElement(prefix(XML.Namespace.ROOT), attrList);
82  
83    }
84  
85  
86    public void endDocument() throws SAXException {
87      leaveDirectory();
88      leaveSchema();
89      _docHandler.endElement(prefix(XML.Namespace.ROOT));
90    }
91  
92  
93    public void produce(ImportDescriptor importDesc) throws SAXException {
94      leaveDirectory();
95      leaveSchema();
96      importDesc.produce(_docHandler);
97    }
98  
99  
100   public void produce(SearchDescriptor searchDesc) throws SAXException {
101     leaveDirectory();
102     leaveSchema();
103     searchDesc.produce(_docHandler);
104   }
105 
106 
107   protected void enterDirectory() throws SAXException {
108     // If not inside directory element, start it
109     if (!_insideDirectory) {
110       _insideDirectory = true;
111       _docHandler.startElement(prefix(XML.Entries.ELEMENT), new AttributeListImpl());
112     }
113   }
114 
115 
116   protected void leaveDirectory() throws SAXException {
117     // If inside directory element, end it
118     if (_insideDirectory) {
119       _insideDirectory = false;
120       _docHandler.endElement(prefix(XML.Entries.ELEMENT));
121     }
122   }
123 
124 
125   protected void enterSchema() throws SAXException {
126     // If not inside schema element, start it
127     if (!_insideSchema) {
128       _insideSchema = true;
129       _docHandler.startElement(prefix(XML.Schema.ELEMENT), new AttributeListImpl());
130     }
131   }
132 
133 
134   protected void leaveSchema() throws SAXException {
135     // If not inside schema element, end it
136     if (_insideSchema) {
137       _insideSchema = false;
138       _docHandler.endElement(prefix(XML.Schema.ELEMENT));
139     }
140   }
141 
142 
143   protected String prefix(String tagName) {
144     if (_namespace)
145       return XML.Namespace.PREFIX + ":" + tagName;
146     return tagName;
147   }
148 
149 
150 }