Pull request #31: rename project and ruleSet

Merge in RED/redaction-report-service from RED-1329 to master

* commit 'b275e30062865af796b9685b946dc4ae9a2e82d9':
  rename project and ruleSet
This commit is contained in:
Timo Bejan 2021-05-31 14:00:23 +02:00
commit 0f236f4104
14 changed files with 47941 additions and 47 deletions

View File

@ -20,7 +20,9 @@ public class ReportRequestMessage {
private String downloadId;
private String projectId;
private String dossierId;
private String dossierTemplateId;
@Builder.Default
private List<String> fileIds = new ArrayList<>();

View File

@ -24,7 +24,7 @@
<dependency>
<groupId>com.iqser.red.service</groupId>
<artifactId>redaction-service-api-v1</artifactId>
<version>2.9.0</version>
<version>2.15.0</version>
<exclusions>
<exclusion>
<groupId>com.iqser.red.service</groupId>
@ -34,13 +34,17 @@
<groupId>com.iqser.red.service</groupId>
<artifactId>file-management-service-api-v1</artifactId>
</exclusion>
<exclusion>
<groupId>com.iqser.red.service</groupId>
<artifactId>configuration-service-api-v1</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.iqser.red.service</groupId>
<artifactId>configuration-service-api-v1</artifactId>
<version>2.8.0</version>
<version>2.11.0</version>
<exclusions>
<exclusion>
<groupId>com.iqser.red.service</groupId>
@ -57,7 +61,7 @@
<dependency>
<groupId>com.iqser.red.service</groupId>
<artifactId>file-management-service-api-v1</artifactId>
<version>2.21.0</version>
<version>2.25.0</version>
</dependency>
<dependency>

View File

@ -1,7 +1,7 @@
package com.iqser.red.service.redaction.report.v1.server;
import com.iqser.red.commons.spring.DefaultWebMvcConfiguration;
import com.iqser.red.service.redaction.report.v1.server.client.ProjectClient;
import com.iqser.red.service.redaction.report.v1.server.client.DossierClient;
import com.iqser.red.service.redaction.report.v1.server.configuration.MessagingConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration;
@ -14,7 +14,7 @@ import org.springframework.scheduling.annotation.EnableAsync;
@EnableAsync
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class})
@Import({DefaultWebMvcConfiguration.class, MessagingConfiguration.class})
@EnableFeignClients(basePackageClasses = {ProjectClient.class})
@EnableFeignClients(basePackageClasses = {DossierClient.class})
public class Application {
/**

View File

@ -0,0 +1,9 @@
package com.iqser.red.service.redaction.report.v1.server.client;
import com.iqser.red.service.file.management.v1.api.resources.DossierResource;
import org.springframework.cloud.openfeign.FeignClient;
@FeignClient(name = "DossierResource", url = "${file-management-service.url}")
public interface DossierClient extends DossierResource {
}

View File

@ -1,9 +0,0 @@
package com.iqser.red.service.redaction.report.v1.server.client;
import com.iqser.red.service.file.management.v1.api.resources.ProjectResource;
import org.springframework.cloud.openfeign.FeignClient;
@FeignClient(name = "ProjectResource", url = "${file-management-service.url}")
public interface ProjectClient extends ProjectResource {
}

View File

@ -2,12 +2,12 @@ package com.iqser.red.service.redaction.report.v1.server.service;
import com.iqser.red.service.configuration.v1.api.model.LegalBasisMapping;
import com.iqser.red.service.file.management.v1.api.model.FileStatus;
import com.iqser.red.service.file.management.v1.api.model.Project;
import com.iqser.red.service.file.management.v1.api.model.Dossier;
import com.iqser.red.service.redaction.report.v1.api.model.ReportRequestMessage;
import com.iqser.red.service.redaction.report.v1.api.model.ReportType;
import com.iqser.red.service.redaction.report.v1.api.model.StoredFileInformation;
import com.iqser.red.service.redaction.report.v1.server.client.FileStatusClient;
import com.iqser.red.service.redaction.report.v1.server.client.ProjectClient;
import com.iqser.red.service.redaction.report.v1.server.client.DossierClient;
import com.iqser.red.service.redaction.report.v1.server.model.ReportRedactionEntry;
import com.iqser.red.service.redaction.report.v1.server.storage.ReportStorageService;
import com.iqser.red.service.redaction.v1.model.RedactionLog;
@ -31,7 +31,7 @@ public class ReportGenerationService {
private final WordReportGenerationService wordReportGenerationService;
private final RedactionLogConverterService redactionLogConverterService;
private final FileStatusClient fileStatusClient;
private final ProjectClient projectClient;
private final DossierClient projectClient;
public List<StoredFileInformation> generateReport(ReportRequestMessage reportMessage) {
@ -47,15 +47,15 @@ public class ReportGenerationService {
List<StoredFileInformation> storedFileInformation = new ArrayList<>();
Project project = projectClient.getProjectById(reportMessage.getProjectId());
Dossier project = projectClient.getDossierById(reportMessage.getDossierId());
int i = 1;
for (String fileId : reportMessage.getFileIds()) {
FileStatus fileStatus = fileStatusClient.getFileStatus(reportMessage.getProjectId(), fileId);
FileStatus fileStatus = fileStatusClient.getFileStatus(reportMessage.getDossierId(), fileId);
long start = System.currentTimeMillis();
RedactionLog redactionLog = reportStorageService.getRedactionLog(reportMessage.getProjectId(), fileId);
RedactionLog redactionLog = reportStorageService.getRedactionLog(reportMessage.getDossierId(), fileId);
List<LegalBasisMapping> legalBasisMappings = redactionLog.getLegalBasis();
List<ReportRedactionEntry> reportEntries = redactionLogConverterService.convertAndSort(redactionLog, legalBasisMappings);
@ -71,20 +71,20 @@ public class ReportGenerationService {
}
for (String templateId : reportMessage.getTemplateIds()) {
byte[] template = wordReportGenerationService.generateReport(ReportType.WORD_SINGLE_FILE, reportEntries, redactionLog.getRuleSetId(), templateId, fileStatus, project);
byte[] template = wordReportGenerationService.generateReport(ReportType.WORD_SINGLE_FILE, reportEntries, reportMessage.getDossierTemplateId(), templateId, fileStatus, project);
String storageId = reportStorageService.storeObject(reportMessage.getDownloadId(), template);
storedFileInformation.add(new StoredFileInformation(fileId, storageId, ReportType.WORD_SINGLE_FILE, templateId));
}
if (reportMessage.getReportTypes().contains(ReportType.WORD_SINGLE_FILE_APPENDIX_A1_TEMPLATE)) {
byte[] wordEFSATemplate = wordReportGenerationService.generateReport(ReportType.WORD_SINGLE_FILE_APPENDIX_A1_TEMPLATE,
reportEntries, redactionLog.getRuleSetId(), null, fileStatus, project);
reportEntries, reportMessage.getDossierTemplateId(), null, fileStatus, project);
String storageId = reportStorageService.storeObject(reportMessage.getDownloadId(), wordEFSATemplate);
storedFileInformation.add(new StoredFileInformation(fileId, storageId, ReportType.WORD_SINGLE_FILE_APPENDIX_A1_TEMPLATE, null));
}
if (reportMessage.getReportTypes().contains(ReportType.WORD_SINGLE_FILE_APPENDIX_A2_TEMPLATE)) {
byte[] wordSyngentaTemplate = wordReportGenerationService.generateReport(ReportType.WORD_SINGLE_FILE_APPENDIX_A2_TEMPLATE,
reportEntries, redactionLog.getRuleSetId(), null, fileStatus, project);
reportEntries, reportMessage.getDossierTemplateId(), null, fileStatus, project);
String storageId = reportStorageService.storeObject(reportMessage.getDownloadId(), wordSyngentaTemplate);
storedFileInformation.add(new StoredFileInformation(fileId, storageId, ReportType.WORD_SINGLE_FILE_APPENDIX_A2_TEMPLATE, null));
}

View File

@ -2,7 +2,7 @@ package com.iqser.red.service.redaction.report.v1.server.service;
import com.iqser.red.service.configuration.v1.api.model.FileAttributesConfig;
import com.iqser.red.service.file.management.v1.api.model.FileStatus;
import com.iqser.red.service.file.management.v1.api.model.Project;
import com.iqser.red.service.file.management.v1.api.model.Dossier;
import com.iqser.red.service.file.management.v1.api.model.ReportTemplate;
import com.iqser.red.service.redaction.report.v1.api.model.ReportType;
import com.iqser.red.service.redaction.report.v1.server.client.FileAttributesClient;
@ -59,9 +59,9 @@ public class WordReportGenerationService {
}
public byte[] generateReport(ReportType reportType, List<ReportRedactionEntry> reportEntries, String ruleSetId, String templateId, FileStatus fileStatus, Project project) {
public byte[] generateReport(ReportType reportType, List<ReportRedactionEntry> reportEntries, String dossierTemplateId, String templateId, FileStatus fileStatus, Dossier project) {
List<String> placeholders = getDefaultPlaceholders();
Map<String, String> fileAttributePlaceholders = getFileAttributePlaceholders(ruleSetId);
Map<String, String> fileAttributePlaceholders = getFileAttributePlaceholders(dossierTemplateId);
placeholders.addAll(fileAttributePlaceholders.keySet());
byte[] template;
@ -71,7 +71,7 @@ public class WordReportGenerationService {
} else if (reportType.equals(ReportType.WORD_SINGLE_FILE_APPENDIX_A2_TEMPLATE)) {
template = appendixA2Template;
} else {
ReportTemplate reportTemplate= reportTemplateClient.getReportTemplate(ruleSetId, templateId);
ReportTemplate reportTemplate= reportTemplateClient.getReportTemplate(dossierTemplateId, templateId);
String storageId = reportTemplate.getStorageId();
template = reportStorageService.getReportTemplate(storageId);
}
@ -99,17 +99,17 @@ public class WordReportGenerationService {
return defPlaceholders;
}
private Map<String, String> getFileAttributePlaceholders(String ruleSetId) {
private Map<String, String> getFileAttributePlaceholders(String dossierTemplateId) {
Map<String, String> fileAttributePlaceholders = new HashMap<>();
FileAttributesConfig fileAttributesConfig = fileAttributesClient.getFileAttributes(ruleSetId);
FileAttributesConfig fileAttributesConfig = fileAttributesClient.getFileAttributes(dossierTemplateId);
fileAttributesConfig.getFileAttributeConfigs().forEach(fileAttributeConfig -> {
fileAttributePlaceholders.put(fileAttributeConfig.getPlaceholder(), fileAttributeConfig.getId());
});
return fileAttributePlaceholders;
}
private String getPlaceholderValue(String placeholder, Project project, FileStatus fileStatus, Map<String, String> fileAttributePlaceholders) {
private String getPlaceholderValue(String placeholder, Dossier project, FileStatus fileStatus, Map<String, String> fileAttributePlaceholders) {
if (placeholder.equals(FORMAT_DATE_ISO_PLACEHOLDER)) {
return OffsetDateTime.now().format(FORMAT_DATE_ISO);
}
@ -123,7 +123,7 @@ public class WordReportGenerationService {
return OffsetDateTime.now().format(FORMAT_TIME_ISO);
}
if (placeholder.equals(DOSSIER_NAME_PLACEHOLDER)) {
return project.getProjectName();
return project.getDossierName();
}
if (placeholder.equals(FILE_NAME_PLACEHOLDER)) {
return fileStatus.getFilename();
@ -269,4 +269,4 @@ public class WordReportGenerationService {
}
}
}
}

View File

@ -20,9 +20,9 @@ public class ReportStorageService {
private final ObjectMapper objectMapper;
public RedactionLog getRedactionLog(String projectId, String fileId) {
public RedactionLog getRedactionLog(String dossierId, String fileId) {
var redactionLog = storageService.getObject(StorageIdUtils.getRedactionLogStorageId(projectId, fileId));
var redactionLog = storageService.getObject(StorageIdUtils.getRedactionLogStorageId(dossierId, fileId));
try {
return objectMapper.readValue(redactionLog.getInputStream(), RedactionLog.class);
} catch (IOException e) {

View File

@ -2,9 +2,9 @@ package com.iqser.red.service.redaction.report.v1.server.storage;
public class StorageIdUtils {
public static String getRedactionLogStorageId(String projectId, String fileId) {
public static String getRedactionLogStorageId(String dossierId, String fileId) {
return projectId + "/" + fileId + ".REDACTION_LOG.json";
return dossierId + "/" + fileId + ".REDACTION_LOG.json";
}

View File

@ -6,9 +6,9 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.iqser.red.service.configuration.v1.api.model.FileAttributeConfig;
import com.iqser.red.service.configuration.v1.api.model.FileAttributesConfig;
import com.iqser.red.service.configuration.v1.api.model.LegalBasisMapping;
import com.iqser.red.service.file.management.v1.api.model.Dossier;
import com.iqser.red.service.file.management.v1.api.model.FileAttributes;
import com.iqser.red.service.file.management.v1.api.model.FileStatus;
import com.iqser.red.service.file.management.v1.api.model.Project;
import com.iqser.red.service.file.management.v1.api.model.ReportTemplate;
import com.iqser.red.service.redaction.report.v1.api.model.ReportType;
import com.iqser.red.service.redaction.report.v1.server.client.FileAttributesClient;
@ -78,6 +78,8 @@ public class RedactionReportIntegrationTest {
@Test
public void testWordReportGeneration() throws IOException {
String dossierTemplateId = "dossierTemplateId";
ClassPathResource redactionLogResource = new ClassPathResource("files/redactionLog.json");
RedactionLog redactionLog = objectMapper.readValue(redactionLogResource.getInputStream(), RedactionLog.class);
@ -93,7 +95,7 @@ public class RedactionReportIntegrationTest {
List<FileAttributeConfig> fileAttributeConfigs = new ArrayList<>();
fileAttributeConfigs.add(new FileAttributeConfig("3e9b9569-5d2e-4619-848b-dd0a3e96527f", "", "Document Title", true, true, FileAttributeConfig.FileAttributeType.TEXT, "{{file.attribute.placeholder}}"));
FileAttributesConfig fileAttributesConfig = new FileAttributesConfig("", "", fileAttributeConfigs);
when(fileAttributesClient.getFileAttributes(redactionLog.getRuleSetId())).thenReturn(fileAttributesConfig);
when(fileAttributesClient.getFileAttributes(dossierTemplateId)).thenReturn(fileAttributesConfig);
Map<String, String> attributeIdToValue = new HashMap();
attributeIdToValue.put("3e9b9569-5d2e-4619-848b-dd0a3e96527f", "Test");
@ -101,16 +103,16 @@ public class RedactionReportIntegrationTest {
FileAttributes fileAttributes = new FileAttributes(attributeIdToValue);
FileStatus fileStatus = FileStatus.builder().filename("filename").fileAttributes(fileAttributes).build();
Project project = Project.builder().projectId("projectId").projectName("projectName").build();
Dossier project = Dossier.builder().dossierId("dossierId").dossierName("projectName").build();
String templateId = "templateId";
String storageId = "storageId";
when(reportTemplateClient.getReportTemplate(redactionLog.getRuleSetId(), templateId)).thenReturn(ReportTemplate.builder().storageId(storageId).build());
when(reportTemplateClient.getReportTemplate(dossierTemplateId, templateId)).thenReturn(ReportTemplate.builder().dossierTemplateId(dossierTemplateId).storageId(storageId).build());
ClassPathResource templateResource = new ClassPathResource("templates/TEST_TEMPLATE.docx");
when(reportStorageService.getReportTemplate(storageId)).thenReturn(IOUtils.toByteArray(templateResource.getInputStream()));
byte[] report = wordReportGenerationService.generateReport(ReportType.WORD_SINGLE_FILE, reportEntries, redactionLog
.getRuleSetId(), templateId, fileStatus, project);
byte[] report = wordReportGenerationService.generateReport(ReportType.WORD_SINGLE_FILE, reportEntries, dossierTemplateId
, templateId, fileStatus, project);
try (FileOutputStream fileOutputStream = new FileOutputStream("/tmp/efsa_template.docx")) {
fileOutputStream.write(report);
@ -121,7 +123,7 @@ public class RedactionReportIntegrationTest {
@Test
public void testExcelReportGeneration() throws IOException {
ClassPathResource redactionLogResource = new ClassPathResource("files/RedactedLog.txt");
ClassPathResource redactionLogResource = new ClassPathResource("files/excelReportRedactionLog.json");
RedactionLog redactionLog = objectMapper.readValue(redactionLogResource.getInputStream(), RedactionLog.class);

View File

@ -0,0 +1,348 @@
{
"redactionLogEntry": [
{
"id": "ba922aabe15e334569dc06b212b3a15b",
"type": "address",
"value": "regina.dorn@syngenta.com",
"reason": "Applicant information was found",
"matchedRule": 6,
"legalBasis": "Reg (EC) No 1107/2009 Art. 63 (2g)",
"redacted": true,
"section": "B.1 Identity",
"color": [
0.0,
1.0,
1.0
],
"positions": [
{
"topLeft": {
"x": 147.86,
"y": 517.43
},
"width": 122.451065,
"height": 11.017679,
"page": 4
}
],
"sectionNumber": 13,
"manual": false,
"status": null,
"manualRedactionType": null,
"hint": false
},
{
"id": "b841bb2734863a14e95cb15efdf98172",
"type": "address",
"value": "+41 (61) 323 6358",
"reason": "Applicant information was found",
"matchedRule": 6,
"legalBasis": "Reg (EC) No 1107/2009 Art. 63 (2g)",
"redacted": true,
"section": "B.1 Identity",
"color": [
0.0,
1.0,
1.0
],
"positions": [
{
"topLeft": {
"x": 147.86,
"y": 542.75
},
"width": 83.41362,
"height": 11.017679,
"page": 4
}
],
"sectionNumber": 13,
"manual": false,
"status": null,
"manualRedactionType": null,
"hint": false
},
{
"id": "d39269482f83c64453153826d8de0a5f",
"type": "address",
"value": "Patrick Gardinal",
"reason": "Producer was found",
"matchedRule": 7,
"legalBasis": "Reg (EC) No 1107/2009 Art. 63 (2g)",
"redacted": true,
"section": "B.1.1.2 Producer of the plant protection product",
"color": [
0.0,
1.0,
1.0
],
"positions": [
{
"topLeft": {
"x": 148.94,
"y": 404.39
},
"width": 73.40033,
"height": 11.017679,
"page": 4
}
],
"sectionNumber": 14,
"manual": false,
"status": null,
"manualRedactionType": null,
"hint": false
},
{
"id": "9ddda875972c0fbcda02ae551cd0d07a",
"type": "address",
"value": "+41 (0) 61 323 60 51",
"reason": "Producer was found",
"matchedRule": 7,
"legalBasis": "Reg (EC) No 1107/2009 Art. 63 (2g)",
"redacted": true,
"section": "B.1.1.2 Producer of the plant protection product",
"color": [
0.0,
1.0,
1.0
],
"positions": [
{
"topLeft": {
"x": 148.94,
"y": 328.53
},
"width": 94.33217,
"height": 11.017679,
"page": 4
}
],
"sectionNumber": 14,
"manual": false,
"status": null,
"manualRedactionType": null,
"hint": false
},
{
"id": "9e289c70c17cb2b3bf7c96b070d44533",
"type": "address",
"value": "patrick.gardinal@syngenta.com",
"reason": "Producer was found",
"matchedRule": 7,
"legalBasis": "Reg (EC) No 1107/2009 Art. 63 (2g)",
"redacted": true,
"section": "B.1.1.2 Producer of the plant protection product",
"color": [
0.0,
1.0,
1.0
],
"positions": [
{
"topLeft": {
"x": 148.94,
"y": 303.21002
},
"width": 141.26324,
"height": 11.017679,
"page": 4
}
],
"sectionNumber": 14,
"manual": false,
"status": null,
"manualRedactionType": null,
"hint": false
},
{
"id": "10a4893ec30e268c951b8026e0dc3e11",
"type": "address",
"value": "Syngenta Crop Protection AG",
"reason": "Applicant information was found",
"matchedRule": 6,
"legalBasis": "Reg (EC) No 1107/2009 Art. 63 (2g)",
"redacted": true,
"section": "B.1 Identity",
"color": [
0.0,
1.0,
1.0
],
"positions": [
{
"topLeft": {
"x": 147.86,
"y": 631.34
},
"width": 133.3113,
"height": 11.017679,
"page": 4
}
],
"sectionNumber": 13,
"manual": false,
"status": null,
"manualRedactionType": null,
"hint": false
},
{
"id": "86b754bc4e70f45038b465a66c0e927b",
"type": "address",
"value": "Regina Dorn",
"reason": "Applicant information was found",
"matchedRule": 6,
"legalBasis": "Reg (EC) No 1107/2009 Art. 63 (2g)",
"redacted": true,
"section": "B.1 Identity",
"color": [
0.0,
1.0,
1.0
],
"positions": [
{
"topLeft": {
"x": 147.86,
"y": 555.47
},
"width": 57.624176,
"height": 11.017679,
"page": 4
}
],
"sectionNumber": 13,
"manual": false,
"status": null,
"manualRedactionType": null,
"hint": false
},
{
"id": "fd367ab592da09165d1bcd52cfddaf68",
"type": "address",
"value": "Syngenta Crop Protection AG",
"reason": "Producer was found",
"matchedRule": 7,
"legalBasis": "Reg (EC) No 1107/2009 Art. 63 (2g)",
"redacted": true,
"section": "B.1.1.2 Producer of the plant protection product",
"color": [
0.0,
1.0,
1.0
],
"positions": [
{
"topLeft": {
"x": 148.94,
"y": 455.03
},
"width": 133.34088,
"height": 11.017679,
"page": 4
}
],
"sectionNumber": 14,
"manual": false,
"status": null,
"manualRedactionType": null,
"hint": false
},
{
"id": "3ae8841f1e9a6e022af1880aaa2853ef",
"type": "address",
"value": "Syngenta Crop Protection AG",
"reason": "Producer was found",
"matchedRule": 7,
"legalBasis": "Reg (EC) No 1107/2009 Art. 63 (2g)",
"redacted": true,
"section": "B.1.1.2 Producer of the plant protection product",
"color": [
0.0,
1.0,
1.0
],
"positions": [
{
"topLeft": {
"x": 148.94,
"y": 391.77
},
"width": 133.23718,
"height": 11.017679,
"page": 4
}
],
"sectionNumber": 14,
"manual": false,
"status": null,
"manualRedactionType": null,
"hint": false
},
{
"id": "027e744e97c8c1cecb974023f8792055",
"type": "address",
"value": "+41 (61) 323 6155",
"reason": "Applicant information was found",
"matchedRule": 6,
"legalBasis": "Reg (EC) No 1107/2009 Art. 63 (2g)",
"redacted": true,
"section": "B.1 Identity",
"color": [
0.0,
1.0,
1.0
],
"positions": [
{
"topLeft": {
"x": 147.86,
"y": 530.15
},
"width": 83.41362,
"height": 11.017679,
"page": 4
}
],
"sectionNumber": 13,
"manual": false,
"status": null,
"manualRedactionType": null,
"hint": false
},
{
"id": "a022f9ecad5b06f9da7bc2ebdcc97c17",
"type": "address",
"value": "+41 (0) 61 323 61 55",
"reason": "Producer was found",
"matchedRule": 7,
"legalBasis": "Reg (EC) No 1107/2009 Art. 63 (2g)",
"redacted": true,
"section": "B.1.1.2 Producer of the plant protection product",
"color": [
0.0,
1.0,
1.0
],
"positions": [
{
"topLeft": {
"x": 148.94,
"y": 315.81
},
"width": 94.33217,
"height": 11.017679,
"page": 4
}
],
"sectionNumber": 14,
"manual": false,
"status": null,
"manualRedactionType": null,
"hint": false
}
],
"dictionaryVersion": 0,
"rulesVersion": 0,
"filename": null
}

View File

@ -1 +1,42 @@
[{"name":"1. personal data (incl. geolocation)","description":"any other personal data except for\n a. the name and address of the applicant;\n b. the names of authors of published or publicly available studies supporting such requests; and the names of all participants and observers in meetings of the Scientific Committee and the Scientific Panels, their working groups and any other ad hoc group meeting on the subject matter.\nand except for personal data (names and addresses) of individuals involved in testing on vertebrate studies or in obtaining toxicological information","reason":"Article 39(e)(1) and Article 39(e)(2) of Regulation (EC) No 178/2002"},{"name":"2. manufacturing or production process","description":"the manufacturing or production process, including the method and innovative aspects thereof, as well as other technical and industrial specifications inherent to that process or method, except for information which is relevant to the assessment of safety","reason":"Article 63(2)(a) of Regulation (EC) No 1107/2009 (making reference to Article 39 of Regulation EC No 178/2002)"},{"name":"3. links between a producer and applicant","description":"commercial links between a producer or importer and the applicant or the authorisation holder, where applicable;","reason":"Article 63(2)(a) of Regulation (EC) No 1107/2009 (making reference to Article 39 of Regulation EC No 178/2002)"},{"name":"4. commercial information","description":"commercial information revealing sourcing, market shares or business strategy of the applicant","reason":"Article 63(2)(a) of Regulation (EC) No 1107/2009 (making reference to Article 39 of Regulation EC No 178/2002)"},{"name":"5. quantitative composition","description":"quantitative composition of the subject matter of the request, except for information which is relevant to the assessment of safety","reason":"Article 63(2)(a) of Regulation (EC) No 1107/2009 (making reference to Article 39 of Regulation EC No 178/2002)"},{"name":"6. specification of impurity","description":"the specification of impurity of the active substance and the related methods of analysis for impurities in the active substance as manufactured, except for the impurities that are considered to be toxicologically, ecotoxicologically or environmentally relevant and the related methods of analysis for such impurities","reason":"Article 63(2)(b) of Regulation (EC) No 1107/2009"},{"name":"7. results of production batches","description":"results of production batches of the active substance including impurities","reason":"Article 63(2)(c) of Regulation (EC) No 1107/2009"},{"name":"8. composition of a plant protection product","description":"information on the complete composition of a plant protection product","reason":"Article 63(2)(d) of Regulation (EC) No 1107/2009"}]
[
{
"name": "1. personal data (incl. geolocation)",
"description": "any other personal data except for\n a. the name and address of the applicant;\n b. the names of authors of published or publicly available studies supporting such requests; and the names of all participants and observers in meetings of the Scientific Committee and the Scientific Panels, their working groups and any other ad hoc group meeting on the subject matter.\nand except for personal data (names and addresses) of individuals involved in testing on vertebrate studies or in obtaining toxicological information",
"reason": "Article 39(e)(1) and Article 39(e)(2) of Regulation (EC) No 178/2002"
},
{
"name": "2. manufacturing or production process",
"description": "the manufacturing or production process, including the method and innovative aspects thereof, as well as other technical and industrial specifications inherent to that process or method, except for information which is relevant to the assessment of safety",
"reason": "Article 63(2)(a) of Regulation (EC) No 1107/2009 (making reference to Article 39 of Regulation EC No 178/2002)"
},
{
"name": "3. links between a producer and applicant",
"description": "commercial links between a producer or importer and the applicant or the authorisation holder, where applicable;",
"reason": "Article 63(2)(a) of Regulation (EC) No 1107/2009 (making reference to Article 39 of Regulation EC No 178/2002)"
},
{
"name": "4. commercial information",
"description": "commercial information revealing sourcing, market shares or business strategy of the applicant",
"reason": "Article 63(2)(a) of Regulation (EC) No 1107/2009 (making reference to Article 39 of Regulation EC No 178/2002)"
},
{
"name": "5. quantitative composition",
"description": "quantitative composition of the subject matter of the request, except for information which is relevant to the assessment of safety",
"reason": "Article 63(2)(a) of Regulation (EC) No 1107/2009 (making reference to Article 39 of Regulation EC No 178/2002)"
},
{
"name": "6. specification of impurity",
"description": "the specification of impurity of the active substance and the related methods of analysis for impurities in the active substance as manufactured, except for the impurities that are considered to be toxicologically, ecotoxicologically or environmentally relevant and the related methods of analysis for such impurities",
"reason": "Article 63(2)(b) of Regulation (EC) No 1107/2009"
},
{
"name": "7. results of production batches",
"description": "results of production batches of the active substance including impurities",
"reason": "Article 63(2)(c) of Regulation (EC) No 1107/2009"
},
{
"name": "8. composition of a plant protection product",
"description": "information on the complete composition of a plant protection product",
"reason": "Article 63(2)(d) of Regulation (EC) No 1107/2009"
}
]