/** * Copyright (C) 2013 Red Hat, Inc. (jdcasey@commonjava.org) * * 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 org.commonjava.cartographer; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.databind.Module; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import org.commonjava.cartographer.INTERNAL.graph.agg.DefaultGraphAggregator; import org.commonjava.cartographer.INTERNAL.graph.discover.DiscovererImpl; import org.commonjava.cartographer.INTERNAL.graph.discover.SourceManagerImpl; import org.commonjava.cartographer.INTERNAL.ops.CalculationOpsImpl; import org.commonjava.cartographer.INTERNAL.ops.GraphOpsImpl; import org.commonjava.cartographer.INTERNAL.ops.GraphRenderingOpsImpl; import org.commonjava.cartographer.INTERNAL.ops.MetadataOpsImpl; import org.commonjava.cartographer.INTERNAL.ops.ResolveOpsImpl; import org.commonjava.cartographer.graph.GraphResolver; import org.commonjava.cartographer.graph.MultiGraphCalculator; import org.commonjava.cartographer.graph.RecipeResolver; import org.commonjava.cartographer.graph.discover.meta.LicenseScanner; import org.commonjava.cartographer.graph.discover.meta.MetadataScanner; import org.commonjava.cartographer.graph.discover.meta.MetadataScannerSupport; import org.commonjava.cartographer.graph.discover.meta.ScmUrlScanner; import org.commonjava.cartographer.graph.discover.patch.DepgraphPatcher; import org.commonjava.cartographer.graph.discover.patch.PatcherSupport; import org.commonjava.cartographer.graph.mutator.ManagedDependencyGraphMutatorFactory; import org.commonjava.cartographer.graph.mutator.MutatorSelector; import org.commonjava.cartographer.graph.mutator.NoOpGraphMutatorFactory; import org.commonjava.cartographer.graph.preset.BuildRequirementProjectsFilterFactory; import org.commonjava.cartographer.graph.preset.PresetFactory; import org.commonjava.cartographer.graph.preset.PresetSelector; import org.commonjava.cartographer.graph.preset.ScopeWithEmbeddedProjectsFilterFactory; import org.commonjava.cartographer.graph.preset.ScopedProjectFilterFactory; import org.commonjava.cartographer.ops.CalculationOps; import org.commonjava.cartographer.ops.GraphOps; import org.commonjava.cartographer.ops.GraphRenderingOps; import org.commonjava.cartographer.ops.MetadataOps; import org.commonjava.cartographer.ops.ResolveOps; import org.commonjava.cartographer.spi.graph.agg.GraphAggregator; import org.commonjava.cartographer.spi.graph.discover.DiscoverySourceManager; import org.commonjava.cartographer.spi.graph.discover.ProjectRelationshipDiscoverer; import org.commonjava.cdi.util.weft.NamedThreadFactory; import org.commonjava.cartographer.graph.RelationshipGraphFactory; import org.commonjava.maven.atlas.graph.jackson.ProjectRelationshipSerializerModule; import org.commonjava.cartographer.graph.spi.RelationshipGraphConnectionFactory; import org.commonjava.cartographer.graph.spi.neo4j.io.NeoSpecificProjectRelationshipSerializerModule; import org.commonjava.cartographer.graph.spi.neo4j.io.NeoSpecificProjectVersionRefSerializerModule; import org.commonjava.maven.atlas.ident.jackson.ProjectVersionRefSerializerModule; import org.commonjava.maven.galley.GalleyInitException; import org.commonjava.maven.galley.TransferManager; import org.commonjava.maven.galley.auth.MemoryPasswordManager; import org.commonjava.maven.galley.cache.partyline.PartyLineCacheProvider; import org.commonjava.maven.galley.filearc.FileTransport; import org.commonjava.maven.galley.filearc.ZipJarTransport; import org.commonjava.maven.galley.maven.ArtifactManager; import org.commonjava.maven.galley.maven.ArtifactMetadataManager; import org.commonjava.maven.galley.maven.GalleyMaven; import org.commonjava.maven.galley.maven.GalleyMavenBuilder; import org.commonjava.maven.galley.maven.internal.defaults.StandardMaven304PluginDefaults; import org.commonjava.maven.galley.maven.model.view.XPathManager; import org.commonjava.maven.galley.maven.parse.MavenMetadataReader; import org.commonjava.maven.galley.maven.parse.MavenPomReader; import org.commonjava.maven.galley.maven.parse.XMLInfrastructure; import org.commonjava.maven.galley.maven.rel.MavenModelProcessor; import org.commonjava.maven.galley.maven.spi.defaults.MavenPluginDefaults; import org.commonjava.maven.galley.maven.spi.defaults.MavenPluginImplications; import org.commonjava.maven.galley.maven.spi.type.TypeMapper; import org.commonjava.maven.galley.maven.spi.version.VersionResolver; import org.commonjava.maven.galley.spi.auth.PasswordManager; import org.commonjava.maven.galley.spi.cache.CacheProvider; import org.commonjava.maven.galley.spi.event.FileEventManager; import org.commonjava.maven.galley.spi.io.TransferDecorator; import org.commonjava.maven.galley.spi.nfc.NotFoundCache; import org.commonjava.maven.galley.spi.transport.LocationExpander; import org.commonjava.maven.galley.spi.transport.LocationResolver; import org.commonjava.maven.galley.spi.transport.Transport; import org.commonjava.maven.galley.spi.transport.TransportManager; import org.commonjava.maven.galley.transport.htcli.Http; import org.commonjava.maven.galley.transport.htcli.HttpClientTransport; import org.commonjava.maven.galley.transport.htcli.HttpImpl; import org.commonjava.maven.galley.transport.htcli.conf.GlobalHttpConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; public class CartographerCoreBuilder { private final Logger logger = LoggerFactory.getLogger( getClass() ); private int aggregatorThreads = 2; private int resolverThreads = 10; private RelationshipGraphFactory graphFactory; private Collection<MetadataScanner> metadataScanners; private ProjectRelationshipDiscoverer discoverer; private ExecutorService aggregatorExecutor; private ExecutorService resolveExecutor; private MetadataScannerSupport scannerSupport; private Collection<DepgraphPatcher> depgraphPatchers; private PatcherSupport patcherSupport; private final RelationshipGraphConnectionFactory connectionFactory; private GraphAggregator aggregator; private DiscoverySourceManager sourceManager; private Http http; private GlobalHttpConfiguration globalHttpConfig; private MavenModelProcessor mavenModelProcessor; private RecipeResolver dtoResolver; private final GalleyMavenBuilder mavenBuilder; private final GalleyMaven maven; private PresetSelector presetSelector; private ObjectMapper objectMapper; private MutatorSelector mutatorSelector; public CartographerCoreBuilder( final GalleyMaven galleyMaven, final RelationshipGraphConnectionFactory connectionFactory ) throws CartoDataException { this.maven = galleyMaven; this.mavenBuilder = null; this.connectionFactory = connectionFactory; } public CartographerCoreBuilder( final File resolverCacheDir, final RelationshipGraphConnectionFactory connectionFactory ) throws CartoDataException { this.maven = null; this.mavenBuilder = new GalleyMavenBuilder( ( pathGenerator, transferDecorator, eventManager ) -> new PartyLineCacheProvider( resolverCacheDir, pathGenerator, eventManager, transferDecorator ) ); this.connectionFactory = connectionFactory; } public CartographerCoreBuilder( final CacheProvider cache, final RelationshipGraphConnectionFactory connectionFactory ) throws CartoDataException { this.maven = null; this.mavenBuilder = new GalleyMavenBuilder( cache ); this.connectionFactory = connectionFactory; } public CartographerCoreBuilder initHttpComponents() { checkMaven(); if ( mavenBuilder.getPasswordManager() == null ) { mavenBuilder.withPasswordManager( new MemoryPasswordManager() ); } if ( http == null ) { http = new HttpImpl( mavenBuilder.getPasswordManager() ); } if ( globalHttpConfig == null ) { globalHttpConfig = new GlobalHttpConfiguration(); } return this; } private void checkMaven() { if ( maven != null ) { throw new IllegalStateException( "Galley Maven components were pre-initiailized!" ); } } public CartographerCoreBuilder withGraphAggregator( final GraphAggregator aggregator ) { this.aggregator = aggregator; return this; } public CartographerCoreBuilder withDefaultTransports() { checkMaven(); initHttpComponents(); mavenBuilder.withEnabledTransports( new HttpClientTransport( http, new ObjectMapper(), globalHttpConfig ), new FileTransport(), new ZipJarTransport() ); return this; } public CartographerCoreBuilder withTransport( final Transport transport ) { checkMaven(); mavenBuilder.withAdditionalTransport( transport ); return this; } public CartographerCore build() throws CartoDataException { // this has implications on how the maven components are built, below...so it has to happen first. if ( this.sourceManager == null ) { final SourceManagerImpl smi = new SourceManagerImpl(); this.sourceManager = smi; withLocationExpander( smi ); withLocationResolver( smi ); } if ( maven == null ) { final List<Transport> transports = mavenBuilder.getEnabledTransports(); if ( transports == null || transports.isEmpty() ) { withDefaultTransports(); } try { mavenBuilder.initMissingComponents(); } catch ( final GalleyInitException e ) { throw new CartoDataException( "Failed to initialize missing Galley components: %s", e, e.getMessage() ); } } aggregatorThreads = aggregatorThreads < 2 ? 2 : aggregatorThreads; if ( aggregatorExecutor == null ) { aggregatorExecutor = Executors.newScheduledThreadPool( aggregatorThreads, new NamedThreadFactory( "carto-aggregator", true, 8 ) ); } resolverThreads = resolverThreads < aggregatorThreads ? 5 * aggregatorThreads : resolverThreads; if ( resolveExecutor == null ) { resolveExecutor = Executors.newScheduledThreadPool( resolverThreads, new NamedThreadFactory( "carto-graph", true, 8 ) ); } if ( this.metadataScanners == null ) { this.metadataScanners = new ArrayList<MetadataScanner>( Arrays.asList( new LicenseScanner( getPomReader() ), new ScmUrlScanner( getPomReader() ) ) ); } // TODO: Add some scanners. if ( scannerSupport == null ) { scannerSupport = new MetadataScannerSupport( metadataScanners ); } if ( this.depgraphPatchers == null ) { this.depgraphPatchers = new ArrayList<DepgraphPatcher>(); } if ( patcherSupport == null ) { this.patcherSupport = new PatcherSupport( this.depgraphPatchers.toArray( new DepgraphPatcher[this.depgraphPatchers.size()] ) ); } if ( mavenModelProcessor == null ) { mavenModelProcessor = new MavenModelProcessor(); } if ( this.discoverer == null ) { this.discoverer = new DiscovererImpl( mavenModelProcessor, getPomReader(), getArtifactManager(), patcherSupport, scannerSupport ); } if ( aggregator == null ) { aggregator = new DefaultGraphAggregator( discoverer, aggregatorExecutor ); } if ( presetSelector == null ) { presetSelector = new PresetSelector( Arrays.<PresetFactory>asList( new BuildRequirementProjectsFilterFactory(), new ScopeWithEmbeddedProjectsFilterFactory(), new ScopedProjectFilterFactory() ) ); } if ( mutatorSelector == null ) { mutatorSelector = new MutatorSelector( Arrays.asList( new ManagedDependencyGraphMutatorFactory(), new NoOpGraphMutatorFactory() ) ); } if ( dtoResolver == null ) { dtoResolver = new RecipeResolver( getLocationResolver(), getLocationExpander(), sourceManager, getPomReader(), presetSelector, mutatorSelector ); } withStandardObjectMapperModules(); logger.debug( "Object mapper: {}", objectMapper ); final RelationshipGraphFactory graphFactory = new RelationshipGraphFactory( connectionFactory ); MultiGraphCalculator calculator = new MultiGraphCalculator( graphFactory ); GraphResolver resolver = new GraphResolver( calculator, sourceManager, discoverer, aggregator, getArtifactManager(), resolveExecutor, graphFactory, dtoResolver ); final CalculationOps calculationOps = new CalculationOpsImpl( calculator, resolver ); final ResolveOps resolveOps = new ResolveOpsImpl( sourceManager, discoverer, getArtifactManager(), resolveExecutor, dtoResolver, resolver ); final GraphOps graphOps = new GraphOpsImpl( resolver ); final GraphRenderingOps graphRenderingOps = new GraphRenderingOpsImpl( resolveOps, resolver, getLocationExpander(), dtoResolver ); final MetadataOps metadataOps = new MetadataOpsImpl( getArtifactManager(), getPomReader(), scannerSupport, resolver, dtoResolver ); try { return new CartographerCore( maven == null ? mavenBuilder.build() : maven, calculationOps, graphOps, graphRenderingOps, metadataOps, resolveOps, graphFactory, resolver, calculator, sourceManager, objectMapper ); } catch ( final GalleyInitException e ) { throw new CartoDataException( "Failed to build Galley Maven component: %s", e, e.getMessage() ); } } public CartographerCoreBuilder withStandardObjectMapperModules() { initDefaultObjectMapper(); logger.debug( "{} adding standard modules", objectMapper ); objectMapper.registerModules( new ProjectVersionRefSerializerModule(), new ProjectRelationshipSerializerModule(), new NeoSpecificProjectVersionRefSerializerModule(), new NeoSpecificProjectRelationshipSerializerModule() ); return this; } public CartographerCoreBuilder initDefaultObjectMapper() { if ( objectMapper == null ) { logger.debug( "initializing object mapper" ); objectMapper = new ObjectMapper(); objectMapper.setSerializationInclusion( Include.NON_NULL ); objectMapper.enable( SerializationFeature.INDENT_OUTPUT ); objectMapper.disable( SerializationFeature.WRITE_NULL_MAP_VALUES ); objectMapper.disable( SerializationFeature.WRITE_EMPTY_JSON_ARRAYS ); objectMapper.enable( SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS ); } return this; } public CartographerCoreBuilder withObjectMapperModules( final Module... modules ) { initDefaultObjectMapper(); logger.debug( "{} adding custom modules", objectMapper ); objectMapper.registerModules( modules ); return this; } public MavenModelProcessor getMavenModelProcessor() { return mavenModelProcessor; } public CartographerCoreBuilder withMavenModelProcessor( final MavenModelProcessor mmp ) { this.mavenModelProcessor = mmp; return this; } public RelationshipGraphFactory getGraphFactory() { return graphFactory; } public int getAggregatorThreads() { return aggregatorThreads; } public int getResolverThreads() { return resolverThreads; } public DiscoverySourceManager getSourceManager() { return sourceManager; } public Collection<MetadataScanner> getMetadataScanners() { return metadataScanners; } public ProjectRelationshipDiscoverer getDiscoverer() { return discoverer; } public CartographerCoreBuilder withGraphFactory( final RelationshipGraphFactory graphFactory ) { this.graphFactory = graphFactory; return this; } public CartographerCoreBuilder withAggregatorThreads( final int resolverThreads ) { this.aggregatorThreads = resolverThreads; return this; } public CartographerCoreBuilder withResolverThreads( final int resolverThreads ) { this.resolverThreads = resolverThreads; return this; } public CartographerCoreBuilder withSourceManager( final DiscoverySourceManager sourceManager ) { this.sourceManager = sourceManager; if ( sourceManager instanceof LocationResolver ) { withLocationResolver( (LocationResolver) sourceManager ); } if ( sourceManager instanceof LocationExpander ) { withLocationExpander( (LocationExpander) sourceManager ); } return this; } public CartographerCoreBuilder withMetadataScanners( final Collection<MetadataScanner> metadataScanners ) { this.metadataScanners = metadataScanners; return this; } public CartographerCoreBuilder withDepgraphPatchers( final Collection<DepgraphPatcher> patchers ) { this.depgraphPatchers = patchers; return this; } public CartographerCoreBuilder withDiscoverer( final ProjectRelationshipDiscoverer discoverer ) { this.discoverer = discoverer; return this; } public Http getHttp() { return http; } public GlobalHttpConfiguration getGlobalHttpConfig() { return globalHttpConfig; } public ExecutorService getAggregatorExecutor() { return aggregatorExecutor; } public ExecutorService getResolveExecutor() { return resolveExecutor; } public MetadataScannerSupport getScannerSupport() { return scannerSupport; } public CartographerCoreBuilder withHttp( final Http http ) { this.http = http; return this; } public CartographerCoreBuilder withGlobalHttpConfig( final GlobalHttpConfiguration globalHttpConfig ) { this.globalHttpConfig = globalHttpConfig; return this; } public CartographerCoreBuilder withAggregatorExecutor( final ScheduledExecutorService aggregatorExecutor ) { this.aggregatorExecutor = aggregatorExecutor; return this; } public CartographerCoreBuilder withResolveExecutor( final ScheduledExecutorService resolveExecutor ) { this.resolveExecutor = resolveExecutor; return this; } public CartographerCoreBuilder withScannerSupport( final MetadataScannerSupport scannerSupport ) { this.scannerSupport = scannerSupport; return this; } public CartographerCoreBuilder withPatcherSupport( final PatcherSupport patcherSupport ) { this.patcherSupport = patcherSupport; return this; } public Collection<DepgraphPatcher> getDepgraphPatchers() { return depgraphPatchers; } public PatcherSupport getPatcherSupport() { return patcherSupport; } public GraphAggregator getGraphAggregator() { return aggregator; } public ArtifactManager getArtifactManager() { return maven == null ? mavenBuilder.getArtifactManager() : maven.getArtifactManager(); } public ArtifactMetadataManager getArtifactMetadataManager() { return maven == null ? mavenBuilder.getArtifactMetadataManager() : maven.getArtifactMetadataManager(); } public CartographerCoreBuilder withArtifactManager( final ArtifactManager artifactManager ) { checkMaven(); mavenBuilder.withArtifactManager( artifactManager ); return this; } public CartographerCoreBuilder withArtifactMetadataManager( final ArtifactMetadataManager metadata ) { checkMaven(); mavenBuilder.withArtifactMetadataManager( metadata ); return this; } public TypeMapper getTypeMapper() { return maven == null ? mavenBuilder.getTypeMapper() : maven.getTypeMapper(); } public MavenPomReader getPomReader() { return maven == null ? mavenBuilder.getPomReader() : maven.getPomReader(); } public CartographerCoreBuilder withPomReader( final MavenPomReader pomReader ) { checkMaven(); mavenBuilder.withPomReader( pomReader ); return this; } public MavenPluginDefaults getPluginDefaults() { return maven == null ? mavenBuilder.getPluginDefaults() : maven.getPluginDefaults(); } public CartographerCoreBuilder withPluginDefaults( final StandardMaven304PluginDefaults pluginDefaults ) { checkMaven(); mavenBuilder.withPluginDefaults( pluginDefaults ); return this; } public XPathManager getXPathManager() { return maven == null ? mavenBuilder.getXPathManager() : maven.getXPathManager(); } public CartographerCoreBuilder withXPathManager( final XPathManager xpathManager ) { checkMaven(); mavenBuilder.withXPathManager( xpathManager ); return this; } public XMLInfrastructure getXmlInfrastructure() { return maven == null ? mavenBuilder.getXmlInfrastructure() : maven.getXmlInfrastructure(); } public CartographerCoreBuilder withXmlInfrastructure( final XMLInfrastructure xmlInfra ) { checkMaven(); mavenBuilder.withXmlInfrastructure( xmlInfra ); return this; } public CartographerCoreBuilder withTypeMapper( final TypeMapper mapper ) { checkMaven(); mavenBuilder.withTypeMapper( mapper ); return this; } public CartographerCoreBuilder withPluginDefaults( final MavenPluginDefaults pluginDefaults ) { checkMaven(); mavenBuilder.withPluginDefaults( pluginDefaults ); return this; } public MavenPluginImplications getPluginImplications() { return maven == null ? mavenBuilder.getPluginImplications() : maven.getPluginImplications(); } public CartographerCoreBuilder withPluginImplications( final MavenPluginImplications pluginImplications ) { checkMaven(); mavenBuilder.withPluginImplications( pluginImplications ); return this; } public MavenMetadataReader getMavenMetadataReader() { return maven == null ? mavenBuilder.getMavenMetadataReader() : maven.getMavenMetadataReader(); } public VersionResolver getVersionResolver() { return maven == null ? mavenBuilder.getVersionResolver() : maven.getVersionResolver(); } public CartographerCoreBuilder withMavenMetadataReader( final MavenMetadataReader metaReader ) { checkMaven(); mavenBuilder.withMavenMetadataReader( metaReader ); return this; } public CartographerCoreBuilder withVersionResolver( final VersionResolver versionResolver ) { checkMaven(); mavenBuilder.withVersionResolver( versionResolver ); return this; } public LocationExpander getLocationExpander() { return maven == null ? mavenBuilder.getLocationExpander() : maven.getLocationExpander(); } public LocationResolver getLocationResolver() { return maven == null ? mavenBuilder.getLocationResolver() : maven.getLocationResolver(); } public TransferDecorator getTransferDecorator() { return maven == null ? mavenBuilder.getTransferDecorator() : maven.getTransferDecorator(); } public FileEventManager getFileEvents() { return maven == null ? mavenBuilder.getFileEvents() : maven.getFileEvents(); } public CacheProvider getCache() { return maven == null ? mavenBuilder.getCache() : maven.getCache(); } public NotFoundCache getNfc() { return maven == null ? mavenBuilder.getNfc() : maven.getNfc(); } public CartographerCoreBuilder withLocationExpander( final LocationExpander locationExpander ) { checkMaven(); logger.debug( "Setting location expander: {}", locationExpander ); mavenBuilder.withLocationExpander( locationExpander ); return this; } public CartographerCoreBuilder withLocationResolver( final LocationResolver locationResolver ) { checkMaven(); mavenBuilder.withLocationResolver( locationResolver ); return this; } public CartographerCoreBuilder withTransferDecorator( final TransferDecorator decorator ) { checkMaven(); mavenBuilder.withTransferDecorator( decorator ); return this; } public CartographerCoreBuilder withFileEvents( final FileEventManager events ) { checkMaven(); mavenBuilder.withFileEvents( events ); return this; } public CartographerCoreBuilder withCache( final CacheProvider cache ) { checkMaven(); mavenBuilder.withCache( cache ); return this; } public CartographerCoreBuilder withNfc( final NotFoundCache nfc ) { checkMaven(); mavenBuilder.withNfc( nfc ); return this; } public TransportManager getTransportManager() { return maven == null ? mavenBuilder.getTransportManager() : maven.getTransportManager(); } public TransferManager getTransferManager() { return maven == null ? mavenBuilder.getTransferManager() : maven.getTransferManager(); } public CartographerCoreBuilder withTransportManager( final TransportManager transportManager ) { checkMaven(); mavenBuilder.withTransportManager( transportManager ); return this; } public CartographerCoreBuilder withTransferManager( final TransferManager transferManager ) { checkMaven(); mavenBuilder.withTransferManager( transferManager ); return this; } public List<Transport> getTransports() { return maven == null ? mavenBuilder.getEnabledTransports() : maven.getEnabledTransports(); } public CartographerCoreBuilder withTransports( final List<Transport> transports ) { checkMaven(); mavenBuilder.withEnabledTransports( transports ); return this; } public CartographerCoreBuilder withTransports( final Transport... transports ) { checkMaven(); mavenBuilder.withEnabledTransports( transports ); return this; } public ExecutorService getHandlerExecutor() { return maven == null ? mavenBuilder.getHandlerExecutor() : maven.getHandlerExecutor(); } public CartographerCoreBuilder withHandlerExecutor( final ExecutorService handlerExecutor ) { checkMaven(); mavenBuilder.withHandlerExecutor( handlerExecutor ); return this; } public ExecutorService getBatchExecutor() { return maven == null ? mavenBuilder.getBatchExecutor() : maven.getBatchExecutor(); } public CartographerCoreBuilder withBatchExecutor( final ExecutorService batchExecutor ) { checkMaven(); mavenBuilder.withBatchExecutor( batchExecutor ); return this; } public PasswordManager getPasswordManager() { return maven == null ? mavenBuilder.getPasswordManager() : maven.getPasswordManager(); } public CartographerCoreBuilder withPasswordManager( final PasswordManager passwordManager ) { checkMaven(); mavenBuilder.withPasswordManager( passwordManager ); return this; } public CartographerCoreBuilder withAdditionalTransport( final Transport transport ) { checkMaven(); mavenBuilder.withAdditionalTransport( transport ); return this; } public RecipeResolver getDtoResolver() { return dtoResolver; } public CartographerCoreBuilder withDtoResolver( final RecipeResolver dtoResolver ) { this.dtoResolver = dtoResolver; return this; } public PresetSelector getPresetSelector() { return presetSelector; } public CartographerCoreBuilder withPresetSelector( final PresetSelector presetSelector ) { this.presetSelector = presetSelector; return this; } public MutatorSelector getMutatorSelector() { return mutatorSelector; } public CartographerCoreBuilder withMutatorSelector( final MutatorSelector mutatorSelector ) { this.mutatorSelector = mutatorSelector; return this; } public ObjectMapper getObjectMapper() { return objectMapper; } public CartographerCoreBuilder withObjectMapper( final ObjectMapper objectMapper ) { this.objectMapper = objectMapper; return this; } }