| /** |
| * 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.ehcache; |
| |
| import java.util.Collections; |
| import java.util.Map; |
| import java.util.Set; |
| |
| import org.apache.camel.CamelExchangeException; |
| import org.apache.camel.InvokeOnHeader; |
| import org.apache.camel.Message; |
| import org.apache.camel.impl.HeaderSelectorProducer; |
| import org.ehcache.Cache; |
| |
| public class EhcacheProducer extends HeaderSelectorProducer { |
| private final EhcacheConfiguration configuration; |
| private final EhcacheManager manager; |
| private final Cache cache; |
| |
| public EhcacheProducer(EhcacheEndpoint endpoint, String cacheName, EhcacheConfiguration configuration) throws Exception { |
| super(endpoint, EhcacheConstants.ACTION, () -> configuration.getAction()); |
| |
| this.configuration = configuration; |
| this.manager = endpoint.getManager(); |
| this.cache = manager.getCache(cacheName, configuration.getKeyType(), configuration.getValueType()); |
| } |
| |
| // **************************** |
| // Handlers |
| // **************************** |
| |
| @InvokeOnHeader(EhcacheConstants.ACTION_CLEAR) |
| public void onClear(Message message) throws Exception { |
| cache.clear(); |
| |
| setResult(message, true, null, null); |
| } |
| |
| @InvokeOnHeader(EhcacheConstants.ACTION_PUT) |
| public void onPut(Message message) throws Exception { |
| cache.put(getKey(message), getValue(message, configuration.getValueType())); |
| |
| setResult(message, true, null, null); |
| } |
| |
| @InvokeOnHeader(EhcacheConstants.ACTION_PUT_ALL) |
| public void onPutAll(Message message) throws Exception { |
| cache.putAll((Map)getValue(message, Map.class)); |
| |
| setResult(message, true, null, null); |
| } |
| |
| @InvokeOnHeader(EhcacheConstants.ACTION_PUT_IF_ABSENT) |
| public void onPutIfAbsent(Message message) throws Exception { |
| Object oldValue = cache.putIfAbsent(getKey(message), getValue(message, configuration.getValueType())); |
| |
| setResult(message, true, null, oldValue); |
| } |
| |
| @InvokeOnHeader(EhcacheConstants.ACTION_GET) |
| public void onGet(Message message) throws Exception { |
| Object result = cache.get(getKey(message)); |
| |
| setResult(message, true, result, null); |
| } |
| |
| @InvokeOnHeader(EhcacheConstants.ACTION_GET_ALL) |
| public void onGetAll(Message message) throws Exception { |
| Object result = cache.getAll( |
| message.getHeader(EhcacheConstants.KEYS, Collections::emptySet, Set.class) |
| ); |
| |
| setResult(message, true, result, null); |
| } |
| |
| @InvokeOnHeader(EhcacheConstants.ACTION_REMOVE) |
| public void onRemove(Message message) throws Exception { |
| boolean success = true; |
| Object valueToReplace = message.getHeader(EhcacheConstants.OLD_VALUE); |
| if (valueToReplace == null) { |
| cache.remove(getKey(message)); |
| } else { |
| success = cache.remove(getKey(message), valueToReplace); |
| } |
| |
| setResult(message, success, null, null); |
| } |
| |
| @InvokeOnHeader(EhcacheConstants.ACTION_REMOVE_ALL) |
| public void onRemoveAll(Message message) throws Exception { |
| cache.removeAll( |
| message.getHeader(EhcacheConstants.KEYS, Collections::emptySet, Set.class) |
| ); |
| |
| setResult(message, true, null, null); |
| } |
| |
| @InvokeOnHeader(EhcacheConstants.ACTION_REPLACE) |
| public void onReplace(Message message) throws Exception { |
| boolean success = true; |
| Object oldValue = null; |
| Object value = getValue(message, configuration.getValueType()); |
| Object valueToReplace = message.getHeader(EhcacheConstants.OLD_VALUE); |
| |
| if (valueToReplace == null) { |
| oldValue = cache.replace(getKey(message), value); |
| } else { |
| success = cache.replace(getKey(message), valueToReplace, value); |
| } |
| |
| setResult(message, success, null, oldValue); |
| } |
| |
| // **************************** |
| // Helpers |
| // **************************** |
| |
| private Object getKey(final Message message) throws Exception { |
| Object value = message.getHeader(EhcacheConstants.KEY, configuration.getKeyType()); |
| if (value == null) { |
| value = configuration.getKey(); |
| } |
| |
| if (value == null) { |
| throw new CamelExchangeException( |
| "No value provided in header or as default value (" + EhcacheConstants.KEY + ")", |
| message.getExchange() |
| ); |
| } |
| |
| return value; |
| } |
| |
| private Object getValue(final Message message, final Class<?> type) throws Exception { |
| Object value = message.getHeader(EhcacheConstants.VALUE, type); |
| if (value == null) { |
| value = message.getBody(type); |
| } |
| |
| if (value == null) { |
| throw new CamelExchangeException( |
| "No value provided in header or body (" + EhcacheConstants.VALUE + ")", |
| message.getExchange() |
| ); |
| } |
| |
| return value; |
| } |
| |
| private void setResult(Message message, boolean success, Object result, Object oldValue) { |
| message.setHeader(EhcacheConstants.ACTION_SUCCEEDED, success); |
| message.setHeader(EhcacheConstants.ACTION_HAS_RESULT, oldValue != null || result != null); |
| |
| if (oldValue != null) { |
| message.setHeader(EhcacheConstants.OLD_VALUE, oldValue); |
| } |
| if (result != null) { |
| message.setBody(result); |
| } |
| } |
| } |