001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.camel.component.hazelcast.map;
018
019 import java.util.Collection;
020 import java.util.Map;
021
022 import com.hazelcast.core.Hazelcast;
023 import com.hazelcast.core.IMap;
024 import com.hazelcast.query.SqlPredicate;
025
026 import org.apache.camel.Exchange;
027 import org.apache.camel.component.hazelcast.HazelcastComponentHelper;
028 import org.apache.camel.component.hazelcast.HazelcastConstants;
029 import org.apache.camel.impl.DefaultProducer;
030
031 public class HazelcastMapProducer extends DefaultProducer {
032
033 private final IMap<String, Object> cache;
034 private final HazelcastComponentHelper helper = new HazelcastComponentHelper();
035
036 public HazelcastMapProducer(HazelcastMapEndpoint endpoint, String cacheName) {
037 super(endpoint);
038 this.cache = Hazelcast.getMap(cacheName);
039 }
040
041 public void process(Exchange exchange) throws Exception {
042
043 Map<String, Object> headers = exchange.getIn().getHeaders();
044
045 // get header parameters
046 String oid = null;
047 int operation = -1;
048 String query = null;
049
050 if (headers.containsKey(HazelcastConstants.OBJECT_ID)) {
051 oid = (String) headers.get(HazelcastConstants.OBJECT_ID);
052 }
053
054 if (headers.containsKey(HazelcastConstants.OPERATION)) {
055
056 // producer allows int (HazelcastConstants) and string values
057 if (headers.get(HazelcastConstants.OPERATION) instanceof String) {
058 operation = helper.lookupOperationNumber((String) headers.get(HazelcastConstants.OPERATION));
059 } else {
060 operation = (Integer) headers.get(HazelcastConstants.OPERATION);
061 }
062 }
063
064 if (headers.containsKey(HazelcastConstants.QUERY)) {
065 query = (String) headers.get(HazelcastConstants.QUERY);
066 }
067
068 switch (operation) {
069
070 case HazelcastConstants.PUT_OPERATION:
071 this.put(oid, exchange);
072 break;
073
074 case HazelcastConstants.GET_OPERATION:
075 this.get(oid, exchange);
076 break;
077
078 case HazelcastConstants.DELETE_OPERATION:
079 this.delete(oid);
080 break;
081
082 case HazelcastConstants.UPDATE_OPERATION:
083 this.update(oid, exchange);
084 break;
085
086 case HazelcastConstants.QUERY_OPERATION:
087 this.query(query, exchange);
088 break;
089
090 default:
091 throw new IllegalArgumentException(String.format("The value '%s' is not allowed for parameter '%s' on the MAP cache.", operation, HazelcastConstants.OPERATION));
092 }
093
094 // finally copy headers
095 HazelcastComponentHelper.copyHeaders(exchange);
096
097 }
098
099 /**
100 * query map with a sql like syntax (see http://www.hazelcast.com/)
101 */
102 private void query(String query, Exchange exchange) {
103 Collection<Object> result = this.cache.values(new SqlPredicate(query));
104 exchange.getOut().setBody(result);
105 }
106
107 /**
108 * update an object in your cache (the whole object will be replaced)
109 */
110 private void update(String oid, Exchange exchange) {
111 Object body = exchange.getIn().getBody();
112 this.cache.lock(oid);
113 this.cache.replace(oid, body);
114 this.cache.unlock(oid);
115 }
116
117 /**
118 * remove an object from the cache
119 */
120 private void delete(String oid) {
121 this.cache.remove(oid);
122 }
123
124 /**
125 * find an object by the given id and give it back
126 */
127 private void get(String oid, Exchange exchange) {
128 exchange.getOut().setBody(this.cache.get(oid));
129 }
130
131 /**
132 * put a new object into the cache
133 */
134 private void put(String oid, Exchange exchange) {
135 Object body = exchange.getIn().getBody();
136 this.cache.put(oid, body);
137 }
138 }