/**
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* @author Gabriel Roldan
*/
package org.geowebcache.diskquota.bdb;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.sleepycat.persist.model.ClassMetadata;
import com.sleepycat.persist.model.DeleteAction;
import com.sleepycat.persist.model.EntityModel;
import com.sleepycat.persist.model.FieldMetadata;
import com.sleepycat.persist.model.PrimaryKeyMetadata;
import com.sleepycat.persist.model.Relationship;
import com.sleepycat.persist.model.SecondaryKeyMetadata;
public class ClassMetadataBuilder {
private Class entityClass;
private PrimaryKeyMetadata primaryKey;
private List<SecondaryKeyMetadata> secondaryKeys = new ArrayList<SecondaryKeyMetadata>();
public void entity(Class type) {
this.entityClass = type;
}
public void primaryKey(String field, String sequence) {
Field pkField = getField(field);
primaryKey = new PrimaryKeyMetadata(pkField.getName(), pkField.getType().getName(),
entityClass.getName(), sequence);
}
public void secondaryKey(String field, String keyName, Relationship relationship,
Class relatedEntity, DeleteAction deleteAction) {
Field skField = getField(field);
secondaryKeys.add(new SecondaryKeyMetadata(skField.getName(), entityClass.getName(),
entityClass.getName(), skField.getType().getName(), keyName, relationship,
relatedEntity != null ? relatedEntity.getName() : null, deleteAction));
}
private Field getField(String lookup) {
List<FieldMetadata> fields = new ArrayList<FieldMetadata>();
for (Field field : entityClass.getDeclaredFields()) {
if (field.getName().equals(lookup)) {
return field;
}
}
throw new IllegalArgumentException("Field " + lookup + " not found in " + entityClass);
}
public ClassMetadata build() throws ClassNotFoundException {
Class type = EntityModel.classForName(entityClass.getName());
// check it's a valid type
if (type.isEnum() || type.isInterface() || type.isPrimitive()) {
throw new IllegalArgumentException(
"Enumerations, interfaces or primitive types cannot be entities: "
+ type.getName());
}
// setup the fields
List<FieldMetadata> fields = new ArrayList<FieldMetadata>();
for (Field field : type.getDeclaredFields()) {
int modifiers = field.getModifiers();
// skip non persistent fields
if (Modifier.isStatic(modifiers) || Modifier.isTransient(modifiers)) {
continue;
}
// grab the field
fields.add(new FieldMetadata(field.getName(), field.getType().getName(), type.getName()));
}
// create the class metadata
Map<String, SecondaryKeyMetadata> secondaryKeyMap = new HashMap<String, SecondaryKeyMetadata>();
if (secondaryKeys != null) {
for (SecondaryKeyMetadata metadata : secondaryKeys) {
secondaryKeyMap.put(metadata.getName(), metadata);
}
}
ClassMetadata classMetadata = new ClassMetadata(type.getName(), 0, null, true, primaryKey,
secondaryKeyMap, null, fields);
primaryKey = null;
secondaryKeys.clear();
entityClass = null;
return classMetadata;
}
}