/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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. */ package org.apache.camel.component.krati.processor.idempotent; import krati.core.segment.ChannelSegmentFactory; import krati.core.segment.SegmentFactory; import krati.io.Serializer; import krati.store.DataSet; import org.apache.camel.api.management.ManagedOperation; import org.apache.camel.component.krati.KratiHelper; import org.apache.camel.component.krati.serializer.KratiDefaultSerializer; import org.apache.camel.spi.IdempotentRepository; import org.apache.camel.support.ServiceSupport; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class KratiIdempotentRepository extends ServiceSupport implements IdempotentRepository<String> { private static final Logger LOG = LoggerFactory.getLogger(KratiHelper.class); private String repositoryPath; private DataSet<byte[]> dataSet; private int initialCapacity = 100; private Serializer<String> serializer = new KratiDefaultSerializer<String>(); private SegmentFactory segmentFactory = new ChannelSegmentFactory(); public KratiIdempotentRepository(String repositoryPath) { this.repositoryPath = repositoryPath; } @Override @ManagedOperation(description = "Adds the key to the store") public boolean add(String s) { byte[] bytes = serializer.serialize(s); try { synchronized (dataSet) { if (dataSet.has(bytes)) { return false; } else { return dataSet.add(serializer.serialize(s)); } } } catch (Exception e) { LOG.warn("Error adding item to Krati idempotent repository. This exception is ignored.", e); return false; } } @Override @ManagedOperation(description = "Does the store contain the given key") public boolean contains(String s) { byte[] bytes = serializer.serialize(s); try { return dataSet.has(bytes); } catch (Exception e) { LOG.warn("Error checking item exists in Krati idempotent repository. This exception is ignored.", e); return false; } } @Override @ManagedOperation(description = "Removes the given key from the store") public boolean remove(String s) { byte[] bytes = serializer.serialize(s); try { return dataSet.delete(bytes); } catch (Exception e) { LOG.warn("Error removing item from Krati idempotent repository. This exception is ignored.", e); return false; } } @Override public boolean confirm(String s) { return true; } @Override public void clear() { try { dataSet.clear(); } catch (Exception e) { LOG.warn("Error clear Krati idempotent repository. This exception is ignored.", e); } } @Override protected void doStart() throws Exception { if (dataSet == null) { this.dataSet = KratiHelper.createDataSet(repositoryPath, initialCapacity, segmentFactory); } } @Override protected void doStop() throws Exception { if (dataSet != null && dataSet.isOpen()) { this.dataSet.close(); } } public String getRepositoryPath() { return repositoryPath; } public void setRepositoryPath(String repositoryPath) { this.repositoryPath = repositoryPath; } public DataSet<byte[]> getDataSet() { return dataSet; } public void setDataSet(DataSet<byte[]> dataSet) { this.dataSet = dataSet; } public int getInitialCapacity() { return initialCapacity; } public void setInitialCapacity(int initialCapacity) { this.initialCapacity = initialCapacity; } public Serializer<String> getSerializer() { return serializer; } public void setSerializer(Serializer<String> serializer) { this.serializer = serializer; } public SegmentFactory getSegmentFactory() { return segmentFactory; } public void setSegmentFactory(SegmentFactory segmentFactory) { this.segmentFactory = segmentFactory; } }