/* | |
* Copyright (c) 2004 - 2012 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); | |
} | |
} | |
} |