001/* 002 * (C) Copyright 2012 Nuxeo SA (http://nuxeo.com/) and contributors. 003 * 004 * All rights reserved. This program and the accompanying materials 005 * are made available under the terms of the GNU Lesser General Public License 006 * (LGPL) version 2.1 which accompanies this distribution, and is available at 007 * http://www.gnu.org/licenses/lgpl.html 008 * 009 * This library is distributed in the hope that it will be useful, 010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 012 * Lesser General Public License for more details. 013 * 014 * Contributors: 015 * Thomas Roger 016 */ 017 018package org.nuxeo.ecm.csv; 019 020import java.io.File; 021import java.util.ArrayList; 022import java.util.Arrays; 023import java.util.Collections; 024import java.util.List; 025 026import org.nuxeo.ecm.core.api.CoreSession; 027import org.nuxeo.ecm.core.work.api.Work; 028import org.nuxeo.ecm.core.work.api.Work.State; 029import org.nuxeo.ecm.core.work.api.WorkManager; 030import org.nuxeo.runtime.api.Framework; 031 032/** 033 * @since 5.7 034 */ 035public class CSVImporterImpl implements CSVImporter { 036 037 @Override 038 public String launchImport(CoreSession session, String parentPath, File csvFile, String csvFileName, 039 CSVImporterOptions options) { 040 CSVImporterWork work = new CSVImporterWork(session.getRepositoryName(), parentPath, 041 session.getPrincipal().getName(), csvFile, csvFileName, options); 042 WorkManager workManager = Framework.getLocalService(WorkManager.class); 043 workManager.schedule(work, WorkManager.Scheduling.IF_NOT_RUNNING_OR_SCHEDULED); 044 return work.getId(); 045 } 046 047 @Override 048 public CSVImportStatus getImportStatus(String id) { 049 WorkManager workManager = Framework.getLocalService(WorkManager.class); 050 State state = workManager.getWorkState(id); 051 if (state == null) { 052 return null; 053 } else if (state == State.COMPLETED) { 054 return new CSVImportStatus(CSVImportStatus.State.COMPLETED); 055 } else if (state == State.SCHEDULED) { 056 String queueId = workManager.getCategoryQueueId(CSVImporterWork.CATEGORY_CSV_IMPORTER); 057 int queueSize = workManager.getQueueSize(queueId, State.SCHEDULED); 058 return new CSVImportStatus(CSVImportStatus.State.SCHEDULED, 0, queueSize); 059 } else { // RUNNING 060 return new CSVImportStatus(CSVImportStatus.State.RUNNING); 061 } 062 } 063 064 @Override 065 public List<CSVImportLog> getImportLogs(String id) { 066 return getLastImportLogs(id, -1); 067 } 068 069 @Override 070 public List<CSVImportLog> getImportLogs(String id, CSVImportLog.Status... status) { 071 return getLastImportLogs(id, -1, status); 072 } 073 074 @Override 075 public List<CSVImportLog> getLastImportLogs(String id, int max) { 076 WorkManager workManager = Framework.getLocalService(WorkManager.class); 077 Work work = workManager.find(id, null); 078 if (work == null) { 079 work = workManager.find(id, State.COMPLETED); 080 if (work == null) { 081 return Collections.emptyList(); 082 } 083 } 084 List<CSVImportLog> importLogs = ((CSVImporterWork) work).getImportLogs(); 085 max = (max == -1 || max > importLogs.size()) ? importLogs.size() : max; 086 return importLogs.subList(importLogs.size() - max, importLogs.size()); 087 } 088 089 @Override 090 public List<CSVImportLog> getLastImportLogs(String id, int max, CSVImportLog.Status... status) { 091 List<CSVImportLog> importLogs = getLastImportLogs(id, max); 092 return status.length == 0 ? importLogs : filterImportLogs(importLogs, status); 093 } 094 095 protected List<CSVImportLog> filterImportLogs(List<CSVImportLog> importLogs, CSVImportLog.Status... status) { 096 List<CSVImportLog.Status> statusList = Arrays.asList(status); 097 List<CSVImportLog> filteredLogs = new ArrayList<CSVImportLog>(); 098 for (CSVImportLog log : importLogs) { 099 if (statusList.contains(log.getStatus())) { 100 filteredLogs.add(log); 101 } 102 } 103 return filteredLogs; 104 } 105 106 @Override 107 public CSVImportResult getImportResult(String id) { 108 WorkManager workManager = Framework.getLocalService(WorkManager.class); 109 Work work = workManager.find(id, State.COMPLETED); 110 if (work == null) { 111 return null; 112 } 113 114 List<CSVImportLog> importLogs = ((CSVImporterWork) work).getImportLogs(); 115 return CSVImportResult.fromImportLogs(importLogs); 116 } 117 118}