You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2022/02/22 10:08:01 UTC

[plc4x] branch develop updated: feat: Dynamically determine ETS project number (#321)

This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/develop by this push:
     new 7a6f03c  feat: Dynamically determine ETS project number (#321)
7a6f03c is described below

commit 7a6f03cf16e50e3476fe0af28085f3ef27ed209f
Author: Darren Everley <60...@users.noreply.github.com>
AuthorDate: Tue Feb 22 10:07:57 2022 +0000

    feat: Dynamically determine ETS project number (#321)
---
 .../plc4x/java/knxnetip/ets5/Ets5Parser.java       | 34 +++++++++++++++++-----
 1 file changed, 27 insertions(+), 7 deletions(-)

diff --git a/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/ets5/Ets5Parser.java b/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/ets5/Ets5Parser.java
index deb6361..ae7be1d 100644
--- a/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/ets5/Ets5Parser.java
+++ b/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/ets5/Ets5Parser.java
@@ -19,6 +19,7 @@
 package org.apache.plc4x.java.knxnetip.ets5;
 
 import net.lingala.zip4j.ZipFile;
+import net.lingala.zip4j.exception.ZipException;
 import net.lingala.zip4j.model.FileHeader;
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
 import org.apache.plc4x.java.knxnetip.ets5.model.AddressType;
@@ -44,6 +45,8 @@ import java.nio.file.Path;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.TreeMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 public class Ets5Parser {
 
@@ -63,23 +66,24 @@ public class Ets5Parser {
                 ////////////////////////////////////////////////////////////////////////////////
                 Document projectHeaderDoc;
                 Document projectDoc;
-                FileHeader projectFileHeader = zipFile.getFileHeader("P-05CD/project.xml");
+                String projectNumber = this.getProjectNumber(zipFile);
+                FileHeader projectFileHeader = zipFile.getFileHeader(projectNumber + "/project.xml");
                 if (projectFileHeader == null) {
                     // This is the case of a knxproj file which is password-protected
-                    final FileHeader encryptedProjectFileHeader = zipFile.getFileHeader("P-05CD.zip");
+                    final FileHeader encryptedProjectFileHeader = zipFile.getFileHeader(projectNumber + ".zip");
                     if(encryptedProjectFileHeader == null) {
-                        throw new PlcRuntimeException("Error accessing project header file. Project file 'P-05CD/project.xml' and 'P-05CD.zip' don't exist.");
+                        throw new PlcRuntimeException(String.format("Error accessing project header file. Project file '%s/project.xml' and '%s.zip' don't exist.", projectNumber, projectNumber));
                     }
                     // Dump the encrypted zip to a temp file.
                     Path tempDir = Files.createTempDirectory(null);
-                    zipFile.extractFile("P-05CD.zip", tempDir.toFile().getAbsolutePath());
-                    File tempFile = new File(tempDir.toFile(), "P-05CD.zip");
+                    zipFile.extractFile(projectNumber + ".zip", tempDir.toFile().getAbsolutePath());
+                    File tempFile = new File(tempDir.toFile(), projectNumber + ".zip");
 
                     // Unzip the archive inside the archive.
                     try (ZipFile projectZipFile = new ZipFile(tempFile, password.toCharArray())) {
                         final FileHeader compressedProjectFileHeader = projectZipFile.getFileHeader("project.xml");
                         if (compressedProjectFileHeader == null) {
-                            throw new PlcRuntimeException("Error accessing project header file: Project file 'project.xml' inside 'P-05CD.zip'.");
+                            throw new PlcRuntimeException(String.format("Error accessing project header file: Project file 'project.xml' inside '%s.zip'.", projectNumber));
                         }
                         projectHeaderDoc = builder.parse(projectZipFile.getInputStream(compressedProjectFileHeader));
                         FileHeader projectFileFileHeader = projectZipFile.getFileHeader("0.xml");
@@ -90,7 +94,7 @@ public class Ets5Parser {
                     }
                 } else {
                     projectHeaderDoc = builder.parse(zipFile.getInputStream(projectFileHeader));
-                    FileHeader projectFileFileHeader = zipFile.getFileHeader("P-05CD/0.xml");
+                    FileHeader projectFileFileHeader = zipFile.getFileHeader(projectNumber + "/0.xml");
                     if (projectFileFileHeader == null) {
                         throw new PlcRuntimeException("Error accessing project file.");
                     }
@@ -210,4 +214,20 @@ public class Ets5Parser {
         throw new PlcRuntimeException("Unsupported GroupAddressStyle=" + knxprojValue);
     }
 
+    private String getProjectNumber(ZipFile zipFile) throws ZipException
+    {
+        // The following is defined within the KNX spec: Project Scheme 2.1 public documentation
+        //
+        // P-iiii/project.xml Created by user; contains the global data for project iiii (internal project ID, formatted as 4 hex digits).
+        Pattern pattern = Pattern.compile( "^P-[0-9A-F]{4}", Pattern.CASE_INSENSITIVE);
+        for ( var fileHeader : zipFile.getFileHeaders ( ) ) {
+            Matcher matcher = pattern.matcher(fileHeader.getFileName());
+            if (matcher.find()) {
+                return matcher.group();
+            }
+        }
+        
+        throw new PlcRuntimeException("Error determining project number.");
+    }
+
 }