| //------------------------------------------------------------------------------ |
| // Copyright (c) 2005, 2006 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 implementation |
| //------------------------------------------------------------------------------ |
| package org.eclipse.epf.dataexchange.util; |
| |
| import java.io.File; |
| import java.util.StringTokenizer; |
| import java.util.regex.Matcher; |
| import java.util.regex.Pattern; |
| |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.epf.common.utils.FileUtil; |
| |
| |
| |
| /** |
| * content processer to fix references and copy resources to the target library location |
| * |
| * @author Jinhua Xi |
| * @since 1.0 |
| * |
| */ |
| public class ContentProcessor { |
| |
| protected static final Pattern p_src_ref = Pattern.compile("src\\s*=\\s*\"(.*?)\"", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$ |
| // protected static final Pattern p_link_ref = Pattern.compile("<a\\s+?([^>]*)>(.*?)</a>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$ |
| protected static final Pattern p_href_ref = Pattern.compile("href\\s*=\\s*\"(.*?)\"", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$ |
| |
| IResourceHandler handler; |
| ILogger logger; |
| |
| public ContentProcessor(IResourceHandler handler, ILogger logger) { |
| this.handler = handler; |
| this.logger = logger; |
| } |
| |
| /** |
| * resovle the resource string for the given owner. |
| * The owner is a method element, but can be either from uma model or xml model. |
| * @param owner |
| * @param source |
| * @return |
| */ |
| public String resolveResourceFiles(Object owner, String source) { |
| StringBuffer sb = new StringBuffer(); |
| |
| try |
| { |
| // process images and other src resources |
| Matcher m = p_src_ref.matcher(source); |
| while ( m.find() ) |
| { |
| String url = m.group(1); |
| String new_url = processResourceUrl(owner, url); |
| String replacement = "src=\"" + new_url + "\""; //$NON-NLS-1$ //$NON-NLS-2$ |
| m.appendReplacement(sb, fixReplacementStr(replacement)); |
| } |
| m.appendTail(sb); |
| |
| // process hrefs |
| m = p_href_ref.matcher(sb.toString()); |
| sb.setLength(0); |
| |
| while ( m.find() ) |
| { |
| String url = m.group(1); |
| String mark = ""; //$NON-NLS-1$ |
| |
| int index = url.indexOf("#"); //$NON-NLS-1$ |
| if ( index >= 0 ) |
| { |
| mark = url.substring(index); |
| url = url.substring(0, index); |
| } |
| |
| if ( url.length() > 0 ) |
| { |
| url = processResourceUrl(owner, url); |
| } |
| m.appendReplacement(sb, fixReplacementStr("href=\"" + url + mark + "\"")); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| m.appendTail(sb); |
| |
| // anything else ??? |
| |
| } |
| catch (Exception ex) |
| { |
| ex.printStackTrace(); |
| } |
| |
| //System.out.println(sb); |
| |
| return sb.toString(); |
| } |
| |
| private String fixReplacementStr(String str) { |
| // escape the $ since it's treated as a group sequence |
| try { |
| int index = str.indexOf("$"); //$NON-NLS-1$ |
| if ( index < 0 ) { |
| return str; |
| } |
| |
| StringBuffer b = new StringBuffer(); |
| int start = 0; |
| while ( index >= 0 ) { |
| b.append(str.substring(start, index)).append("\\$"); //$NON-NLS-1$ |
| start = index+1; |
| index = str.indexOf("$", start); //$NON-NLS-1$ |
| } |
| |
| b.append(str.substring(start)); |
| |
| return b.toString(); |
| |
| } catch (RuntimeException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } |
| |
| return str; |
| } |
| |
| protected boolean isFileUrl(String url) |
| { |
| //System.out.println("Processing image url [" + url + "]"); |
| if ( url == null || url.length() == 0 |
| || url.startsWith("http") //$NON-NLS-1$ |
| || url.startsWith("www.") //$NON-NLS-1$ |
| || url.startsWith("mailto:") //$NON-NLS-1$ |
| || url.toLowerCase().indexOf("javascript:") >=0 ) //$NON-NLS-1$ |
| { |
| return false; |
| } |
| |
| return true; |
| } |
| |
| protected boolean isValidFilePath(File f) { |
| return (f != null) && f.exists(); |
| } |
| |
| |
| public String processResourceUrl(Object owner, String url) |
| { |
| if ( !isFileUrl(url) ) |
| { |
| return url; |
| } |
| |
| UrlInfo info = null; |
| try { |
| info = handler.resolveFileUrl(owner, url); |
| } catch (Exception ex) { |
| logger.logWarning("error processing url '" + url + "'"); //$NON-NLS-1$ //$NON-NLS-2$ |
| return url; |
| } |
| |
| if ( info.sourceFile == null || info.targetFile == null ) { |
| return url; |
| } |
| |
| if ( info.sourceFile.isFile() && info.sourceFile.exists() ) |
| { |
| FileUtil.copyFile(info.sourceFile, info.targetFile); |
| |
| // return the fixed target url if the file exists |
| // and is copied over to the target location |
| return info.targetUrl; |
| } |
| |
| return url; |
| } |
| |
| |
| /** |
| * process the url, update the result buffer, and return the associated element if any |
| * @param source teh url text string |
| * @param result StringBuffer |
| * @return MethodElement the linked element or null |
| */ |
| protected void processUrlText(Object owner, String source) |
| { |
| Matcher m = p_href_ref.matcher(source); |
| if ( m.find() ) |
| { |
| String url = m.group(1); |
| if ( url.toLowerCase().indexOf("javaScript:") < 0 ) //$NON-NLS-1$ |
| { |
| int index = url.indexOf("#"); //$NON-NLS-1$ |
| if ( index >= 0 ) |
| { |
| url = url.substring(0, index); |
| } |
| |
| if ( url.length() > 0 ) |
| { |
| processResourceUrl(owner, url); |
| } |
| } |
| } |
| } |
| |
| public void copyResource(String sourceFile) { |
| handler.copyResource(sourceFile); |
| } |
| |
| public void copyResource(String sourceFile, EObject obj, org.eclipse.epf.uma.MethodPlugin umaPlugin) { |
| handler.copyResource(sourceFile, obj, umaPlugin); |
| } |
| |
| /** |
| * this method is for resolveing the template attachment resources |
| * The resource is a set of urls seperated by | |
| * |
| * @param owner |
| * @param urls |
| * @return String |
| */ |
| public String resolveAttachmentResources(Object owner, String urls) { |
| if ( (urls != null) && urls.length() != 0 ) { |
| StringBuffer buffer = new StringBuffer(); |
| StringTokenizer st = new StringTokenizer(urls, "|"); // this is hardcoded somehow //$NON-NLS-1$ |
| while (st.hasMoreTokens() ) { |
| String url = st.nextToken(); |
| url = processResourceUrl(owner, url); |
| if ( buffer.length() > 0 ) { |
| buffer.append("|"); //$NON-NLS-1$ |
| } |
| buffer.append(url); |
| } |
| |
| return buffer.toString(); |
| } |
| |
| return ""; //$NON-NLS-1$ |
| } |
| } |