[ 
https://issues.apache.org/jira/browse/SQOOP-1604?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14194134#comment-14194134
 ] 

Jarek Jarcec Cecho commented on SQOOP-1604:
-------------------------------------------

Wouldn't we had to do that change anyway though as we've changed the class that 
we're expecting? I don't immediately see how base classes would help in this 
case as we would have to replace the {{EmptyLinkConfig}} with 
{{RealLinkConfig}} anyway because we've started using the Link and we need to 
read values from it, right?

The base class would help only for workflow parts when we don't use the Link 
and we wouldn't have the {{EmptyLinkConfig}}, but we would have the base class 
there instead. But in that case, we would achieve the same if we would use the 
generic {{Object}} (=I don't care) in such workflow parts, right?

> Base/ Marker class for Config and Configuration
> -----------------------------------------------
>
>                 Key: SQOOP-1604
>                 URL: https://issues.apache.org/jira/browse/SQOOP-1604
>             Project: Sqoop
>          Issue Type: Bug
>    Affects Versions: 1.99.4
>            Reporter: Veena Basavaraj
>            Assignee: Veena Basavaraj
>             Fix For: 2.0.0
>
>
> HDFS and Hbase connector code did not seem to have much functionality to in 
> the initializer and destroyer, so provide a common empty class that connector 
> developers can use if they have nothing to override.
> It is pretty much difficult to have a empty initializer and destroyer classes 
> with the current Initializer api
> I wish our Initializer api was more like the below that enforced the 
> typesafety much harder. 
> {code}
> /**
>  * This allows connector to define initialization work for execution,
>  * for example, context configuration.
>  */
> public abstract class Initializer<L extends LinkConfiguration, J extends 
> JobConfiguration> {
>   /**
>    * Initialize new submission based on given configuration properties. Any
>    * needed temporary values might be saved to context object and they will be
>    * promoted to all other part of the workflow automatically.
>    *
>    * @param context Initializer context object
>    * @param linkConfiguration link configuration object
>    * @param jobConfiguration job configuration object for the FROM and TO
>    *        In case of the FROM initializer this will represent the FROM job 
> configuration
>    *        In case of the TO initializer this will represent the TO job 
> configuration
>    */
>   public abstract void initialize(InitializerContext context, L 
> linkConfiguration,
>       J jobConfiguration);
> {code}
> We could have a base marker classes LinkConfiguration / JobConfiguration, 
> FromJobConfiguration, ToConfiguration instead of the annotations, this way 
> code like this would be more type safe rather than using object that can lead 
> to a lot of class cast exception at runt time
> {code}
>     // link config for the FROM part of the job
>     Object fromLinkConfig = 
> ClassUtils.instantiate(fromConnector.getLinkConfigurationClass());
>     
> ConfigUtils.fromConfigs(fromConnection.getConnectorLinkConfig().getConfigs(), 
> fromLinkConfig);
>     // link config for the TO part of the job
>     Object toLinkConfig = 
> ClassUtils.instantiate(toConnector.getLinkConfigurationClass());
>     
> ConfigUtils.fromConfigs(toConnection.getConnectorLinkConfig().getConfigs(), 
> toLinkConfig);
>  public Object getConnectorLinkConfig(Direction type) {
>     switch(type) {
>       case FROM:
>         return fromConnectorLinkConfig;
>       case TO:
>         return toConnectorLinkConfig;
>       default:
>         throw new SqoopException(DirectionError.DIRECTION_0000, "Direction: " 
> + type);
>     }
>   }
>   public void setConnectorLinkConfig(Direction type, Object config) {
>     switch(type) {
>       case FROM:
>         fromConnectorLinkConfig = config;
>         break;
>       case TO:
>         toConnectorLinkConfig = config;
>         break;
>       default:
>         throw new SqoopException(DirectionError.DIRECTION_0000, "Direction: " 
> + type);
>     }
>   }
>   /**
>    * All configuration objects
>    */
>   Object fromConnectorLinkConfig;
>   Object toConnectorLinkConfig;
>   Object fromConfig;
>   Object toConfig;
>   Object d
>  
> {code}
> and instead of generic Class, we could have typed Class
> before
> {code}
>   /**
>    * @return Get link configuration group class
>    */
>   @SuppressWarnings("rawtypes")
>   public abstract Class getLinkConfigurationClass();
> {code}
> after
> {code}
>  /**
>    * @return Get link configuration group class
>    */
>   public abstract LinkConfiguration getLinkConfigurationClass();
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to