Package org.eclipse.jst.pagedesigner.utils

Source Code of org.eclipse.jst.pagedesigner.utils.PreviewUtil

/*******************************************************************************
* Copyright (c) 2006 Sybase, Inc. 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:
*     Sybase, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.pagedesigner.utils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.MissingResourceException;
import java.util.PropertyResourceBundle;
import java.util.Map.Entry;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.content.IContentDescription;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.core.runtime.content.IContentTypeManager;
import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
import org.eclipse.jst.jsf.common.ui.internal.utils.PathUtil;
import org.eclipse.jst.pagedesigner.PDPlugin;
import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
import org.eclipse.ui.IEditorInput;
import org.w3c.dom.Attr;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
* @author mengbo
*/
public class PreviewUtil {
  /** Create the logger for this class */
  private static Logger _log = PDPlugin.getLogger(PreviewUtil.class);

  /** line separator */
  public static final String LINE_SEPARATOR = System
      .getProperty("line.separator"); //$NON-NLS-1$

  /** web root path */
  private final static String WEBROOT_PATH = null;

  /** the file being previewed */
  private static IFile CURRENT_FILE = null;

  /** the property bundel */
  private static PropertyResourceBundle BUNDLE = null;

  /** the property bundel map used for loadbundle preview action */
  private static Map BUNDLE_MAP = null;

  /** the variable name used for loadbundel preview action */
  private static String VAR = null;

  /** key is prefix value is uri */
  private static Map _taglibMap = new HashMap();


  /**
   * @return the current bundle
   */
  public static final PropertyResourceBundle getBUNDLE() {
        return BUNDLE;
    }

    /**
     * @param bundle
     */
    public static final void setBUNDLE(PropertyResourceBundle bundle) {
        BUNDLE = bundle;
    }

    /**
     * @return the current bundle map
     */
    public static final Map getBUNDLE_MAP() {
        return BUNDLE_MAP;
    }

    /**
     * @param bundle_map
     */
    public static final void setBUNDLE_MAP(Map bundle_map) {
        BUNDLE_MAP = bundle_map;
    }

    /**
     * @return the current variable
     */
    public static final String getVAR() {
        return VAR;
    }

    /**
     * @param var
     */
    public static final void setVAR(String var) {
        VAR = var;
    }

    /**
   * @return Returns the _taglibMap.
   */
  public static Map getTaglibMap() {
    return _taglibMap;
  }

  /**
   * @param map
   *            The _taglibMap to set.
   */
  public static void setTaglibMap(Map map) {
    _taglibMap = map;
  }

  /**
   * Get tag attribute string from attribute map
   *
   * @param map
   *            tag attribute map
   * @return the attribute string
   */
  public static String getAttributesAsString(Map map) {
    return getAttributesAsString(map, true);
  }

  /**
   * Get file path from uri
   *
   * @param uri
   *            taglib uri
   * @return the path as a string
   */
  public static String getPathFromURI(String uri) {
    if (uri == null) {
      return uri;
    }

    if (uri.startsWith(IFileFolderConstants.PATH_SEPARATOR)) {
      return PreviewUtil.WEBROOT_PATH + uri;
    }
    IFile curFile = PreviewUtil.CURRENT_FILE;
    if (curFile != null) {
      IContainer con = curFile.getParent();
      if (con != null) {
        IPath path = con.getLocation();
        if (path != null) {
          String aPath = path.toString() + File.separator + uri;

          aPath = aPath.replace('/', File.separatorChar);
          aPath = aPath.replace('\\', File.separatorChar);
          if (aPath.endsWith(File.separator)) {
            aPath += File.separator;
          }
          File file = new File(aPath);
          if (file.exists()) {
            return aPath;
          }
                    return uri;
        }
      }
    }
    return null;
  }

  /**
   * Get bundle value for expression
   *
   * @param attrValue
   *            expression
   * @return the value
   */
  public static String getValueOFEP(String attrValue) {
    if (attrValue != null) {
      if (attrValue.startsWith("#{")) //$NON-NLS-1$
      {
        String key, value = null;
        int i = attrValue.lastIndexOf("."); //$NON-NLS-1$
        if (i > 0) {
          key = attrValue.substring(i + 1, attrValue.length() - 1)
              .trim();
          String bundleVariable = attrValue.substring(2, i).trim();
          if (BUNDLE_MAP == null) {
            return attrValue;
          }
          PropertyResourceBundle bundle = (PropertyResourceBundle) BUNDLE_MAP
              .get(bundleVariable);

          if (bundle != null) {
            try {
              value = bundle.getString(key);
              if (value != null) {
                return value;
              }
                            return attrValue;
            } catch (MissingResourceException e1) {
              // "Error in resource bundle processing:"
              _log.info("PreviewUtil.Error.0", e1); //$NON-NLS-1$
            }
          }
        }
      }
    }
    return attrValue;
  }

