/* * (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; } }