/*
 * Copyright 2010 Red Hat, Inc. and/or its affiliates.
 *
 * Licensed 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.drools.eclipse.flow.common.datatype.impl;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.drools.eclipse.flow.common.datatype.DataTypeRegistry;
import org.drools.core.process.core.datatype.DataTypeFactory;

/**
 * Default implementation of a datatype registry.
 */
public class DataTypeRegistryImpl implements DataTypeRegistry {

    private Map<Class<?>, DataTypeInfo> dataTypes = new HashMap<Class<?>, DataTypeRegistryImpl.DataTypeInfo>();
    
    public Set<IDataTypeInfo> getDataTypes() {
        return new HashSet<IDataTypeInfo>(dataTypes.values());
    }

    public void registerDataType(Class<?> type, DataTypeFactory dataTypeFactory, String name, Class<?> valueEditorClass,
            Class<?> dataTypeEditorClass) {
        if (dataTypeFactory == null) {
            throw new NullPointerException("Data type factory may not be null");
        }
        if (name == null) {
            throw new NullPointerException("Name may not be null");
        }
        if (valueEditorClass == null) {
            throw new NullPointerException("valueEditorClass may not be null");
        }
        if (dataTypeEditorClass == null) {
            throw new NullPointerException("dataTypeEditorClass may not be null");
        }
        dataTypes.put(type, new DataTypeInfo(
            type, dataTypeFactory, name, valueEditorClass, dataTypeEditorClass));
    }
    
    public IDataTypeInfo getDataTypeInfo(Class<?> type) {
        IDataTypeInfo dataTypeInfo = dataTypes.get(type);
        if (dataTypeInfo == null) {
            throw new IllegalArgumentException("Cannot find data type info with type " + type);
        }
        return dataTypeInfo;
    }
    
    public class DataTypeInfo implements IDataTypeInfo {
        private Class<?> type;
        private DataTypeFactory dataTypeFactory;
        private String name;
        private Class<?> valueEditorClass;
        private Class<?> dataTypeEditorClass;
        private DataTypeInfo(Class<?> type, DataTypeFactory dataTypeFactory, String name,
                Class<?> valueEditorClass, Class<?> dataTypeEditorClass) {
            this.type = type;
            this.dataTypeFactory = dataTypeFactory;
            this.name = name;
            this.valueEditorClass = valueEditorClass;
            this.dataTypeEditorClass = dataTypeEditorClass;
        }
        public Class<?> getType() {
            return type;
        }
        public DataTypeFactory getDataTypeFactory() {
            return dataTypeFactory;
        }
        public String getName() {
            return name;
        }
        public Class<?> getValueEditorClass() {
            return valueEditorClass;
        }
        public Class<?> getDataTypeEditorClass() {
            return dataTypeEditorClass;
        }
    }
}
