/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you under the Apache License, Version 2.0 (the
 *  "License"); you may not use this file except in compliance
 *  with the License.  You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing,
 *  software distributed under the License is distributed on an
 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *  KIND, either express or implied.  See the License for the
 *  specific language governing permissions and limitations
 *  under the License.
 *
 */

package org.apache.openaz.xacml.admin.converters;

import java.util.Locale;

import org.apache.openaz.xacml.api.Identifier;
import org.apache.openaz.xacml.std.IdentifierImpl;
import com.vaadin.data.util.converter.Converter;


public class IdentifierConverter implements Converter<Object, Identifier> {
	private static final long serialVersionUID = 1L;

	@Override
	public Identifier convertToModel(Object value,
			Class<? extends Identifier> targetType, Locale locale)
			throws Converter.ConversionException {
		return new IdentifierImpl(value.toString());
	}

	@Override
	public Object convertToPresentation(Identifier value,
			Class<? extends Object> targetType, Locale locale)
			throws Converter.ConversionException {
		if (targetType.isInstance(String.class) ||
			targetType.getName().equals(String.class.getName())) {
			return value.stringValue();
		}
		return null;
	}

	@Override
	public Class<Identifier> getModelType() {
		return Identifier.class;
	}

	@Override
	public Class<Object> getPresentationType() {
		return Object.class;
	}

}
