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"