File indexing completed on 2024-04-28 03:51:38

0001 /*
0002     This file is part of KDE.
0003 
0004     SPDX-FileCopyrightText: 2010 Sebastian Kügler <sebas@kde.org>
0005 
0006     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007 */
0008 
0009 #include "projecttest.h"
0010 
0011 #include <QAction>
0012 #include <QListWidgetItem>
0013 #include <QMenu>
0014 #include <QMenuBar>
0015 #include <QVBoxLayout>
0016 
0017 #include <QDebug>
0018 
0019 #include <buildservice.h>
0020 #include <buildservicejob.h>
0021 #include <itemjob.h>
0022 #include <listjob.h>
0023 #include <provider.h>
0024 
0025 using namespace Attica;
0026 
0027 ProjectTest::ProjectTest()
0028     : QMainWindow()
0029     , m_mainWidget(nullptr)
0030 {
0031     m_mainWidget = new QWidget();
0032     setCentralWidget(m_mainWidget);
0033 
0034     m_editor = new Ui::EditProject();
0035     m_editor->setupUi(m_mainWidget);
0036 
0037     // Project page
0038     connect(m_editor->save, &QAbstractButton::clicked, this, &ProjectTest::save);
0039     connect(m_editor->create, SIGNAL(clicked()), this, SLOT(create()));
0040     connect(m_editor->deleteProject, SIGNAL(clicked()), this, SLOT(deleteProject()));
0041 
0042     // build service / job page
0043     connect(m_editor->build, &QAbstractButton::clicked, this, &ProjectTest::createBuildServiceJob);
0044     connect(m_editor->cancelJob, &QAbstractButton::clicked, this, &ProjectTest::cancelBuildServiceJob);
0045     connect(m_editor->updateJob, &QAbstractButton::clicked, this, &ProjectTest::updateCurrentProject);
0046     connect(m_editor->buildServices, &QListWidget::currentItemChanged, this, &ProjectTest::selectedBuildServiceChanged);
0047 
0048     QAction *a = new QAction(this);
0049     a->setText(QLatin1String("Quit"));
0050     connect(a, &QAction::triggered, this, &QWidget::close);
0051     menuBar()->addMenu(QLatin1String("File"))->addAction(a);
0052 
0053     initOcs();
0054 }
0055 
0056 ProjectTest::~ProjectTest()
0057 {
0058 }
0059 
0060 void ProjectTest::initOcs()
0061 {
0062     m_pm.setAuthenticationSuppressed(true);
0063     connect(&m_pm, &ProviderManager::providerAdded, this, &ProjectTest::providerAdded);
0064     m_pm.loadDefaultProviders();
0065     m_mainWidget->setEnabled(false);
0066     setStatus(QLatin1String("Loading providers..."));
0067     // connect(m_serviceUpdates.data(), SIGNAL(mapped(QString)), SLOT(serviceUpdates(QString)));
0068 }
0069 
0070 void ProjectTest::providerAdded(const Attica::Provider &provider)
0071 {
0072     qDebug() << "providerAdded" << provider.baseUrl();
0073     setStatus(QLatin1String("Provider found:") + provider.baseUrl().toString());
0074     m_mainWidget->setEnabled(true);
0075 
0076     if (provider.isValid()) {
0077         QString _id = QLatin1String("1");
0078         m_provider = provider;
0079 
0080         getProject(_id);
0081 
0082         listProjects();
0083 
0084         listBuildServices();
0085 
0086         Project p;
0087         p.setId(_id);
0088         listBuildServiceJobs(p);
0089     }
0090 }
0091 
0092 void ProjectTest::getProject(QString id)
0093 {
0094     ItemJob<Project> *job = m_provider.requestProject(id);
0095     connect(job, &BaseJob::finished, this, &ProjectTest::projectResult);
0096     job->start();
0097     setStatus(QString(QLatin1String("Loading project %")).arg(id));
0098     m_mainWidget->setEnabled(false);
0099 }
0100 
0101 void ProjectTest::listProjects()
0102 {
0103     ListJob<Project> *job = m_provider.requestProjects();
0104     connect(job, &BaseJob::finished, this, &ProjectTest::projectListResult);
0105     job->start();
0106 }
0107 
0108 void ProjectTest::listBuildServices()
0109 {
0110     ListJob<BuildService> *job = m_provider.requestBuildServices();
0111     connect(job, &BaseJob::finished, this, &ProjectTest::buildServiceListResult);
0112     job->start();
0113 }
0114 
0115 void ProjectTest::listBuildServiceJobs(const Project &p)
0116 {
0117     ListJob<BuildServiceJob> *job = m_provider.requestBuildServiceJobs(p);
0118     connect(job, &BaseJob::finished, this, &ProjectTest::buildServiceJobListResult);
0119     job->start();
0120 }
0121 
0122 void ProjectTest::projectResult(Attica::BaseJob *j)
0123 {
0124     qDebug() << "Project job returned";
0125     QString output;
0126     m_mainWidget->setEnabled(true);
0127 
0128     if (j->metadata().error() == Metadata::NoError) {
0129         Attica::ItemJob<Project> *itemJob = static_cast<Attica::ItemJob<Project> *>(j);
0130         Attica::Project p = itemJob->result();
0131         output.append(QLatin1String("Project loaded."));
0132 
0133         projectToUi(p);
0134     } else if (j->metadata().error() == Metadata::OcsError) {
0135         output.append(QString(QLatin1String("OCS Error: %1")).arg(j->metadata().message()));
0136     } else if (j->metadata().error() == Metadata::NetworkError) {
0137         output.append(QString(QLatin1String("Network Error: %1")).arg(j->metadata().message()));
0138     } else {
0139         output.append(QString(QLatin1String("Unknown Error: %1")).arg(j->metadata().message()));
0140     }
0141     setStatus(output);
0142 }
0143 
0144 void ProjectTest::projectToUi(const Project &p)
0145 {
0146     m_editor->id->setText(p.id());
0147     m_editor->name->setText(p.name());
0148     m_editor->description->setText(p.description());
0149     m_editor->url->setText(p.url());
0150     m_editor->summary->setText(p.summary());
0151     m_editor->developers->setText(p.developers().join(QLatin1String(", ")));
0152     m_editor->license->setText(p.license());
0153     m_editor->version->setText(p.version());
0154     m_editor->requirements->setText(p.requirements());
0155     m_editor->specFile->setPlainText(p.specFile());
0156 }
0157 
0158 Project ProjectTest::uiToProject()
0159 {
0160     qDebug() << "Saving project";
0161 
0162     Project project = Project();
0163 
0164     project.setId(m_editor->id->text());
0165     project.setName(m_editor->name->text());
0166     project.setVersion(m_editor->version->text());
0167     project.setLicense(m_editor->license->text());
0168     project.setUrl(m_editor->url->text());
0169     const QStringList _d = m_editor->developers->text().split(QLatin1Char(','));
0170     QStringList devs;
0171     for (const QString &dev : _d) {
0172         devs << dev.trimmed();
0173     }
0174     project.setDevelopers(devs);
0175     project.setSummary(m_editor->summary->text());
0176     project.setDescription(m_editor->description->text());
0177     project.setRequirements(m_editor->requirements->text());
0178     project.setSpecFile(m_editor->specFile->toPlainText());
0179 
0180     return project;
0181 }
0182 
0183 void ProjectTest::save()
0184 {
0185     Attica::PostJob *postjob = m_provider.editProject(uiToProject());
0186     connect(postjob, &BaseJob::finished, this, &ProjectTest::saveProjectResult);
0187     postjob->start();
0188     m_mainWidget->setEnabled(false);
0189 }
0190 
0191 void ProjectTest::create()
0192 {
0193     Attica::PostJob *postjob = m_provider.createProject(uiToProject());
0194     connect(postjob, &BaseJob::finished, this, &ProjectTest::createProjectResult);
0195     postjob->start();
0196     m_mainWidget->setEnabled(false);
0197 }
0198 
0199 void ProjectTest::deleteProject()
0200 {
0201     Attica::PostJob *postjob = m_provider.deleteProject(uiToProject());
0202     connect(postjob, &BaseJob::finished, this, &ProjectTest::deleteProjectResult);
0203     postjob->start();
0204     m_mainWidget->setEnabled(false);
0205 }
0206 
0207 void ProjectTest::createProjectResult(Attica::BaseJob *j)
0208 {
0209     qDebug() << "createProject() job returned";
0210     QString output;
0211     m_mainWidget->setEnabled(true);
0212 
0213     if (j->metadata().error() == Metadata::NoError) {
0214         m_currentProjectId = j->metadata().resultingId();
0215         qDebug() << "Yay, no errors ... resulting ID:" << m_currentProjectId;
0216         output.append(QString(QLatin1String("Project [%1] successfully created:")).arg(m_currentProjectId));
0217     } else if (j->metadata().error() == Metadata::OcsError) {
0218         output.append(QString(QLatin1String("OCS Error: %1")).arg(j->metadata().message()));
0219     } else if (j->metadata().error() == Metadata::NetworkError) {
0220         output.append(QString(QLatin1String("Network Error: %1")).arg(j->metadata().message()));
0221     } else {
0222         output.append(QString(QLatin1String("Unknown Error: %1")).arg(j->metadata().message()));
0223     }
0224     setStatus(output);
0225 }
0226 
0227 void ProjectTest::saveProjectResult(Attica::BaseJob *j)
0228 {
0229     qDebug() << "editProject() job returned";
0230     QString output;
0231     m_mainWidget->setEnabled(true);
0232 
0233     if (j->metadata().error() == Metadata::NoError) {
0234         m_currentProjectId = j->metadata().resultingId();
0235         qDebug() << "Yay, no errors ... resulting ID:" << m_currentProjectId;
0236         output.append(QString(QLatin1String("Project [%1] successfully saved.")).arg(m_currentProjectId));
0237     } else if (j->metadata().error() == Metadata::OcsError) {
0238         output.append(QString(QLatin1String("OCS Error: %1")).arg(j->metadata().message()));
0239     } else if (j->metadata().error() == Metadata::NetworkError) {
0240         output.append(QString(QLatin1String("Network Error: %1")).arg(j->metadata().message()));
0241     } else {
0242         output.append(QString(QLatin1String("Unknown Error: %1")).arg(j->metadata().message()));
0243     }
0244     setStatus(output);
0245 }
0246 
0247 void ProjectTest::deleteProjectResult(Attica::BaseJob *j)
0248 {
0249     qDebug() << "deleteProject() job returned";
0250     QString output;
0251     m_mainWidget->setEnabled(true);
0252 
0253     if (j->metadata().error() == Metadata::NoError) {
0254         qDebug() << "Yay, no errors ... deleted project.";
0255         output.append(QString(QLatin1String("Project [%1] successfully deleted")).arg(m_currentProjectId));
0256     } else if (j->metadata().error() == Metadata::OcsError) {
0257         output.append(QString(QLatin1String("OCS Error: %1")).arg(j->metadata().message()));
0258     } else if (j->metadata().error() == Metadata::NetworkError) {
0259         output.append(QString(QLatin1String("Network Error: %1")).arg(j->metadata().message()));
0260     } else {
0261         output.append(QString(QLatin1String("Unknown Error: %1")).arg(j->metadata().message()));
0262     }
0263     setStatus(output);
0264     m_currentProjectId.clear();
0265     projectToUi(Project());
0266 }
0267 
0268 void ProjectTest::projectListResult(Attica::BaseJob *j)
0269 {
0270     qDebug() << "Project list job returned";
0271     QString output = QLatin1String("<b>Projects:</b>");
0272     m_mainWidget->setEnabled(true);
0273 
0274     if (j->metadata().error() == Metadata::NoError) {
0275         Attica::ListJob<Project> *listJob = static_cast<Attica::ListJob<Project> *>(j);
0276         qDebug() << "Yay, no errors ...";
0277         QStringList projectIds;
0278 
0279         const auto itemList = listJob->itemList();
0280         for (const Project &p : itemList) {
0281             m_projects[p.id()] = p;
0282             qDebug() << "New project:" << p.id() << p.name();
0283             output.append(QString(QLatin1String("<br />%1 (%2)")).arg(p.name(), p.id()));
0284             projectIds << p.id();
0285             m_editor->projects->insertItem(0, p.name(), p.id());
0286             // TODO: start project jobs here
0287         }
0288         if (listJob->itemList().isEmpty()) {
0289             output.append(QLatin1String("No Projects found."));
0290         }
0291     } else if (j->metadata().error() == Metadata::OcsError) {
0292         output.append(QString(QLatin1String("OCS Error: %1")).arg(j->metadata().message()));
0293     } else if (j->metadata().error() == Metadata::NetworkError) {
0294         output.append(QString(QLatin1String("Network Error: %1")).arg(j->metadata().message()));
0295     } else {
0296         output.append(QString(QLatin1String("Unknown Error: %1")).arg(j->metadata().message()));
0297     }
0298     qDebug() << output;
0299     setStatus(output);
0300 }
0301 
0302 void ProjectTest::buildServiceListResult(Attica::BaseJob *j)
0303 {
0304     qDebug() << "BuildService list job returned";
0305     QString output = QLatin1String("<b>BuildServices:</b>");
0306     // m_mainWidget->setEnabled(true); // fixme: tab
0307 
0308     if (j->metadata().error() == Metadata::NoError) {
0309         Attica::ListJob<BuildService> *listJob = static_cast<Attica::ListJob<BuildService> *>(j);
0310         qDebug() << "Yay, no errors ...";
0311 
0312         const auto itemList = listJob->itemList();
0313         for (const BuildService &bs : itemList) {
0314             m_buildServices[bs.id()] = bs;
0315             qDebug() << "New OBS:" << bs.id() << bs.name() << bs.url();
0316             output.append(QString(QLatin1String("<br />%1 (%2) at %3")).arg(bs.name(), bs.id(), bs.url()));
0317             QListWidgetItem *new_bs = new QListWidgetItem(bs.name(), m_editor->buildServices);
0318             new_bs->setData(Qt::UserRole, QVariant(bs.id()));
0319 
0320             m_editor->accountsServers->insertItem(0, bs.name(), bs.id());
0321             // QListWidgetItem* new_bsa = new QListWidgetItem(bs.name(), m_editor->accountsServers);
0322             // new_bsa->setData(Qt::UserRole, QVariant(bs.id()));
0323         }
0324         if (listJob->itemList().isEmpty()) {
0325             output.append(QLatin1String("No OBS'en found."));
0326         }
0327     } else if (j->metadata().error() == Metadata::OcsError) {
0328         output.append(QString(QLatin1String("OCS Error: %1")).arg(j->metadata().message()));
0329     } else if (j->metadata().error() == Metadata::NetworkError) {
0330         output.append(QString(QLatin1String("Network Error: %1")).arg(j->metadata().message()));
0331     } else {
0332         output.append(QString(QLatin1String("Unknown Error: %1")).arg(j->metadata().message()));
0333     }
0334     qDebug() << output;
0335     // setBuildStatus(output);
0336 }
0337 
0338 void ProjectTest::buildServiceJobListResult(Attica::BaseJob *j)
0339 {
0340     qDebug() << "BuildServiceJobList list job returned";
0341     QString output = QLatin1String("<b>BuildServiceJobs: </b>");
0342     // m_mainWidget->setEnabled(true); // fixme: tab
0343 
0344     if (j->metadata().error() == Metadata::NoError) {
0345         Attica::ListJob<BuildServiceJob> *listJob = static_cast<Attica::ListJob<BuildServiceJob> *>(j);
0346         qDebug() << "Yay, no errors. Items found:" << listJob->itemList().count();
0347 
0348         const auto itemList = listJob->itemList();
0349         for (const BuildServiceJob &bsj : itemList) {
0350             m_buildServiceJobs[bsj.id()] = bsj;
0351             qDebug() << "New BuildServiceJob:" << bsj.id() << bsj.name() << bsj.target();
0352             output.append(QString(QLatin1String("<br />%1 (%2) for %3")).arg(bsj.name(), bsj.id(), bsj.target()));
0353             QListWidgetItem *new_bsj = new QListWidgetItem(bsj.name(), m_editor->buildServiceJobs);
0354             new_bsj->setData(Qt::UserRole, QVariant(bsj.id()));
0355         }
0356         if (listJob->itemList().isEmpty()) {
0357             output.append(QLatin1String("No jobs found."));
0358         }
0359     } else if (j->metadata().error() == Metadata::OcsError) {
0360         output.append(QString(QLatin1String("OCS Error: %1")).arg(j->metadata().message()));
0361     } else if (j->metadata().error() == Metadata::NetworkError) {
0362         output.append(QString(QLatin1String("Network Error: %1")).arg(j->metadata().message()));
0363     } else {
0364         output.append(QString(QLatin1String("Unknown Error: %1")).arg(j->metadata().message()));
0365     }
0366     qDebug() << output;
0367     // setBuildStatus(output);
0368 }
0369 
0370 void ProjectTest::selectedBuildServiceChanged(QListWidgetItem *current, QListWidgetItem *previous)
0371 {
0372     Q_UNUSED(previous)
0373     qDebug() << "current item changed to " << current->data(Qt::UserRole).toString();
0374     m_editor->targets->clear();
0375     const QList<Target> targetlist = m_buildServices[current->data(Qt::UserRole).toString()].targets();
0376     for (const Target &t : targetlist) {
0377         // m_editor->targets->insertItems(0, m_buildServices[current->data(Qt::UserRole).toString()].targets());
0378         m_editor->targets->insertItem(0, t.name, t.id);
0379         // FIXME: target id.
0380         qDebug() << "target:" << t.name << t.id;
0381     }
0382 }
0383 
0384 void ProjectTest::createBuildServiceJob()
0385 {
0386     BuildServiceJob b = BuildServiceJob();
0387     b.setProjectId(m_editor->projects->itemData(m_editor->projects->currentIndex()).toString());
0388     b.setTarget(m_editor->targets->itemData(m_editor->targets->currentIndex()).toString());
0389     b.setBuildServiceId(m_editor->buildServices->currentItem()->data(Qt::UserRole).toString());
0390     b.setTarget(m_editor->targets->itemData(m_editor->targets->currentIndex()).toString());
0391 
0392     ///*
0393     qDebug() << "Create build job:" << m_editor->targets->itemData(m_editor->targets->currentIndex()).toString() << m_editor->targets->currentIndex()
0394              << m_editor->targets->itemData(m_editor->targets->currentIndex());
0395     qDebug() << "Project:" << b.projectId();
0396     qDebug() << "Target:" << b.target();
0397     qDebug() << "Buildservice:" << b.buildServiceId();
0398     //*/
0399     Attica::PostJob *j = m_provider.createBuildServiceJob(b);
0400     connect(j, &BaseJob::finished, this, &ProjectTest::buildServiceJobCreated);
0401     j->start();
0402     setStatus(QLatin1String("Starting a build job on the server."));
0403 }
0404 
0405 void ProjectTest::cancelBuildServiceJob()
0406 {
0407     const QString bsj_id = m_editor->buildServiceJobs->currentItem()->data(Qt::UserRole).toString();
0408     qDebug() << "Cancelling build job:" << bsj_id;
0409     BuildServiceJob b = BuildServiceJob();
0410     b.setId(bsj_id);
0411     Attica::PostJob *j = m_provider.cancelBuildServiceJob(b);
0412     connect(j, &BaseJob::finished, this, &ProjectTest::buildServiceJobCanceled);
0413     j->start();
0414 }
0415 
0416 void ProjectTest::buildServiceJobCanceled(Attica::BaseJob *j)
0417 {
0418     // m_mainWidget->setEnabled(true); // fixme: tab
0419     QString output;
0420     if (j->metadata().error() == Metadata::NoError) {
0421         qDebug() << "job canceled.";
0422         // TODO: refresh jobs
0423     } else if (j->metadata().error() == Metadata::OcsError) {
0424         output.append(QString(QLatin1String("OCS Error: %1")).arg(j->metadata().message()));
0425     } else if (j->metadata().error() == Metadata::NetworkError) {
0426         output.append(QString(QLatin1String("Network Error: %1")).arg(j->metadata().message()));
0427     } else {
0428         output.append(QString(QLatin1String("Unknown Error: %1")).arg(j->metadata().message()));
0429     }
0430     qDebug() << output;
0431     updateCurrentProject();
0432     setStatus(output);
0433 }
0434 
0435 void ProjectTest::buildServiceJobCreated(Attica::BaseJob *j)
0436 {
0437     qDebug() << "JOB CREATED!!!!!!!!!!!!!!!!";
0438     // m_mainWidget->setEnabled(true); // fixme: tab
0439     QString output;
0440     if (j->metadata().error() == Metadata::NoError) {
0441         qDebug() << "job created. I think.";
0442         // TODO: refresh jobs
0443     } else if (j->metadata().error() == Metadata::OcsError) {
0444         output.append(QString(QLatin1String("OCS Error: %1")).arg(j->metadata().message()));
0445     } else if (j->metadata().error() == Metadata::NetworkError) {
0446         output.append(QString(QLatin1String("Network Error: %1")).arg(j->metadata().message()));
0447     } else {
0448         output.append(QString(QLatin1String("Unknown Error: %1")).arg(j->metadata().message()));
0449     }
0450     qDebug() << "New BuildServiceJob created with ID:" << j->metadata().resultingId();
0451     qDebug() << output;
0452     updateCurrentProject();
0453     setStatus(output);
0454 }
0455 
0456 void ProjectTest::setStatus(QString status)
0457 {
0458     qDebug() << "[ii] Status:" << status;
0459     m_editor->status->setText(status);
0460 }
0461 
0462 QString ProjectTest::currentProject()
0463 {
0464     return m_editor->projects->itemData(m_editor->projects->currentIndex()).toString();
0465 }
0466 
0467 void ProjectTest::updateCurrentProject()
0468 {
0469     m_editor->buildServiceJobs->clear();
0470     qDebug() << "Updating project ...";
0471     Project p = Project();
0472     p.setId(currentProject());
0473     listBuildServiceJobs(p);
0474 }
0475 
0476 #include "moc_projecttest.cpp"