Skip to content

Commit fecdda9

Browse files
author
nickchecan
committed
chore: implement ollama model memory object
1 parent 1de20bc commit fecdda9

File tree

4 files changed

+493
-0
lines changed

4 files changed

+493
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package com.developer.nefarious.zjoule.plugin.login.memory;
2+
3+
import com.developer.nefarious.zjoule.plugin.memory.IEclipseMemory;
4+
import com.developer.nefarious.zjoule.plugin.memory.IMemoryObject;
5+
import com.developer.nefarious.zjoule.plugin.memory.MemoryOllamaModel;
6+
import com.developer.nefarious.zjoule.plugin.memory.utils.IObjectSerializer;
7+
import com.developer.nefarious.zjoule.plugin.models.OllamaModel;
8+
9+
/**
10+
* Manages temporary storage and retrieval of ollamaModel information during the login process.
11+
* <p>
12+
* The {@code TemporaryMemoryOllamaModel} class provides methods to save, load, and persist
13+
* temporary ollamaModel data using Eclipse preferences. It implements {@link IMemoryObject<OllamaModel>}
14+
* and {@link ITemporaryMemoryObject}.
15+
*/
16+
public class TemporaryMemoryOllamaModel implements IMemoryObject<OllamaModel>, ITemporaryMemoryObject {
17+
18+
/** Singleton instance of {@code TemporaryMemoryOllamaModel}. */
19+
private static TemporaryMemoryOllamaModel instance;
20+
21+
/** Key used for storing and retrieving the temporary ollamaModel in Eclipse preferences. */
22+
public static final String KEY = "tmp-" + MemoryOllamaModel.KEY;
23+
24+
/** Serializer for converting objects to and from serialized formats. */
25+
private IObjectSerializer objectSerializer;
26+
27+
/** Manages interactions with Eclipse's preferences storage. */
28+
private IEclipseMemory eclipseMemory;
29+
30+
/**
31+
* Retrieves the singleton instance of {@code TemporaryMemoryOllamaModel}.
32+
*
33+
* @return the singleton instance.
34+
* @throws IllegalStateException if the instance has not been initialized.
35+
*/
36+
public static TemporaryMemoryOllamaModel getInstance() {
37+
if (instance == null) {
38+
throw new IllegalStateException("TemporaryMemoryOllamaModel not initialized. Call initialize() first.");
39+
}
40+
return instance;
41+
}
42+
43+
/**
44+
* Initializes the {@code TemporaryMemoryOllamaModel} singleton with the specified dependencies.
45+
*
46+
* @param objectSerializer the serializer for handling object serialization and deserialization.
47+
* @param eclipseMemory the manager for Eclipse preferences storage.
48+
*/
49+
public static void initialize(final IObjectSerializer objectSerializer, final IEclipseMemory eclipseMemory) {
50+
if (instance == null) {
51+
instance = new TemporaryMemoryOllamaModel(objectSerializer, eclipseMemory);
52+
}
53+
}
54+
55+
/**
56+
* Resets the singleton instance. Useful for testing or reinitialization.
57+
*/
58+
public static void resetInstance() {
59+
instance = null;
60+
}
61+
62+
/**
63+
* Private constructor to enforce singleton behavior.
64+
*
65+
* @param objectSerializer the serializer for handling object serialization and deserialization.
66+
* @param eclipseMemory the manager for Eclipse preferences storage.
67+
*/
68+
private TemporaryMemoryOllamaModel(final IObjectSerializer objectSerializer, final IEclipseMemory eclipseMemory) {
69+
this.objectSerializer = objectSerializer;
70+
this.eclipseMemory = eclipseMemory;
71+
}
72+
73+
/**
74+
* {@inheritDoc}
75+
*/
76+
@Override
77+
public Boolean isEmpty() {
78+
OllamaModel ollamaModel = load();
79+
if ((ollamaModel == null) || (ollamaModel.getName() == null) || ollamaModel.getName().isEmpty()
80+
|| ollamaModel.getName().isBlank()) {
81+
return true;
82+
}
83+
return false;
84+
}
85+
86+
/**
87+
* {@inheritDoc}
88+
*/
89+
@Override
90+
public OllamaModel load() {
91+
try {
92+
String serializedObject = eclipseMemory.loadFromEclipsePreferences(KEY);
93+
return objectSerializer.deserialize(serializedObject, OllamaModel.class);
94+
} catch (Exception e) {
95+
return null;
96+
}
97+
}
98+
99+
/**
100+
* {@inheritDoc}
101+
*/
102+
@Override
103+
public void persist() {
104+
String serializedObject = eclipseMemory.loadFromEclipsePreferences(KEY);
105+
eclipseMemory.saveOnEclipsePreferences(MemoryOllamaModel.KEY, serializedObject);
106+
}
107+
108+
/**
109+
* {@inheritDoc}
110+
*/
111+
@Override
112+
public void save(final OllamaModel ollamaModel) {
113+
String serializedObject = objectSerializer.serialize(ollamaModel);
114+
eclipseMemory.saveOnEclipsePreferences(KEY, serializedObject);
115+
}
116+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package com.developer.nefarious.zjoule.plugin.memory;
2+
3+
import com.developer.nefarious.zjoule.plugin.memory.utils.IObjectSerializer;
4+
import com.developer.nefarious.zjoule.plugin.models.OllamaModel;
5+
6+
/**
7+
* Manages the storage and retrieval of ollamaModel information in memory.
8+
* <p>
9+
* The {@code MemoryOllamaModel} class provides methods to save, load, and check
10+
* the validity of ollamaModel data stored in Eclipse preferences. It implements {@link IMemoryObject<OllamaModel>}.
11+
*/
12+
public class MemoryOllamaModel implements IMemoryObject<OllamaModel> {
13+
14+
/** Key used for storing and retrieving ollamaModel information in memory. */
15+
public static final String KEY = "ollama-model";
16+
17+
/** Singleton instance of {@code MemoryOllamaModel}. */
18+
private static MemoryOllamaModel instance;
19+
20+
/** Serializer for converting objects to and from serialized formats. */
21+
private IObjectSerializer objectSerializer;
22+
23+
/** Manages interactions with Eclipse's preferences storage. */
24+
private IEclipseMemory eclipseMemory;
25+
26+
/**
27+
* Retrieves the singleton instance of {@code MemoryOllamaModel}.
28+
*
29+
* @return the singleton instance.
30+
* @throws IllegalStateException if the instance has not been initialized.
31+
*/
32+
public static MemoryOllamaModel getInstance() {
33+
if (instance == null) {
34+
throw new IllegalStateException("MemoryOllamaModel not initialized. Call initialize() first.");
35+
}
36+
return instance;
37+
}
38+
39+
/**
40+
* Initializes the {@code MemoryOllamaModel} singleton with the specified dependencies.
41+
*
42+
* @param objectSerializer the serializer for handling object serialization and deserialization.
43+
* @param eclipseMemory the manager for Eclipse preferences storage.
44+
*/
45+
public static void initialize(final IObjectSerializer objectSerializer, final IEclipseMemory eclipseMemory) {
46+
if (instance == null) {
47+
instance = new MemoryOllamaModel(objectSerializer, eclipseMemory);
48+
}
49+
}
50+
51+
/**
52+
* Resets the singleton instance. Useful for testing or reinitialization.
53+
*/
54+
public static void resetInstance() {
55+
instance = null;
56+
}
57+
58+
/**
59+
* Private constructor to enforce singleton behavior.
60+
*
61+
* @param objectSerializer the serializer for handling object serialization and deserialization.
62+
* @param eclipseMemory the manager for Eclipse preferences storage.
63+
*/
64+
private MemoryOllamaModel(final IObjectSerializer objectSerializer, final IEclipseMemory eclipseMemory) {
65+
this.objectSerializer = objectSerializer;
66+
this.eclipseMemory = eclipseMemory;
67+
}
68+
69+
/**
70+
* {@inheritDoc}
71+
*/
72+
@Override
73+
public Boolean isEmpty() {
74+
OllamaModel ollamaModel = load();
75+
if ((ollamaModel == null) || (ollamaModel.getName() == null) || ollamaModel.getName().isEmpty()
76+
|| ollamaModel.getName().isBlank()) {
77+
return true;
78+
}
79+
return false;
80+
}
81+
82+
/**
83+
* {@inheritDoc}
84+
*/
85+
@Override
86+
public OllamaModel load() {
87+
try {
88+
String serializedObject = eclipseMemory.loadFromEclipsePreferences(KEY);
89+
return objectSerializer.deserialize(serializedObject, OllamaModel.class);
90+
} catch (Exception e) {
91+
return null;
92+
}
93+
}
94+
95+
/**
96+
* {@inheritDoc}
97+
*/
98+
@Override
99+
public void save(final OllamaModel ollamaModel) {
100+
String serializedObject = objectSerializer.serialize(ollamaModel);
101+
eclipseMemory.saveOnEclipsePreferences(KEY, serializedObject);
102+
}
103+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
package com.developer.nefarious.zjoule.test.login.memory;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertFalse;
5+
import static org.junit.jupiter.api.Assertions.assertTrue;
6+
import static org.mockito.Mockito.doReturn;
7+
import static org.mockito.Mockito.spy;
8+
import static org.mockito.Mockito.verify;
9+
import static org.mockito.Mockito.when;
10+
11+
import org.junit.jupiter.api.BeforeEach;
12+
import org.junit.jupiter.api.Test;
13+
import org.mockito.Mock;
14+
import org.mockito.MockitoAnnotations;
15+
16+
import com.developer.nefarious.zjoule.plugin.login.memory.TemporaryMemoryOllamaModel;
17+
import com.developer.nefarious.zjoule.plugin.memory.IEclipseMemory;
18+
import com.developer.nefarious.zjoule.plugin.memory.utils.IObjectSerializer;
19+
import com.developer.nefarious.zjoule.plugin.models.OllamaModel;
20+
21+
public class TemporaryMemoryOllamaModelTest {
22+
23+
public static final String FINAL_KEY = "ollama-model";
24+
25+
public static final String TEMPORARY_KEY = "tmp-ollama-model";
26+
27+
private TemporaryMemoryOllamaModel cut;
28+
29+
@Mock
30+
private IObjectSerializer mockObjectSerializer;
31+
32+
@Mock
33+
private IEclipseMemory mockEclipseMemory;
34+
35+
@BeforeEach
36+
public void setUp() {
37+
MockitoAnnotations.openMocks(this);
38+
39+
TemporaryMemoryOllamaModel.resetInstance();
40+
TemporaryMemoryOllamaModel.initialize(mockObjectSerializer, mockEclipseMemory);
41+
cut = spy(TemporaryMemoryOllamaModel.getInstance());
42+
}
43+
44+
@Test
45+
public void shouldBeEmptyWhenOllamaModelIsBlank() {
46+
// Arrange
47+
OllamaModel mockMockOllamaModel = new OllamaModel();
48+
mockMockOllamaModel.setName(" ");
49+
doReturn(mockMockOllamaModel).when(cut).load();
50+
// Act
51+
Boolean returnValue = cut.isEmpty();
52+
// Assert
53+
verify(cut).load();
54+
assertTrue(returnValue);
55+
}
56+
57+
@Test
58+
public void shouldBeEmptyWhenOllamaModelIsEmpty() {
59+
// Arrange
60+
OllamaModel mockMockOllamaModel = new OllamaModel();
61+
mockMockOllamaModel.setName("");
62+
doReturn(mockMockOllamaModel).when(cut).load();
63+
// Act
64+
Boolean returnValue = cut.isEmpty();
65+
// Assert
66+
verify(cut).load();
67+
assertTrue(returnValue);
68+
}
69+
70+
@Test
71+
public void shouldBeEmptyWhenOllamaModelIsNull() {
72+
// Arrange
73+
OllamaModel mockMockOllamaModel = new OllamaModel();
74+
mockMockOllamaModel.setName(null);
75+
doReturn(mockMockOllamaModel).when(cut).load();
76+
// Act
77+
Boolean returnValue = cut.isEmpty();
78+
// Assert
79+
verify(cut).load();
80+
assertTrue(returnValue);
81+
}
82+
83+
@Test
84+
public void shouldBeEmptyWhenNoMemory() {
85+
// Arrange
86+
doReturn(null).when(cut).load();
87+
// Act
88+
Boolean returnValue = cut.isEmpty();
89+
// Assert
90+
verify(cut).load();
91+
assertTrue(returnValue);
92+
}
93+
94+
@Test
95+
public void shouldLoadOllamaModel() {
96+
// Arrange
97+
OllamaModel expectedValue = new OllamaModel();
98+
String mockSerializedObject = "It doesn't matter";
99+
when(mockEclipseMemory.loadFromEclipsePreferences(TEMPORARY_KEY)).thenReturn(mockSerializedObject);
100+
when(mockObjectSerializer.deserialize(mockSerializedObject, OllamaModel.class)).thenReturn(expectedValue);
101+
// Act
102+
OllamaModel returnValue = cut.load();
103+
// Assert
104+
assertEquals(returnValue, expectedValue);
105+
}
106+
107+
@Test
108+
public void shouldNotBeEmptyWhenOllamaModelIsSave() {
109+
// Arrange
110+
OllamaModel mockMockOllamaModel = new OllamaModel();
111+
mockMockOllamaModel.setName("some-ollama-model");
112+
doReturn(mockMockOllamaModel).when(cut).load();
113+
// Act
114+
Boolean returnValue = cut.isEmpty();
115+
// Assert
116+
verify(cut).load();
117+
assertFalse(returnValue);
118+
}
119+
120+
@Test
121+
public void shouldPersistOllamaModel() {
122+
// Arrange
123+
String mockSerializedObject = "It doesn't matter";
124+
when(mockEclipseMemory.loadFromEclipsePreferences(TEMPORARY_KEY)).thenReturn(mockSerializedObject);
125+
// Act
126+
cut.persist();
127+
// Assert
128+
verify(mockEclipseMemory).saveOnEclipsePreferences(FINAL_KEY, mockSerializedObject);
129+
}
130+
131+
@Test
132+
public void shouldSaveOllamaModel() {
133+
// Arrange
134+
OllamaModel mockOllamaModel = new OllamaModel();
135+
String mockSerializedObject = "It doesn't matter";
136+
when(mockObjectSerializer.serialize(mockOllamaModel)).thenReturn(mockSerializedObject);
137+
// Act
138+
cut.save(mockOllamaModel);
139+
// Assert
140+
verify(mockEclipseMemory).saveOnEclipsePreferences(TEMPORARY_KEY, mockSerializedObject);
141+
}
142+
143+
}

0 commit comments

Comments
 (0)