001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package org.apache.commons.betwixt.strategy; 018 019 /** 020 * <p>Pluggable strategy determines whether introspection or bind time 021 * typing should be used when finding mappings. 022 * The type of a property is determined at introspection time but 023 * the actual type of the instance can differ at bind time (when the 024 * xml is actually being processed). This strategy is used to set 025 * (at a per-element level) whether the bind or introspection 026 * time type should be used to calculate the mapping to be used. 027 * </p> 028 * <p> 029 * <strong>Note:</strong> this strategy is intentionally course. 030 * Typically, the best approach is to use a custom strategy to set 031 * coursely grained rules (for example: all implemetations of 'IAnimal' 032 * use bind time type mapping) and then dot betwixt files to provide 033 * refinements. 034 * </p> 035 * @since 0.7 036 * @author <a href='http://commons.apache.org'>Apache Commons Team</a>, 037 * <a href='http://www.apache.org'>Apache Software Foundation</a> 038 */ 039 public abstract class MappingDerivationStrategy { 040 041 /** 042 * Implementation that always uses bind time type mapping 043 */ 044 public static final MappingDerivationStrategy USE_BIND_TIME_TYPE 045 = new MappingDerivationStrategy() { 046 public boolean useBindTimeTypeForMapping(Class propertyType, Class singluarPropertyType) { 047 return true; 048 } 049 }; 050 051 /** 052 * Implementation that always uses introspection time type mapping 053 */ 054 public static final MappingDerivationStrategy USE_INTROSPECTION_TIME_TYPE 055 = new MappingDerivationStrategy() { 056 public boolean useBindTimeTypeForMapping(Class propertyType, Class singluarPropertyType) { 057 return false; 058 } 059 }; 060 061 /** 062 * The default Betwixt strategy. 063 */ 064 public static final MappingDerivationStrategy DEFAULT = USE_BIND_TIME_TYPE; 065 066 /** 067 * Should bind time type be used for all elements of the given property type? 068 * @param propertyType <code>Class</code> typing the property, not null 069 * @param singluarPropertyType <code>Class</code> composing the collective 070 * or null if the property is not collective 071 * @return true if bind time type should be used for the mapping 072 */ 073 public abstract boolean useBindTimeTypeForMapping(Class propertyType, Class singluarPropertyType); 074 }