All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.stratio.deep.cassandra.config.EntityDeepJobConfig Maven / Gradle / Ivy

/*
 * Copyright 2014, Stratio.
 *
 * 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 com.stratio.deep.cassandra.config;

import java.lang.annotation.AnnotationTypeMismatchException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.conf.Configuration;

import com.stratio.deep.cassandra.extractor.CassandraEntityExtractor;
import com.stratio.deep.commons.annotations.DeepEntity;
import com.stratio.deep.commons.entity.Cell;
import com.stratio.deep.commons.entity.IDeepType;
import com.stratio.deep.commons.exception.DeepGenericException;
import com.stratio.deep.commons.exception.DeepIOException;
import com.stratio.deep.commons.exception.DeepNoSuchFieldException;
import com.stratio.deep.commons.utils.AnnotationUtils;
import com.stratio.deep.commons.utils.Utils;

/**
 * Class containing the appropiate configuration for a CassandraEntityRDD.
 * 

* Remember to call {@link #initialize()} after having configured all the * properties. * * @author Luca Rosellini */ public final class EntityDeepJobConfig extends CassandraDeepJobConfig { private static final long serialVersionUID = 4490719746563473495L; private Map mapDBNameToEntityName; /** * {@inheritDoc} */ @Override public CassandraDeepJobConfig initialize() { super.initialize(); Map tmpMap = new HashMap<>(); Field[] deepFields = AnnotationUtils.filterDeepFields(entityClass); for (Field f : deepFields) { String dbName = AnnotationUtils.deepFieldName(f); String beanFieldName = f.getName(); tmpMap.put(dbName, beanFieldName); } mapDBNameToEntityName = Collections.unmodifiableMap(tmpMap); return this; } public Configuration getHadoopConfiguration() { return null; } /** * Public constructor. Constructs a job object with the specified entity class. * * @param entityClass IDeepType entity Class object * // * @param isWriteConfig boolean specifing if the constructed object is suitable for writes. */ public EntityDeepJobConfig(Class entityClass) { super(entityClass); this.setExtractorImplClass(CassandraEntityExtractor.class); } public EntityDeepJobConfig(Class entityClass, boolean isWriteConfig) { this(entityClass); this.isWriteConfig = isWriteConfig; this.createTableOnWrite = isWriteConfig; } /* (non-Javadoc) * @see IDeepJobConfig#validate() */ @Override public void validate() { if (entityClass == null) { throw new IllegalArgumentException("testentity class cannot be null"); } if (!entityClass.isAnnotationPresent(DeepEntity.class)) { throw new AnnotationTypeMismatchException(null, entityClass.getCanonicalName()); } super.validate(); /* let's validate fieldNames in @DeepField annotations */ Field[] deepFields = AnnotationUtils.filterDeepFields(entityClass); Map colDefs = super.columnDefinitions(); /* colDefs is null if table does not exist. I.E. this configuration will be used as an output configuration object, and the output table is dynamically created */ if (colDefs == null) { return; } for (Field field : deepFields) { String annotationFieldName = AnnotationUtils.deepFieldName(field); if (!colDefs.containsKey(annotationFieldName)) { throw new DeepNoSuchFieldException("Unknown column name \'" + annotationFieldName + "\' specified for" + " field " + entityClass.getCanonicalName() + "#" + field.getName() + ". Please, " + "make sure the field name you specify in @DeepField annotation matches _exactly_ the column " + "name " + "in the database"); } } } /** * Given an instance of the generic object mapped to this configurtion object, * sets the instance property whose name is the name specified by dbName. * Since the provided dbName is the name of the field in the database, we first try * to resolve the property name using the fieldName property of the DeepField annotation. * If we don't find any property whose DeepField.fieldName.equals(dbName) we fallback to the * name of the Java property. * * @param instance instance object. * @param dbName name of the field as known by the data store. * @param value value to set in the property field of the provided instance object. */ public void setInstancePropertyFromDbName(T instance, String dbName, Object value) { Map cfs = columnDefinitions(); Cell metadataCell = cfs.get(dbName); String f = mapDBNameToEntityName.get(dbName); if (StringUtils.isEmpty(f)) { // DB column is not mapped in the testentity return; } try { Method setter = Utils.findSetter(f, entityClass, value.getClass()); setter.invoke(instance, value); } catch (DeepIOException e) { Utils.setFieldWithReflection(instance, f, value); } catch (Exception e1) { throw new DeepGenericException(e1); } } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy