diff --git a/source/java/org/alfresco/repo/transfer/TransferServiceImpl2.java b/source/java/org/alfresco/repo/transfer/TransferServiceImpl2.java index 5f0b53759a..899250a8fd 100644 --- a/source/java/org/alfresco/repo/transfer/TransferServiceImpl2.java +++ b/source/java/org/alfresco/repo/transfer/TransferServiceImpl2.java @@ -772,7 +772,7 @@ public class TransferServiceImpl2 implements TransferService2 logger.warn("Exception - unable to notify end transfer state", e); } - reportName += "_" + new SimpleDateFormat("yyyyMMddhhmmssSSSZ").format(new Date()); + reportName += "_" + new SimpleDateFormat("yyyyMMddhhmmssSSS").format(new Date()); try { diff --git a/source/java/org/alfresco/repo/transfer/TransferServiceImplTest.java b/source/java/org/alfresco/repo/transfer/TransferServiceImplTest.java index 0e4e0e9826..f940fa3a98 100644 --- a/source/java/org/alfresco/repo/transfer/TransferServiceImplTest.java +++ b/source/java/org/alfresco/repo/transfer/TransferServiceImplTest.java @@ -2113,8 +2113,7 @@ public class TransferServiceImplTest extends BaseAlfrescoSpringTest } } // test async cancel - - /** + /** * Test the transfer report. * * This is a unit test so it does some shenanigans to send to the same instance of alfresco. @@ -2152,26 +2151,33 @@ public class TransferServiceImplTest extends BaseAlfrescoSpringTest * This needs to be committed before we can call transfer asycnc. */ String CONTENT_TITLE = "ContentTitle"; - String CONTENT_NAME_A = "Demo Node A"; - String CONTENT_NAME_B = "Demo Node B"; + String CONTENT_NAME_A = "Report Node A"; + String CONTENT_NAME_B = "Report Node B"; Locale CONTENT_LOCALE = Locale.GERMAN; String CONTENT_STRING = "Hello"; NodeRef nodeRefA = null; NodeRef nodeRefB = null; + NodeRef testFolder = null; + String targetName = "testTransferReport"; startNewTransaction(); try { - nodeRefA = nodeService.getChildByName(guestHome, ContentModel.ASSOC_CONTAINS, CONTENT_NAME_A); - - if(nodeRefA == null) + { + String name = GUID.generate(); + ChildAssociationRef child = nodeService.createNode(guestHome, ContentModel.ASSOC_CONTAINS, QName.createQName(name), ContentModel.TYPE_FOLDER); + testFolder = child.getChildRef(); + nodeService.setProperty(testFolder, ContentModel.PROP_TITLE, CONTENT_TITLE); + nodeService.setProperty(testFolder, ContentModel.PROP_NAME, name); + } + { /** * Create a test node that we will read and write */ - ChildAssociationRef child = nodeService.createNode(guestHome, ContentModel.ASSOC_CONTAINS, QName.createQName(GUID.generate()), ContentModel.TYPE_CONTENT); + ChildAssociationRef child = nodeService.createNode(testFolder, ContentModel.ASSOC_CONTAINS, QName.createQName(GUID.generate()), ContentModel.TYPE_CONTENT); nodeRefA = child.getChildRef(); nodeService.setProperty(nodeRefA, ContentModel.PROP_TITLE, CONTENT_TITLE); nodeService.setProperty(nodeRefA, ContentModel.PROP_NAME, CONTENT_NAME_A); @@ -2181,11 +2187,8 @@ public class TransferServiceImplTest extends BaseAlfrescoSpringTest writer.putContent(CONTENT_STRING); } - nodeRefB = nodeService.getChildByName(guestHome, ContentModel.ASSOC_CONTAINS, CONTENT_NAME_B); - - if(nodeRefB == null) { - ChildAssociationRef child = nodeService.createNode(guestHome, ContentModel.ASSOC_CONTAINS, QName.createQName(GUID.generate()), ContentModel.TYPE_CONTENT); + ChildAssociationRef child = nodeService.createNode(testFolder, ContentModel.ASSOC_CONTAINS, QName.createQName(GUID.generate()), ContentModel.TYPE_CONTENT); nodeRefB = child.getChildRef(); nodeService.setProperty(nodeRefB, ContentModel.PROP_TITLE, CONTENT_TITLE); nodeService.setProperty(nodeRefB, ContentModel.PROP_NAME, CONTENT_NAME_B); @@ -2211,12 +2214,117 @@ public class TransferServiceImplTest extends BaseAlfrescoSpringTest NodeRef transferReport = null; NodeRef transferDestReport = null; + /** + * Step 1. + * Call the transfer method. to get a failed transfer - orphan nodes exist + */ + setDefaultRollback(true); startNewTransaction(); try { - /** - * Call the transfer method. - */ + TestTransferCallback callback = new TestTransferCallback(); + Set callbacks = new HashSet(); + callbacks.add(callback); + TransferDefinition definition = new TransferDefinition(); + Setnodes = new HashSet(); + nodes.add(nodeRefA); + nodes.add(nodeRefB); + // missing the folder node (testFolder) + definition.setNodes(nodes); + + // Do the transfer here + + try + { + transferService.transfer(targetName, definition, callbacks); + fail("transfer should have failed with an orphan not found exception"); + } + catch (TransferException te) + { + logger.debug("deliberatly caught and ignored exception"); + } + + // Can't dirty read transfer report here + + boolean foundSourceReport = false; + boolean foundDestReport = false; + + for(TransferEvent event : callback.getEvents()) + { + if(event instanceof TransferEventReport) + { + TransferEventReport reportEvent = (TransferEventReport)event; + switch (reportEvent.getReportType()) + { + case DESTINATION: + foundDestReport = true; + transferDestReport = reportEvent.getNodeRef(); + assertNotNull("dest transfer nodeId null", transferDestReport); + break; + + case SOURCE: + foundSourceReport = true; + transferReport = reportEvent.getNodeRef(); + break; + } + } + } + + assertTrue("source report not found", foundSourceReport); + assertTrue("dest report not found", foundDestReport); + } + finally + { + endTransaction(); + } + + setDefaultRollback(false); + + /** + * Now validate the client side error transfer report against the xsd file + */ + startNewTransaction(); + try + { + ContentReader reader = contentService.getReader(transferReport, ContentModel.PROP_CONTENT); + assertNotNull("transfer reader is null", reader); + assertEquals("client report mimetype not set", reader.getMimetype(), MimetypeMap.MIMETYPE_XML); + String name = (String)nodeService.getProperty(transferReport, ContentModel.PROP_NAME); + assertTrue("client report does not end with .xml", name.endsWith(".xml")); + + logger.debug("This report should have failed"); + if(logger.isDebugEnabled()) + { + dumpToSystemOut(transferReport); + } + + // Now validate the client side transfer report against the XSD + Source transferReportSource = new StreamSource(reader.getContentInputStream()); + SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); + final String TRANSFER_REPORT_SCHEMA_LOCATION = "classpath:org/alfresco/repo/transfer/report/TransferReport2.xsd"; + Schema schema = sf.newSchema(ResourceUtils.getURL(TRANSFER_REPORT_SCHEMA_LOCATION)); + Validator validator = schema.newValidator(); + try + { + validator.validate(transferReportSource); + } + catch (Exception e) + { + fail(e.getMessage() ); + } + } + finally + { + endTransaction(); + } + + /** + * Step 2 + * Call the transfer method to get a good success transfer report + */ + startNewTransaction(); + try + { { TestTransferCallback callback = new TestTransferCallback(); Set callbacks = new HashSet(); @@ -2225,6 +2333,7 @@ public class TransferServiceImplTest extends BaseAlfrescoSpringTest Setnodes = new HashSet(); nodes.add(nodeRefA); nodes.add(nodeRefB); + nodes.add(testFolder); definition.setNodes(nodes); transferReport = transferService.transfer(targetName, definition, callbacks); @@ -2275,17 +2384,16 @@ public class TransferServiceImplTest extends BaseAlfrescoSpringTest ContentReader reader = contentService.getReader(transferReport, ContentModel.PROP_CONTENT); assertNotNull("transfer reader is null", reader); -// ContentReader reader2 = contentService.getReader(transferReport, ContentModel.PROP_CONTENT); -// assertNotNull("transfer reader is null", reader2); -// -// logger.debug("now show the contents of the transfer report"); -// System.out.println("Client side transfer report"); -// reader2.getContent(System.out); + logger.debug("This report should succeed"); + if(logger.isDebugEnabled()) + { + dumpToSystemOut(transferReport); + } // Now validate the client side transfer report against the XSD Source transferReportSource = new StreamSource(reader.getContentInputStream()); SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); - final String TRANSFER_REPORT_SCHEMA_LOCATION = "classpath:org/alfresco/repo/transfer/report/TransferReport.xsd"; + final String TRANSFER_REPORT_SCHEMA_LOCATION = "classpath:org/alfresco/repo/transfer/report/TransferReport2.xsd"; Schema schema = sf.newSchema(ResourceUtils.getURL(TRANSFER_REPORT_SCHEMA_LOCATION)); Validator validator = schema.newValidator(); try @@ -2310,6 +2418,15 @@ public class TransferServiceImplTest extends BaseAlfrescoSpringTest { ContentReader reader = contentService.getReader(transferDestReport, ContentModel.PROP_CONTENT); assertNotNull("transfer reader is null", reader); + + assertEquals("dest report mimetype not set", reader.getMimetype(), MimetypeMap.MIMETYPE_XML); + String name = (String)nodeService.getProperty(transferReport, ContentModel.PROP_NAME); + assertTrue("dest report does not end with .xml", name.endsWith(".xml")); + + if(logger.isDebugEnabled()) + { + dumpToSystemOut(transferDestReport); + } // Now validate the destination side transfer report against the XSD Source transferReportSource = new StreamSource(reader.getContentInputStream()); @@ -2387,7 +2504,6 @@ public class TransferServiceImplTest extends BaseAlfrescoSpringTest } } // test transfer report - private void dumpToSystemOut(NodeRef nodeRef) throws IOException { ContentReader reader2 = contentService.getReader(nodeRef, ContentModel.PROP_CONTENT); diff --git a/source/java/org/alfresco/repo/transfer/report/TransferReport2.xsd b/source/java/org/alfresco/repo/transfer/report/TransferReport2.xsd new file mode 100644 index 0000000000..9f43dbc7c0 --- /dev/null +++ b/source/java/org/alfresco/repo/transfer/report/TransferReport2.xsd @@ -0,0 +1,173 @@ + + + + + + + + + This is an Alfresco client side transfer report + + + + + + + The Alfresco client side transfer report + + + + + + + + + + + + + + + + + + + + + + The destination of the target + + + + + + + + + + + The contents of the transfer + + + + + + + + + + + The nodes being transferred + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/source/java/org/alfresco/repo/transfer/report/TransferReportModel2.java b/source/java/org/alfresco/repo/transfer/report/TransferReportModel2.java new file mode 100644 index 0000000000..b942b1ffd5 --- /dev/null +++ b/source/java/org/alfresco/repo/transfer/report/TransferReportModel2.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2009-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.repo.transfer.report; + +/** + * The transfer report model - extended for XML Manifest Model + */ +public interface TransferReportModel2 extends TransferReportModel +{ + + static final String TRANSFER_REPORT_MODEL_2_0_URI = "http://www.alfresco.org/model/transferReport/2.0"; + + // New in 1.1 + static final String LOCALNAME_TRANSFER_EVENT_START_STATE = "eventStartState"; + static final String LOCALNAME_TRANSFER_EVENT_END_STATE = "eventEndState"; + static final String LOCALNAME_TRANSFER_EVENT_REPORT = "eventReport"; + static final String LOCALNAME_TRANSFER_EVENT_SENDING_CONTENT = "eventSendContent"; + static final String LOCALNAME_TRANSFER_EVENT_SENDING_SNAPSHOT = "eventSendSnapshot"; + static final String LOCALNAME_TRANSFER_EVENT_BEGIN = "eventBegin"; + static final String LOCALNAME_TRANSFER_EVENT_COMMITTING_STATUS = "eventCommittingStatus"; + static final String LOCALNAME_TRANSFER_EVENT_SENT_CONTENT = "eventSentContent"; + static final String LOCALNAME_TRANSFER_EVENT_CANCELLED = "eventCancelled"; + static final String LOCALNAME_TRANSFER_EVENT_ERROR = "eventError"; + static final String LOCALNAME_TRANSFER_EVENT_SUCCESS = "eventSuccess"; + +} diff --git a/source/java/org/alfresco/repo/transfer/report/TransferReporterImpl.java b/source/java/org/alfresco/repo/transfer/report/TransferReporterImpl.java index 01fbd1058e..ef688eeea7 100644 --- a/source/java/org/alfresco/repo/transfer/report/TransferReporterImpl.java +++ b/source/java/org/alfresco/repo/transfer/report/TransferReporterImpl.java @@ -98,7 +98,7 @@ public class TransferReporterImpl implements TransferReporter String title = transferName; String description = "Transfer Report - target: " + target.getName(); - String name = transferName; + String name = transferName + ".xml"; properties.put(ContentModel.PROP_NAME, name); properties.put(ContentModel.PROP_TITLE, title); @@ -109,7 +109,6 @@ public class TransferReporterImpl implements TransferReporter writer.setMimetype(MimetypeMap.MIMETYPE_XML); writer.setEncoding(DEFAULT_ENCODING); - // XMLTransferReportWriter reportWriter = new XMLTransferReportWriter(); BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(writer.getContentOutputStream())); @@ -118,14 +117,12 @@ public class TransferReporterImpl implements TransferReporter { reportWriter.startTransferReport(DEFAULT_ENCODING, bufferedWriter); - // Header reportWriter.writeTarget(target); reportWriter.writeDefinition(definition); reportWriter.writeException(e); - // Detail reportWriter.writeTransferEvents(events); reportWriter.endTransferReport(); @@ -166,7 +163,7 @@ public class TransferReporterImpl implements TransferReporter String title = transferName; String description = "Transfer Report - target: " + target.getName(); - String name = transferName; + String name = transferName + ".xml"; properties.put(ContentModel.PROP_NAME, name); properties.put(ContentModel.PROP_TITLE, title); @@ -189,8 +186,12 @@ public class TransferReporterImpl implements TransferReporter // Header reportWriter.writeTarget(target); + // Definition of transfer reportWriter.writeDefinition(definition); + // Events of transfer + reportWriter.writeTransferEvents(events); + /** * Write the node summary details to the transfer report */ @@ -248,9 +249,6 @@ public class TransferReporterImpl implements TransferReporter return null; } - // Detail Events - reportWriter.writeTransferEvents(events); - reportWriter.endTransferReport(); return ref.getChildRef(); @@ -289,7 +287,7 @@ public class TransferReporterImpl implements TransferReporter String title = transferName + "_destination"; String description = "Transfer Destination Report - target: " + target.getName(); - String name = title; + String name = title + ".xml"; logger.debug("writing destination transfer report " + title); logger.debug("parent node ref " + target.getNodeRef()); diff --git a/source/java/org/alfresco/repo/transfer/report/XMLTransferEventFormatter.java b/source/java/org/alfresco/repo/transfer/report/XMLTransferEventFormatter.java new file mode 100644 index 0000000000..0095694add --- /dev/null +++ b/source/java/org/alfresco/repo/transfer/report/XMLTransferEventFormatter.java @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2009-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.repo.transfer.report; + +import org.alfresco.service.cmr.transfer.TransferEvent; +import org.xml.sax.helpers.AttributesImpl; + +public interface XMLTransferEventFormatter +{ + AttributesImpl getAttributes(TransferEvent event); + String getElementName(TransferEvent event); + String getMessage(TransferEvent event); +} diff --git a/source/java/org/alfresco/repo/transfer/report/XMLTransferEventFormatterFactory.java b/source/java/org/alfresco/repo/transfer/report/XMLTransferEventFormatterFactory.java new file mode 100644 index 0000000000..6a89580f70 --- /dev/null +++ b/source/java/org/alfresco/repo/transfer/report/XMLTransferEventFormatterFactory.java @@ -0,0 +1,386 @@ +/* + * Copyright (C) 2009-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +package org.alfresco.repo.transfer.report; + +import java.util.HashMap; +import java.util.Map; + +import org.alfresco.service.cmr.transfer.TransferEvent; +import org.alfresco.service.cmr.transfer.TransferEventBegin; +import org.alfresco.service.cmr.transfer.TransferEventEndState; +import org.alfresco.service.cmr.transfer.TransferEventEnterState; +import org.alfresco.service.cmr.transfer.TransferEventReport; +import org.alfresco.service.cmr.transfer.TransferEventSendingContent; +import org.alfresco.service.cmr.transfer.TransferEventCommittingStatus; +import org.alfresco.service.cmr.transfer.TransferEventCancelled; +import org.alfresco.service.cmr.transfer.TransferEventError; +import org.alfresco.service.cmr.transfer.TransferEventSentContent; +import org.alfresco.service.cmr.transfer.TransferEventSuccess; + +import org.alfresco.service.cmr.transfer.TransferEventSendingSnapshot; +import org.springframework.extensions.surf.util.ISO8601DateFormat; +import org.xml.sax.helpers.AttributesImpl; + +/** + * The XMLTransferEventFormatterFactory returns formatters for the various client side TransferEvents. + * + * The main entry point for this class is the static method getFormatter(); + * @author mrogers + * + */ +public class XMLTransferEventFormatterFactory +{ + + private static XMLTransferEventFormatter defaultFormatter = new XMLTransferEventFormatter() { + + @Override + public AttributesImpl getAttributes(TransferEvent event) + { + AttributesImpl attributes = new AttributesImpl(); + attributes.addAttribute(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, "date", "date", "dateTime", ISO8601DateFormat.format(event.getTime())); + return attributes; + } + + @Override + public String getElementName(TransferEvent event) + { + return TransferReportModel.LOCALNAME_TRANSFER_EVENT; + } + + @Override + public String getMessage(TransferEvent event) + { + return event.getMessage(); + } + }; + + private static XMLTransferEventFormatter eventEnterStateFormatter = new XMLTransferEventFormatter() { + + @Override + public AttributesImpl getAttributes(TransferEvent event) + { + TransferEventEnterState s = (TransferEventEnterState)event; + + AttributesImpl attributes = new AttributesImpl(); + attributes.addAttribute(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, "date", "date", "dateTime", ISO8601DateFormat.format(event.getTime())); + attributes.addAttribute(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, "state", "state", "string", s.getTransferState().toString()); + return attributes; + } + + @Override + public String getElementName(TransferEvent event) + { + return TransferReportModel2.LOCALNAME_TRANSFER_EVENT_START_STATE; + + } + + @Override + public String getMessage(TransferEvent event) + { + return event.getMessage(); + } + }; + + private static XMLTransferEventFormatter eventReportFormatter = new XMLTransferEventFormatter() { + + @Override + public AttributesImpl getAttributes(TransferEvent event) + { + TransferEventReport s = (TransferEventReport)event; + AttributesImpl attributes = new AttributesImpl(); + attributes.addAttribute(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, "date", "date", "dateTime", ISO8601DateFormat.format(event.getTime())); + attributes.addAttribute(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, "nodeRef", "nodeRef", "string", s.getNodeRef().toString()); + attributes.addAttribute(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, "reportType", "reportType", "string", s.getReportType().toString()); + return attributes; + } + + @Override + public String getElementName(TransferEvent event) + { + return TransferReportModel2.LOCALNAME_TRANSFER_EVENT_REPORT; + } + + @Override + public String getMessage(TransferEvent event) + { + return null; + } + }; + + private static XMLTransferEventFormatter eventSendingContentFormatter = new XMLTransferEventFormatter() { + + @Override + public AttributesImpl getAttributes(TransferEvent event) + { + TransferEventSendingContent s = (TransferEventSendingContent)event; + AttributesImpl attributes = new AttributesImpl(); + attributes.addAttribute(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, "date", "date", "dateTime", ISO8601DateFormat.format(event.getTime())); + attributes.addAttribute(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, "position", "position", "string", String.valueOf(s.getPosition())); + attributes.addAttribute(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, "range", "range", "string", String.valueOf(s.getRange())); + attributes.addAttribute(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, "size", "size", "string", String.valueOf(s.getSize())); + return attributes; + } + + @Override + public String getElementName(TransferEvent event) + { + return TransferReportModel2.LOCALNAME_TRANSFER_EVENT_SENDING_CONTENT; + } + + @Override + public String getMessage(TransferEvent event) + { + return null; + } + }; + + private static XMLTransferEventFormatter eventSendingSnapshotFormatter = new XMLTransferEventFormatter() { + + @Override + public AttributesImpl getAttributes(TransferEvent event) + { + TransferEventSendingSnapshot s = (TransferEventSendingSnapshot)event; + AttributesImpl attributes = new AttributesImpl(); + attributes.addAttribute(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, "date", "date", "dateTime", ISO8601DateFormat.format(event.getTime())); + return attributes; + } + + @Override + public String getElementName(TransferEvent event) + { + return TransferReportModel2.LOCALNAME_TRANSFER_EVENT_SENDING_SNAPSHOT; + } + + @Override + public String getMessage(TransferEvent event) + { + return null; + } + }; + + private static XMLTransferEventFormatter eventBeginFormatter = new XMLTransferEventFormatter() { + + @Override + public AttributesImpl getAttributes(TransferEvent event) + { + TransferEventBegin s = (TransferEventBegin)event; + AttributesImpl attributes = new AttributesImpl(); + attributes.addAttribute(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, "date", "date", "dateTime", ISO8601DateFormat.format(event.getTime())); + attributes.addAttribute(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, "transferId", "transferId", "string", s.getTransferId()); + return attributes; + } + + @Override + public String getElementName(TransferEvent event) + { + return TransferReportModel2.LOCALNAME_TRANSFER_EVENT_BEGIN; + } + + @Override + public String getMessage(TransferEvent event) + { + return event.getMessage(); + } + }; + + private static XMLTransferEventFormatter eventEndStateFormatter = new XMLTransferEventFormatter() { + + @Override + public AttributesImpl getAttributes(TransferEvent event) + { + TransferEventEndState s = (TransferEventEndState)event; + AttributesImpl attributes = new AttributesImpl(); + attributes.addAttribute(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, "date", "date", "dateTime", ISO8601DateFormat.format(event.getTime())); + attributes.addAttribute(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, "state", "state", "string", s.getTransferState().toString()); + return attributes; + } + + @Override + public String getElementName(TransferEvent event) + { + return TransferReportModel2.LOCALNAME_TRANSFER_EVENT_END_STATE; + } + + @Override + public String getMessage(TransferEvent event) + { + return null; + } + }; + + private static XMLTransferEventFormatter eventCommittingStatus = new XMLTransferEventFormatter() { + + @Override + public AttributesImpl getAttributes(TransferEvent event) + { + TransferEventCommittingStatus s = (TransferEventCommittingStatus)event; + AttributesImpl attributes = new AttributesImpl(); + attributes.addAttribute(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, "date", "date", "dateTime", ISO8601DateFormat.format(event.getTime())); + attributes.addAttribute(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, "position", "position", "string", String.valueOf(s.getPosition())); + attributes.addAttribute(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, "range", "range", "string", String.valueOf(s.getRange())); + return attributes; + } + + @Override + public String getElementName(TransferEvent event) + { + return TransferReportModel2.LOCALNAME_TRANSFER_EVENT_COMMITTING_STATUS; + } + + @Override + public String getMessage(TransferEvent event) + { + return event.getMessage(); + } + }; + + private static XMLTransferEventFormatter eventCancelled = new XMLTransferEventFormatter() { + + @Override + public AttributesImpl getAttributes(TransferEvent event) + { + TransferEventCancelled s = (TransferEventCancelled)event; + AttributesImpl attributes = new AttributesImpl(); + attributes.addAttribute(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, "date", "date", "dateTime", ISO8601DateFormat.format(event.getTime())); + return attributes; + } + + @Override + public String getElementName(TransferEvent event) + { + return TransferReportModel2.LOCALNAME_TRANSFER_EVENT_CANCELLED; + } + + @Override + public String getMessage(TransferEvent event) + { + return event.getMessage(); + } + }; + + private static XMLTransferEventFormatter eventSuccess = new XMLTransferEventFormatter() { + + @Override + public AttributesImpl getAttributes(TransferEvent event) + { + TransferEventSuccess s = (TransferEventSuccess)event; + AttributesImpl attributes = new AttributesImpl(); + attributes.addAttribute(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, "date", "date", "dateTime", ISO8601DateFormat.format(event.getTime())); + return attributes; + } + + @Override + public String getElementName(TransferEvent event) + { + return TransferReportModel2.LOCALNAME_TRANSFER_EVENT_SUCCESS; + } + + @Override + public String getMessage(TransferEvent event) + { + return event.getMessage(); + } + }; + + private static XMLTransferEventFormatter eventSentContent = new XMLTransferEventFormatter() { + + @Override + public AttributesImpl getAttributes(TransferEvent event) + { + TransferEventSentContent s = (TransferEventSentContent)event; + AttributesImpl attributes = new AttributesImpl(); + attributes.addAttribute(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, "date", "date", "dateTime", ISO8601DateFormat.format(event.getTime())); + return attributes; + } + + @Override + public String getElementName(TransferEvent event) + { + return TransferReportModel2.LOCALNAME_TRANSFER_EVENT_SENT_CONTENT; + } + + @Override + public String getMessage(TransferEvent event) + { + return event.getMessage(); + } + }; + + private static XMLTransferEventFormatter eventError = new XMLTransferEventFormatter() { + + @Override + public AttributesImpl getAttributes(TransferEvent event) + { + TransferEventError s = (TransferEventError)event; + AttributesImpl attributes = new AttributesImpl(); + attributes.addAttribute(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, "date", "date", "dateTime", ISO8601DateFormat.format(event.getTime())); + return attributes; + } + + @Override + public String getElementName(TransferEvent event) + { + return TransferReportModel2.LOCALNAME_TRANSFER_EVENT_ERROR; + } + + @Override + public String getMessage(TransferEvent event) + { + TransferEventError s = (TransferEventError)event; + return s.getException().getMessage(); + } + }; + + + protected static Map, XMLTransferEventFormatter> formatters; + + static + { + formatters = new HashMap, XMLTransferEventFormatter>(29); + formatters.put(TransferEventEnterState.class, eventEnterStateFormatter); + formatters.put(TransferEventEndState.class, eventEndStateFormatter); + formatters.put(TransferEventReport.class, eventReportFormatter); + formatters.put(TransferEventSendingContent.class, eventSendingContentFormatter); + formatters.put(TransferEventSendingSnapshot.class, eventSendingSnapshotFormatter); + formatters.put(TransferEventBegin.class, eventBeginFormatter); + formatters.put(TransferEventCommittingStatus.class, eventCommittingStatus); + formatters.put(TransferEventCancelled.class, eventCancelled); + formatters.put(TransferEventError.class, eventError); + formatters.put(TransferEventSuccess.class, eventSuccess); + formatters.put(TransferEventSentContent.class, eventSentContent); + } + + public static XMLTransferEventFormatter getFormatter(TransferEvent event) + { + + XMLTransferEventFormatter formatter = formatters.get(event.getClass()); + + if(formatter == null) + { + return defaultFormatter; + } + else + { + return formatter; + } + } + + +} \ No newline at end of file diff --git a/source/java/org/alfresco/repo/transfer/report/XMLTransferReportWriter.java b/source/java/org/alfresco/repo/transfer/report/XMLTransferReportWriter.java index 6a061c5ff2..de37740083 100644 --- a/source/java/org/alfresco/repo/transfer/report/XMLTransferReportWriter.java +++ b/source/java/org/alfresco/repo/transfer/report/XMLTransferReportWriter.java @@ -28,6 +28,9 @@ import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.Path; import org.alfresco.service.cmr.transfer.TransferDefinition; import org.alfresco.service.cmr.transfer.TransferEvent; +import org.alfresco.service.cmr.transfer.TransferEventBegin; +import org.alfresco.service.cmr.transfer.TransferEventEndState; +import org.alfresco.service.cmr.transfer.TransferEventEnterState; import org.alfresco.service.cmr.transfer.TransferTarget; import org.alfresco.service.namespace.QName; import org.dom4j.io.OutputFormat; @@ -66,10 +69,10 @@ public class XMLTransferReportWriter this.writer = new XMLWriter(writer, format); this.writer.startDocument(); - this.writer.startPrefixMapping(PREFIX, TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI); + this.writer.startPrefixMapping(PREFIX, TransferReportModel2.TRANSFER_REPORT_MODEL_2_0_URI); // Start Transfer Manifest // uri, name, prefix - this.writer.startElement(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, TransferReportModel.LOCALNAME_TRANSFER_REPORT, PREFIX + ":" + TransferReportModel.LOCALNAME_TRANSFER_REPORT, EMPTY_ATTRIBUTES); + this.writer.startElement(TransferReportModel2.TRANSFER_REPORT_MODEL_2_0_URI, TransferReportModel.LOCALNAME_TRANSFER_REPORT, PREFIX + ":" + TransferReportModel.LOCALNAME_TRANSFER_REPORT, EMPTY_ATTRIBUTES); } /** @@ -78,7 +81,7 @@ public class XMLTransferReportWriter public void endTransferReport() throws SAXException { // End Transfer Manifest - writer.endElement(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, TransferReportModel.LOCALNAME_TRANSFER_REPORT, PREFIX + ":" + TransferReportModel.LOCALNAME_TRANSFER_REPORT); + writer.endElement(TransferReportModel2.TRANSFER_REPORT_MODEL_2_0_URI, TransferReportModel.LOCALNAME_TRANSFER_REPORT, PREFIX + ":" + TransferReportModel.LOCALNAME_TRANSFER_REPORT); writer.endPrefixMapping(PREFIX); writer.endDocument(); } @@ -89,12 +92,12 @@ public class XMLTransferReportWriter public void writeTarget(TransferTarget target) throws SAXException { AttributesImpl attributes = new AttributesImpl(); - attributes.addAttribute(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, "name", "name", "String", target.getName()); - attributes.addAttribute(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, "endpointHost", "endpointHost", "String", target.getEndpointHost()); - attributes.addAttribute(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, "endpointPort", "endpointPort", "int", String.valueOf(target.getEndpointPort())); + attributes.addAttribute(TransferReportModel2.TRANSFER_REPORT_MODEL_2_0_URI, "name", "name", "String", target.getName()); + attributes.addAttribute(TransferReportModel2.TRANSFER_REPORT_MODEL_2_0_URI, "endpointHost", "endpointHost", "String", target.getEndpointHost()); + attributes.addAttribute(TransferReportModel2.TRANSFER_REPORT_MODEL_2_0_URI, "endpointPort", "endpointPort", "int", String.valueOf(target.getEndpointPort())); - writer.startElement(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, TransferReportModel.LOCALNAME_TRANSFER_TARGET, PREFIX + ":" + TransferReportModel.LOCALNAME_TRANSFER_TARGET, attributes); - writer.endElement(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, TransferReportModel.LOCALNAME_TRANSFER_TARGET, PREFIX + ":" + TransferReportModel.LOCALNAME_TRANSFER_TARGET); + writer.startElement(TransferReportModel2.TRANSFER_REPORT_MODEL_2_0_URI, TransferReportModel.LOCALNAME_TRANSFER_TARGET, PREFIX + ":" + TransferReportModel.LOCALNAME_TRANSFER_TARGET, attributes); + writer.endElement(TransferReportModel2.TRANSFER_REPORT_MODEL_2_0_URI, TransferReportModel.LOCALNAME_TRANSFER_TARGET, PREFIX + ":" + TransferReportModel.LOCALNAME_TRANSFER_TARGET); } @@ -103,8 +106,17 @@ public class XMLTransferReportWriter */ public void writeDefinition(TransferDefinition definition) throws SAXException { - writer.startElement(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, TransferReportModel.LOCALNAME_TRANSFER_DEFINITION, PREFIX + ":" + TransferReportModel.LOCALNAME_TRANSFER_DEFINITION, EMPTY_ATTRIBUTES); - writer.endElement(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, TransferReportModel.LOCALNAME_TRANSFER_DEFINITION, PREFIX + ":" + TransferReportModel.LOCALNAME_TRANSFER_DEFINITION); + AttributesImpl attributes = new AttributesImpl(); + attributes.addAttribute(TransferReportModel2.TRANSFER_REPORT_MODEL_2_0_URI, "isReadOnly", "isReadOnly", "boolean", definition.isReadOnly()?"true":"false"); + attributes.addAttribute(TransferReportModel2.TRANSFER_REPORT_MODEL_2_0_URI, "isSync", "isSync", "boolean", definition.isSync()?"true":"false"); + + if(definition.getNodes() != null) + { + attributes.addAttribute(TransferReportModel2.TRANSFER_REPORT_MODEL_2_0_URI, "numberOfNodes", "numberOfNodes", "string", String.valueOf(definition.getNodes().size())); + } + + writer.startElement(TransferReportModel2.TRANSFER_REPORT_MODEL_2_0_URI, TransferReportModel.LOCALNAME_TRANSFER_DEFINITION, PREFIX + ":" + TransferReportModel.LOCALNAME_TRANSFER_DEFINITION, attributes); + writer.endElement(TransferReportModel2.TRANSFER_REPORT_MODEL_2_0_URI, TransferReportModel.LOCALNAME_TRANSFER_DEFINITION, PREFIX + ":" + TransferReportModel.LOCALNAME_TRANSFER_DEFINITION); } @@ -114,10 +126,10 @@ public class XMLTransferReportWriter public void writeException(Exception e) throws SAXException { AttributesImpl attributes = new AttributesImpl(); - attributes.addAttribute(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, "type", "type", "String", e.getClass().getName()); - attributes.addAttribute(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, "message", "message", "String", e.getMessage()); - writer.startElement(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, TransferReportModel.LOCALNAME_EXCEPTION, PREFIX + ":" + TransferReportModel.LOCALNAME_EXCEPTION, attributes); - writer.endElement(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, TransferReportModel.LOCALNAME_EXCEPTION, PREFIX + ":" + TransferReportModel.LOCALNAME_EXCEPTION); + attributes.addAttribute(TransferReportModel2.TRANSFER_REPORT_MODEL_2_0_URI, "type", "type", "String", e.getClass().getName()); + attributes.addAttribute(TransferReportModel2.TRANSFER_REPORT_MODEL_2_0_URI, "message", "message", "String", e.getMessage()); + writer.startElement(TransferReportModel2.TRANSFER_REPORT_MODEL_2_0_URI, TransferReportModel.LOCALNAME_EXCEPTION, PREFIX + ":" + TransferReportModel.LOCALNAME_EXCEPTION, attributes); + writer.endElement(TransferReportModel2.TRANSFER_REPORT_MODEL_2_0_URI, TransferReportModel.LOCALNAME_EXCEPTION, PREFIX + ":" + TransferReportModel.LOCALNAME_EXCEPTION); } /** @@ -125,14 +137,14 @@ public class XMLTransferReportWriter */ public void writeTransferEvents(List events) throws SAXException { - writer.startElement(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, TransferReportModel.LOCALNAME_TRANSFER_EVENTS, PREFIX + ":" + TransferReportModel.LOCALNAME_TRANSFER_EVENTS, EMPTY_ATTRIBUTES); + writer.startElement(TransferReportModel2.TRANSFER_REPORT_MODEL_2_0_URI, TransferReportModel.LOCALNAME_TRANSFER_EVENTS, PREFIX + ":" + TransferReportModel.LOCALNAME_TRANSFER_EVENTS, EMPTY_ATTRIBUTES); for(TransferEvent event : events) { writeTransferEvent(event); } - writer.endElement(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, TransferReportModel.LOCALNAME_TRANSFER_EVENTS, PREFIX + ":" + TransferReportModel.LOCALNAME_TRANSFER_EVENTS); + writer.endElement(TransferReportModel2.TRANSFER_REPORT_MODEL_2_0_URI, TransferReportModel.LOCALNAME_TRANSFER_EVENTS, PREFIX + ":" + TransferReportModel.LOCALNAME_TRANSFER_EVENTS); } @@ -143,31 +155,31 @@ public class XMLTransferReportWriter { AttributesImpl attributes = new AttributesImpl(); attributes.addAttribute("uri", "nodeRef", "nodeRef", "String", node.getNodeRef().toString()); - writer.startElement(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, TransferReportModel.LOCALNAME_TRANSFER_NODE, PREFIX + ":" + TransferReportModel.LOCALNAME_TRANSFER_NODE, attributes); + writer.startElement(TransferReportModel2.TRANSFER_REPORT_MODEL_2_0_URI, TransferReportModel.LOCALNAME_TRANSFER_NODE, PREFIX + ":" + TransferReportModel.LOCALNAME_TRANSFER_NODE, attributes); if(node.getPrimaryParentAssoc() != null) { writePrimaryParent(node.getPrimaryParentAssoc(), node.getParentPath()); } - writer.endElement(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, TransferReportModel.LOCALNAME_TRANSFER_NODE, PREFIX + ":" + TransferReportModel.LOCALNAME_TRANSFER_NODE); + writer.endElement(TransferReportModel2.TRANSFER_REPORT_MODEL_2_0_URI, TransferReportModel.LOCALNAME_TRANSFER_NODE, PREFIX + ":" + TransferReportModel.LOCALNAME_TRANSFER_NODE); } private void writePrimaryParent(ChildAssociationRef parentAssoc, Path parentPath) throws SAXException { - writer.startElement(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, TransferReportModel.LOCALNAME_TRANSFER_PRIMARY_PARENT, PREFIX + ":" + TransferReportModel.LOCALNAME_TRANSFER_PRIMARY_PARENT, EMPTY_ATTRIBUTES); + writer.startElement(TransferReportModel2.TRANSFER_REPORT_MODEL_2_0_URI, TransferReportModel.LOCALNAME_TRANSFER_PRIMARY_PARENT, PREFIX + ":" + TransferReportModel.LOCALNAME_TRANSFER_PRIMARY_PARENT, EMPTY_ATTRIBUTES); writeParentAssoc(parentAssoc); - writer.startElement(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, TransferReportModel.LOCALNAME_TRANSFER_PRIMARY_PATH, PREFIX + ":" + TransferReportModel.LOCALNAME_TRANSFER_PRIMARY_PATH, EMPTY_ATTRIBUTES); + writer.startElement(TransferReportModel2.TRANSFER_REPORT_MODEL_2_0_URI, TransferReportModel.LOCALNAME_TRANSFER_PRIMARY_PATH, PREFIX + ":" + TransferReportModel.LOCALNAME_TRANSFER_PRIMARY_PATH, EMPTY_ATTRIBUTES); if(parentPath != null) { String path = parentPath.toString(); writer.characters(path.toCharArray(), 0, path.length()); } - writer.endElement(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, TransferReportModel.LOCALNAME_TRANSFER_PRIMARY_PATH, PREFIX + ":" + ManifestModel.LOCALNAME_ELEMENT_PRIMARY_PATH); + writer.endElement(TransferReportModel2.TRANSFER_REPORT_MODEL_2_0_URI, TransferReportModel.LOCALNAME_TRANSFER_PRIMARY_PATH, PREFIX + ":" + ManifestModel.LOCALNAME_ELEMENT_PRIMARY_PATH); - writer.endElement(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, TransferReportModel.LOCALNAME_TRANSFER_PRIMARY_PARENT, PREFIX + ":" + ManifestModel.LOCALNAME_ELEMENT_PRIMARY_PARENT); + writer.endElement(TransferReportModel2.TRANSFER_REPORT_MODEL_2_0_URI, TransferReportModel.LOCALNAME_TRANSFER_PRIMARY_PARENT, PREFIX + ":" + ManifestModel.LOCALNAME_ELEMENT_PRIMARY_PARENT); } private void writeParentAssoc(ChildAssociationRef assoc) throws SAXException @@ -187,22 +199,25 @@ public class XMLTransferReportWriter } } + /** - * Write the transfer manifest header + * Write the transfer event */ public void writeTransferEvent(TransferEvent event) throws SAXException { - AttributesImpl attributes = new AttributesImpl(); - attributes.addAttribute(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, "date", "date", "dateTime", ISO8601DateFormat.format(event.getTime())); - writer.startElement(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, TransferReportModel.LOCALNAME_TRANSFER_EVENT, PREFIX + ":" + TransferReportModel.LOCALNAME_TRANSFER_EVENT, attributes); + XMLTransferEventFormatter formatter = XMLTransferEventFormatterFactory.getFormatter(event); + + AttributesImpl attributes = formatter.getAttributes(event); + String elementName = formatter.getElementName(event); + String message = formatter.getMessage(event); - String message = event.getMessage(); + writer.startElement(TransferReportModel2.TRANSFER_REPORT_MODEL_2_0_URI, elementName, PREFIX + ":" + elementName, attributes); if(message != null) { - writer.characters(message.toCharArray(), 0, message.length()); + writer.characters(message.toCharArray(), 0, message.length()); } - writer.endElement(TransferReportModel.TRANSFER_REPORT_MODEL_1_0_URI, TransferReportModel.LOCALNAME_TRANSFER_EVENT, PREFIX + ":" + TransferReportModel.LOCALNAME_TRANSFER_EVENT); + writer.endElement(TransferReportModel2.TRANSFER_REPORT_MODEL_2_0_URI, elementName, PREFIX + ":" + elementName); } private String formatQName(QName qname)