/**
 * <copyright>
 * 
 * Copyright (c) 2010 Thales Corporate Services S.A.S.
 * 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:
 * Thales Corporate Services S.A.S - initial API and implementation
 * 
 * </copyright>
 */

package org.eclipse.egf.portfolio.type;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.egf.core.producer.InvocationException;
import org.eclipse.egf.ftask.producer.context.ITaskProductionContext;
import org.eclipse.egf.ftask.producer.invocation.ITaskProduction;

/**
 * @author Benoit Langlois
 * 
 */
public class StringReplaceTask implements ITaskProduction {

  private static final String FIRST_VALUE = "first"; //$NON-NLS-1$
  private static final String ALL_VALUE = "all"; //$NON-NLS-1$

  public void preExecute(ITaskProductionContext productionContext, IProgressMonitor monitor) throws InvocationException {
    // Nothing to do
  }

  public void doExecute(ITaskProductionContext productionContext, IProgressMonitor monitor) throws InvocationException {
    String result = new String();
    String inValue = productionContext.getInputValue(TypeConstants.IN_VALUE_NAME_CONTRACT, String.class);
    String occurrenceValue = productionContext.getInputValue(TypeConstants.OCCURRENCE_NAME_CONTRACT, String.class);
    String regexValue = productionContext.getInputValue(TypeConstants.REGEX_NAME_CONTRACT, String.class);
    String replacementValue = productionContext.getInputValue(TypeConstants.REPLACEMENT_NAME_CONTRACT, String.class);

    if (inValue != null && inValue.trim().length() > 0) {
      result = inValue;
      if (occurrenceValue.equals(FIRST_VALUE)) {
        result = inValue.replaceFirst(regexValue, replacementValue);
      } else {
        if (occurrenceValue.equals(ALL_VALUE)) {
          result = inValue.replaceAll(regexValue, replacementValue);
        }
      }
    }

    productionContext.setOutputValue(TypeConstants.OUT_VALUE_NAME_CONTRACT, result);

  }

  public void postExecute(ITaskProductionContext productionContext, IProgressMonitor monitor) throws InvocationException {
    // Nothing to do
  }

}
