use of org.alfresco.service.cmr.transfer.TransferEvent in project alfresco-repository by Alfresco.
the class TransferServiceCallbackTest method verifyCallback.
private void verifyCallback(List<TransferEvent> expectedEvents) {
ArgumentCaptor<TransferEvent> eventCaptor = ArgumentCaptor.forClass(TransferEvent.class);
verify(mockedCallback, atLeastOnce()).processEvent(eventCaptor.capture());
List<TransferEvent> capturedEvents = eventCaptor.getAllValues();
assertEquals(expectedEvents.size(), capturedEvents.size());
int count = capturedEvents.size();
for (int index = 0; index < count; ++index) {
TransferEvent expectedEvent = expectedEvents.get(index);
TransferEvent capturedEvent = capturedEvents.get(index);
assertEquals("Event " + index, expectedEvent.getClass(), capturedEvent.getClass());
assertEquals("Event " + index, expectedEvent.getTransferState(), capturedEvent.getTransferState());
if (TransferEventError.class.isAssignableFrom(expectedEvent.getClass())) {
assertEquals(((TransferEventError) expectedEvent).getException(), ((TransferEventError) capturedEvent).getException());
}
}
}
use of org.alfresco.service.cmr.transfer.TransferEvent in project alfresco-repository by Alfresco.
the class TransferServiceCallbackTest method testTargetAlreadyLocked.
public void testTargetAlreadyLocked() {
configureBasicMockTransmitter(null);
when(mockedTransferTransmitter.begin(target, "localRepositoryId", version)).thenThrow(new TransferException("Simulate lock unavailable"));
TransferDefinition transferDef = new TransferDefinition();
transferDef.setNodes(folder1, file1, file2, file3);
try {
transferService.transfer(TRANSFER_TARGET_NAME, transferDef, mockedCallback);
fail("Transfer expected to throw an exception, but it didn't.");
} catch (TransferFailureException ex) {
List<TransferEvent> expectedEvents = new ArrayList<TransferEvent>();
TransferEventImpl event;
event = new TransferEventEnterState();
event.setTransferState(TransferState.START);
expectedEvents.add(event);
event = new TransferEventEndState();
event.setTransferState(TransferState.START);
expectedEvents.add(event);
event = new TransferEventEnterState();
event.setTransferState(TransferState.ERROR);
expectedEvents.add(event);
event = new TransferEventReport();
event.setTransferState(TransferState.ERROR);
expectedEvents.add(event);
event = new TransferEventError();
event.setTransferState(TransferState.ERROR);
((TransferEventError) event).setException((Exception) ex.getCause());
expectedEvents.add(event);
verifyCallback(expectedEvents);
}
}
use of org.alfresco.service.cmr.transfer.TransferEvent in project alfresco-repository by Alfresco.
the class TransferServiceImpl2 method transferImpl.
private TransferEndEvent transferImpl(String targetName, final TransferDefinition definition, final TransferEventProcessor eventProcessor) throws TransferFailureException {
if (logger.isDebugEnabled()) {
logger.debug("transfer started to :" + targetName);
}
// transfer end event
TransferEndEvent endEvent = null;
Exception failureException = null;
TransferTarget target = null;
Transfer transfer = null;
final List<TransferEvent> transferReportEvents = new LinkedList<TransferEvent>();
NodeRef sourceReport = null;
NodeRef destinationReport = null;
File manifest = null;
File requisite = null;
int pollRetries = 0;
int pollPosition = -1;
boolean cancelled = false;
Descriptor currentDescriptor = descriptorService.getCurrentRepositoryDescriptor();
Descriptor serverDescriptor = descriptorService.getServerDescriptor();
final String localRepositoryId = currentDescriptor.getId();
TransferVersion fromVersion = new TransferVersionImpl(serverDescriptor);
// Wire in the transferReport - so any callbacks are stored in transferReport
TransferCallback reportCallback = new TransferCallback() {
public void processEvent(TransferEvent event) {
transferReportEvents.add(event);
}
};
eventProcessor.addObserver(reportCallback);
TransferContext transferContext = new TransferContext();
// start transfer
ClientTransferState clientState = ClientTransferState.Begin;
while (clientState != ClientTransferState.Exit) {
try {
switch(clientState) {
case Begin:
{
eventProcessor.start();
manifest = createManifest(definition, localRepositoryId, fromVersion, transferContext);
logger.debug("transfer begin");
target = getTransferTarget(targetName);
checkTargetEnabled(target);
transfer = transmitter.begin(target, localRepositoryId, fromVersion);
String transferId = transfer.getTransferId();
TransferStatus status = new TransferStatus();
transferMonitoring.put(transferId, status);
logger.debug("transfer begun transferId:" + transferId);
eventProcessor.begin(transferId);
checkCancel(transferId);
// next state
clientState = ClientTransferState.Prepare;
break;
}
case Prepare:
{
// check alfresco versions are compatible
TransferVersion toVersion = transfer.getToVersion();
if (!this.transferVersionChecker.checkTransferVersions(fromVersion, toVersion)) {
throw new TransferException(MSG_INCOMPATIBLE_VERSIONS, new Object[] { transfer.getTransferId(), fromVersion, toVersion });
}
// send Manifest, get the requsite back.
eventProcessor.sendSnapshot(1, 1);
requisite = createRequisiteFile();
FileOutputStream reqOutput = new FileOutputStream(requisite);
transmitter.sendManifest(transfer, manifest, reqOutput);
logger.debug("manifest sent");
checkCancel(transfer.getTransferId());
if (logger.isDebugEnabled()) {
logger.debug("requisite file written to local filesystem");
try {
outputFile(requisite);
} catch (IOException error) {
// This is debug code - so an exception thrown while debugging
logger.debug("error while outputting snapshotFile");
error.printStackTrace();
}
}
sendContent(transfer, definition, eventProcessor, manifest, requisite);
logger.debug("content sending finished");
checkCancel(transfer.getTransferId());
// prepare
eventProcessor.prepare();
transmitter.prepare(transfer);
checkCancel(transfer.getTransferId());
// next state
clientState = ClientTransferState.Commit;
break;
}
case Commit:
{
logger.debug("about to start committing transferId:" + transfer.getTransferId());
eventProcessor.commit();
transmitter.commit(transfer);
logger.debug("committing transferId:" + transfer.getTransferId());
checkCancel(transfer.getTransferId());
// next state
clientState = ClientTransferState.Poll;
break;
}
case Poll:
{
TransferProgress progress = null;
try {
progress = transmitter.getStatus(transfer);
// reset retries for next poll
pollRetries = 0;
} catch (TransferException e) {
pollRetries++;
if (pollRetries == 3) {
throw new TransferException(MSG_FAILED_TO_GET_TRANSFER_STATUS, new Object[] { target.getName() });
}
}
// check status
if (progress.getStatus() == TransferProgress.Status.ERROR) {
Throwable targetError = progress.getError();
// NOTE: it's possible the error is not returned from pre v3.4 target repositories
if (targetError == null) {
targetError = new TransferException(MSG_UNKNOWN_TARGET_ERROR);
}
if (Exception.class.isAssignableFrom(targetError.getClass())) {
failureException = (Exception) targetError;
} else {
failureException = new TransferException(MSG_TARGET_ERROR, new Object[] { targetError.getMessage() }, targetError);
}
clientState = ClientTransferState.Finished;
break;
} else if (progress.getStatus() == TransferProgress.Status.CANCELLED) {
cancelled = true;
clientState = ClientTransferState.Finished;
break;
}
// notify transfer progress
if (progress.getCurrentPosition() != pollPosition) {
pollPosition = progress.getCurrentPosition();
logger.debug("committing :" + pollPosition);
eventProcessor.committing(progress.getEndPosition(), pollPosition);
}
if (progress.getStatus() == TransferProgress.Status.COMPLETE) {
clientState = ClientTransferState.Finished;
break;
}
checkCancel(transfer.getTransferId());
// sleep before next poll
try {
Thread.sleep(commitPollDelay);
} catch (InterruptedException e) {
// carry on
}
break;
}
case Cancel:
{
logger.debug("Abort - waiting for target confirmation of cancel");
transmitter.abort(transfer);
// next state... poll for confirmation of cancel from target
clientState = ClientTransferState.Poll;
break;
}
case Finished:
{
try {
TransferEndEventImpl endEventImpl = null;
String reportName = null;
try {
if (failureException != null) {
logger.debug("TransferException - unable to transfer", failureException);
TransferEventError errorEvent = new TransferEventError();
errorEvent.setTransferState(TransferEvent.TransferState.ERROR);
errorEvent.setException(failureException);
errorEvent.setMessage(failureException.getMessage());
endEventImpl = errorEvent;
reportName = "error";
} else if (cancelled) {
endEventImpl = new TransferEventCancelled();
endEventImpl.setTransferState(TransferEvent.TransferState.CANCELLED);
endEventImpl.setMessage("cancelled");
reportName = "cancelled";
} else {
logger.debug("committed transferId:" + transfer.getTransferId());
endEventImpl = new TransferEventSuccess();
endEventImpl.setTransferState(TransferEvent.TransferState.SUCCESS);
endEventImpl.setMessage("success");
reportName = "success";
}
// manually add the terminal event to the transfer report event list
transferReportEvents.add(endEventImpl);
} catch (Exception e) {
// report this failure as last resort
failureException = e;
reportName = "error";
logger.warn("Exception - unable to notify end transfer state", e);
}
reportName += "_" + new SimpleDateFormat("yyyyMMddhhmmssSSS").format(new Date());
try {
if (transfer != null) {
logger.debug("now pull back the destination transfer report");
destinationReport = persistDestinationTransferReport(reportName, transfer, target);
if (destinationReport != null) {
eventProcessor.writeReport(destinationReport, TransferEventReport.ReportType.DESTINATION, endEventImpl.getTransferState());
}
}
logger.debug("now persist the client side transfer report");
sourceReport = persistTransferReport(reportName, transfer, target, definition, transferReportEvents, manifest, failureException);
if (sourceReport != null) {
eventProcessor.writeReport(sourceReport, TransferEventReport.ReportType.SOURCE, endEventImpl.getTransferState());
}
} catch (Exception e) {
logger.warn("Exception - unable to write transfer reports", e);
}
try {
endEventImpl.setLast(true);
endEventImpl.setSourceReport(sourceReport);
endEventImpl.setDestinationReport(destinationReport);
endEvent = endEventImpl;
eventProcessor.end(endEvent);
} catch (Exception e) {
// report this failure as last resort
failureException = e;
logger.warn("Exception - unable to notify end transfer state", e);
}
} finally {
clientState = ClientTransferState.Exit;
}
}
}
} catch (TransferCancelledException e) {
logger.debug("Interrupted by transfer cancel request from client");
clientState = ClientTransferState.Cancel;
} catch (Exception e) {
logger.debug("Exception - unable to transfer", e);
/**
* Save the first exception that we encounter.
*/
if (failureException == null) {
failureException = e;
}
if (transfer != null && (clientState == ClientTransferState.Begin || clientState == ClientTransferState.Prepare || clientState == ClientTransferState.Commit)) {
// we must first inform the target repository that a client failure has occurred to allow it to
// clean up appropriately, too
clientState = ClientTransferState.Cancel;
} else {
clientState = ClientTransferState.Finished;
}
}
}
try {
if (endEvent == null) {
TransferEventError error = new TransferEventError();
error.setTransferState(TransferEvent.TransferState.ERROR);
TransferFailureException endException = new TransferFailureException(error);
error.setMessage(endException.getMessage());
error.setException(endException);
error.setSourceReport(sourceReport);
error.setDestinationReport(destinationReport);
error.setLast(true);
endEvent = error;
}
if (endEvent instanceof TransferEventError) {
TransferEventError endError = (TransferEventError) endEvent;
throw new TransferFailureException(endError);
}
return endEvent;
} finally {
// clean up
if (transfer != null) {
transferMonitoring.remove(transfer.getTransferId());
}
if (manifest != null) {
manifest.delete();
logger.debug("manifest file deleted");
}
if (requisite != null) {
requisite.delete();
logger.debug("requisite file deleted");
}
}
}
use of org.alfresco.service.cmr.transfer.TransferEvent in project alfresco-repository by Alfresco.
the class TransferTreeWithCancelActionExecuter method executeImpl.
/* (non-Javadoc)
* @see org.alfresco.repo.action.executer.ActionExecuterAbstractBase#executeImpl(org.alfresco.service.cmr.action.Action, org.alfresco.service.cmr.repository.NodeRef)
*/
@Override
protected void executeImpl(Action action, NodeRef actionedUponNodeRef) {
TransferTarget target = serviceRegistry.getTransactionService().getRetryingTransactionHelper().doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<TransferTarget>() {
public TransferTarget execute() throws Throwable {
return TransferTestUtil.getTestTarget(transferService);
}
}, false, true);
NodeCrawler crawler = new StandardNodeCrawlerImpl(serviceRegistry);
crawler.setNodeFinders(new ChildAssociatedNodeFinder(ContentModel.ASSOC_CONTAINS));
Set<NodeRef> nodes = crawler.crawl(actionedUponNodeRef);
TransferDefinition td = new TransferDefinition();
td.setNodes(nodes);
transferService.transferAsync(target.getName(), td, new TransferCallback() {
private String transferId;
public void processEvent(TransferEvent event) {
if (event instanceof TransferEventBegin) {
transferId = ((TransferEventBegin) event).getTransferId();
} else if (event instanceof TransferEventCommittingStatus) {
transferService.cancelAsync(transferId);
}
}
});
}
use of org.alfresco.service.cmr.transfer.TransferEvent in project alfresco-repository by Alfresco.
the class TransferServiceToBeRefactoredTest method testTransferReport.
/**
* Test the transfer report.
*
* This is a unit test so it does some shenanigans to send to the same instance of alfresco.
*/
@Test
public void testTransferReport() throws Exception {
final NodeRef guestHome = repositoryHelper.getGuestHome();
/**
* For unit test
* - replace the HTTP transport with the in-process transport
* - replace the node factory with one that will map node refs, paths etc.
*/
TransferTransmitter transmitter = new UnitTestInProcessTransmitterImpl(this.receiver, this.contentService, transactionService);
transferServiceImpl.setTransmitter(transmitter);
UnitTestTransferManifestNodeFactory testNodeFactory = new UnitTestTransferManifestNodeFactory(this.transferManifestNodeFactory);
transferServiceImpl.setTransferManifestNodeFactory(testNodeFactory);
List<Pair<Path, Path>> pathMap = testNodeFactory.getPathMap();
// Map company_home/guest_home to company_home so tranferred nodes and moved "up" one level.
pathMap.add(new Pair<Path, Path>(PathHelper.stringToPath(GUEST_HOME_XPATH_QUERY), PathHelper.stringToPath(COMPANY_HOME_XPATH_QUERY)));
DescriptorService mockedDescriptorService = getMockDescriptorService(REPO_ID_A);
transferServiceImpl.setDescriptorService(mockedDescriptorService);
/**
* Now go ahead and create our first transfer target
* This needs to be committed before we can call transfer asycnc.
*/
final String CONTENT_TITLE = "ContentTitle";
final String CONTENT_NAME_A = "Report Node A";
final String CONTENT_NAME_B = "Report Node B";
final Locale CONTENT_LOCALE = Locale.GERMAN;
final String CONTENT_STRING = "Hello";
class TestData {
NodeRef nodeRefA;
NodeRef nodeRefB;
NodeRef testFolder;
NodeRef transferReport;
NodeRef transferDestReport;
}
final TestData testData = new TestData();
final String targetName = "testTransferReport";
transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback<Void>() {
@Override
public Void execute() throws Throwable {
{
String name = GUID.generate();
ChildAssociationRef child = nodeService.createNode(guestHome, ContentModel.ASSOC_CONTAINS, QName.createQName(name), ContentModel.TYPE_FOLDER);
testData.testFolder = child.getChildRef();
nodeService.setProperty(testData.testFolder, ContentModel.PROP_TITLE, CONTENT_TITLE);
nodeService.setProperty(testData.testFolder, ContentModel.PROP_NAME, name);
}
{
/**
* Create a test node that we will read and write
*/
ChildAssociationRef child = nodeService.createNode(testData.testFolder, ContentModel.ASSOC_CONTAINS, QName.createQName(GUID.generate()), ContentModel.TYPE_CONTENT);
testData.nodeRefA = child.getChildRef();
nodeService.setProperty(testData.nodeRefA, ContentModel.PROP_TITLE, CONTENT_TITLE);
nodeService.setProperty(testData.nodeRefA, ContentModel.PROP_NAME, CONTENT_NAME_A);
ContentWriter writer = contentService.getWriter(testData.nodeRefA, ContentModel.PROP_CONTENT, true);
writer.setLocale(CONTENT_LOCALE);
writer.putContent(CONTENT_STRING);
}
{
ChildAssociationRef child = nodeService.createNode(testData.testFolder, ContentModel.ASSOC_CONTAINS, QName.createQName(GUID.generate()), ContentModel.TYPE_CONTENT);
testData.nodeRefB = child.getChildRef();
nodeService.setProperty(testData.nodeRefB, ContentModel.PROP_TITLE, CONTENT_TITLE);
nodeService.setProperty(testData.nodeRefB, ContentModel.PROP_NAME, CONTENT_NAME_B);
ContentWriter writer = contentService.getWriter(testData.nodeRefB, ContentModel.PROP_CONTENT, true);
writer.setLocale(CONTENT_LOCALE);
writer.putContent(CONTENT_STRING);
}
/**
* Now go ahead and create our first transfer target
*/
if (!transferService.targetExists(targetName)) {
createTransferTarget(targetName);
}
return null;
}
});
/**
* Step 1.
* Call the transfer method. to get a failed transfer - orphan nodes exist
*/
TestTransaction.start();
try {
TestTransferCallback callback = new TestTransferCallback();
Set<TransferCallback> callbacks = new HashSet<TransferCallback>();
callbacks.add(callback);
TransferDefinition definition = new TransferDefinition();
Set<NodeRef> nodes = new HashSet<NodeRef>();
nodes.add(testData.nodeRefA);
nodes.add(testData.nodeRefB);
// missing the folder node (testFolder)
definition.setNodes(nodes);
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;
testData.transferDestReport = reportEvent.getNodeRef();
assertNotNull("dest transfer nodeId null", testData.transferDestReport);
break;
case SOURCE:
foundSourceReport = true;
testData.transferReport = reportEvent.getNodeRef();
break;
}
}
}
assertTrue("source report not found", foundSourceReport);
assertTrue("dest report not found", foundDestReport);
} finally {
TestTransaction.end();
}
/**
* Now validate the client side error transfer report against the xsd file
*/
transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback<Void>() {
@Override
public Void execute() throws Throwable {
ContentReader reader = contentService.getReader(testData.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(testData.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(testData.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());
}
return null;
}
});
/**
* Step 2
* Call the transfer method to get a good success transfer report
*/
transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback<Void>() {
@Override
public Void execute() throws Throwable {
{
TestTransferCallback callback = new TestTransferCallback();
Set<TransferCallback> callbacks = new HashSet<TransferCallback>();
callbacks.add(callback);
TransferDefinition definition = new TransferDefinition();
Set<NodeRef> nodes = new HashSet<NodeRef>();
nodes.add(testData.nodeRefA);
nodes.add(testData.nodeRefB);
nodes.add(testData.testFolder);
definition.setNodes(nodes);
testData.transferReport = transferService.transfer(targetName, definition, callbacks);
assertNotNull("transfer report is null", testData.transferReport);
// 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;
testData.transferDestReport = reportEvent.getNodeRef();
assertNotNull("dest transfer nodeId null", testData.transferDestReport);
assertFalse("dest transfer nodeId not correct", testData.transferReport.equals(testData.transferDestReport));
break;
case SOURCE:
foundSourceReport = true;
assertEquals("source transfer nodeId not correct", testData.transferReport, reportEvent.getNodeRef());
break;
}
}
}
assertTrue("source report not found", foundSourceReport);
assertTrue("dest report not found", foundDestReport);
}
return null;
}
});
/**
* Now validate the client side transfer report against the xsd file
*/
transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback<Void>() {
@Override
public Void execute() throws Throwable {
ContentReader reader = contentService.getReader(testData.transferReport, ContentModel.PROP_CONTENT);
assertNotNull("transfer reader is null", reader);
logger.debug("This report should succeed");
if (logger.isDebugEnabled()) {
dumpToSystemOut(testData.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());
}
return null;
}
});
/**
* Now validate the destination side transfer report against its xsd file
*/
transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback<Void>() {
@Override
public Void execute() throws Throwable {
ContentReader reader = contentService.getReader(testData.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(testData.transferReport, ContentModel.PROP_NAME);
assertTrue("dest report does not end with .xml", name.endsWith(".xml"));
if (logger.isDebugEnabled()) {
dumpToSystemOut(testData.transferDestReport);
}
// Now validate the destination 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/reportd/TransferDestinationReport.xsd";
Schema schema = sf.newSchema(ResourceUtils.getURL(TRANSFER_REPORT_SCHEMA_LOCATION));
Validator validator = schema.newValidator();
try {
validator.validate(transferReportSource);
} catch (Exception e) {
fail("Destination Transfer Report " + e.getMessage());
}
return null;
}
});
/**
* Now validate all transfer reports.
*/
transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback<Void>() {
@Override
public Void execute() throws Throwable {
String query = "TYPE:\"trx:transferReportDest\"";
ResultSet results = searchService.query(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, SearchService.LANGUAGE_LUCENE, query);
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
final String TRANSFER_REPORT_SCHEMA_LOCATION = "classpath:org/alfresco/repo/transfer/reportd/TransferDestinationReport.xsd";
Schema schema = sf.newSchema(ResourceUtils.getURL(TRANSFER_REPORT_SCHEMA_LOCATION));
Validator validator = schema.newValidator();
for (ResultSetRow result : results) {
NodeRef reportNode = result.getNodeRef();
logger.debug("validating reportNode " + reportNode);
// Now validate the destination side transfer report against the XSD
ContentReader reader = contentService.getReader(reportNode, ContentModel.PROP_CONTENT);
assertNotNull("transfer reader is null", reader);
if (reader.getMimetype().equals(MimetypeMap.MIMETYPE_XML)) {
Source transferReportSource = new StreamSource(reader.getContentInputStream());
try {
validator.validate(transferReportSource);
} catch (Exception e) {
fail("Destination Transfer Report reportNode:" + reportNode + " message :" + e.getMessage());
}
}
}
return null;
}
});
transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback<Void>() {
@Override
public Void execute() throws Throwable {
logger.debug("now delete the target:" + targetName);
transferService.deleteTransferTarget(targetName);
return null;
}
});
}
Aggregations