X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/obfuscator/ObfuscatorIgnoreSet.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/obfuscator/ObfuscatorIgnoreSet.java new file mode 100644 index 0000000..402a8bd --- /dev/null +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/obfuscator/ObfuscatorIgnoreSet.java @@ -0,0 +1,349 @@ +/* + * (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; + +/** + * ObfuscatorIgnoreSet 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; + } + +}