/**
 * Copyright (c) 2004 - 2011 Eike Stepper (Berlin, Germany) 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:
 *    Eike Stepper - initial API and implementation
 */
package org.eclipse.emf.cdo.server.internal.db.mapping;

import org.eclipse.emf.cdo.server.db.mapping.ITypeMapping;
import org.eclipse.emf.cdo.server.internal.db.messages.Messages;

import org.eclipse.net4j.db.DBType;

import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EPackage;

import java.text.MessageFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author Stefan Winkler
 */
public class TypeMappingUtil
{
  private static final Pattern FACTORY_DESCRIPTOR_PATTERN = Pattern.compile("(.+);(.+)#(.+)->(.+)");

  /**
   * Utility class - no instantiation.
   */
  private TypeMappingUtil()
  {
  }

  public static ITypeMapping.Descriptor createDescriptor(String id, EClassifier eClassifier, DBType dbType)
  {
    String factoryType = createFactoryType(id, eClassifier, dbType);
    return new TypeMappingDescriptor(id, factoryType, eClassifier, dbType);
  }

  public static String createFactoryType(String id, EClassifier eClassifier, DBType dbType)
  {
    StringBuilder builder = new StringBuilder();

    // id
    builder.append(id);
    builder.append(";");

    // classifier
    builder.append(eClassifier.getEPackage().getNsURI());
    builder.append("#");
    builder.append(eClassifier.getName());
    builder.append("->");

    // dbtype
    builder.append(dbType.getKeyword());

    return builder.toString();
  }

  public static ITypeMapping.Descriptor descriptorFromFactoryType(String factoryType) throws FactoryTypeParserException
  {
    Matcher matcher = FACTORY_DESCRIPTOR_PATTERN.matcher(factoryType);

    if (!matcher.matches())
    {
      throw new FactoryTypeParserException(MessageFormat.format(Messages.getString("FactoryTypeParserException.1"),
          factoryType));
    }

    String id = matcher.group(1);
    String packageUri = matcher.group(2);
    String classifierName = matcher.group(3);
    String typeKeyword = matcher.group(4);

    EPackage ePackage = EPackage.Registry.INSTANCE.getEPackage(packageUri);
    if (ePackage == null)
    {
      throw new FactoryTypeParserException(MessageFormat.format(Messages.getString("FactoryTypeParserException.2"),
          packageUri, factoryType));
    }

    EClassifier eClassifier = ePackage.getEClassifier(classifierName);
    if (eClassifier == null)
    {
      throw new FactoryTypeParserException(MessageFormat.format(Messages.getString("FactoryTypeParserException.3"),
          classifierName, factoryType));
    }

    DBType dbType = DBType.getTypeByKeyword(typeKeyword);
    if (dbType == null)
    {
      throw new FactoryTypeParserException(MessageFormat.format(Messages.getString("FactoryTypeParserException.4"),
          dbType, factoryType));
    }

    return new TypeMappingDescriptor(id, factoryType, eClassifier, dbType);
  }

  public static class FactoryTypeParserException extends Exception
  {
    private static final long serialVersionUID = 1L;

    public FactoryTypeParserException(String desc)
    {
      super(desc);
    }
  }
}
