29 #include <arcs/arcsfactory.h>
30 #include <arcs/arcsinternalfamily.h>
31 #include <arcs/arcsinternaltypes.h>
32 #include <arcs/arcssensorlogger.h>
33 #include <arcs/arcsgenerallogger.h>
34 #include <arcs/arcsconstantmodifier.h>
35 #include <arcs/arcsapplicationobject.h>
37 #include <QHashIterator>
38 #include <arcs/arcslog.h>
55 ARCSFactory::ARCSFactory()
59 families.insert(nativeFamily->
name(), nativeFamily);
71 qRegisterMetaType<ARCSConstant>(
"ARCSConstant");
73 qRegisterMetaType<ARCSComponent>(
"ARCSComponent");
77 qRegisterMetaType<boolArray>(
"boolArray");
79 qRegisterMetaType<intArray>(
"intArray");
81 qRegisterMetaType<shortArray>(
"shortArray");
83 qRegisterMetaType<longArray>(
"longArray");
85 qRegisterMetaType<floatArray>(
"floatArray");
87 qRegisterMetaType<doubleArray>(
"doubleArray");
94 buildComponentLists();
97 ARCSFactory::~ARCSFactory()
107 families.insert(family->
name(), family);
114 QString varName = var.typeName();
115 if ( !variantTypeMap.contains(varName))
116 variantTypeMap.insertMulti(varName, type->
getTypeName());
130 void ARCSFactory::buildComponentLists()
132 QHashIterator<QString, ARCSAbstractFamily*> i(families);
136 componentFamilyMap.clear();
142 QStringList flist = (i.value())->factoryList();
143 for (j=0; j < flist.count() ; j++)
145 if ( components.contains(flist[j]))
148 components << flist[j];
150 if (componentFamilyMap.contains(flist[j]))
153 componentFamilyMap.insert(flist[j], i.value()->name());
168 ARCSLog::logError(ARCS_SOURCE,lib->
getError());
173 if ( libraries.contains(path) )
175 ARCSLog::logWarning(ARCS_SOURCE,
"library "+ path+
" already loaded.");
185 QHashIterator<QString, ARCSNativeComponent*> i(acm);
190 QString namespaced = path +
":" + i.key();
192 nativeFamily->
addFactory(namespaced, i.value());
195 if ( nativeComponentLibraryMap.contains(namespaced) )
196 qCritical() <<
"[Factory] Native component" << namespaced <<
"already found !";
198 nativeComponentLibraryMap.insert(namespaced, path);
199 if ( nativeComponentLibraryMap.contains(i.key()) )
200 qCritical() <<
"[Factory] Native component" << i.key() <<
"already found !";
202 nativeComponentLibraryMap.insert(i.key(), path);
207 QHashIterator<QString, ARCSAbstractFamily*> j(afm);
212 QString namespaced = path +
":" + j.key();
215 if (families.contains(namespaced))
216 qCritical() <<
"[Factory] Component family" << namespaced <<
"already added !";
218 families.insert(namespaced, j.value());
220 if (families.contains(j.key()))
221 qCritical() <<
"[Factory] Component family" << j.key() <<
"already added !";
223 families.insert(j.key(), j.value());
225 if (familyLibraryMap.contains(namespaced))
226 qCritical() <<
"[Factory] Component family" << namespaced <<
"already found !" ;
228 familyLibraryMap.insert(namespaced, path);
230 if (familyLibraryMap.contains(j.key()))
231 qCritical() <<
"[Factory] Component family" << j.key() <<
"already found !" ;
233 familyLibraryMap.insert(j.key(), path);
238 QHashIterator<QString, ARCSTypeFactory*> k(atm);
242 QString namespaced = path +
":" + k.key();
244 if (typeLibraryMap.contains(namespaced))
245 qCritical() <<
"[Factory] Type factory" << namespaced <<
"already found !";
247 typeLibraryMap.insert(namespaced, path);
249 if (typeLibraryMap.contains(k.key()))
250 qCritical() <<
"[Factory] Type factory" << k.key() <<
"already found !" ;
252 typeLibraryMap.insert(k.key(), path);
254 if( types.contains(namespaced))
255 qCritical() <<
"[Factory] Type factory" << namespaced <<
"already added !";
257 types.insert(namespaced, k.value());
259 if (types.contains(k.key()))
260 qCritical() <<
"[Factory] Type factory" << namespaced <<
"already added !";
262 types.insert(k.key(), k.value());
264 QVariant var = k.value()->parseString(QString::null);
265 QString varName = var.typeName();
266 QString namespacedVarName = path +
":" + k.key();
267 if ( !variantTypeMap.contains(varName))
269 variantTypeMap.insertMulti(varName, k.key());
270 variantTypeMap.insertMulti(varName, namespacedVarName);
276 buildComponentLists();
277 libraries.insert(path,lib);
286 if (!libraries.contains(path))
288 qCritical() <<
"[Factory] Attempted to unload an unknown library" << path ;
300 QHashIterator<QString, ARCSNativeComponent*> i(acm);
305 QString namespaced = path +
":" + i.key();
310 nativeComponentLibraryMap.remove(namespaced);
311 nativeComponentLibraryMap.remove(i.key());
315 QHashIterator<QString, ARCSAbstractFamily*> j(afm);
320 QString namespaced = path +
":" + j.key();
321 families.remove(namespaced);
322 families.remove(j.key());
323 familyLibraryMap.remove(namespaced);
324 familyLibraryMap.remove(j.key());
328 QHashIterator<QString, ARCSTypeFactory*> k(atm);
332 QString namespaced = path +
":" + k.key();
333 types.remove(namespaced);
334 types.remove(k.key());
335 typeLibraryMap.remove(namespaced);
336 typeLibraryMap.remove(k.key());
338 QVariant var = k.value()->parseString(QString::null);
339 variantTypeMap.remove(var.typeName());
342 buildComponentLists();
350 if (! componentFamilyMap.contains(type))
352 ARCSLog::logError(ARCS_SOURCE,
"component type " + type +
" is unknown.");
356 QString familyName = componentFamilyMap[type];
357 if (!families.contains(familyName))
359 ARCSLog::logError(ARCS_SOURCE,
"family "+ familyName +
" is unkown.");
368 if (! familyLibraryMap.contains(familyName))
370 qCritical() <<
"[Factory] family:" << familyName <<
"is unkown from family-library map." ;
374 QString libraryName = familyLibraryMap[familyName];
375 if (! libraries.contains(libraryName) )
377 qCritical() <<
"[Factory] library:" << libraryName <<
"is not loaded properly." ;
381 libraries[libraryName]->ref();
401 if (familyName.isEmpty())
404 if (!families.contains(familyName))
415 if (! familyLibraryMap.contains(familyName))
418 QString libraryName = familyLibraryMap[familyName];
419 if (! libraries.contains(libraryName) )
422 libraries[libraryName]->unref();
429 QStringList typesList = variantTypeMap.values(var.typeName());
432 if (typesList.count() <=0 )
433 return QString::null;
435 for (
int i=0; i < typesList.count() ; i++)
437 if (typesList[i].contains(
":"))
440 first = typesList[i];
443 if (!first.isEmpty())
444 if (types.count(first) <= 1)
450 return QString::null;
457 QStringList typesList = variantTypeMap.values(s);
460 if (typesList.count() <= 0)
461 return QString::null;
463 for (
int i=0; i < typesList.count() ; i++)
465 if (typesList[i].contains(
":"))
468 first = typesList[i];
471 if (!first.isEmpty())
472 if (types.count(first) <= 1)
478 return QString::null;
486 if (!types.contains(type))
488 qCritical() <<
"[Factory] Type" << type <<
"is unkown.";
492 QVariant var = qVariantFromValue(types[type]->parseString(representation));
494 if ( types[type]->isInternal())
497 if (!typeLibraryMap.contains(type))
499 qCritical() <<
"[Factory] Type" << type <<
"is unknown from type-library map.";
503 QString libraryName = typeLibraryMap[type];
504 if (! libraries.contains(libraryName))
507 libraries[libraryName]->ref();
516 if (!types.contains(type))
518 qCritical() <<
"[Factory] Type" << type <<
"is unkown.";
519 return QString::null;
522 return types[type]->toString(var);
528 if (nativeComponentLibraryMap.contains(s))
529 return nativeComponentLibraryMap[s];
531 if (componentFamilyMap.contains(s))
533 QString family = componentFamilyMap[s];
534 if (familyLibraryMap.contains(s))
535 return familyLibraryMap[family];
538 return QString::null;
543 if (! libraries.contains(s))
544 return QStringList();
547 res += libraries[s]->getComponentMap().keys();
549 ARCSFamilyMap map = libraries[s]->getFamilyMap();
551 QHashIterator<QString,ARCSAbstractFamily*> it(map);
556 res += it.value()->factoryList();
566 if (typeLibraryMap.contains(s))
567 return typeLibraryMap[s];
569 return QString::null;
575 if (familyLibraryMap.contains(s))
576 return familyLibraryMap[s];
578 return QString::null;
void setFamily(QString s)
virtual bool isInternal() const
Describes wether the family is internal to ARCS or not.
This class is a dynamic library manager.
void destroyComponent(ARCSAbstractComponent *aac)
Destroys a component.
QString getVariantType(QVariant var)
Returns the type of a QVariant.
virtual QString getTypeName() const =0
Should return the name of the type factory.
virtual void removeFactory(QString type)
Removes a component factory to the family.
QString getInternalType(QString s)
QString getTypeLibrary(QString s)
Returns the path of the library associated to a certain kind of type.
static ARCSFactory * getInstance()
Returns the instance of the singleton ARCSFactory.
ARCSFamilyMap getFamilyMap()
virtual ARCSAbstractComponent * instanciate(QString type)=0
Returns a component.
virtual QString name() const =0
name of the family
Class handling the generic description of a component.
virtual void destroy(ARCSAbstractComponent *component)=0
Destroys a component.
A singleton handling all needed factories in ARCS runtime.
This class represents the family that describes several internal component types. ...
void unLoadLibrary(QString path)
Unloads a library given the path to it.
ARCSAbstractComponent * createComponent(QString componentType)
Creates a component given its class name.
QString getFamilyLibrary(QString s)
virtual bool addFactory(QString type, ARCSAbstractComponent *whatever)
Adds a component factory to the family.
QString getComponentLibrary(QString s)
Returns the path of the library associated to a certain kind of component.
virtual QVariant parseString(QString s)=0
Should create data from their string representation.
ARCSComponentMap getComponentMap()
bool loadLibrary(QString path)
Loads a library given the path to it.
Generic class describing how type factories should be implemented.
virtual QString name() const
name of the family
QString dataSerialize(QVariant var)
Serializes data from their QVariant counterpart.
QVariant dataDeserialize(QString type, QString representation)
Deserialize data from their string representation.
QStringList getLibraryComponents(QString s)
Returns the list of components associated to a library.
Native family handling native components inside ARCS runtime.
Generic factories for each new native component type.
Abstract class representing a family of components i.e. a factory of factories of components...