3ddf18fb7764c71a6cda7ac5d64536044eb62601
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / corext / template / TemplateSet.java
1 /*
2  * (c) Copyright IBM Corp. 2000, 2001.
3  * All Rights Reserved.
4  */
5 package net.sourceforge.phpdt.internal.corext.template;
6
7 import java.io.File;
8 import java.io.FileInputStream;
9 import java.io.FileOutputStream;
10 import java.io.IOException;
11 import java.io.InputStream;
12 import java.io.OutputStream;
13 import java.util.ArrayList;
14 import java.util.Arrays;
15 import java.util.Comparator;
16 import java.util.Iterator;
17 import java.util.List;
18
19 import javax.xml.parsers.DocumentBuilder;
20 import javax.xml.parsers.DocumentBuilderFactory;
21 import javax.xml.parsers.ParserConfigurationException;
22
23 import net.sourceforge.phpeclipse.PHPeclipsePlugin;
24
25 import javax.xml.parsers.DocumentBuilder;
26 import javax.xml.parsers.DocumentBuilderFactory;
27 import javax.xml.parsers.ParserConfigurationException;
28 import javax.xml.transform.OutputKeys;
29 import javax.xml.transform.Transformer;
30 import javax.xml.transform.TransformerException;
31 import javax.xml.transform.TransformerFactory;
32 import javax.xml.transform.dom.DOMSource;
33 import javax.xml.transform.stream.StreamResult;
34 import org.eclipse.core.runtime.CoreException;
35 import org.w3c.dom.Attr;
36 import org.w3c.dom.Document;
37 import org.w3c.dom.NamedNodeMap;
38 import org.w3c.dom.Node;
39 import org.w3c.dom.NodeList;
40 import org.w3c.dom.Text;
41 import org.xml.sax.InputSource;
42 import org.xml.sax.SAXException;
43 import org.xml.sax.SAXParseException;
44
45 /**
46  * <code>ObfuscatorIgnoreSet</code> manages a collection of templates and makes them
47  * persistent.
48  */
49 public class TemplateSet {
50
51   private static class TemplateComparator implements Comparator {
52     public int compare(Object arg0, Object arg1) {
53       if (arg0 == arg1)
54         return 0;
55
56       if (arg0 == null)
57         return -1;
58
59       Template template0 = (Template) arg0;
60       Template template1 = (Template) arg1;
61
62       return template0.getName().compareTo(template1.getName());
63     }
64   }
65
66   private static final String TEMPLATE_TAG = "template"; //$NON-NLS-1$
67   private static final String NAME_ATTRIBUTE = "name"; //$NON-NLS-1$
68   private static final String DESCRIPTION_ATTRIBUTE = "description"; //$NON-NLS-1$
69   private static final String CONTEXT_ATTRIBUTE = "context"; //$NON-NLS-1$
70   private static final String ENABLED_ATTRIBUTE = "enabled"; //$NON-NLS-1$
71
72   private List fTemplates = new ArrayList();
73   private Comparator fTemplateComparator = new TemplateComparator();
74   private Template[] fSortedTemplates = new Template[0];
75
76   /**
77    * Convenience method for reading templates from a file.
78    * 
79    * @see #addFromStream(InputStream)
80    */
81   public void addFromFile(File file) throws CoreException {
82     InputStream stream = null;
83
84     try {
85       stream = new FileInputStream(file);
86       addFromStream(stream);
87
88     } catch (IOException e) {
89       throwReadException(e);
90
91     } finally {
92       try {
93         if (stream != null)
94           stream.close();
95       } catch (IOException e) {
96       }
97     }
98   }
99
100   /**
101    * Reads templates from a XML stream and adds them to the template set.
102    */
103   public void addFromStream(InputStream stream) throws CoreException {
104     try {
105       DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
106       DocumentBuilder parser = factory.newDocumentBuilder();
107       Document document = parser.parse(new InputSource(stream));
108       NodeList elements = document.getElementsByTagName(TEMPLATE_TAG);
109
110       int count = elements.getLength();
111       for (int i = 0; i != count; i++) {
112         Node node = elements.item(i);
113         NamedNodeMap attributes = node.getAttributes();
114
115         if (attributes == null)
116           continue;
117
118         String name = getAttributeValue(attributes, NAME_ATTRIBUTE);
119         String description = getAttributeValue(attributes, DESCRIPTION_ATTRIBUTE);
120         String context = getAttributeValue(attributes, CONTEXT_ATTRIBUTE);
121         Node enabledNode = attributes.getNamedItem(ENABLED_ATTRIBUTE);
122
123         if (name == null || description == null || context == null)
124           throw new SAXException(TemplateMessages.getString("TemplateSet.error.missing.attribute")); //$NON-NLS-1$
125
126         boolean enabled = (enabledNode == null) || (enabledNode.getNodeValue().equals("true")); //$NON-NLS-1$
127
128         StringBuffer buffer = new StringBuffer();
129         NodeList children = node.getChildNodes();
130         for (int j = 0; j != children.getLength(); j++) {
131           String value = children.item(j).getNodeValue();
132           if (value != null)
133             buffer.append(value);
134         }
135         String pattern = buffer.toString().trim();
136
137         Template template = new Template(name, description, context, pattern);
138         template.setEnabled(enabled);
139         add(template);
140       }
141
142       sort();
143
144     } catch (ParserConfigurationException e) {
145       throwReadException(e);
146     } catch (IOException e) {
147       throwReadException(e);
148     } catch (SAXParseException e) {
149                         System.out.println("SAXParseException in line:"+e.getLineNumber()+" column:"+e.getColumnNumber());
150       throwReadException(e);
151     } catch (SAXException e) {
152       throwReadException(e);
153     }
154   }
155
156   private String getAttributeValue(NamedNodeMap attributes, String name) {
157     Node node = attributes.getNamedItem(name);
158
159     return node == null ? null : node.getNodeValue();
160   }
161
162   /**
163    * Convenience method for saving to a file.
164    * 
165    * @see #saveToStream(OutputStream)
166    */
167   public void saveToFile(File file) throws CoreException {
168     OutputStream stream = null;
169
170     try {
171       stream = new FileOutputStream(file);
172       saveToStream(stream);
173
174     } catch (IOException e) {
175       throwWriteException(e);
176
177     } finally {
178       try {
179         if (stream != null)
180           stream.close();
181       } catch (IOException e) {
182       }
183     }
184   }
185
186   /**
187    * Saves the template set as XML.
188    */
189   public void saveToStream(OutputStream stream) throws CoreException {
190     try {
191       DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
192       DocumentBuilder builder = factory.newDocumentBuilder();
193       Document document = builder.newDocument();
194
195       Node root = document.createElement("templates"); // $NON-NLS-1$ //$NON-NLS-1$
196       document.appendChild(root);
197
198       for (int i = 0; i != fTemplates.size(); i++) {
199         Template template = (Template) fTemplates.get(i);
200
201         Node node = document.createElement("template"); // $NON-NLS-1$ //$NON-NLS-1$
202         root.appendChild(node);
203
204         NamedNodeMap attributes = node.getAttributes();
205
206         Attr name = document.createAttribute(NAME_ATTRIBUTE);
207         name.setValue(template.getName());
208         attributes.setNamedItem(name);
209
210         Attr description = document.createAttribute(DESCRIPTION_ATTRIBUTE);
211         description.setValue(template.getDescription());
212         attributes.setNamedItem(description);
213
214         Attr context = document.createAttribute(CONTEXT_ATTRIBUTE);
215         context.setValue(template.getContextTypeName());
216         attributes.setNamedItem(context);
217
218         Attr enabled = document.createAttribute(ENABLED_ATTRIBUTE);
219         enabled.setValue(template.isEnabled() ? "true" : "false"); //$NON-NLS-1$ //$NON-NLS-2$
220         attributes.setNamedItem(enabled);
221
222         Text pattern = document.createTextNode(template.getPattern());
223         node.appendChild(pattern);
224       }
225
226       Transformer transformer=TransformerFactory.newInstance().newTransformer();
227           transformer.setOutputProperty(OutputKeys.METHOD, "xml"); //$NON-NLS-1$
228           transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); //$NON-NLS-1$
229           DOMSource source = new DOMSource(document);
230           StreamResult result = new StreamResult(stream);
231
232           transformer.transform(source, result);
233       
234 //      OutputFormat format = new OutputFormat();
235 //      format.setPreserveSpace(true);
236 //      Serializer serializer = SerializerFactory.getSerializerFactory("xml").makeSerializer(stream, format); //$NON-NLS-1$
237 //      serializer.asDOMSerializer().serialize(document);
238
239     } catch (ParserConfigurationException e) {
240       throwWriteException(e);
241     } catch (TransformerException e) {
242                 throwWriteException(e);
243         }
244 //    } catch (IOException e) {
245 //      throwWriteException(e);
246 //    }
247   }
248
249   private static void throwReadException(Throwable t) throws CoreException {
250     PHPeclipsePlugin.log(t);
251     //          IStatus status= new JavaUIStatus(JavaStatusConstants.TEMPLATE_IO_EXCEPTION,
252     //                  ObfuscatorMessages.getString("TemplateSet.error.read"), t); //$NON-NLS-1$
253     //          throw new JavaUIException(status);
254   }
255
256   private static void throwWriteException(Throwable t) throws CoreException {
257     PHPeclipsePlugin.log(t);
258     //          IStatus status= new JavaUIStatus(JavaStatusConstants.TEMPLATE_IO_EXCEPTION,
259     //                  ObfuscatorMessages.getString("TemplateSet.error.write"), t); //$NON-NLS-1$
260     //          throw new JavaUIException(status);
261   }
262
263   /**
264    * Adds a template to the set.
265    */
266   public void add(Template template) {
267     if (exists(template))
268       return; // ignore duplicate
269
270     fTemplates.add(template);
271     sort();
272   }
273
274   private boolean exists(Template template) {
275     for (Iterator iterator = fTemplates.iterator(); iterator.hasNext();) {
276       Template anotherTemplate = (Template) iterator.next();
277
278       if (template.equals(anotherTemplate))
279         return true;
280     }
281
282     return false;
283   }
284
285   /**
286    * Removes a template to the set.
287    */
288   public void remove(Template template) {
289     fTemplates.remove(template);
290     sort();
291   }
292
293   /**
294    * Empties the set.
295    */
296   public void clear() {
297     fTemplates.clear();
298     sort();
299   }
300
301   /**
302    * Returns all templates.
303    */
304   public Template[] getTemplates() {
305     return (Template[]) fTemplates.toArray(new Template[fTemplates.size()]);
306   }
307
308   /**
309    * Returns all templates with a given name.
310    */
311   public Template[] getTemplates(String name) {
312     ArrayList res = new ArrayList();
313     for (Iterator iterator = fTemplates.iterator(); iterator.hasNext();) {
314       Template curr = (Template) iterator.next();
315       if (curr.getName().equals(name)) {
316         res.add(curr);
317       }
318     }
319     return (Template[]) res.toArray(new Template[res.size()]);
320   }
321
322   private void sort() {
323     fSortedTemplates = (Template[]) fTemplates.toArray(new Template[fTemplates.size()]);
324     Arrays.sort(fSortedTemplates, fTemplateComparator);
325   }
326
327 }