> + > +import com.google.common.base.Function; > +import com.google.common.base.Supplier; > + > +/** > + * @author Jeremy Daggett > + */ > +@Singleton > +public class RegionToCDNEndpoint implements Function<Object, URI> { > + > + private final Supplier<Map<String, Supplier<URI>>> endpointsSupplier; > + > + @Inject > + public RegionToCDNEndpoint(@ApiVersion final String apiVersion, final > RegionIdToURISupplier.Factory factory) { > + this.endpointsSupplier = > factory.createForApiTypeAndVersion(ServiceType.OBJECT_CDN, apiVersion); > + }
@jdaggett I completely understand that having to create two contexts is not ideal. Let's put things in order, so we can pick the right approach: The requirement is to support "object-storage" and "rax:object-cdn" (and no other service types). In order to support both, you have to let the users choose the service type they want to use somehow. I can only think about three ways to do this: * Allowing to dynamically specify it at runtime. To do this, the factory method should be modified [as I explained in the original email](http://markmail.org/message/d6knfqeyoslmuyk6). It would look like this: ```java CDNApi api = cloudFilesApi.cdnApiInRegionAndServiceType(region, serviceType); ``` * If configuration has to be dynamic, but can't be a parameter, then it must be done "somewhere" in the execution environment (that is, the context). This is the approach discussed in this PR. * If you don't want to pass the service type parameter dynamically and also don't want to configure it in the context, you could have two factory methods, one for each service type: ```java CDNApi api = cloudFilesApi.cdnApiInRegionForObjectStorage(region); CDNApi api = cloudFilesApi.cdnApiInRegionForRaxCDN(region); ``` In approach 1 and 2, a validation could be performed and failure would happen at runtime (which is not ideal), and in the third approach, you have one method for each service type, which seems confusing. All three approaches have pros and cons, but all three **meet the requirements**. Personally, I'd go for approach 1, and pass the service type tot he factory method, as I suggested in the initial email. I think we shouldn't hardcode it, as it **would not meet the requirements to support both**. IMHO it is worse to leave the PR as-is, leaving users without the possibility to use "object-storage", than implementing one of the three suggested approaches. Furthermore, if we merge this as-is, how long will it take until we support the "object-storage" service type? Can we put a date on that? IMHO if we know, right now, that the PR does not meet the requirements, and already know three approaches that could fix that (with their pros and cons), we should go for one of them now, otherwise we are just introducing more (unnecessary) technical debt to the project. --- Reply to this email directly or view it on GitHub: https://github.com/jclouds/jclouds-labs-openstack/pull/79/files#r10143888