/*******************************************************************************
 * Copyright (c) 2001, 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.j2ee.model.internal.validation;


import java.util.List;

import org.eclipse.jst.j2ee.ejb.CommonRelationshipRole;
import org.eclipse.jst.j2ee.internal.EjbModuleExtensionHelper;


/**
 * This class is a copy of org.eclipse.jst.j2ee.internal.ejb.codegen.helpers.RoleHelper.
 * org.eclipse.jst.j2ee.internal.ejb.codegen.helpers.RoleHelper cannot be used
 * directly by the EJB Validator (to calculate role method names) because
 * it uses classes which are not used by WebSphere. Until the long-term
 * fix can be put in, this class will be used.
 */
public class RoleHelper {
	static final String KEY_GETTER_NAME_PATTERN = "get{0}Key";//$NON-NLS-1$
	static final String KEY_SETTER_NAME_PATTERN = "privateSet{0}Key";//$NON-NLS-1$
	static final String LINK_GETTER_NAME_PATTERN = "get{0}Link";//$NON-NLS-1$
	static final String ADD_NAME_PREFIX = "add";//$NON-NLS-1$
	static final String GETTER_NAME_PREFIX = "get"; //$NON-NLS-1$
	static final String REMOVE_NAME_PREFIX = "remove";//$NON-NLS-1$
	static final String SECONDARY_ADD_NAME_PREFIX = "secondaryAdd";//$NON-NLS-1$
	static final String SECONDARY_REMOVE_NAME_PREFIX = "secondaryRemove";//$NON-NLS-1$
	static final String SECONDARY_SETTER_NAME_PREFIX = "secondarySet";//$NON-NLS-1$
	static final String SETTER_NAME_PREFIX = "set"; //$NON-NLS-1$
	protected EjbModuleExtensionHelper modHelper;
/**
 * RoleHelper constructor comment.
 */
public RoleHelper() {
	super();
}
/**
 * Collect the names of the methods that were added to the bean class
 * for a particular role.
 */
public static void collectRoleMethodNames(CommonRelationshipRole aRole, List aList) {
	if (aRole == null || aList == null) return;
	aList.add(getLinkGetterName(aRole));
	if (aRole.isForward()) {
		aList.add(getKeyGetterName(aRole));
		aList.add(getKeySetterName(aRole));
	}
	if (aRole.isNavigable())
		aList.add(getGetterName(aRole));
	if (!isMany(aRole)) {
		try {
			if(aRole.getOppositeAsCommonRole() != null) {
				if (!aRole.getOppositeAsCommonRole().isKey())
					aList.add(getSetterName(aRole));
				if (!aRole.isKey()) {
					aList.add(getSecondarySetterName(aRole));
				}
			}
		}
		catch(NullPointerException exc) {
			// If a NullPointerException is caught, assume that the role isn't a key.
			// Just continue.
		}
	} else {
		aList.add(getSecondaryAddName(aRole));
		aList.add(getSecondaryRemoveName(aRole));
		if (aRole.isNavigable()) {
			try {
				if(aRole.getOppositeAsCommonRole() != null) {
					if (!aRole.getOppositeAsCommonRole().isKey()) {
						aList.add(getAddName(aRole));
					}
				}
			}
			catch(NullPointerException exc) {
				// If a NullPointerException is thrown, just assume that the opposite isn't a key.
			}
			if (aRole.getOppositeAsCommonRole() != null && !aRole.getOppositeAsCommonRole().isRequired())
				aList.add(getRemoveName(aRole));
		}
	}
}
/**
 * Return aString where the first character is uppercased.
 */
public static final String firstAsUppercase(String aString) {
	if (aString != null && aString.length() >0 && !Character.isUpperCase(aString.charAt(0))) {
		char[] chars = aString.toCharArray();
		chars[0] = Character.toUpperCase(chars[0]);
		return String.valueOf(chars);
	}
	return aString;
}
protected static String format(String pattern, String[] replacements) {
	return java.text.MessageFormat.format(pattern, (Object[])replacements);
}
/**
 * Return the add method name for @aRole.
 * It will be in the format "add{aRole name}".
 * For example, a role named "department" would return
 * addDepartment.
 */
public static String getAddName(CommonRelationshipRole aRole) {
	if (aRole == null) return null;
	String arg = firstAsUppercase(aRole.getName());
	return ADD_NAME_PREFIX + arg;
}
/**
 * Return the getter method name for @aRole.
 * It will be in the format "get{aRole name}".
 * For example, a role named "department" would return
 * getDepartment.
 */
public static String getGetterName(CommonRelationshipRole aRole) {
	if (aRole == null) return null;
	String arg = firstAsUppercase(aRole.getName());
	return GETTER_NAME_PREFIX + arg;
}
/**
 * Return the key getter method name for @aRole.
 * It will be in the format "get{aRole name}Key".
 * For example, a role named "department" would return
 * getDepartmentKey.
 */
public static String getKeyGetterName(CommonRelationshipRole aRole) {
	if (aRole == null) return null;
	String arg = firstAsUppercase(aRole.getName());
	return format(KEY_GETTER_NAME_PATTERN, new String[]{arg});
}
/**
 * Return the key setter method name for @aRole.
 * It will be in the format "privateSet{aRole name}Key".
 * For example, a role named "department" would return
 * privateSetDepartmentKey.
 */
public static String getKeySetterName(CommonRelationshipRole aRole) {
	if (aRole == null) return null;
	String arg = firstAsUppercase(aRole.getName());
	return format(KEY_SETTER_NAME_PATTERN, new String[]{arg});
}
/**
 * Return the link getter method name for @aRole.
 * It will be in the format "get{aRole name}Link".
 * For example, a role named "department" would return
 * getDepartmentLink.
 */
public static String getLinkGetterName(CommonRelationshipRole aRole) {
	if (aRole == null) return null;
	String arg = firstAsUppercase(aRole.getName());
	return format(LINK_GETTER_NAME_PATTERN, new String[]{arg});
}
/**
 * Return the remove method name for @aRole.
 * It will be in the format "remove{aRole name}".
 * For example, a role named "department" would return
 * removeDepartment.
 */
public static String getRemoveName(CommonRelationshipRole aRole) {
	if (aRole == null) return null;
	String arg = firstAsUppercase(aRole.getName());
	return REMOVE_NAME_PREFIX + arg;
}
/**
 * Return the secondary add method name for @aRole.
 * It will be in the format "secondaryAdd{aRole name}".
 * For example, a role named "department" would return
 * secondaryAddDepartment.
 */
public static String getSecondaryAddName(CommonRelationshipRole aRole) {
	if (aRole == null) return null;
	String arg = firstAsUppercase(aRole.getName());
	return SECONDARY_ADD_NAME_PREFIX + arg;
}
/**
 * Return the secondary remove method name for @aRole.
 * It will be in the format "secondaryRemove{aRole name}".
 * For example, a role named "department" would return
 * secondaryRemoveDepartment.
 */
public static String getSecondaryRemoveName(CommonRelationshipRole aRole) {
	if (aRole == null) return null;
	String arg = firstAsUppercase(aRole.getName());
	return SECONDARY_REMOVE_NAME_PREFIX + arg;
}
/**
 * Return the secondary setter method name for @aRole.
 * It will be in the format "secondarySet{aRole name}".
 * For example, a role named "department" would return
 * secondarySetDepartment.
 */
public static String getSecondarySetterName(CommonRelationshipRole aRole) {
	if (aRole == null) return null;
	String arg = firstAsUppercase(aRole.getName());
	return SECONDARY_SETTER_NAME_PREFIX + arg;
}
/**
 * Return the setter method name for @aRole.
 * It will be in the format "set{aRole name}".
 * For example, a role named "department" would return
 * setDepartment.
 */
public static String getSetterName(CommonRelationshipRole aRole) {
	if (aRole == null) return null;
	String arg = firstAsUppercase(aRole.getName());
	return SETTER_NAME_PREFIX + arg;
}
/**
 * Return true if the multiplicity is many.
 */
public static boolean isMany(CommonRelationshipRole aRole) {
	return aRole != null && aRole.isMany();
}
}
