package com.constellio.app.ui; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.util.Iterator; import java.util.List; import org.apache.commons.io.FileUtils; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.output.Format; import org.jdom2.output.XMLOutputter; import org.junit.Test; import com.constellio.model.entities.records.Record; import com.constellio.model.entities.schemas.Metadata; import com.constellio.model.entities.schemas.MetadataSchema; import com.constellio.model.entities.schemas.MetadataSchemaType; import com.constellio.model.entities.schemas.MetadataSchemaTypes; import com.constellio.model.services.search.SearchServices; import com.constellio.model.services.search.query.logical.LogicalSearchQuery; import com.constellio.sdk.tests.ConstellioTest; import com.constellio.sdk.tests.annotations.MainTest; import com.constellio.sdk.tests.annotations.MainTestDefaultStart; import com.constellio.sdk.tests.annotations.PreserveState; import com.constellio.sdk.tests.annotations.UiTest; @UiTest @MainTest //@PreserveState(state = "/Users/francisbaril/Workspaces/saveStates/07-20-VSL.zip") @PreserveState(state = "/Users/francisbaril/Workspaces/saveStates/instance-asma.zip", enabled = true) public class ExportXMLFromSaveStateAcceptTest extends ConstellioTest { @Test @MainTestDefaultStart public void startApplicationWithSaveState() throws Exception { givenTransactionLogIsEnabled(); File exportFolder = prepareExportFolder(); getCurrentTestSession().getFactoriesTestFeatures().givenSystemInState(saveState()).withPasswordsReset(); for (String collection : getModelLayerFactory().getCollectionsListManager().getCollections()) { exportCollectionData(exportFolder, collection); } } private void exportCollectionData(File exportFolder, String collection) throws Exception { MetadataSchemaTypes types = getModelLayerFactory().getMetadataSchemasManager().getSchemaTypes(collection); File exportCollectionFolder = new File(exportFolder, collection); exportCollectionFolder.mkdirs(); for (MetadataSchemaType type : types.getSchemaTypes()) { File exportFile = new File(exportCollectionFolder, type.getCode() + ".xml"); exportTypeData(type, exportFile); } } private void exportTypeData(MetadataSchemaType type, File exportFile) throws Exception { Element root = new Element("records"); Document xmlDocument = new Document(root); buildXMLDocument(type, root); XMLOutputter xmlOutput = new XMLOutputter(); xmlOutput.setFormat(Format.getPrettyFormat()); Writer writer = new BufferedWriter(new FileWriter(exportFile)); xmlOutput.output(xmlDocument, writer); } private void buildXMLDocument(MetadataSchemaType type, Element root) { SearchServices searchServices = getModelLayerFactory().newSearchServices(); Iterator<Record> recordsIterator = searchServices.recordsIterator(new LogicalSearchQuery(from(type).returnAll())); while (recordsIterator.hasNext()) { Record record = recordsIterator.next(); MetadataSchema schema = type.getSchema(record.getSchemaCode()); Element recordElement = new Element("record"); buildRecordElement(schema, record, recordElement); root.addContent(recordElement); } } private void buildRecordElement(MetadataSchema schema, Record record, Element recordElement) { recordElement.setAttribute("id", record.getId()); for (Metadata metadata : schema.getMetadatas().onlyManuals()) { if (isImported(metadata)) { Element metadataElement = new Element(metadata.getLocalCode()); boolean hasValue = false; if (metadata.isMultivalue()) { metadataElement.setAttribute("multivalue", "true"); List<Object> values = record.getList(metadata); for (Object value : values) { Element itemElement = new Element("item"); buildRecordMetadataElement(metadata, value, itemElement); metadataElement.addContent(itemElement); hasValue = true; } } else { Object value = record.get(metadata); if (value != null) { buildRecordMetadataElement(metadata, value, metadataElement); hasValue = true; } } if (hasValue) { recordElement.addContent(metadataElement); } } } } private boolean isImported(Metadata metadata) { return !metadata.isSystemReserved() && !metadata.getCode().equals("category_default_retentionRules"); //return !metadata.isSameLocalCodeThanAny(CREATED_ON, MODIFIED_ON, CREATED_BY, MODIFIED_BY, IDENTIFIER); } private void buildRecordMetadataElement(Metadata metadata, Object value, Element itemElement) { itemElement.setText(value.toString()); } private File saveState() { return new File(getClass().getAnnotation(PreserveState.class).state()); } private File prepareExportFolder() { File saveState = saveState(); File exportFolder = new File(saveState.getParentFile(), saveState.getName().replace(".zip", "")); if (exportFolder.exists()) { try { FileUtils.deleteDirectory(exportFolder); } catch (IOException e) { throw new RuntimeException(e); } } exportFolder.mkdirs(); return exportFolder; } }