/** * Copyright (c) 2010 Kenn Hussey and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: * Kenn Hussey - Initial API and implementation */ package org.eclipse.emf.oda.ecore.impl; import java.util.Map; import org.eclipse.datatools.connectivity.oda.IParameterMetaData; import org.eclipse.datatools.connectivity.oda.OdaException; import org.eclipse.datatools.connectivity.oda.spec.QuerySpecification.ParameterIdentifier; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EcorePackage; /** * Implementation of IParameterMetaData for EMF ODA runtime driver. */ public class ParameterMetaData implements IParameterMetaData { public static final String TARGET_PARAMETER_NAME = "@target"; //$NON-NLS-1$ public static final String DEFAULT_PARAMETER_VALUE = "<unset>"; //$NON-NLS-1$ protected final Query query; protected ParameterMetaData(Query query) { super(); this.query = query; } public int getParameterCount() throws OdaException { return query.getSpecification().getParameterValues().size(); } public int getParameterMode(int param) throws OdaException { // only input parameters supported return IParameterMetaData.parameterModeIn; } public String getParameterName(int param) throws OdaException { if (param < 1 || param > getParameterCount()) { throw new OdaException(new IllegalArgumentException(String.valueOf(param))); } for (Map.Entry<ParameterIdentifier, ? > entry : query.getSpecification().getParameterValues().entrySet()) { ParameterIdentifier identifier = entry.getKey(); if (identifier.hasId() && identifier.getParameterId().equals(param)) { return identifier.getParameterName(); } } throw new OdaException(new IllegalArgumentException(String.valueOf(param))); } public Object getParameterDefaultValue(String name) throws OdaException { Object defaultValue = getParameterClassifier(name).getDefaultValue(); return defaultValue == null ? DEFAULT_PARAMETER_VALUE : String.valueOf(defaultValue); } protected EClassifier getParameterClassifier(String name) throws OdaException { if (TARGET_PARAMETER_NAME.equals(name)) { return EcorePackage.Literals.EOBJECT; } else { Map<String, EClassifier> variables = query.getVariables(); if (!variables.isEmpty()) { EClassifier classifier = variables.get(name); if (classifier != null) { return classifier; } } return EcorePackage.Literals.EJAVA_OBJECT; } } /** * Returns the data provider specific type for the specified parameter. * @param param 1-based index of the parameter * @return the native data type of the parameter * @throws OdaException if data source error occurs */ protected EClassifier getParameterClassifier(int param) throws OdaException { return getParameterClassifier(getParameterName(param)); } public int getParameterType(int param) throws OdaException { return DataTypes.getType(getParameterClassifier(param)); } public String getParameterTypeName(int param) throws OdaException { return DataTypes.getTypeName(getParameterClassifier(param)); } public int getPrecision(int param) throws OdaException { return DataTypes.getPrecision(getParameterClassifier(param)); } public int getScale(int param) throws OdaException { return DataTypes.getScale(getParameterClassifier(param)); } public int isNullable(int param) throws OdaException { switch (DataTypes.isNullable(getParameterClassifier(param))) { case DataTypes.noNulls: return IParameterMetaData.parameterNoNulls; case DataTypes.nullable: return IParameterMetaData.parameterNullable; default: return IParameterMetaData.parameterNullableUnknown; } } }