XDBMS: Replace objects properly
[dashstudio.git] / src / dashserver / project / projectmanager.cpp
blob017260909c43763460a5c84838dd88bbae919547
1 /***************************************************************************
2 * Copyright (C) 2007 by David Cuadrado *
3 * krawek@gmail.com *
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
22 #include "projectmanager.h"
24 #include <QVariant>
25 #include <QXmlStreamReader>
26 #include <QXmlStreamWriter>
28 #include <dashserver/server.h>
29 #include <dashserver/package.h>
30 #include <dashserver/connection.h>
32 #include <dash/network/package/error.h>
33 #include <dash/network/package/projectlist.h>
34 #include <dash/network/parser/projectactionparser.h>
36 #include <dcore/debug.h>
38 #include "store.h"
39 #include "project.h"
40 #include "member.h"
42 #include "dashserver/users/user.h"
43 #include "dashserver/xdbms/manager.h"
44 #include "dashserver/xdbms/table.h"
47 namespace DashServer {
48 namespace Project {
50 struct Manager::Private
52 Store *store;
55 Manager::Manager()
56 : DashServer::Observer(), d(new Private)
58 d->store = new Store;
62 Manager::~Manager()
64 delete d->store;
65 delete d;
68 void Manager::handlePackage(DashServer::Package* const pkg)
70 DashServer::TcpServer *server = pkg->source()->server();
72 if( pkg->root() == "command" )
74 if( !d->store->execute(pkg->xml(), pkg->source() ) )
76 pkg->source()->sendError(QObject::tr("Cannot execute command"), Dash::Network::Package::Error::Err);
78 pkg->accept();
80 else if( pkg->root() == "listprojects" )
82 QList<Project *> projects = d->store->allProjects();
84 Dash::Network::Package::ProjectList plist;
86 foreach(Project *p, projects)
88 plist.addProject(p->projectName(), p->author(), p->description());
91 pkg->source()->sendToClient(plist.toString(), true);
94 qDeleteAll(projects);
95 pkg->accept();
97 else if( pkg->root() == "openproject" )
99 QString project;
101 QXmlStreamReader reader(pkg->xml());
102 while(!reader.atEnd())
104 reader.readNext();
106 if( reader.tokenType() == QXmlStreamReader::StartElement )
108 if( reader.name().toString() == "project" )
110 project = reader.attributes().value("name").toString();
111 break;
117 if( !project.isEmpty() )
119 d->store->openProject(project, pkg->source());
120 pkg->accept();
122 else
124 // TODO: Enviar mensaje de error.
127 else if( pkg->root() == "newproject" )
129 QString projectName, author, description;
131 QXmlStreamReader reader(pkg->xml());
132 while(!reader.atEnd())
134 reader.readNext();
136 if( reader.tokenType() == QXmlStreamReader::StartElement )
138 if( reader.name().toString() == "name" )
140 projectName = reader.readElementText();
142 else if( reader.name().toString() == "author" )
144 author = reader.readElementText();
146 else if( reader.name().toString() == "description" )
148 description = reader.readElementText();
153 if( !d->store->contains(projectName) )
155 if( d->store->createProject(projectName, author, description, pkg->source()->user()->login()) )
157 dfDebug << "Created project: " << projectName;
158 d->store->addToProject(projectName, pkg->source());
161 else
163 // TODO: enviar mensaje de error
166 pkg->accept();
168 else if(pkg->root() == "updateproject" )
170 Dash::Network::Parser::ProjectAction parser;
172 if(parser.parse(pkg->xml()))
174 QString projectName = parser.name();
175 QString newDescription = parser.description();
176 QString newAuthor = parser.author();
178 if(Project::Project *project = d->store->project(projectName))
180 if(!newDescription.isEmpty())
182 project->setDescription(newDescription);
184 if(!newAuthor.isEmpty())
186 project->setAuthor(newAuthor);
190 QList<Dash::Network::Parser::ProjectAction::Member> members = parser.members();
192 foreach(Dash::Network::Parser::ProjectAction::Member member, members)
194 Member *mem = new Member();
195 mem->setUser(member.login);
196 mem->setJob(member.job);
197 D_SHOW_VAR(member.login);
198 QList<Dash::Network::Permission> permissions = member.profile.permissions();
201 foreach(Dash::Network::Permission permission, permissions)
203 Users::Permission *perm = new Users::Permission();
205 perm->setId(permission.name());
206 perm->setName(permission.name());
207 perm->setRead(permission.read());
208 perm->setWrite(permission.write());
210 mem->addPermission(perm);
213 D_SHOW_VAR(mem->objects().size());
214 project->addMember(mem);
217 project->aboutToSave();
219 if( XDBMS::Manager::self()->update("projects", project) )
221 server->sendToAdmins(pkg->xml());
222 pkg->accept();
224 delete project;
226 else
228 pkg->source()->sendError(QObject::tr("Project not exist"), Dash::Network::Package::Error::Err);
231 pkg->accept();
234 else if(pkg->root() == "queryproject" )
236 QString projectName;
237 QXmlStreamReader reader(pkg->xml());
238 while(!reader.atEnd())
240 reader.readNext();
242 if( reader.tokenType() == QXmlStreamReader::StartElement )
244 if( reader.name().toString() == "name" )
246 projectName = reader.readElementText();
251 if(!projectName.isEmpty())
253 if(Project::Project *project = d->store->project(projectName))
255 QString xml;
257 QXmlStreamWriter writer(&xml);
258 writer.writeStartElement("projectquery");
260 writer.writeStartElement("name");
261 writer.writeCharacters(project->projectName());
262 writer.writeEndElement();
264 writer.writeStartElement("description");
265 writer.writeCharacters(project->description());
266 writer.writeEndElement();
268 writer.writeStartElement("author");
269 writer.writeCharacters(project->author());
270 writer.writeEndElement();
272 writer.writeStartElement("members");
274 QHash<QString, Member *> members = project->members();
275 foreach(Member *member, members)
277 writer.writeStartElement("user");
278 writer.writeAttribute("login", member->user().login());
279 writer.writeAttribute("job", member->job());
281 QHash<QString, Users::Permission *> permissions = member->permissions();
282 QHash<QString, Users::Permission *>::iterator it = permissions.begin();
284 writer.writeStartElement("permissions");
286 while(it != permissions.end())
288 writer.writeStartElement("module");
289 writer.writeAttribute("name", it.key());
290 writer.writeAttribute("read", QString::number(it.value()->read()));
291 writer.writeAttribute("write", QString::number(it.value()->write()));
292 writer.writeEndElement();
294 it++;
297 writer.writeEndElement();
298 writer.writeEndElement();
300 writer.writeEndElement();
301 writer.writeEndElement();
303 DashServer::Connection *cnn = pkg->source();
304 cnn->sendToClient(xml, true);
305 delete project;
309 else
311 pkg->source()->sendError(QObject::tr("Project not exist"), Dash::Network::Package::Error::Err);
313 pkg->accept();
315 else
317 dfDebug << "Unhandled package: " << pkg->root();
321 void Manager::connectionClosed(DashServer::Connection *cnx)
323 d->store->removeClient(cnx);
326 void Manager::sendToMembers(const QString &projectName, const QString &pkg)
328 d->store->sendToMembers(projectName, pkg);
331 void Manager::resendProject(const QString &projectName)
333 d->store->resendProject(projectName);