Package org.eclipse.wst.xml.core.internal.commentelement.impl

Source Code of org.eclipse.wst.xml.core.internal.commentelement.impl.CommentElementConfiguration

/*******************************************************************************
* Copyright (c) 2001, 2010 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*     IBM Corporation - initial API and implementation
*     Jens Lukowski/Innoopract - initial renaming/restructuring
*    
*******************************************************************************/
package org.eclipse.wst.xml.core.internal.commentelement.impl;



import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.InvalidRegistryObjectException;
import org.eclipse.wst.xml.core.internal.Logger;
import org.eclipse.wst.xml.core.internal.commentelement.CommentElementAdapter;
import org.eclipse.wst.xml.core.internal.commentelement.CommentElementHandler;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
import org.w3c.dom.Document;
import org.w3c.dom.Element;


/**
*/
public class CommentElementConfiguration {
  private Map fAttributes = null;
  private boolean fCustom;
  private IConfigurationElement fElement = null;

  private boolean fEmpty;
  private CommentElementHandler fHandler = null;
  private String fID = null;
  private boolean fJSPComment;
  private String[] fPrefix = null;
  private boolean fXMLComment;

  CommentElementConfiguration(IConfigurationElement element) {
    super();
    fElement = element;
    fCustom = "handler-custom".equalsIgnoreCase(element.getName()); //$NON-NLS-1$

    fillAttributes(element);

    fXMLComment = fJSPComment = false;
    String commentType = getProperty("commenttype"); //$NON-NLS-1$
    if ("xml".equalsIgnoreCase(commentType)) { //$NON-NLS-1$
      fXMLComment = true;
    } else if ("jsp".equalsIgnoreCase(commentType)) { //$NON-NLS-1$
      fJSPComment = true;
    } else if ("both".equalsIgnoreCase(commentType)) { //$NON-NLS-1$
      fXMLComment = fJSPComment = true;
    }
    String empty = getProperty("isempty"); //$NON-NLS-1$
    fEmpty = Boolean.valueOf(empty).booleanValue(); //$NON-NLS-1$
  }

  public boolean acceptJSPComment() {
    return fJSPComment;
  }

  public boolean acceptXMLComment() {
    return fXMLComment;
  }

  public Element createElement(Document document, String data, boolean isJSPTag) {
    IDOMElement element = (IDOMElement) getHandler().createElement(document, data, isJSPTag);
    if (element != null) {
      CommentElementAdapter adapter = (CommentElementAdapter) element.getAdapterFor(CommentElementAdapter.class);
      if (adapter != null) {
        adapter.setConfiguration(this);
      }
    }
    return element;
  }

  private void fillAttributes(IConfigurationElement element) {
    if (fAttributes == null) {
      fAttributes = new HashMap();
    } else {
      fAttributes.clear();
    }
    String[] names = element.getAttributeNames();
    if (names == null) {
      return;
    }
    int length = names.length;
    for (int i = 0; i < length; i++) {
      String name = names[i];
      fAttributes.put(name.toLowerCase(), element.getAttribute(name));
    }
  }

  public CommentElementHandler getHandler() {
    if (fHandler == null) {
      if (fElement != null) {
        try {
          if (isCustom()) {
            fHandler = (CommentElementHandler) fElement.createExecutableExtension("class"); //$NON-NLS-1$
          } else {
            String elementName = getProperty("elementname"); //$NON-NLS-1$
            if (elementName != null) {
              fHandler = new BasicCommentElementHandler(elementName, fEmpty);
            }
          }
          //          ((AbstractCommentElementHandler)fHandler).setElementPrefix(fElement.getAttribute("prefix"));
        } catch (Exception e) {
          // catch and log (and ignore) ANY exception created
          // by executable extension.
          Logger.logException(e);
          fHandler = null;
        }
      }
      if (fHandler == null) {
        fHandler = new CommentElementHandler() {
          public Element createElement(Document document, String data, boolean isJSPTag) {
            return null;
          }

          public String generateEndTagContent(IDOMElement element) {
            return null;
          }

          public String generateStartTagContent(IDOMElement element) {
            return null;
          }

// removed in RC2, ro removed "unused" error/warning
//          public String getElementPrefix() {
//            return null;
//          }

          public boolean isCommentElement(IDOMElement element) {
            return false;
          }

          public boolean isEmpty() {
            return false;
          }
        };
      }
    }
    return fHandler;
  }

  public String getHandlerID() {
    if (fID == null) {
      fID = getProperty("id"); //$NON-NLS-1$
      if (fID == null) {
        if (isCustom()) {
          fID = getProperty("class"); //$NON-NLS-1$       
        } else {
          StringBuffer buf = new StringBuffer();
          buf.append(fElement.getDeclaringExtension().getNamespace());
          buf.append('.');
          buf.append(getProperty("elementname")); //$NON-NLS-1$
          fID = buf.toString();
        }
      }
    }
    return fID;
  }


  public String[] getPrefix() {
    if (fPrefix == null) {
      if (fElement != null) {
        if (isCustom()) { // custom
          IConfigurationElement[] prefixes = fElement.getChildren("startwith"); //$NON-NLS-1$ 
          if (prefixes != null) {
            List prefixValues = new ArrayList(prefixes.length);
            for (int i = 0; i < prefixes.length; i++) {
              String prefix = prefixes[i].getAttribute("prefix"); //$NON-NLS-1$
              if (prefix != null) {
                prefixValues.add(prefix);
              }
              else {
                try {
                  Logger.log(Logger.WARNING, "misconfigured comment element in" + fElement.getContributor().getName(), new IllegalArgumentException("startwith")); //$NON-NLS-1$ //$NON-NLS-2$
                }
                catch (InvalidRegistryObjectException e) {
                  // stale bundle?
                }
              }
            }
            if (!prefixValues.isEmpty()) {
              fPrefix = (String[]) prefixValues.toArray(new String[prefixValues.size()]);
            }
          }
        } else { // basic
          String name = getProperty("elementname"); //$NON-NLS-1$
          if (name != null) {
            if (isEmpty()) {
              fPrefix = new String[1];
              fPrefix[0] = name;
            } else {
              fPrefix = new String[2];
              fPrefix[0] = name;
              fPrefix[1] = '/' + name;
            }
          }
        }
      }
    }
    if (fPrefix == null) {
      fPrefix = new String[0];
    }
    return fPrefix;
  }

  public String getProperty(String name) {
    return (fAttributes != null) ? (String) fAttributes.get(name) : null;
  }

  private boolean isCustom() {
    return fCustom;
  }

  private boolean isEmpty() {
    return fEmpty;
  }

  void setupCommentElement(IDOMElement element) {
    element.setCommentTag(true);
    CommentElementAdapter adapter = new CommentElementAdapter(false, fHandler);
    adapter.setConfiguration(this);
    element.addAdapter(adapter);
  }
}
TOP

Related Classes of org.eclipse.wst.xml.core.internal.commentelement.impl.CommentElementConfiguration

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.