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 7055 leinfelder
import java.util.List;
7 6395 leinfelder
import java.util.Map;
8
import java.util.Set;
9
10 6868 cjones
import org.apache.log4j.Logger;
11 6904 cjones
import org.dataone.service.exceptions.InvalidSystemMetadata;
12 6395 leinfelder
import org.dataone.service.types.v1.Identifier;
13
import org.dataone.service.types.v1.ObjectInfo;
14
import org.dataone.service.types.v1.ObjectList;
15
import org.dataone.service.types.v1.SystemMetadata;
16
17 6888 cjones
import com.hazelcast.core.Hazelcast;
18 6395 leinfelder
import com.hazelcast.core.MapLoader;
19
import com.hazelcast.core.MapStore;
20
21
import edu.ucsb.nceas.metacat.IdentifierManager;
22
import edu.ucsb.nceas.metacat.McdbDocNotFoundException;
23 6888 cjones
import edu.ucsb.nceas.metacat.properties.PropertyService;
24
import edu.ucsb.nceas.utilities.PropertyNotFoundException;
25 6395 leinfelder
26
/**
27
 * Storage implementation for Hazelcast System Metadata
28
 * @author leinfelder
29
 *
30
 */
31 6868 cjones
public class SystemMetadataMap
32
    implements MapStore<Identifier, SystemMetadata>, MapLoader<Identifier, SystemMetadata> {
33 6395 leinfelder
34 6868 cjones
  private Logger logMetacat = null;
35
36 6471 jones
	@Override
37 6395 leinfelder
	public void delete(Identifier arg0) {
38
		// we do not delete system metadata
39
	}
40
41 6471 jones
	@Override
42 6395 leinfelder
	public void deleteAll(Collection<Identifier> arg0) {
43
		// we do not delete system metadata
44
	}
45
46 6471 jones
	@Override
47 6395 leinfelder
	public void store(Identifier pid, SystemMetadata sm) {
48
		try {
49 7111 leinfelder
			logMetacat.debug("Storing System Metadata to store: " + pid.getValue());
50 6451 leinfelder
			if (!IdentifierManager.getInstance().systemMetadataExists(pid.getValue())) {
51 6997 leinfelder
				IdentifierManager.getInstance().insertSystemMetadata(sm);
52 6893 cjones
53 6395 leinfelder
			} else {
54
				IdentifierManager.getInstance().updateSystemMetadata(sm);
55 6893 cjones
56 6395 leinfelder
			}
57 6893 cjones
58 6395 leinfelder
		} catch (McdbDocNotFoundException e) {
59 6456 leinfelder
			throw new RuntimeException(e.getMessage(), e);
60 6893 cjones
61
		} catch (SQLException e) {
62
	      throw new RuntimeException(e.getMessage(), e);
63
64 6904 cjones
    } catch (InvalidSystemMetadata e) {
65
        throw new RuntimeException(e.getMessage(), e);
66
        }
67 6395 leinfelder
	}
68
69 6471 jones
	@Override
70 6395 leinfelder
	public void storeAll(Map<Identifier, SystemMetadata> map) {
71
		for (Identifier key: map.keySet()) {
72
			store(key, map.get(key));
73
		}
74
	}
75
76 6471 jones
	@Override
77 6395 leinfelder
	public SystemMetadata load(Identifier pid) {
78
		SystemMetadata sm = null;
79 6868 cjones
    logMetacat = Logger.getLogger(SystemMetadataMap.class);
80
81
    try {
82
			logMetacat.debug("loading from store: " + pid.getValue());
83 6395 leinfelder
			sm = IdentifierManager.getInstance().getSystemMetadata(pid.getValue());
84
		} catch (McdbDocNotFoundException e) {
85 6496 leinfelder
			//throw new RuntimeException(e.getMessage(), e);
86
			// not found => null
87
			return null;
88
		}
89
		catch (Exception e) {
90 6456 leinfelder
			throw new RuntimeException(e.getMessage(), e);
91 6395 leinfelder
		}
92
		return sm;
93
	}
94
95 6471 jones
	@Override
96 6395 leinfelder
	public Map<Identifier, SystemMetadata> loadAll(Collection<Identifier> keys) {
97 6426 leinfelder
		Map<Identifier, SystemMetadata> map = new HashMap<Identifier, SystemMetadata>();
98 6395 leinfelder
		for (Identifier key: keys) {
99
			SystemMetadata value = load(key);
100
			map.put(key, value);
101
		}
102
		return map;
103
	}
104
105 6471 jones
	@Override
106 6395 leinfelder
	public Set<Identifier> loadAllKeys() {
107 6888 cjones
108 7055 leinfelder
		String identifiersSet;
109
		try {
110
			identifiersSet =
111
				PropertyService.getProperty("dataone.hazelcast.storageCluster.identifiersSet");
112
		} catch (PropertyNotFoundException e1) {
113
		    identifiersSet = "hzIdentifiers";
114
		}
115 6888 cjones
116 7055 leinfelder
		Set<Identifier> pids = Hazelcast.getSet(identifiersSet);
117
118 6395 leinfelder
		try {
119 7055 leinfelder
120
			// this has more overhead than just looking at the GUIDs
121 6395 leinfelder
			ObjectList ol = IdentifierManager.getInstance().querySystemMetadata(
122
					null, //startTime,
123
					null, //endTime,
124
					null, //objectFormatId,
125
					false, //replicaStatus,
126
					0, //start,
127
					-1 //count
128
					);
129
			for (ObjectInfo o: ol.getObjectInfoList()) {
130
				Identifier pid = o.getIdentifier();
131 6888 cjones
				if ( !pids.contains(pid) ) {
132 7055 leinfelder
					pids.add(pid);
133 6888 cjones
				}
134 6395 leinfelder
			}
135 6888 cjones
136 7055 leinfelder
			// ALTERNATIVE method: look up all the Identifiers from the table
137
//			List<String> guids = IdentifierManager.getInstance().getAllGUIDs();
138
//			for (String guid: guids){
139
//				Identifier pid = new Identifier();
140
//				pid.setValue(guid);
141
//				pids.add(pid);
142
//			}
143
144 6456 leinfelder
		} catch (Exception e) {
145
			throw new RuntimeException(e.getMessage(), e);
146 6888 cjones
147 6395 leinfelder
		}
148
149
		return pids;
150
	}
151
152
}