  /**
   * Get tag attribute string from attribute map
   *
   * @param map
   *            tag attribute map
   * @param flag
   *            state
   * @return the attributes as a single string
   */
  private static String getAttributesAsString(Map<String, String> map, boolean flag) {
    if (map == null) {
      return null;
    }

    StringBuffer stringbuffer = new StringBuffer();
    for (Iterator<Entry<String, String>> e = map.entrySet().iterator(); e.hasNext();) {
        Map.Entry<String,String> entry = e.next();
      String attrName = entry.getKey();
      String attrValue = entry.getValue();
      attrValue = getValueOFEP(attrValue);
      if (ICSSPropertyID.ATTR_SRC.equalsIgnoreCase(attrName)
          || ICSSPropertyID.ATTR_HREF.equalsIgnoreCase(attrName)
          || ICSSPropertyID.ATTR_URI.equalsIgnoreCase(attrName)
          || ICSSPropertyID.ATTR_BINDING.equalsIgnoreCase(attrName)
          || ICSSPropertyID.ATTR_PAGE.equalsIgnoreCase(attrName)) {
        if (PreviewUtil.WEBROOT_PATH != null && attrValue != null
            && !attrValue.startsWith("http") //$NON-NLS-1$
            && !attrValue.startsWith("file")) //$NON-NLS-1$
        {
          attrValue = getPathFromURI(attrValue);
        }
      }
      if (attrValue != null) {
        stringbuffer.append(" ").append(attrName); //$NON-NLS-1$
        if (attrValue.indexOf(34) != -1) {
          StringBuffer stringbuffer1 = new StringBuffer();
          for (int j = 0; j < attrValue.length(); j++) {
            char c = attrValue.charAt(j);
            if (c != '"') {
              stringbuffer1.append(c);
            }
          }

          attrValue = stringbuffer1.toString();
        }
        if (attrValue != null && attrValue.startsWith("#{")) //$NON-NLS-1$
        {
          attrValue = ""; //$NON-NLS-1$
        }
        stringbuffer.append("=\"").append(attrValue).append('"'); //$NON-NLS-1$
      }
    }
    // System.out.println("BBBB:" +stringbuffer.toString());

    return stringbuffer.toString();
  }

  /**
   * Change NamedNodeMap type to Map type
   *
   * @param nodeMap
   *            NamedNodeMap type
   * @return the map
   */
  public static Map getAttributeMap(NamedNodeMap nodeMap) {
    if (nodeMap != null) {
      int len = nodeMap.getLength();
      HashMap map = new HashMap();
      for (int i = 0; i < len; i++) {
        Node node = nodeMap.item(i);
        String name = node.getNodeName();
        String value = node.getNodeValue();
        if (name != null
            && !name.trim().equalsIgnoreCase("") && value != null) //$NON-NLS-1$
        {
          map.put(name, value);
        }
      }
      return map;
    }
    return null;
  }

  /**
   * @param result
   * @param editorInput
   * @return the file
   */
  public static File toFile(StringBuffer result, IEditorInput editorInput) {
    try {
      File file = File.createTempFile("previewtmp", ".html"); //$NON-NLS-1$ //$NON-NLS-2$
      if (!file.exists()) {
        file.createNewFile();
      }
     
      //fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=202613 kindly contributed by Eiji Morito.
      IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
      IContentType contentType = contentTypeManager.getContentType("org.eclipse.wst.html.core.htmlsource"); //$NON-NLS-1$
      IContentDescription contentDescription = contentType.getDescriptionFor(new StringReader(result.toString()), null);
      String charset = contentDescription.getCharset();
     
      if (charset == null || !Charset.isSupported(charset)) {
        charset = ResourcesPlugin.getEncoding();
        if (charset == null)
          charset = "UTF-8"; //$NON-NLS-1$
      }

      FileOutputStream fos = new FileOutputStream(file);
      PrintStream ps = new PrintStream(fos, true, charset);
      ps.print(result.toString());
      ps.close();
      fos.close();
      return file;
    } catch (IOException e) {
      // "Error in file open:"
      _log.info("PreviewUtil.Error.3", e); //$NON-NLS-1$
      return null;
    }
  }


  /**
   * do preivew on Node recursively translate escape char for Node and Node's
   * child translate relative path for Node and Node's child
   *
   * @param node
   *            root node that will be previewed
   */
  public static void previewNode(Node node) {
    if (node == null) {
      return;
    }
    NodeList nodeList = node.getChildNodes();
    if (nodeList == null) {
      return;
    }
    NamedNodeMap attrMap = node.getAttributes();

    if (attrMap != null) {
      for (int i = 0, n = attrMap.getLength(); i < n; i++) {
        Node attrNode = attrMap.item(i);
        if (attrNode instanceof Attr) {
          Attr attr = (Attr) attrNode;
          String value = attr.getNodeValue();
          value = getValueOFEP(value);
          //Bug 307801 - [WPE] WPE does not render Images with URL encoding in their path in the preview pane
          try {
            value = URLDecoder.decode(value, "UTF-8"); //$NON-NLS-1$
          } catch(UnsupportedEncodingException uee) {
            //we tried to decode using recommended encoding, we failed
          } catch(IllegalArgumentException iae) {
            //we tried to decode using recommended encoding, we failed
          }
          value = PathUtil.convertToAbsolutePath(value, null);
          attr.setNodeValue(value);
        }
      }
    }
    for (int i = 0, n = nodeList.getLength(); i < n; i++) {
      previewNode(nodeList.item(i));
    }
  }

  // /**
  // * handle escape attebute of tag
  // *
  // * @param node
  // * @return
  // */
  // public static boolean escapeFoeNode(Node node)
  // {
  // if (node == null)
  // {
  // return false;
  // }
  // NamedNodeMap attrMap = node.getAttributes();
  // if (attrMap != null)
  // {
  // for (int i = 0, n = attrMap.getLength(); i < n; i++)
  // {
  // Node attrNode = attrMap.item(i);
  // if (attrNode != null && attrNode instanceof Attr)
  // {
  // if ("escape".equalsIgnoreCase(attrNode.getNodeName())
  // && "true".equalsIgnoreCase(attrNode.getNodeValue()))
  // {
  // return true;
  // }
  // }
  // }
  // }
  // return false;
  // }

}
TOP

Related Classes of org.eclipse.jst.pagedesigner.utils.PreviewUtil

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.