blob: 967c4a7c738f114a22a0c780dc0c0db9eff4c265 [file] [log] [blame]
/*
* Copyright (c) 2016, 2019 Eike Stepper (Loehne, 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;
import org.eclipse.emf.cdo.common.model.EMFUtil;
import org.eclipse.emf.cdo.server.internal.db.bundle.OM;
import org.eclipse.emf.ecore.EAnnotation;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;
/**
* @author Kai Schlamp
* @see DBAnnotation
*/
public final class DBIndexAnnotation
{
public static final String SOURCE_URI = "http://www.eclipse.org/CDO/DBIndex";
public static final String FEATURES = "features";
private DBIndexAnnotation()
{
}
public static Set<List<EStructuralFeature>> getIndices(EClass eClass, EStructuralFeature[] allPersistentFeatures)
{
Set<List<EStructuralFeature>> indices = new HashSet<>();
for (EAnnotation annotation : EMFUtil.getAnnotations(eClass, SOURCE_URI))
{
List<EStructuralFeature> features = new ArrayList<>();
String featureNames = annotation.getDetails().get(FEATURES);
if (featureNames != null && featureNames.length() != 0)
{
StringTokenizer tokenizer = new StringTokenizer(featureNames, ",");
while (tokenizer.hasMoreTokens())
{
String featureName = tokenizer.nextToken().trim();
if (featureName.length() != 0)
{
EStructuralFeature feature = getPersistentFeature(featureName, allPersistentFeatures);
if (feature == null)
{
OM.LOG.warn("Feature '" + featureName + "' not found in class '" + eClass.getName() + "' in package '" + eClass.getEPackage().getNsURI() + "'");
continue;
}
features.add(feature);
}
}
}
else
{
for (EObject reference : annotation.getReferences())
{
if (reference instanceof EStructuralFeature)
{
EStructuralFeature feature = (EStructuralFeature)reference;
if (!isPersistentFeature(feature, allPersistentFeatures))
{
OM.LOG.warn("Feature '" + feature.getName() + "' is not a persistent feature of class '" + eClass.getName() + "' in package '"
+ eClass.getEPackage().getNsURI() + "'");
continue;
}
features.add(feature);
}
else
{
OM.LOG.warn("Reference '" + reference + "' is not a feature");
}
}
}
int size = features.size();
if (size > 0)
{
if (size > 1)
{
for (EStructuralFeature feature : features)
{
if (feature.isMany())
{
OM.LOG.warn("Many-valued feature '" + feature.getName() + "' not allowed in composed index on class '" + eClass.getName() + "' in package '"
+ eClass.getEPackage().getNsURI() + "'");
continue;
}
}
}
indices.add(features);
}
}
for (EStructuralFeature feature : allPersistentFeatures)
{
if (feature.getEAnnotation(SOURCE_URI) != null)
{
indices.add(Collections.singletonList(feature));
}
}
return indices;
}
private static EStructuralFeature getPersistentFeature(String featureName, EStructuralFeature[] allPersistentFeatures)
{
for (int i = 0; i < allPersistentFeatures.length; i++)
{
EStructuralFeature feature = allPersistentFeatures[i];
if (feature.getName().equals(featureName))
{
return feature;
}
}
return null;
}
private static boolean isPersistentFeature(EStructuralFeature feature, EStructuralFeature[] allPersistentFeatures)
{
for (int i = 0; i < allPersistentFeatures.length; i++)
{
if (allPersistentFeatures[i] == feature)
{
return true;
}
}
return false;
}
}