Bonjour,

est ce que vous pouvez m'aider meme par des idées et merci.

J'ai un objet de type ResultData que selon ses attributs je cherche sa fichier xml associé et je récupére son interpretation.

Le but est de parcourir en ordre et en paralléle le fichier xml et son objet Java ( une instance de ResultData) et remplir sa interpretaion afin de mieux comprendre ce objet.

Afin de bien répondre a ce besoin j'ai crée un classe TypeInterpretation et j'ai ajouté un attribut interpretationOfType au sein du classe ObjectResult afin d'interpreter le type .
NB: Je n'ai pas developpé le code , J'effectue un stage et il m'ont donné ce tache:
Pour un objet de type ResultData , il faut parcourir un fichier XML et récuperer sa interpretation.
J'ai utilisé L'API Stax afin de parser le fichier xml.
tous les idées que j'ai pensé n'a pas donné des solutions.
je vous présente les déclarations:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
public class ResultData  {
 
	/** The result. */
	private ObjectResult result;
 
	/** The obis. */
	private String obis;
 
	/** The class id. */
	private String classId;
 
	/** The attribute id. */
	private String attributeId;
 
	/** The data index. */
	private String dataIndex;
 
	/** The version. */
	private String version;
 
	private Data data;
 
//getters , setters constructeurs
la classe ObjectResult

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
public class ObjectResult  {
 
	/** The type. */
	private Choices type;
 
	/** The result. */
	private Object result;
 
	private TypeInterpretation interpretationOfType ;
TypeInterpretation

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
public class TypeInterpretation {
 
