package fr.acxio.tools.agia.cmis; /* * Copyright 2014 Acxio * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import java.util.Calendar; import java.util.Iterator; import org.apache.chemistry.opencmis.client.api.ItemIterable; import org.apache.chemistry.opencmis.client.api.OperationContext; import org.apache.chemistry.opencmis.client.api.QueryResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.batch.item.ExecutionContext; import org.springframework.batch.item.ItemStreamException; import org.springframework.batch.item.ItemStreamReader; import org.springframework.batch.item.NonTransientResourceException; import org.springframework.batch.item.ParseException; import org.springframework.batch.item.UnexpectedInputException; import fr.acxio.tools.agia.convert.DateToStringConverter; public class CmisReader implements ItemStreamReader<QueryResult> { private static final Logger LOGGER = LoggerFactory.getLogger(CmisReader.class); private static final String CONTEXT_KEY_LASTTIMESTAMP = "cmis.reader.lastTimestamp"; private static final DateToStringConverter CONVERTER_TIMESTAMP = new DateToStringConverter("yyyy-MM-dd'T'HH:mm:ss.SSSZZ"); private CmisService cmisService; private String query; private OperationContext operationContext; private String lastTimestamp; private ItemIterable<QueryResult> currentQueryResult; private Iterator<QueryResult> unreadObjects; public void setCmisService(CmisService sCmisService) { cmisService = sCmisService; } public void setQuery(String sQuery) { query = sQuery; } public void setOperationContext(OperationContext sOperationContext) { operationContext = sOperationContext; } @Override public void open(ExecutionContext sExecutionContext) throws ItemStreamException { cmisService.startSession(); lastTimestamp = sExecutionContext.getString(CONTEXT_KEY_LASTTIMESTAMP, null); executeQuery(); } @Override public void update(ExecutionContext sExecutionContext) throws ItemStreamException { sExecutionContext.putString(CONTEXT_KEY_LASTTIMESTAMP, lastTimestamp); } @Override public void close() throws ItemStreamException { unreadObjects = null; lastTimestamp = null; currentQueryResult = null; } @Override public QueryResult read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException { QueryResult aResult = null; if (unreadObjects.hasNext()) { aResult = unreadObjects.next(); if (aResult != null) { lastTimestamp = CONVERTER_TIMESTAMP.convert((Calendar) aResult.getPropertyByQueryName("cmis:creationDate").getFirstValue()).get(0); } else { executeQuery(); aResult = read(); } } else if (currentQueryResult.getHasMoreItems()) { executeQuery(); aResult = read(); } return aResult; } private void executeQuery() { StringBuilder aQuery = new StringBuilder(query); if (lastTimestamp != null) { aQuery.append(" and cmis:creationDate > TIMESTAMP '"); aQuery.append(lastTimestamp); aQuery.append("'"); } aQuery.append("order by cmis:creationDate"); if (LOGGER.isDebugEnabled()) { LOGGER.debug("Execute query : " + aQuery.toString()); } currentQueryResult = cmisService.getSession().query(aQuery.toString(), false, operationContext); unreadObjects = currentQueryResult.iterator(); } }