/*******************************************************************************
 * Copyright (c) 2010 Oracle 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:
 *    Oracle Corporation - initial API and implementation and/or initial documentation
 *******************************************************************************/

package org.eclipse.jst.jsf.common.metadata.internal;

import org.eclipse.core.resources.IProject;

/**
 * Implementation of {@link IMetaDataModelContext}
 *
 */
public class MetaDataModelContext implements IMetaDataModelContext {

	private final IProject 	_project;
	private final String 	_domainId;
	private final String 	_modelId;

	/**
	 * @param project
	 * @param domainId
	 * @param modelId
	 */
	public MetaDataModelContext(final IProject project, final String domainId, final String modelId) {
		_project 	= project;
		_domainId 	= domainId;
		_modelId 	= fixJSPURIIfNecessary(modelId);  //major hack carried forward from ModelKeyDescriptor!
	}
	
	//this is a workaround for issue where jsp "uri" may upper or lower cased
	private String fixJSPURIIfNecessary(final String tempuri) {
		if (tempuri != null && tempuri.equals("jsp11")) //$NON-NLS-1$
			return tempuri.toUpperCase();
		return tempuri;
	}
	
	public Object getAdapter(Class adapter) {
		if (adapter == ModelKeyDescriptor.class)
			return new ModelKeyDescriptor(_project, _domainId, _modelId);
		if (adapter == IProject.class)
			return _project;
		return null;
	}

//	/**
//	 * @return project
//	 */
//	public IProject getProject() {
//		return _project;
//	}

	public String getDomainId() {
		return _domainId;
	}

	public String getModelIdentifier() {
		return _modelId;
	}
	
	@Override
	public String toString() {
		final StringBuffer buf = new StringBuffer();
		if (_project != null) {
			buf.append(_project.getName()).append(":"); //$NON-NLS-1$
		}
		buf.append(getDomainId()).append(":"); //$NON-NLS-1$
		buf.append(getModelIdentifier()).append(":"); //$NON-NLS-1$
		return buf.toString();
	}

}
