/*******************************************************************************
 * Copyright (c) 2000, 2004 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
 *******************************************************************************/

package org.eclipse.jst.ws.internal.consumption.common;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jst.ws.internal.common.J2EEUtils;


/**
* This class contains useful methods for working with Server plugin functions
*/
public final class MappingUtils
{

  // Copyright
  public static final String copyright = "(c) Copyright IBM Corporation 2000, 2002.";

  private static final String DEFAULT_SERVICE_EXT = "Service.wsdl";
  private static final String DEFAULT_BINDING_EXT = "Binding.wsdl";
  private static final String DEFAULT_V4_SERVICE_EXT = "-service.wsdl";
  private static final String DEFAULT_V4_BINDING_EXT = "-binding.wsdl";
  private static final String WSDL_EXTENSION = ".wsdl";
  private static final String WSDL_FOLDER = "wsdl";
  public static final String DEFAULT_SKELETON_PACKAGENAME = "service";

  /**
  * Returns the WSDL folder path
  * @param project the project
  */
  public static IPath getWSDLFolderPath (IProject project, String componentName)
  {
    IPath wsdlFolder=null;
//  	IPath webModuleServerRoot = ResourceUtils.getWebModuleServerRoot( project ).getFullPath();
  	IPath webModuleServerRoot = J2EEUtils.getWebContentPath(project);
  	if (webModuleServerRoot != null )
  		wsdlFolder = webModuleServerRoot.append(WSDL_FOLDER);
    return wsdlFolder;
  }
    

   /**
  * Returns the base name based on WSDL file name
  * @param wsdlName WSDL file name
  */
  public static String getBaseName (String wsdlLocation )
  {
  	String wsdlName=wsdlLocation;
  	
  	int index = wsdlLocation.lastIndexOf('/');
    if (index!= -1) {
      wsdlName = wsdlLocation.substring(index+1,wsdlName.length());
    }
    
    String baseName=wsdlName;
    if ( wsdlName.endsWith(DEFAULT_SERVICE_EXT) ) {
      baseName = wsdlName.substring(0,(wsdlName.length() - DEFAULT_SERVICE_EXT.length()));
    } else if ( wsdlName.toLowerCase().endsWith(DEFAULT_V4_SERVICE_EXT) ) {
      baseName = wsdlName.substring(0,(wsdlName.length() - DEFAULT_V4_SERVICE_EXT.length()));
    } else if (wsdlName.endsWith(DEFAULT_BINDING_EXT)) {
      baseName = wsdlName.substring(0,(wsdlName.length()-DEFAULT_BINDING_EXT.length()));
    } else if (wsdlName.toLowerCase().endsWith(DEFAULT_V4_BINDING_EXT)) {
      baseName = wsdlName.substring(0,(wsdlName.length()-DEFAULT_V4_BINDING_EXT.length()));
    } else if (wsdlName.toLowerCase().endsWith(WSDL_EXTENSION)) {
    	baseName = wsdlName.substring(0,(wsdlName.length() - WSDL_EXTENSION.length()));
    } else {
      // no recognizable suffix, just remove extension, if any
      int index4 = baseName.lastIndexOf('.');
      if (index4!=-1)
        baseName = baseName.substring(0, index4);
    }
    return baseName;
  }

}
