diff --git a/dmp-backend/web/src/main/java/eu/eudat/document/DocxDocumentBuilderAdapter.java b/dmp-backend/web/src/main/java/eu/eudat/document/DocxDocumentBuilderAdapter.java new file mode 100644 index 000000000..a302e05ba --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/document/DocxDocumentBuilderAdapter.java @@ -0,0 +1,38 @@ +package eu.eudat.document; + +import org.apache.poi.ooxml.POIXMLDocument; +import org.apache.poi.ooxml.POIXMLDocumentPart; +import org.apache.poi.openxml4j.exceptions.OpenXML4JException; +import org.apache.poi.openxml4j.opc.OPCPackage; +import org.apache.poi.openxml4j.opc.PackagePart; +import org.apache.poi.xwpf.usermodel.*; +import org.apache.xmlbeans.XmlCursor; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc; + +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +/** + * Created by ikalyvas on 10/17/2018. + */ +public class DocxDocumentBuilderAdapter extends XWPFDocument { + + public DocxDocumentBuilderAdapter(OPCPackage pkg) throws IOException { + super(pkg); + } + + public DocxDocumentBuilderAdapter(InputStream is) throws IOException { + super(is); + } + + public DocxDocumentBuilderAdapter() { + } + + @Override + public void createTOC() { + super.createTOC(); + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DocumentManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DocumentManager.java new file mode 100644 index 000000000..aa55c92f5 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DocumentManager.java @@ -0,0 +1,141 @@ +package eu.eudat.logic.managers; + +import eu.eudat.data.dao.entities.DatasetDao; +import eu.eudat.logic.services.forms.VisibilityRuleService; +import eu.eudat.logic.utilities.documents.helpers.FileEnvelope; +import eu.eudat.logic.utilities.documents.word.WordBuilder; +import eu.eudat.logic.utilities.documents.xml.ExportXmlBuilder; +import eu.eudat.models.HintedModelFactory; +import eu.eudat.models.data.datasetwizard.DatasetWizardModel; +import eu.eudat.models.data.user.composite.PagedDatasetProfile; +import org.apache.commons.io.IOUtils; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.json.JSONObject; +import org.springframework.core.env.Environment; +import org.springframework.core.io.FileSystemResource; +import org.springframework.http.*; +import org.springframework.http.converter.ByteArrayHttpMessageConverter; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.web.client.RestTemplate; + +import java.io.*; +import java.net.URL; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +/** + * Created by ikalyvas on 10/16/2018. + */ +public class DocumentManager { + public File getWordDocument(Environment environment, DatasetDao datatasetRepository, String id, VisibilityRuleService visibilityRuleService) throws InstantiationException, IllegalAccessException, IOException { + WordBuilder wordBuilder = new WordBuilder(); + DatasetWizardModel dataset = new DatasetWizardModel(); + String fileUrl = environment.getProperty("configuration.h2020template"); + InputStream is = new URL(Paths.get(fileUrl).toUri().toURL().toString()).openStream(); + XWPFDocument document = new XWPFDocument(is); + eu.eudat.data.entities.Dataset datasetEntity = datatasetRepository.find(UUID.fromString(id), HintedModelFactory.getHint(DatasetWizardModel.class)); + Map properties = new HashMap<>(); + if (datasetEntity.getProperties() != null) { + JSONObject jobject = new JSONObject(datasetEntity.getProperties()); + properties = jobject.toMap(); + } + PagedDatasetProfile pagedDatasetProfile = new DatasetManager().getPagedProfile(dataset, datasetEntity); + visibilityRuleService.setProperties(properties); + visibilityRuleService.buildVisibilityContext(pagedDatasetProfile.getRules()); + wordBuilder.build(document, pagedDatasetProfile, visibilityRuleService); + File exportFile = new File(dataset.getLabel() + ".docx"); + FileOutputStream out = new FileOutputStream(exportFile); + document.write(out); + out.close(); + return exportFile; + } + + public FileEnvelope getXmlDocument(eu.eudat.data.entities.Dataset datasetEntity, String id, VisibilityRuleService visibilityRuleService) throws InstantiationException, IllegalAccessException, IOException { + ExportXmlBuilder xmlBuilder = new ExportXmlBuilder(); + DatasetWizardModel dataset = new DatasetWizardModel(); + Map properties = new HashMap<>(); + if (datasetEntity.getProperties() != null) { + JSONObject jobject = new JSONObject(datasetEntity.getProperties()); + properties = jobject.toMap(); + } + PagedDatasetProfile pagedDatasetProfile = new DatasetManager().getPagedProfile(dataset, datasetEntity); + visibilityRuleService.setProperties(properties); + visibilityRuleService.buildVisibilityContext(pagedDatasetProfile.getRules()); + File file = xmlBuilder.build(pagedDatasetProfile, visibilityRuleService); + FileEnvelope fileEnvelope = new FileEnvelope(); + fileEnvelope.setFile(file); + fileEnvelope.setFilename(datasetEntity.getLabel()); + return fileEnvelope; + } + + public File convertToPDF(File file, Environment environment, String label) throws IOException, InterruptedException { + LinkedMultiValueMap map = new LinkedMultiValueMap<>(); + map.add("file", new FileSystemResource(file)); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.MULTIPART_FORM_DATA); + headers.add("Content-disposition", "attachment; filename=" + label + ".docx"); + + headers.add("Content-type", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"); + + HttpEntity> requestEntity = new HttpEntity>( + map, headers); + + Map queueResult = new RestTemplate().postForObject( + environment.getProperty("pdf.converter.url") + + "api/v1/", requestEntity, Map.class); + + Map mediaResult = new RestTemplate().getForObject(environment.getProperty("pdf.converter.url") + + "/api/v1/" + queueResult.get("id"), Map.class); + System.out.println("Status: " + mediaResult.get("status")); + while (!mediaResult.get("status").equals("finished")) { + Thread.sleep(500); + mediaResult = new RestTemplate().getForObject(environment.getProperty("pdf.converter.url") + + "api/v1/" + queueResult.get("id"), Map.class); + System.out.println("Polling"); + } + RestTemplate restTemplate = new RestTemplate(); + restTemplate.getMessageConverters().add(new ByteArrayHttpMessageConverter()); + HttpHeaders headers2 = new HttpHeaders(); + headers.setAccept(Arrays.asList(MediaType.APPLICATION_OCTET_STREAM)); + HttpEntity entity = new HttpEntity(headers2); + + ResponseEntity response = restTemplate.exchange(environment.getProperty("pdf.converter.url") + + mediaResult.get("result_url"), HttpMethod.GET, entity, byte[].class, "1"); + + UUID uuid = UUID.randomUUID(); + File zip = new File(uuid + ".zip"); + if (response.getStatusCode().equals(HttpStatus.OK)) { + FileOutputStream output = new FileOutputStream(zip); + IOUtils.write(response.getBody(), output); + } + return extractFromZip(zip, label + ".pdf"); + } + + private File extractFromZip(File file, String filename) throws IOException { + byte[] buffer = new byte[1024]; + File newFile = new File(filename); + ZipInputStream zis = new ZipInputStream(new FileInputStream(file)); + ZipEntry zipEntry = zis.getNextEntry(); + while (zipEntry != null) { + String zippedFileName = zipEntry.getName(); + if (zippedFileName.equals("pdf")) { + + FileOutputStream fos = new FileOutputStream(newFile); + int len; + while ((len = zis.read(buffer)) > 0) { + fos.write(buffer, 0, len); + } + fos.close(); + zipEntry = zis.getNextEntry(); + } + } + zis.closeEntry(); + zis.close(); + return newFile; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/UserManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/UserManager.java index 27c0c06be..cc237a29d 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/UserManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/UserManager.java @@ -10,6 +10,7 @@ import eu.eudat.logic.builders.model.models.DataTableDataBuilder; import eu.eudat.logic.services.ApiContext; import eu.eudat.logic.services.operations.AuthenticationServiceImpl; import eu.eudat.logic.utilities.builders.XmlBuilder; +import eu.eudat.models.HintedModelFactory; import eu.eudat.models.data.dmp.DataManagementPlan; import eu.eudat.models.data.helpers.common.DataTableData; import eu.eudat.models.data.login.Credentials; @@ -41,7 +42,7 @@ public class UserManager { } public static DataTableData getPaged(ApiContext apiContext, UserInfoTableRequestItem userInfoTableRequestItem) throws Exception { - QueryableList users = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().getWithCriteria(userInfoTableRequestItem.getCriteria()); + QueryableList users = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().getWithCriteria(userInfoTableRequestItem.getCriteria()).withHint(HintedModelFactory.getHint(UserListingModel.class)); QueryableList pagedUsers = PaginationManager.applyPaging(users, userInfoTableRequestItem); List modelUsers = pagedUsers.select(item -> new UserListingModel().fromDataModel(item)); diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/entities/xmlmodels/datasetprofiledefinition/Field.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/entities/xmlmodels/datasetprofiledefinition/Field.java index 7e7e9aa55..ce530fbc9 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/entities/xmlmodels/datasetprofiledefinition/Field.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/entities/xmlmodels/datasetprofiledefinition/Field.java @@ -18,6 +18,7 @@ import java.util.List; public class Field implements DatabaseViewStyleDefinition, XmlSerializable { private String id; private int ordinal; + private String numbering; private ViewStyle viewStyle; private DefaultValue defaultValue; private Visibility visible; @@ -80,6 +81,14 @@ public class Field implements DatabaseViewStyleDefinition, XmlSerializable fields; + private String numbering; private String title; private String description; private String extendedDescription; @@ -94,6 +95,14 @@ public class FieldSet implements DatabaseViewStyleDefinition, XmlSerializable { Element sections = doc.createElement("sections"); Element pages = doc.createElement("pages"); for (Section section : this.sections) { + section.setNumbering("" + (this.sections.indexOf(section) + 1)); sections.appendChild(section.toXml(doc)); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/user/components/datasetprofile/Field.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/user/components/datasetprofile/Field.java index 2624c2e31..6c7e2c636 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/user/components/datasetprofile/Field.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/user/components/datasetprofile/Field.java @@ -20,6 +20,7 @@ public class Field implements Comparable, PropertiesModelBuilder, ViewStyleDefin private String value; private ViewStyle viewStyle; private String datatype; + private String numbering; private int page; private DefaultValue defaultValue; private Multiplicity multiplicity; @@ -128,6 +129,13 @@ public class Field implements Comparable, PropertiesModelBuilder, ViewStyleDefin this.validations = eu.eudat.models.data.admin.components.datasetprofile.Field.ValidationType.fromIntegers(validations); } + public String getNumbering() { + return numbering; + } + + public void setNumbering(String numbering) { + this.numbering = numbering; + } public Field cloneForMultiplicity(String key, Map properties) { Field newField = new Field(); @@ -160,6 +168,7 @@ public class Field implements Comparable, PropertiesModelBuilder, ViewStyleDefin this.id = item.getId(); this.ordinal = item.getOrdinal(); this.viewStyle = item.getViewStyle(); + this.numbering = item.getNumbering(); this.data = item.getData(); this.defaultValue = item.getDefaultValue(); this.visible = item.getVisible(); diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/user/components/datasetprofile/FieldSet.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/user/components/datasetprofile/FieldSet.java index 32e44adf4..d3a60acba 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/user/components/datasetprofile/FieldSet.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/user/components/datasetprofile/FieldSet.java @@ -13,6 +13,7 @@ public class FieldSet implements Comparable, PropertiesModelBuilder, ViewStyleDe private String id; private Integer ordinal; private String title; + private String numbering; private String description; private String extendedDescription; private Multiplicity multiplicity; @@ -83,6 +84,14 @@ public class FieldSet implements Comparable, PropertiesModelBuilder, ViewStyleDe return multiplicityItems; } + public String getNumbering() { + return numbering; + } + + public void setNumbering(String numbering) { + this.numbering = numbering; + } + public void setMultiplicityItems(List
multiplicityItems) { this.multiplicityItems = multiplicityItems; } @@ -126,6 +135,7 @@ public class FieldSet implements Comparable, PropertiesModelBuilder, ViewStyleDe this.ordinal = item.getOrdinal(); this.title = item.getTitle(); this.description = item.getDescription(); + this.numbering = item.getNumbering(); this.extendedDescription = item.getExtendedDescription(); this.hasCommentField = item.getHasCommentField(); this.multiplicity = item.getMultiplicity(); diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/user/components/datasetprofile/Section.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/user/components/datasetprofile/Section.java index a1559be83..72d61ac75 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/user/components/datasetprofile/Section.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/user/components/datasetprofile/Section.java @@ -13,6 +13,7 @@ public class Section implements Comparable, ViewStyleDefinition sections; private List
compositeFields; private Boolean defaultVisibility; + private String numbering; private String page; private Integer ordinal; private String id; @@ -85,6 +86,14 @@ public class Section implements Comparable, ViewStyleDefinition implements Validator { @Override public void validate(Object target, Errors errors) { List validatorResults = new LinkedList<>(); - this.fluentValidatorBuilders.forEach(x-> validatorResults.addAll(x.validate(target))); - validatorResults.forEach(x-> errors.rejectValue(x.getField(),x.getError())); + //this.fluentValidatorBuilders.forEach(x-> validatorResults.addAll(x.validate(target))); + //validatorResults.forEach(x-> errors.rejectValue(x.getField(),x.getError())); } } diff --git a/dmp-frontend/src/app/dataset-profile-form/form/form.component.html b/dmp-frontend/src/app/dataset-profile-form/form/form.component.html index 671172935..9b6d4504d 100644 --- a/dmp-frontend/src/app/dataset-profile-form/form/form.component.html +++ b/dmp-frontend/src/app/dataset-profile-form/form/form.component.html @@ -1,6 +1,6 @@ 
- + {{'GENERAL.VALIDATION.REQUIRED' | translate}} @@ -25,7 +25,7 @@
@@ -50,11 +50,11 @@
- - + + diff --git a/dmp-frontend/src/app/dataset-profile-form/form/form.component.ts b/dmp-frontend/src/app/dataset-profile-form/form/form.component.ts index 80b9a9286..f7c457485 100644 --- a/dmp-frontend/src/app/dataset-profile-form/form/form.component.ts +++ b/dmp-frontend/src/app/dataset-profile-form/form/form.component.ts @@ -97,11 +97,11 @@ export class FormComponent implements OnInit { if (this.profileID) { this.updateForm(this.profileID, data).subscribe(() => { - this.router.navigate(['/datasetsProfiles']); + this.router.navigate(['/dataset-profile']); }); } else { this.createForm(data).subscribe(() => { - this.router.navigate(['/datasetsProfiles']); + this.router.navigate(['/dataset-profile']); }); } } diff --git a/dmp-frontend/src/app/form/dynamic-form-composite-field/dynamic-form-composite-field.html b/dmp-frontend/src/app/form/dynamic-form-composite-field/dynamic-form-composite-field.html index e89c495e8..07308a56e 100644 --- a/dmp-frontend/src/app/form/dynamic-form-composite-field/dynamic-form-composite-field.html +++ b/dmp-frontend/src/app/form/dynamic-form-composite-field/dynamic-form-composite-field.html @@ -1,7 +1,7 @@
-
{{compositeField.title}}
+
{{compositeField.numbering}} {{compositeField.title}}
{{compositeField.description}}
@@ -13,7 +13,7 @@
-
{{compositeField.title}}
+
{{compositeField.numbering}}{{compositeField.title}}
{{compositeField.description}}
diff --git a/dmp-frontend/src/app/form/dynamic-form-section/dynamic-form-section.html b/dmp-frontend/src/app/form/dynamic-form-section/dynamic-form-section.html index f0f552a98..2fe0d2b74 100644 --- a/dmp-frontend/src/app/form/dynamic-form-section/dynamic-form-section.html +++ b/dmp-frontend/src/app/form/dynamic-form-section/dynamic-form-section.html @@ -3,7 +3,7 @@ - {{path}} {{section.title}} + {{section.numbering}} {{section.title}}

{{section.description}}

diff --git a/dmp-frontend/src/app/models/CompositeField.ts b/dmp-frontend/src/app/models/CompositeField.ts index dc0f2dd7a..b255b4255 100644 --- a/dmp-frontend/src/app/models/CompositeField.ts +++ b/dmp-frontend/src/app/models/CompositeField.ts @@ -8,6 +8,7 @@ export class CompositeField extends BaseModel implements Serializable = new Array(); public ordinal: number; public id: string; + public numbering: string; public multiplicity: Multiplicity; public multiplicityItems: Array = new Array(); public title: string; @@ -22,6 +23,7 @@ export class CompositeField extends BaseModel implements Serializable, FormGenerat public value: any; public defaultValue: DefaultValue; public description: string; + public numbering: string; public extendedDescription: string; public viewStyle: ViewStyle; public defaultVisibility: boolean; @@ -29,6 +30,7 @@ export class Field extends BaseModel implements Serializable, FormGenerat this.id = item.id; this.title = item.title; //this.value = item.value; + this.numbering = item.numbering; this.description = item.description; this.extendedDescription = item.extendedDescription; this.viewStyle = item.viewStyle; diff --git a/dmp-frontend/src/app/models/Section.ts b/dmp-frontend/src/app/models/Section.ts index b63a0e39e..78eaea261 100644 --- a/dmp-frontend/src/app/models/Section.ts +++ b/dmp-frontend/src/app/models/Section.ts @@ -11,6 +11,7 @@ export class Section extends BaseModel implements Serializable
, FormGen //public fieldGroups: Array; public defaultVisibility: boolean; public page: number; + public numbering: string; public ordinal: number; public id: string; public title: string; @@ -22,6 +23,7 @@ export class Section extends BaseModel implements Serializable
, FormGen //this.fieldGroups = new JsonSerializer().fromJSONArray(item.fieldGroups, FieldGroup); this.page = item.page; this.defaultVisibility = item.defaultVisibility; + this.numbering = item.numbering; this.id = item.id; this.title = item.title; this.ordinal = item.ordinal; diff --git a/dmp-frontend/src/app/services/data-management-plan/data-management-plan.service.ts b/dmp-frontend/src/app/services/data-management-plan/data-management-plan.service.ts index f6f79ebf3..ff3acde06 100644 --- a/dmp-frontend/src/app/services/data-management-plan/data-management-plan.service.ts +++ b/dmp-frontend/src/app/services/data-management-plan/data-management-plan.service.ts @@ -9,9 +9,9 @@ import { DataTableData } from '../../models/data-table/DataTableData'; import { DataManagementPlanModel } from '../../models/data-managemnt-plans/DataManagementPlanModel'; import { DataManagementPlanListingModel } from '../../models/data-managemnt-plans/DataManagementPlanListingModel'; import { DataManagementPlanCriteria } from '../../models/criteria/data-management-plan/DataManagementPlanCriteria'; -import { DatasetProfileCriteria } from '../../models/criteria/dataset/DatasetProfileCriteria'; import { RequestItem } from '../../models/criteria/RequestItem'; import { DatasetProfileModel } from '../../models/datasets/DatasetProfileModel'; +import { DatasetProfileCriteria } from '../../models/criteria/dataset-profile/DatasetProfileCriteria'; @Injectable() diff --git a/dmp-frontend/src/assets/lang/en.json b/dmp-frontend/src/assets/lang/en.json index b12fbfd79..a9e46b817 100644 --- a/dmp-frontend/src/assets/lang/en.json +++ b/dmp-frontend/src/assets/lang/en.json @@ -132,6 +132,30 @@ "DATASET-PUBLIC-LISTING": { "TITLE": "Published dataset descriptions" }, + "DATASET-PROFILE-LISTING": { + "TITLE": "Dataset Profiles", + "COLUMNS": { + "NAME": "Name", + "REFERNCE": "Reference", + "PROJECT": "Project", + "URI": "Uri", + "STATUS": "Status", + "DESCRIPTION": "Description", + "CREATED": "Created", + "ACTIONS": "Actions", + "DMP": "Dmp", + "PROFILE": "Profile", + "DATAREPOSITORIES": "Data Repositories", + "REGISTRIES": "Registries", + "SERVICES": "Services" + }, + "ACTIONS": { + "EDIT": "Edit", + "MAKE-IT-PUBLIC": "Make it public", + "VIEW": "View", + "CLONE": "Clone" + } + }, "DMP-PROFILE-EDITOR": { "TITLE": { "NEW": "New DMP Profile", @@ -195,6 +219,16 @@ "FINALISE": "Finalise" } }, + "DYNAMIC-FORM": { + "FIELDS": { + "LABEL": "Label" + }, + "ACTIONS": { + "PREVIEW": "Preview", + "ADD-PAGE": "Add Page +", + "ADD-SECTION": "Add Section +" + } + }, "CRITERIA": { "FILTERS": "Filters", "PROJECTS": { @@ -207,8 +241,10 @@ "FINISHED": "Finished" } }, + "DATASET-PROFILE": { + "LIKE": "Search" + }, "DATA-SETS": { - "LIKE": "Search", "PERIOD-FROM": "Start", "PERIOD-TO": "End", "STATUS": "Status",