public static Session getMockSession()

in maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/SessionStub.java [77:263]


    public static Session getMockSession(LocalRepository localRepository) {
        Session session = mock(Session.class);

        RepositoryFactory repositoryFactory = mock(RepositoryFactory.class);
        when(repositoryFactory.createRemote(any(Repository.class))).thenAnswer(iom -> {
            Repository repository = iom.getArgument(0, Repository.class);
            return repositoryFactory.createRemote(repository.getId(), repository.getUrl());
        });
        when(repositoryFactory.createRemote(anyString(), anyString())).thenAnswer(iom -> {
            String id = iom.getArgument(0, String.class);
            String url = iom.getArgument(1, String.class);
            RemoteRepository remoteRepository =
                    mock(RemoteRepository.class, withSettings().lenient());
            when(remoteRepository.getId()).thenReturn(id);
            when(remoteRepository.getUrl()).thenReturn(url);
            when(remoteRepository.getProtocol()).thenReturn(URI.create(url).getScheme());
            return remoteRepository;
        });

        LocalRepositoryManager localRepositoryManager = mock(LocalRepositoryManager.class);
        when(localRepositoryManager.getPathForLocalArtifact(any(), any(), any()))
                .thenAnswer(iom -> {
                    LocalRepository localRepo = iom.getArgument(1, LocalRepository.class);
                    Artifact artifact = iom.getArgument(2, Artifact.class);
                    return localRepo.getPath().resolve(getPathForArtifact(artifact, true));
                });

        ArtifactInstaller artifactInstaller = mock(ArtifactInstaller.class);
        doAnswer(iom -> {
                    artifactInstaller.install(ArtifactInstallerRequest.build(
                            iom.getArgument(0, Session.class), iom.getArgument(1, Collection.class)));
                    return null;
                })
                .when(artifactInstaller)
                .install(any(Session.class), ArgumentMatchers.<Collection<Artifact>>any());

        ArtifactDeployer artifactDeployer = mock(ArtifactDeployer.class);
        doAnswer(iom -> {
                    artifactDeployer.deploy(ArtifactDeployerRequest.build(
                            iom.getArgument(0, Session.class),
                            iom.getArgument(1, RemoteRepository.class),
                            iom.getArgument(2, Collection.class)));
                    return null;
                })
                .when(artifactDeployer)
                .deploy(any(), any(), any());

        ArtifactManager artifactManager = mock(ArtifactManager.class);
        Map<Artifact, Path> paths = new HashMap<>();
        doAnswer(iom -> {
                    paths.put(iom.getArgument(0), iom.getArgument(1));
                    return null;
                })
                .when(artifactManager)
                .setPath(any(), any());
        doAnswer(iom -> Optional.ofNullable(paths.get(iom.getArgument(0, Artifact.class))))
                .when(artifactManager)
                .getPath(any());

        ProjectManager projectManager = mock(ProjectManager.class);
        Map<Project, Collection<Artifact>> attachedArtifacts = new HashMap<>();
        doAnswer(iom -> {
                    Project project = iom.getArgument(1, Project.class);
                    String type = iom.getArgument(2, String.class);
                    Path path = iom.getArgument(3, Path.class);
                    Artifact artifact = session.createArtifact(
                            project.getGroupId(), project.getArtifactId(), project.getVersion(), null, null, type);
                    artifactManager.setPath(artifact, path);
                    attachedArtifacts
                            .computeIfAbsent(project, p -> new ArrayList<>())
                            .add(artifact);
                    return null;
                })
                .when(projectManager)
                .attachArtifact(same(session), any(Project.class), any(), any());
        doAnswer(iom -> {
                    Project project = iom.getArgument(0, Project.class);
                    Artifact artifact = iom.getArgument(1, Artifact.class);
                    Path path = iom.getArgument(2, Path.class);
                    artifactManager.setPath(artifact, path);
                    attachedArtifacts
                            .computeIfAbsent(project, p -> new ArrayList<>())
                            .add(artifact);
                    return null;
                })
                .when(projectManager)
                .attachArtifact(any(Project.class), any(Artifact.class), any(Path.class));
        when(projectManager.getAttachedArtifacts(any()))
                .then(iom ->
                        attachedArtifacts.computeIfAbsent(iom.getArgument(0, Project.class), p -> new ArrayList<>()));

        ArtifactFactory artifactFactory = mock(ArtifactFactory.class);
        when(artifactFactory.create(any())).then(iom -> {
            ArtifactFactoryRequest request = iom.getArgument(0, ArtifactFactoryRequest.class);
            String classifier = request.getClassifier();
            String extension = request.getExtension();
            String type = request.getType();
            if (classifier == null) {
                classifier = "";
            }
            if (extension == null) {
                extension = type != null ? type : "";
            }
            return new ArtifactStub(
                    request.getGroupId(), request.getArtifactId(), classifier, request.getVersion(), extension);
        });

        ProjectBuilder projectBuilder = mock(ProjectBuilder.class);
        when(projectBuilder.build(any(ProjectBuilderRequest.class))).then(iom -> {
            ProjectBuilderRequest request = iom.getArgument(0, ProjectBuilderRequest.class);
            ProjectBuilderResult result = mock(ProjectBuilderResult.class);
            Model model = new MavenXpp3Reader()
                    .read(request.getSource().get().getInputStream())
                    .getDelegate();
            ProjectStub projectStub = new ProjectStub();
            projectStub.setModel(model);
            ArtifactStub artifactStub = new ArtifactStub(
                    model.getGroupId(), model.getArtifactId(), "", model.getVersion(), model.getPackaging());
            projectStub.setArtifact(artifactStub);
            when(result.getProject()).thenReturn(Optional.of(projectStub));
            return result;
        });

        Properties sysProps = new Properties();
        Properties usrProps = new Properties();
        doReturn(sysProps).when(session).getSystemProperties();
        doReturn(usrProps).when(session).getUserProperties();

        when(session.getLocalRepository()).thenReturn(localRepository);
        when(session.getService(RepositoryFactory.class)).thenReturn(repositoryFactory);
        when(session.getService(ProjectBuilder.class)).thenReturn(projectBuilder);
        when(session.getService(LocalRepositoryManager.class)).thenReturn(localRepositoryManager);
        when(session.getService(ProjectManager.class)).thenReturn(projectManager);
        when(session.getService(ArtifactManager.class)).thenReturn(artifactManager);
        when(session.getService(ArtifactInstaller.class)).thenReturn(artifactInstaller);
        when(session.getService(ArtifactDeployer.class)).thenReturn(artifactDeployer);
        when(session.getService(ArtifactFactory.class)).thenReturn(artifactFactory);
        when(session.getService(ModelXmlFactory.class)).thenReturn(new DefaultModelXmlFactory());

        when(session.getPathForLocalArtifact(any(Artifact.class)))
                .then(iom -> localRepositoryManager.getPathForLocalArtifact(
                        session, session.getLocalRepository(), iom.getArgument(0, Artifact.class)));
        when(session.createArtifact(any(), any(), any(), any(), any(), any())).thenAnswer(iom -> {
            String groupId = iom.getArgument(0, String.class);
            String artifactId = iom.getArgument(1, String.class);
            String version = iom.getArgument(2, String.class);
            String classifier = iom.getArgument(3, String.class);
            String extension = iom.getArgument(4, String.class);
            String type = iom.getArgument(5, String.class);
            return session.getService(ArtifactFactory.class)
                    .create(ArtifactFactoryRequest.builder()
                            .session(session)
                            .groupId(groupId)
                            .artifactId(artifactId)
                            .version(version)
                            .classifier(classifier)
                            .extension(extension)
                            .type(type)
                            .build());
        });
        when(session.createArtifact(any(), any(), any(), any())).thenAnswer(iom -> {
            String groupId = iom.getArgument(0, String.class);
            String artifactId = iom.getArgument(1, String.class);
            String version = iom.getArgument(2, String.class);
            String extension = iom.getArgument(3, String.class);
            return session.getService(ArtifactFactory.class)
                    .create(ArtifactFactoryRequest.builder()
                            .session(session)
                            .groupId(groupId)
                            .artifactId(artifactId)
                            .version(version)
                            .extension(extension)
                            .build());
        });
        when(session.createRemoteRepository(anyString(), anyString())).thenAnswer(iom -> {
            String id = iom.getArgument(0, String.class);
            String url = iom.getArgument(1, String.class);
            return session.getService(RepositoryFactory.class).createRemote(id, url);
        });
        doAnswer(iom -> artifactManager.getPath(iom.getArgument(0, Artifact.class)))
                .when(session)
                .getArtifactPath(any());

        when(session.withLocalRepository(any()))
                .thenAnswer(iom -> getMockSession(iom.getArgument(0, LocalRepository.class)));
        return session;
    }