Branch data Line data Source code
1 : : /***************************************************************************
2 : : qgsweakrelation.cpp - QgsWeakRelation
3 : :
4 : : ---------------------
5 : : begin : 5.12.2019
6 : : copyright : (C) 2019 by Alessandro Pasotti
7 : : email : elpaso at itopen dot it
8 : : ***************************************************************************
9 : : * *
10 : : * This program is free software; you can redistribute it and/or modify *
11 : : * it under the terms of the GNU General Public License as published by *
12 : : * the Free Software Foundation; either version 2 of the License, or *
13 : : * (at your option) any later version. *
14 : : * *
15 : : ***************************************************************************/
16 : :
17 : : #include <QApplication>
18 : : #include "qgsweakrelation.h"
19 : : #include "qgslogger.h"
20 : :
21 : :
22 : 0 : QgsWeakRelation::QgsWeakRelation( const QString &relationId, const QString &relationName, const QgsRelation::RelationStrength strength,
23 : : const QString &referencingLayerId, const QString &referencingLayerName, const QString &referencingLayerSource, const QString &referencingLayerProviderKey,
24 : : const QString &referencedLayerId, const QString &referencedLayerName, const QString &referencedLayerSource, const QString &referencedLayerProviderKey,
25 : : const QList<QgsRelation::FieldPair> &fieldPairs )
26 : 0 : : mReferencingLayer( referencingLayerId, referencingLayerName, referencingLayerSource, referencingLayerProviderKey )
27 : 0 : , mReferencedLayer( referencedLayerId, referencedLayerName, referencedLayerSource, referencedLayerProviderKey )
28 : 0 : , mRelationId( relationId )
29 : 0 : , mRelationName( relationName )
30 : 0 : , mStrength( strength )
31 : 0 : , mFieldPairs( fieldPairs )
32 : : {
33 : 0 : }
34 : :
35 : 0 : QgsRelation QgsWeakRelation::resolvedRelation( const QgsProject *project, QgsVectorLayerRef::MatchType matchType ) const
36 : : {
37 : 0 : QgsRelation relation;
38 : 0 : relation.setId( mRelationId );
39 : 0 : relation.setName( mRelationName );
40 : 0 : relation.setStrength( mStrength );
41 : 0 : QgsVectorLayerRef referencedLayerRef { mReferencedLayer };
42 : 0 : QgsMapLayer *referencedLayer { referencedLayerRef.resolveWeakly( project, matchType ) };
43 : 0 : if ( referencedLayer )
44 : : {
45 : 0 : relation.setReferencedLayer( referencedLayer->id() );
46 : 0 : }
47 : 0 : QgsVectorLayerRef referencingLayerRef { mReferencingLayer };
48 : 0 : QgsMapLayer *referencingLayer { referencingLayerRef.resolveWeakly( project, matchType ) };
49 : 0 : if ( referencingLayer )
50 : : {
51 : 0 : relation.setReferencingLayer( referencingLayer->id() );
52 : 0 : }
53 : 0 : for ( const auto &fp : std::as_const( mFieldPairs ) )
54 : : {
55 : 0 : relation.addFieldPair( fp );
56 : : }
57 : 0 : return relation;
58 : 0 : }
59 : :
60 : 0 : QgsVectorLayerRef QgsWeakRelation::referencingLayer() const
61 : : {
62 : 0 : return mReferencingLayer;
63 : : }
64 : :
65 : 0 : QgsVectorLayerRef QgsWeakRelation::referencedLayer() const
66 : : {
67 : 0 : return mReferencedLayer;
68 : : }
69 : :
70 : 0 : QgsRelation::RelationStrength QgsWeakRelation::strength() const
71 : : {
72 : 0 : return mStrength;
73 : : }
74 : :
75 : 0 : QList<QgsRelation::FieldPair> QgsWeakRelation::fieldPairs() const
76 : : {
77 : 0 : return mFieldPairs;
78 : : }
79 : :
80 : 0 : QgsWeakRelation QgsWeakRelation::readXml( const QgsVectorLayer *layer, WeakRelationType type, const QDomNode &node, const QgsPathResolver resolver )
81 : : {
82 : 0 : QDomElement relationElement = node.toElement();
83 : :
84 : 0 : if ( relationElement.tagName() != QLatin1String( "relation" ) )
85 : : {
86 : 0 : QgsLogger::warning( QApplication::translate( "QgsRelation", "Cannot create relation. Unexpected tag '%1'" ).arg( relationElement.tagName() ) );
87 : 0 : }
88 : :
89 : 0 : QList<QgsRelation::FieldPair> fieldPairs;
90 : 0 : const QDomNodeList fieldPairNodes { relationElement.elementsByTagName( QStringLiteral( "fieldRef" ) ) };
91 : 0 : for ( int j = 0; j < fieldPairNodes.length(); ++j )
92 : : {
93 : 0 : const QDomElement fieldPairElement = fieldPairNodes.at( j ).toElement();
94 : 0 : fieldPairs.push_back( { fieldPairElement.attribute( QStringLiteral( "referencingField" ) ),
95 : 0 : fieldPairElement.attribute( QStringLiteral( "referencedField" ) )
96 : : } );
97 : 0 : }
98 : :
99 : 0 : switch ( type )
100 : : {
101 : : case Referencing:
102 : 0 : return QgsWeakRelation { relationElement.attribute( QStringLiteral( "id" ) ),
103 : 0 : relationElement.attribute( QStringLiteral( "name" ) ),
104 : 0 : static_cast<QgsRelation::RelationStrength>( relationElement.attribute( QStringLiteral( "strength" ) ).toInt() ),
105 : : // Referencing
106 : 0 : layer->id(),
107 : 0 : layer->name(),
108 : 0 : resolver.writePath( layer->publicSource() ),
109 : 0 : layer->providerType(),
110 : : // Referenced
111 : 0 : relationElement.attribute( QStringLiteral( "layerId" ) ),
112 : 0 : relationElement.attribute( QStringLiteral( "layerName" ) ),
113 : 0 : relationElement.attribute( QStringLiteral( "dataSource" ) ),
114 : 0 : relationElement.attribute( QStringLiteral( "providerKey" ) ),
115 : : fieldPairs
116 : : };
117 : : case Referenced:
118 : 0 : return QgsWeakRelation { relationElement.attribute( QStringLiteral( "id" ) ),
119 : 0 : relationElement.attribute( QStringLiteral( "name" ) ),
120 : 0 : static_cast<QgsRelation::RelationStrength>( relationElement.attribute( QStringLiteral( "strength" ) ).toInt() ),
121 : : // Referencing
122 : 0 : relationElement.attribute( QStringLiteral( "layerId" ) ),
123 : 0 : relationElement.attribute( QStringLiteral( "layerName" ) ),
124 : 0 : relationElement.attribute( QStringLiteral( "dataSource" ) ),
125 : 0 : relationElement.attribute( QStringLiteral( "providerKey" ) ),
126 : : // Referenced
127 : 0 : layer->id(),
128 : 0 : layer->name(),
129 : 0 : resolver.writePath( layer->publicSource() ),
130 : 0 : layer->providerType(),
131 : : fieldPairs
132 : : };
133 : : }
134 : : // avoid build warnings
135 : 0 : return QgsWeakRelation( QString(), QString(), QgsRelation::RelationStrength::Association, QString(), QString(), QString(),
136 : 0 : QString(), QString(), QString(), QString(), QString(), QList< QgsRelation::FieldPair >() );
137 : 0 : }
138 : :
139 : 0 : void QgsWeakRelation::writeXml( const QgsVectorLayer *layer, WeakRelationType type, const QgsRelation &relation, QDomNode &node, QDomDocument &doc )
140 : : {
141 : 0 : if ( !layer )
142 : 0 : return;
143 : :
144 : 0 : if ( layer != relation.referencingLayer() && layer != relation.referencedLayer() )
145 : 0 : return;
146 : :
147 : 0 : const QgsPathResolver resolver { QgsProject::instance()->pathResolver() };
148 : :
149 : 0 : relation.writeXml( node, doc );
150 : 0 : QDomNodeList relationsNodeList = node.toElement().elementsByTagName( QStringLiteral( "relation" ) );
151 : 0 : QDomElement relationElement;
152 : :
153 : 0 : for ( int i = 0; i < relationsNodeList.size(); ++i )
154 : : {
155 : 0 : relationElement = relationsNodeList.at( i ).toElement();
156 : 0 : if ( relationElement.hasAttribute( QStringLiteral( "id" ) ) && relationElement.attribute( QStringLiteral( "id" ) ) == relation.id() )
157 : : {
158 : 0 : switch ( type )
159 : : {
160 : : case Referencing:
161 : : // if the layer is the referencing one, we save the referenced layer info
162 : 0 : relationElement.setAttribute( QStringLiteral( "layerId" ), relation.referencedLayer()->id() );
163 : 0 : relationElement.setAttribute( QStringLiteral( "layerName" ), relation.referencedLayer()->name() );
164 : 0 : relationElement.setAttribute( QStringLiteral( "dataSource" ), resolver.writePath( relation.referencedLayer()->publicSource() ) );
165 : 0 : relationElement.setAttribute( QStringLiteral( "providerKey" ), relation.referencedLayer()->providerType() );
166 : 0 : break;
167 : :
168 : : case Referenced:
169 : : // if the layer is the referenced one, we save the referencing layer info
170 : 0 : relationElement.setAttribute( QStringLiteral( "layerId" ), relation.referencingLayer()->id() );
171 : 0 : relationElement.setAttribute( QStringLiteral( "layerName" ), relation.referencingLayer()->name() );
172 : 0 : relationElement.setAttribute( QStringLiteral( "dataSource" ), resolver.writePath( relation.referencingLayer()->publicSource() ) );
173 : 0 : relationElement.setAttribute( QStringLiteral( "providerKey" ), relation.referencingLayer()->providerType() );
174 : 0 : break;
175 : : }
176 : 0 : }
177 : 0 : }
178 : 0 : }
|