	private String nameOfType ;
	private int nbrOfAttributes;
	private Map<String,String>  attributes = new HashMap<>();
et le fichier XML

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
 
<object api="DLMS" name="AssociationLNCurrent">
		<attribute id="2" name="object_list" type="array">
			<array name="object_list" min="0" max="9999">
				<struct name="object" size="4">
					<unsigned16 name="class_id" default="0" min="0" max="65535"/>
					<unsigned8 name="version" default="0" min="0" max="255"/>
					<struct name="access_rights" size="2">
						<array name="attributes_access" min="0" max="9999">
							<struct name="attribute_access" size="3">
								<integer8 name="attribute_id" default="0" min="-128" max="127"/>
								<enumerated name="access_mode" editable="false" default="0">
									<enum code="0" description="NO_ACCESS"/>
									<enum code="2" description="WRITE_ONLY
								</enumerated>
								<null name="access_selectors"/>
							</struct>
						</array>
					</struct>
				</struct>
			</array>
		</attribute>
		<attribute id="3" name="associated_partners_id" type="struct">
		<unsigned16 name="class_id" default="0" min="0" max="65535"/>
		</attribute>
// et encore
Le but est selon la valeur attributeId de classe ResultData on va recuperer idAttribute dont sa valeur est égale a attributeId .

Je vous présente le test :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
public static void main(String[] args) throws IOException {
		 String trame="0123B";
		byte[] trameByte = hexStringToByteArray(trame);
		Data data = new Data();
	data.decode(new ByteArrayInputStream(trameByte));
	org.openmuc.jdlms.client.Data d = DataConverter.toApi(data);
	ResultData datar = DataResolver.objectBuilder(d, null, null);
Ils ont convertit la valeur de trame à un objet datar (instance de classe ResultData) avec une méthode que s'en foue .

supposons que ce objet datar est associé à l'attribut dont id=2.

on veut a partir de ce ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
<attribute id="2" name="object_list" type="array">
récupere son interpretation et le stocker dans l' attribut interpretationOfType du classe ObjectResult.

Donc on va se focaliser toujours au attribut result instance de ObjectResult.: on ajoute le ligne récuperé de fichier xml et l'ajoute a l'attribut interpretationOfType . Ensuite on recupere le ligne apres (dans le fichier xml) et on l'ajoute a l'attribut interpretationOfType . et ainsi de suite jusqu'on arrive à la balise fermante attribute.

Le probleme que l'attribut private Object result du classe ObjectResult
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 /** The type. */
	private Choices type;
 
	/** The result. */
	private Object result;
 
	private TypeInterpretation interpretationOfType ;
est de type Object. Donc il se peut que soit de meme de type ResultData ( c'est ce que j'ai trouvé lors de deboggage) ou de type primitif.
Si de type primitif , int par exemple , on recupere la ligne courante de xml et on le stocke au attribut interpretationOfType.

Si de type ArrayList , on passe son contenu qu'il sont de type resultData au parametre.
et ainsi de suite.

J'ai pensé d'implementer un fonction qui prend en parametre un objet de type ObjectResult , rechercher dans le fichier xml l'attribute correspondante, une fois trouvé , elle commence de remplir l'attribut interpretationOfType par les données récuperés de ligne courante de fichier XML.
La declaration de cette méhode statique
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 
public class DataInterpretation  {
	public static Object objectInterpretation(ObjectResult ob)
	{
		XMLInputFactory factory = XMLInputFactory.newInstance();
		 File file = new File("test1.xml");
		 Boolean found=false ;
		 try {
			 XMLStreamReader reader = factory.createXMLStreamReader(new FileReader(file));
			 while (reader.hasNext() && !found) {
				 int type = reader.next();
				 if(type== XMLStreamReader.START_ELEMENT && reader.getLocalName().equals("attribute") && reader.getAttributeName(0).toString().equals("id") && reader.getAttributeValue(0).equals("2")) 
				 {
					 found=true ;
					 Boolean foundFinish =false;
					 while (reader.hasNext() && !foundFinish)
					 {
						 type = reader.next();
						 if(type==XMLStreamReader.START_ELEMENT)
						 {
							 if(!reader.getLocalName().equals("dlmsAttribute")&&!reader.getLocalName().equals("association"))
							 {
								 String name = reader.getLocalName();
								 int nbrOfAtt = reader.getAttributeCount();
								 Map<String,String>  attri = new HashMap<>(nbrOfAtt);
								 for(int i = 0; i < reader.getAttributeCount(); i++)
				                  {
				                	 attri.put(reader.getAttributeName(i).toString(), reader.getAttributeValue(i)) ;
				                  }
								 TypeInterpretation obInter = new TypeInterpretation(name, nbrOfAtt, attri);
								 ob.setInterpretationOfType(obInter);
								 //appel recursive
 
							 }
						 }
						 else if(type==XMLStreamReader.END_ELEMENT && reader.getLocalName().equals("attribute"))
						 {
							 foundFinish=true;
						 }
					 }
				 }
			 }
 
		 }catch (FileNotFoundException e) {
	         e.printStackTrace();
	      } catch (XMLStreamException e) {
	         e.printStackTrace();
	      }
		 return ob;
 
	}
Si j'utilise la récursivité l'attribut result est de type Object donc il se peut de n'importe quel type et j'ai fixé le type du parametre passé a la methode est ObjectResult.

J'ai pensé à la reflexion , je dois savoir l'attribut result de type Object , quel est son type en memeoire au moment de son execution mais elle devra bien compliqué et si j'utilise la recursivité , la méthode va instancier un nouvau fichier et se positionne au 1 er ligne apres
Code : Sélectionner tout - Visualiser dans une fenêtre à part
<attribute id="2" name="object_list" type="array">
qui est
Code : Sélectionner tout - Visualiser dans une fenêtre à part
<array name="object_list" min="0" max="9999">
.

Je suis vraiment bloqué.
le but apres avoir se positionner au ligne de fichier xml dont l' attribute est egale au idAttribute, il faut parcourir en parallele le fichier xml et l'objet resultData et récupere les données de chaque ligne dans l'attribute interpretaionOfType afin de bien comprendre ce type.

tous les idées que j'ai trouvé sont compliquées , si vous avez une solution meilleur que ceci , meme des ideés, des APIs qui facilite .

J'attend votre réponse.

Le but est de parcourir en parallele le fichier xml et l'objet resultData et récupere les données de chaque ligne dans l'attribute interpretaionOfType .

donc le parcours du fichier xml et l'objet se fait en parallele.

Merci.