--- /dev/null
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+package net.sourceforge.phpeclipse.obfuscator;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.HashMap;
+import java.util.Iterator;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import net.sourceforge.phpeclipse.PHPeclipsePlugin;
+
+import org.eclipse.core.runtime.CoreException;
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Text;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+/**
+ * <code>ObfuscatorIgnoreSet</code> manages a collection of templates and
+ * makes them persistent.
+ */
+public class ObfuscatorIgnoreSet {
+
+ // private static class TemplateComparator implements Comparator {
+ // public int compare(Object arg0, Object arg1) {
+ // if (arg0 == arg1)
+ // return 0;
+ //
+ // if (arg0 == null)
+ // return -1;
+ //
+ // Template template0= (Template) arg0;
+ // Template template1= (Template) arg1;
+ //
+ // return template0.getName().compareTo(template1.getName());
+ // }
+ // }
+
+ private static final String TEMPLATE_TAG = "ignore"; //$NON-NLS-1$
+
+ // private static final String NAME_ATTRIBUTE= "name"; //$NON-NLS-1$
+ // private static final String DESCRIPTION_ATTRIBUTE= "description";
+ // //$NON-NLS-1$
+ // private static final String CONTEXT_ATTRIBUTE= "context"; //$NON-NLS-1$
+ // private static final String ENABLED_ATTRIBUTE= "enabled"; //$NON-NLS-1$
+
+ // private List fTemplates= new ArrayList();
+ private HashMap fIdentifierMap = new HashMap();
+
+ // private Comparator fTemplateComparator= new TemplateComparator();
+ // private Template[] fSortedTemplates= new Template[0];
+
+ /**
+ * Convenience method for reading templates from a file.
+ *
+ * @see #addFromStream(InputStream)
+ */
+ public void addFromFile(File file) throws CoreException {
+ InputStream stream = null;
+
+ try {
+ stream = new FileInputStream(file);
+ addFromStream(stream);
+
+ } catch (IOException e) {
+ throwReadException(e);
+
+ } finally {
+ try {
+ if (stream != null)
+ stream.close();
+ } catch (IOException e) {
+ }
+ }
+ }
+
+ /**
+ * Reads templates from a XML stream and adds them to the template set.
+ */
+ public void addFromStream(InputStream stream) throws CoreException {
+ try {
+ DocumentBuilderFactory factory = DocumentBuilderFactory
+ .newInstance();
+ DocumentBuilder parser = factory.newDocumentBuilder();
+ Document document = parser.parse(new InputSource(stream));
+ NodeList elements = document.getElementsByTagName(TEMPLATE_TAG);
+
+ int count = elements.getLength();
+ for (int i = 0; i != count; i++) {
+ Node node = elements.item(i);
+ NamedNodeMap attributes = node.getAttributes();
+
+ if (attributes == null)
+ continue;
+
+ // String name= getAttributeValue(attributes, NAME_ATTRIBUTE);
+ // String description= getAttributeValue(attributes,
+ // DESCRIPTION_ATTRIBUTE);
+ // String context= getAttributeValue(attributes,
+ // CONTEXT_ATTRIBUTE);
+ // Node enabledNode= attributes.getNamedItem(ENABLED_ATTRIBUTE);
+
+ // if (name == null || description == null || context == null)
+ // throw new
+ // SAXException(ObfuscatorMessages.getString("TemplateSet.error.missing.attribute"));
+ // //$NON-NLS-1$
+
+ // boolean enabled= true; //(enabledNode == null) ||
+ // (enabledNode.getNodeValue().equals("true")); //$NON-NLS-1$
+
+ StringBuffer buffer = new StringBuffer();
+ NodeList children = node.getChildNodes();
+ for (int j = 0; j != children.getLength(); j++) {
+ String value = children.item(j).getNodeValue();
+ if (value != null)
+ buffer.append(value);
+ }
+ String pattern = buffer.toString().trim();
+ fIdentifierMap.put(pattern, new PHPIdentifier(pattern,
+ PHPIdentifier.VARIABLE));
+ // Template template= new Template(name, description, context,
+ // pattern);
+ // template.setEnabled(enabled);
+ // add(template);
+ }
+
+ // sort();
+
+ } catch (ParserConfigurationException e) {
+ throwReadException(e);
+ } catch (IOException e) {
+ throwReadException(e);
+ } catch (SAXException e) {
+ throwReadException(e);
+ }
+ }
+
+// private String getAttributeValue(NamedNodeMap attributes, String name) {
+// Node node = attributes.getNamedItem(name);
+//
+// return node == null ? null : node.getNodeValue();
+// }
+
+ /**
+ * Convenience method for saving to a file.
+ *
+ * @see #saveToStream(OutputStream)
+ */
+ public void saveToFile(File file) throws CoreException {
+ OutputStream stream = null;
+
+ try {
+ stream = new FileOutputStream(file);
+ saveToStream(stream);
+ } catch (IOException e) {
+ throwWriteException(e);
+
+ } finally {
+ try {
+ if (stream != null)
+ stream.close();
+ } catch (IOException e) {
+ }
+ }
+ }
+
+ /**
+ * Saves the template set as XML.
+ */
+ public void saveToStream(OutputStream stream) throws CoreException {
+ try {
+ DocumentBuilderFactory factory = DocumentBuilderFactory
+ .newInstance();
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ Document document = builder.newDocument();
+
+ Node root = document.createElement("obfuscator"); // $NON-NLS-1$
+ // //$NON-NLS-1$
+ document.appendChild(root);
+ Iterator iter = fIdentifierMap.keySet().iterator();
+ while (iter.hasNext()) {
+ // for (int i= 0; i != fTemplates.size(); i++) {
+ // Template template= (Template) fTemplates.get(i);
+
+ Node node = document.createElement("ignore"); // $NON-NLS-1$
+ // //$NON-NLS-1$
+ root.appendChild(node);
+
+ // NamedNodeMap attributes= node.getAttributes();
+ //
+ // Attr name= document.createAttribute(NAME_ATTRIBUTE);
+ // name.setValue(template.getName());
+ // attributes.setNamedItem(name);
+ //
+ // Attr description=
+ // document.createAttribute(DESCRIPTION_ATTRIBUTE);
+ // description.setValue(template.getDescription());
+ // attributes.setNamedItem(description);
+ //
+ // Attr context= document.createAttribute(CONTEXT_ATTRIBUTE);
+ // context.setValue(template.getContextTypeName());
+ // attributes.setNamedItem(context);
+ //
+ // Attr enabled= document.createAttribute(ENABLED_ATTRIBUTE);
+ // enabled.setValue(template.isEnabled() ? "true" : "false");
+ // //$NON-NLS-1$ //$NON-NLS-2$
+ // attributes.setNamedItem(enabled);
+
+ Text pattern = document.createTextNode((String) iter.next());
+ node.appendChild(pattern);
+ }
+ Transformer transformer = TransformerFactory.newInstance()
+ .newTransformer();
+ transformer.setOutputProperty(OutputKeys.METHOD, "xml"); //$NON-NLS-1$
+ transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); //$NON-NLS-1$
+ DOMSource source = new DOMSource(document);
+ StreamResult result = new StreamResult(stream);
+
+ transformer.transform(source, result);
+
+ } catch (ParserConfigurationException e) {
+ throwWriteException(e);
+ } catch (TransformerException e) {
+ throwWriteException(e);
+ }
+ // OutputFormat format = new OutputFormat();
+ // format.setPreserveSpace(true);
+ // Serializer serializer =
+ // SerializerFactory.getSerializerFactory("xml").makeSerializer(stream,
+ // format); //$NON-NLS-1$
+ // serializer.asDOMSerializer().serialize(document);
+ //
+ // } catch (ParserConfigurationException e) {
+ // throwWriteException(e);
+ // } catch (IOException e) {
+ // throwWriteException(e);
+ // }
+ }
+
+ private static void throwReadException(Throwable t) throws CoreException {
+ PHPeclipsePlugin.log(t);
+ // IStatus status= new
+ // JavaUIStatus(JavaStatusConstants.TEMPLATE_IO_EXCEPTION,
+ // ObfuscatorMessages.getString("TemplateSet.error.read"), t);
+ // //$NON-NLS-1$
+ // throw new JavaUIException(status);
+ }
+
+ private static void throwWriteException(Throwable t) throws CoreException {
+ PHPeclipsePlugin.log(t);
+ // IStatus status= new
+ // JavaUIStatus(JavaStatusConstants.TEMPLATE_IO_EXCEPTION,
+ // ObfuscatorMessages.getString("TemplateSet.error.write"), t);
+ // //$NON-NLS-1$
+ // throw new JavaUIException(status);
+ }
+
+ /**
+ * Adds a template to the set.
+ */
+ // public void add(Template template) {
+ // if (exists(template))
+ // return; // ignore duplicate
+ //
+ // fTemplates.add(template);
+ // sort();
+ // }
+ // private boolean exists(Template template) {
+ // for (Iterator iterator = fTemplates.iterator(); iterator.hasNext();) {
+ // Template anotherTemplate = (Template) iterator.next();
+ //
+ // if (template.equals(anotherTemplate))
+ // return true;
+ // }
+ //
+ // return false;
+ // }
+ //
+ // /**
+ // * Removes a template to the set.
+ // */
+ // public void remove(Template template) {
+ // fTemplates.remove(template);
+ // sort();
+ // }
+ //
+ /**
+ * Empties the set.
+ */
+ public void clear() {
+ fIdentifierMap.clear();
+ // fTemplates.clear();
+ // sort();
+ }
+
+ //
+ // /**
+ // * Returns all templates.
+ // */
+ // public Template[] getTemplates() {
+ // return (Template[]) fTemplates.toArray(new Template[fTemplates.size()]);
+ // }
+
+ /**
+ * Returns all templates with a given name.
+ */
+ // public Template[] getTemplates(String name) {
+ // ArrayList res= new ArrayList();
+ // for (Iterator iterator= fTemplates.iterator(); iterator.hasNext();) {
+ // Template curr= (Template) iterator.next();
+ // if (curr.getName().equals(name)) {
+ // res.add(curr);
+ // }
+ // }
+ // return (Template[]) res.toArray(new Template[res.size()]);
+ // }
+ //
+ // private void sort() {
+ // fSortedTemplates= (Template[]) fTemplates.toArray(new
+ // Template[fTemplates.size()]);
+ // Arrays.sort(fSortedTemplates, fTemplateComparator);
+ // }
+ /**
+ * @return
+ */
+ public HashMap getIdentifierMap() {
+ return fIdentifierMap;
+ }
+
+}