Project

General

Profile

1 6395 leinfelder
package edu.ucsb.nceas.metacat.dataone.hazelcast;
2
3 6893 cjones
import java.sql.SQLException;
4 6395 leinfelder
import java.util.Collection;
5 6426 leinfelder
import java.util.HashMap;
6 6395 leinfelder
import java.util.Map;
7
import java.util.Set;
8
9 6868 cjones
import org.apache.log4j.Logger;
10 6904 cjones
import org.dataone.service.exceptions.InvalidSystemMetadata;
11 6395 leinfelder
import org.dataone.service.types.v1.Identifier;
12 8810 leinfelder
import org.dataone.service.types.v2.SystemMetadata;
13 6395 leinfelder
14
import com.hazelcast.core.MapLoader;
15
import com.hazelcast.core.MapStore;
16
17
import edu.ucsb.nceas.metacat.IdentifierManager;
18
import edu.ucsb.nceas.metacat.McdbDocNotFoundException;
19
20
/**
21
 * Storage implementation for Hazelcast System Metadata
22
 * @author leinfelder
23
 *
24
 */
25 6868 cjones
public class SystemMetadataMap
26
    implements MapStore<Identifier, SystemMetadata>, MapLoader<Identifier, SystemMetadata> {
27 6395 leinfelder
28 7197 leinfelder
  private Logger logMetacat = Logger.getLogger(SystemMetadataMap.class);
29 6868 cjones
30 6471 jones
	@Override
31 6395 leinfelder
	public void delete(Identifier arg0) {
32 8850 tao
		if(arg0!= null) {
33
			logMetacat.debug("delete the identifier"+arg0.getValue());
34
			boolean success = IdentifierManager.getInstance().deleteSystemMetadata(arg0.getValue());
35
			if(!success) {
36
				throw new RuntimeException("SystemMetadataMap.delete - the system metadata of guid - "+arg0.getValue()+" can't be removed successfully.");
37
			}
38
		}
39
40 6395 leinfelder
	}
41
42 6471 jones
	@Override
43 6395 leinfelder
	public void deleteAll(Collection<Identifier> arg0) {
44
		// we do not delete system metadata
45
	}
46
47 6471 jones
	@Override
48 6395 leinfelder
	public void store(Identifier pid, SystemMetadata sm) {
49
		try {
50 7111 leinfelder
			logMetacat.debug("Storing System Metadata to store: " + pid.getValue());
51 7188 leinfelder
			IdentifierManager.getInstance().insertOrUpdateSystemMetadata(sm);
52 6395 leinfelder
		} catch (McdbDocNotFoundException e) {
53 6456 leinfelder
			throw new RuntimeException(e.getMessage(), e);
54 6893 cjones
55
		} catch (SQLException e) {
56
	      throw new RuntimeException(e.getMessage(), e);
57
58 6904 cjones
    } catch (InvalidSystemMetadata e) {
59
        throw new RuntimeException(e.getMessage(), e);
60
        }
61 6395 leinfelder
	}
62
63 6471 jones
	@Override
64 6395 leinfelder
	public void storeAll(Map<Identifier, SystemMetadata> map) {
65
		for (Identifier key: map.keySet()) {
66
			store(key, map.get(key));
67
		}
68
	}
69
70 6471 jones
	@Override
71 6395 leinfelder
	public SystemMetadata load(Identifier pid) {
72
		SystemMetadata sm = null;
73 6868 cjones
74 7197 leinfelder
75 6868 cjones
    try {
76
			logMetacat.debug("loading from store: " + pid.getValue());
77 6395 leinfelder
			sm = IdentifierManager.getInstance().getSystemMetadata(pid.getValue());
78
		} catch (McdbDocNotFoundException e) {
79 6496 leinfelder
			//throw new RuntimeException(e.getMessage(), e);
80
			// not found => null
81 9490 leinfelder
			logMetacat.warn("could not load system metadata for: " +  pid.getValue(), e);
82 6496 leinfelder
			return null;
83
		}
84
		catch (Exception e) {
85 6456 leinfelder
			throw new RuntimeException(e.getMessage(), e);
86 6395 leinfelder
		}
87
		return sm;
88
	}
89
90 6471 jones
	@Override
91 6395 leinfelder
	public Map<Identifier, SystemMetadata> loadAll(Collection<Identifier> keys) {
92 6426 leinfelder
		Map<Identifier, SystemMetadata> map = new HashMap<Identifier, SystemMetadata>();
93 6395 leinfelder
		for (Identifier key: keys) {
94
			SystemMetadata value = load(key);
95
			map.put(key, value);
96
		}
97
		return map;
98
	}
99
100 7187 leinfelder
	/**
101
	 * Returning null so that no entries are loaded on map initialization
102
	 *
103
	 * @see http://www.hazelcast.com/docs/1.9.4/manual/single_html/#Map
104
	 *
105
	 * As of 1.9.3 MapLoader has the new MapLoader.loadAllKeys API.
106
	 * It is used for pre-populating the in-memory map when the map is first touched/used.
107
	 * If MapLoader.loadAllKeys returns NULL then nothing will be loaded.
108
	 * Your MapLoader.loadAllKeys implementation can return all or some of the keys.
109
	 * You may select and return only the hot keys, for instance.
110
	 * Also note that this is the fastest way of pre-populating the map as
111
	 * Hazelcast will optimize the loading process by having each node loading owned portion of the entries.
112
	 */
113 6471 jones
	@Override
114 6395 leinfelder
	public Set<Identifier> loadAllKeys() {
115 7187 leinfelder
		return null;
116 6395 leinfelder
	}
117
118
}