|
Lines 1-252
Link Here
|
| 1 |
/******************************************************************************* |
1 |
/******************************************************************************* |
| 2 |
* Copyright (c) 2000, 2004 IBM Corporation and others. |
2 |
* Copyright (c) 2000, 2004 IBM Corporation and others. |
| 3 |
* All rights reserved. This program and the accompanying materials |
3 |
* All rights reserved. This program and the accompanying materials |
| 4 |
* are made available under the terms of the Common Public License v1.0 |
4 |
* are made available under the terms of the Common Public License v1.0 |
| 5 |
* which accompanies this distribution, and is available at |
5 |
* which accompanies this distribution, and is available at |
| 6 |
* http://www.eclipse.org/legal/cpl-v10.html |
6 |
* http://www.eclipse.org/legal/cpl-v10.html |
| 7 |
* |
7 |
* |
| 8 |
* Contributors: |
8 |
* Contributors: |
| 9 |
* IBM Corporation - initial API and implementation |
9 |
* IBM Corporation - initial API and implementation |
| 10 |
*******************************************************************************/ |
10 |
*******************************************************************************/ |
| 11 |
|
11 |
|
| 12 |
package org.eclipse.team.bugzilla.persistence; |
12 |
package org.eclipse.team.bugzilla.persistence; |
| 13 |
|
13 |
|
| 14 |
import java.util.ArrayList; |
14 |
import java.util.ArrayList; |
| 15 |
import java.util.HashMap; |
15 |
import java.util.HashMap; |
| 16 |
import java.util.Map; |
16 |
import java.util.Map; |
| 17 |
|
17 |
|
| 18 |
import org.eclipse.core.runtime.IAdaptable; |
18 |
import org.eclipse.core.runtime.IAdaptable; |
| 19 |
import org.eclipse.core.runtime.preferences.InstanceScope; |
19 |
import org.eclipse.core.runtime.preferences.InstanceScope; |
| 20 |
import org.eclipse.team.bugs.extension.BugsException; |
20 |
import org.eclipse.team.bugs.extension.BugsException; |
| 21 |
import org.eclipse.team.bugs.model.IBugProvider; |
21 |
import org.eclipse.team.bugs.model.IBugProvider; |
| 22 |
import org.eclipse.team.bugs.model.IGenericModel; |
22 |
import org.eclipse.team.bugs.model.IGenericModel; |
| 23 |
import org.eclipse.team.bugs.model.IProviderListener; |
23 |
import org.eclipse.team.bugs.model.IProviderListener; |
| 24 |
import org.eclipse.team.bugzilla.BugzillaException; |
24 |
import org.eclipse.team.bugzilla.BugzillaException; |
| 25 |
import org.eclipse.team.bugzilla.BugzillaPlugin; |
25 |
import org.eclipse.team.bugzilla.BugzillaPlugin; |
| 26 |
import org.eclipse.team.bugzilla.adapters.BugzillaAdapterFactory; |
26 |
import org.eclipse.team.bugzilla.adapters.BugzillaAdapterFactory; |
| 27 |
import org.eclipse.team.bugzilla.model.BugzillaContainer; |
27 |
import org.eclipse.team.bugzilla.model.BugzillaContainer; |
| 28 |
import org.eclipse.team.bugzilla.model.BugzillaFolder; |
28 |
import org.eclipse.team.bugzilla.model.BugzillaFolder; |
| 29 |
import org.eclipse.team.bugzilla.model.BugzillaHistoryFolder; |
29 |
import org.eclipse.team.bugzilla.model.BugzillaHistoryFolder; |
| 30 |
import org.eclipse.team.bugzilla.model.BugzillaModel; |
30 |
import org.eclipse.team.bugzilla.model.BugzillaModel; |
| 31 |
import org.eclipse.team.bugzilla.model.BugzillaProvider; |
31 |
import org.eclipse.team.bugzilla.model.BugzillaProvider; |
| 32 |
import org.eclipse.team.bugzilla.model.BugzillaQuery; |
32 |
import org.eclipse.team.bugzilla.model.BugzillaQuery; |
| 33 |
import org.eclipse.team.bugzilla.model.BugzillaReport; |
33 |
import org.eclipse.team.bugzilla.model.BugzillaReport; |
| 34 |
import org.osgi.service.prefs.BackingStoreException; |
34 |
import org.osgi.service.prefs.BackingStoreException; |
| 35 |
import org.osgi.service.prefs.Preferences; |
35 |
import org.osgi.service.prefs.Preferences; |
| 36 |
|
36 |
|
| 37 |
/** |
37 |
/** |
| 38 |
* |
38 |
* |
| 39 |
*/ |
39 |
*/ |
| 40 |
public class PersistenceManager { |
40 |
public class PersistenceManager { |
| 41 |
|
41 |
|
| 42 |
/* |
42 |
/* |
| 43 |
* The preference node in the instance scope where the providers are persisted |
43 |
* The preference node in the instance scope where the providers are persisted |
| 44 |
*/ |
44 |
*/ |
| 45 |
private static final String PROVIDER_STORE_ID = "providers"; //$NON-NLS-1$ |
45 |
private static final String PROVIDER_STORE_ID = "providers"; //$NON-NLS-1$ |
| 46 |
|
46 |
|
| 47 |
protected static final BugzillaModel [] EMPTY_ARRAY= new BugzillaModel[0]; |
47 |
protected static final BugzillaModel [] EMPTY_ARRAY= new BugzillaModel[0]; |
| 48 |
|
48 |
|
| 49 |
/** |
49 |
/** |
| 50 |
* The key for the model type preference. |
50 |
* The key for the model type preference. |
| 51 |
*/ |
51 |
*/ |
| 52 |
public final static String MODEL_TYPE= "org.eclipse.team.bugzilla.modelType"; //$NON-NLS-1$ |
52 |
public final static String MODEL_TYPE= "org.eclipse.team.bugzilla.modelType"; //$NON-NLS-1$ |
| 53 |
|
53 |
|
| 54 |
public final static String ELEMENT_ID = "org.eclipse.team.bugzilla.elementId"; //$NON-NLS-1$ |
54 |
public final static String ELEMENT_ID = "org.eclipse.team.bugzilla.elementId"; //$NON-NLS-1$ |
| 55 |
|
55 |
|
| 56 |
/** |
56 |
/** |
| 57 |
* IDs for the different persistent model types. |
57 |
* IDs for the different persistent model types. |
| 58 |
*/ |
58 |
*/ |
| 59 |
public final static String PROVIDER= "provider"; //$NON-NLS-1$ |
59 |
public final static String PROVIDER= "provider"; //$NON-NLS-1$ |
| 60 |
public final static String FOLDER= "folder"; //$NON-NLS-1$ |
60 |
public final static String FOLDER= "folder"; //$NON-NLS-1$ |
| 61 |
public final static String HISTORY= "history"; //$NON-NLS-1$ |
61 |
public final static String HISTORY= "history"; //$NON-NLS-1$ |
| 62 |
public final static String REPORT= "report"; //$NON-NLS-1$ |
62 |
public final static String REPORT= "report"; //$NON-NLS-1$ |
| 63 |
public final static String QUERY= "query"; //$NON-NLS-1$ |
63 |
public final static String QUERY= "query"; //$NON-NLS-1$ |
| 64 |
|
64 |
|
| 65 |
private final static Map type2classMap; |
65 |
private final static Map type2classMap; |
| 66 |
|
66 |
|
| 67 |
/* |
67 |
/* |
| 68 |
* Listener that is registered with each provider to update |
68 |
* Listener that is registered with each provider to update |
| 69 |
* the store when the model changes |
69 |
* the store when the model changes |
| 70 |
*/ |
70 |
*/ |
| 71 |
private static IProviderListener listener = new IProviderListener() { |
71 |
private static IProviderListener listener = new IProviderListener() { |
| 72 |
/* (non-Javadoc) |
72 |
/* (non-Javadoc) |
| 73 |
* @see org.eclipse.team.bugs.model.IProviderListener#modelAdded(org.eclipse.team.bugs.model.IGenericModel, org.eclipse.team.bugs.model.IGenericModel) |
73 |
* @see org.eclipse.team.bugs.model.IProviderListener#modelAdded(org.eclipse.team.bugs.model.IGenericModel, org.eclipse.team.bugs.model.IGenericModel) |
| 74 |
*/ |
74 |
*/ |
| 75 |
public void elementsAdded(IGenericModel parent, IGenericModel[] children) { |
75 |
public void elementsAdded(IGenericModel parent, IGenericModel[] children) { |
| 76 |
elementsChanged(children); |
76 |
elementsChanged(children); |
| 77 |
} |
77 |
} |
| 78 |
|
78 |
|
| 79 |
/* (non-Javadoc) |
79 |
/* (non-Javadoc) |
| 80 |
* @see org.eclipse.team.bugs.model.IProviderListener#modelChanged(org.eclipse.team.bugs.model.IGenericModel) |
80 |
* @see org.eclipse.team.bugs.model.IProviderListener#modelChanged(org.eclipse.team.bugs.model.IGenericModel) |
| 81 |
*/ |
81 |
*/ |
| 82 |
public void elementsChanged(IGenericModel[] elements) { |
82 |
public void elementsChanged(IGenericModel[] elements) { |
| 83 |
for (int i = 0; i < elements.length; i++) { |
83 |
for (int i = 0; i < elements.length; i++) { |
| 84 |
final BugzillaModel model = (BugzillaModel)elements[i]; |
84 |
final BugzillaModel model = (BugzillaModel)elements[i]; |
| 85 |
final IPersistenceAdapter adapter = getPersistenceAdapter(elements[i]); |
85 |
final IPersistenceAdapter adapter = getPersistenceAdapter(elements[i]); |
| 86 |
if (adapter != null) |
86 |
if (adapter != null) |
| 87 |
adapter.storeElement(model, false); |
87 |
adapter.storeElement(model, false); |
| 88 |
} |
88 |
} |
| 89 |
final BugzillaProvider provider= ((BugzillaModel)elements[0]).getBugzillaProvider(); |
89 |
final BugzillaProvider provider= ((BugzillaModel)elements[0]).getBugzillaProvider(); |
| 90 |
try { |
90 |
try { |
| 91 |
AbstractPersistenceAdapter.getPreferences(provider).flush(); |
91 |
AbstractPersistenceAdapter.getPreferences(provider).flush(); |
| 92 |
} catch (BackingStoreException e) { |
92 |
} catch (BackingStoreException e) { |
| 93 |
BugzillaPlugin.log(BugzillaException.asBugsException(e)); |
93 |
BugzillaPlugin.log(BugzillaException.asBugsException(e)); |
| 94 |
} |
94 |
} |
| 95 |
} |
95 |
} |
| 96 |
|
96 |
|
| 97 |
/* (non-Javadoc) |
97 |
/* (non-Javadoc) |
| 98 |
* @see org.eclipse.team.bugs.model.IProviderListener#modelRemoved(org.eclipse.team.bugs.model.IGenericModel, org.eclipse.team.bugs.model.IGenericModel) |
98 |
* @see org.eclipse.team.bugs.model.IProviderListener#modelRemoved(org.eclipse.team.bugs.model.IGenericModel, org.eclipse.team.bugs.model.IGenericModel) |
| 99 |
*/ |
99 |
*/ |
| 100 |
public void elementsRemoved(IGenericModel parent, IGenericModel[] children) { |
100 |
public void elementsRemoved(IGenericModel parent, IGenericModel[] children) { |
| 101 |
for (int i = 0; i < children.length; i++) { |
101 |
for (int i = 0; i < children.length; i++) { |
| 102 |
final BugzillaModel model = (BugzillaModel)children[i]; |
102 |
final BugzillaModel model = (BugzillaModel)children[i]; |
| 103 |
final IPersistenceAdapter adapter = getPersistenceAdapter(parent); |
103 |
final IPersistenceAdapter adapter = getPersistenceAdapter(parent); |
| 104 |
if (adapter != null) |
104 |
if (adapter != null) |
| 105 |
adapter.purgeChild((BugzillaModel)parent, model, false); |
105 |
adapter.purgeChild((BugzillaModel)parent, model, false); |
| 106 |
} |
106 |
} |
| 107 |
try { |
107 |
try { |
| 108 |
AbstractPersistenceAdapter.getPreferences(parent).flush(); |
108 |
AbstractPersistenceAdapter.getPreferences(parent).flush(); |
| 109 |
} catch (BackingStoreException e) { |
109 |
} catch (BackingStoreException e) { |
| 110 |
BugzillaPlugin.log(BugzillaException.asBugsException(e)); |
110 |
BugzillaPlugin.log(BugzillaException.asBugsException(e)); |
| 111 |
} |
111 |
} |
| 112 |
} |
112 |
} |
| 113 |
}; |
113 |
}; |
| 114 |
|
114 |
|
| 115 |
|
115 |
|
| 116 |
static { |
116 |
static { |
| 117 |
type2classMap = new HashMap(); |
117 |
type2classMap = new HashMap(); |
| 118 |
type2classMap.put(PROVIDER, BugzillaProvider.class); |
118 |
type2classMap.put(PROVIDER, BugzillaProvider.class); |
| 119 |
type2classMap.put(FOLDER, BugzillaFolder.class); |
119 |
type2classMap.put(FOLDER, BugzillaFolder.class); |
| 120 |
type2classMap.put(HISTORY, BugzillaHistoryFolder.class); |
120 |
type2classMap.put(HISTORY, BugzillaHistoryFolder.class); |
| 121 |
type2classMap.put(REPORT, BugzillaReport.class); |
121 |
type2classMap.put(REPORT, BugzillaReport.class); |
| 122 |
type2classMap.put(QUERY, BugzillaQuery.class); |
122 |
type2classMap.put(QUERY, BugzillaQuery.class); |
| 123 |
} |
123 |
} |
| 124 |
|
124 |
|
| 125 |
/** |
125 |
/** |
| 126 |
* Return the root preferences node whose children are providers |
126 |
* Return the root preferences node whose children are providers |
| 127 |
* @return the root preferences node whose children are providers |
127 |
* @return the root preferences node whose children are providers |
| 128 |
*/ |
128 |
*/ |
| 129 |
/* package */ static Preferences getRootNode() { |
129 |
/* package */ static Preferences getRootNode() { |
| 130 |
return new InstanceScope().getNode(BugzillaPlugin.ID).node(PROVIDER_STORE_ID); |
130 |
return new InstanceScope().getNode(BugzillaPlugin.ID).node(PROVIDER_STORE_ID); |
| 131 |
} |
131 |
} |
| 132 |
|
132 |
|
| 133 |
/** |
133 |
/** |
| 134 |
* Restore the providers from the preference store and return the restored providers |
134 |
* Restore the providers from the preference store and return the restored providers |
| 135 |
* @return the restored providers |
135 |
* @return the restored providers |
| 136 |
*/ |
136 |
*/ |
| 137 |
public static IBugProvider[] restoreProviders() { |
137 |
public static IBugProvider[] restoreProviders() { |
| 138 |
BugzillaModel[] providers = restoreChildren(null /* no parent */, getRootNode()); |
138 |
BugzillaModel[] providers = restoreChildren(null /* no parent */, getRootNode()); |
| 139 |
IBugProvider[] result = new IBugProvider[providers.length]; |
139 |
IBugProvider[] result = new IBugProvider[providers.length]; |
| 140 |
System.arraycopy(providers, 0, result, 0, providers.length); |
140 |
System.arraycopy(providers, 0, result, 0, providers.length); |
| 141 |
return result; |
141 |
return result; |
| 142 |
} |
142 |
} |
| 143 |
|
143 |
|
| 144 |
/** |
144 |
/** |
| 145 |
* Return the persistence adapter for the given element |
145 |
* Return the persistence adapter for the given element |
| 146 |
* or <code>null</code> if there isn't one. |
146 |
* or <code>null</code> if there isn't one. |
| 147 |
* @param element the element |
147 |
* @param element the element |
| 148 |
* @return the persistence adapter for the given element |
148 |
* @return the persistence adapter for the given element |
| 149 |
* or <code>null</code> |
149 |
* or <code>null</code> |
| 150 |
*/ |
150 |
*/ |
| 151 |
public static IPersistenceAdapter getPersistenceAdapter(Object element) { |
151 |
public static IPersistenceAdapter getPersistenceAdapter(Object element) { |
| 152 |
if (element instanceof IAdaptable) { |
152 |
if (element instanceof IAdaptable) { |
| 153 |
Object adapter = ((IAdaptable)element).getAdapter(IPersistenceAdapter.class); |
153 |
Object adapter = ((IAdaptable)element).getAdapter(IPersistenceAdapter.class); |
| 154 |
if (adapter instanceof IPersistenceAdapter) |
154 |
if (adapter instanceof IPersistenceAdapter) |
| 155 |
return (IPersistenceAdapter)adapter; |
155 |
return (IPersistenceAdapter)adapter; |
| 156 |
} |
156 |
} |
| 157 |
return null; |
157 |
return null; |
| 158 |
} |
158 |
} |
| 159 |
|
159 |
|
| 160 |
/* |
160 |
/* |
| 161 |
* Method used by persistence adapters to restore a bugzilla model |
161 |
* Method used by persistence adapters to restore a bugzilla model |
| 162 |
*/ |
162 |
*/ |
| 163 |
/* package */ static BugzillaModel restoreChild(BugzillaContainer parent, Preferences node) { |
163 |
/* package */ static BugzillaModel restoreChild(BugzillaContainer parent, Preferences node) { |
| 164 |
final String type= node.get(MODEL_TYPE, ""); //$NON-NLS-1$ |
164 |
final String type= node.get(MODEL_TYPE, ""); //$NON-NLS-1$ |
| 165 |
final String id = node.get(ELEMENT_ID, ""); //$NON-NLS-1$ |
165 |
final String id = node.get(ELEMENT_ID, ""); //$NON-NLS-1$ |
| 166 |
IPersistenceAdapter adapter = getPersistenceAdapter(type); |
166 |
IPersistenceAdapter adapter = getPersistenceAdapter(type); |
| 167 |
if (adapter != null) { |
167 |
if (adapter != null) { |
| 168 |
try { |
168 |
try { |
| 169 |
BugzillaModel element = adapter.restoreElement(parent, node, id); |
169 |
BugzillaModel element = adapter.restoreElement(parent, node, id); |
| 170 |
return element; |
170 |
return element; |
| 171 |
} catch (BugzillaException e) { |
171 |
} catch (BugzillaException e) { |
| 172 |
BugzillaPlugin.log(e); |
172 |
BugzillaPlugin.log(e); |
| 173 |
} |
173 |
} |
| 174 |
} |
174 |
} |
| 175 |
return null; |
175 |
return null; |
| 176 |
} |
176 |
} |
| 177 |
|
177 |
|
| 178 |
/** |
178 |
/** |
| 179 |
* Restore the childen of the given element. |
179 |
* Restore the childen of the given element. |
| 180 |
* @param parent the element |
180 |
* @param parent the element |
| 181 |
* @param node the node for the element that may contain child nodes |
181 |
* @param node the node for the element that may contain child nodes |
| 182 |
* representing children of the element |
182 |
* representing children of the element |
| 183 |
* @return the restored children |
183 |
* @return the restored children |
| 184 |
*/ |
184 |
*/ |
| 185 |
/* package */ static final BugzillaModel[] restoreChildren(BugzillaContainer parent, Preferences node) { |
185 |
/* package */ static final BugzillaModel[] restoreChildren(BugzillaContainer parent, Preferences node) { |
| 186 |
final String [] childrenNames; |
186 |
final String [] childrenNames; |
| 187 |
try { |
187 |
try { |
| 188 |
childrenNames= node.childrenNames(); |
188 |
childrenNames= node.childrenNames(); |
| 189 |
} catch (BackingStoreException e) { |
189 |
} catch (BackingStoreException e) { |
| 190 |
BugzillaPlugin.log(BugsException.asBugsException(e)); |
190 |
BugzillaPlugin.log(BugsException.asBugsException(e)); |
| 191 |
return EMPTY_ARRAY; |
191 |
return EMPTY_ARRAY; |
| 192 |
} |
192 |
} |
| 193 |
final ArrayList children= new ArrayList(); |
193 |
final ArrayList children= new ArrayList(); |
| 194 |
for (int i = 0; i < childrenNames.length; i++) { |
194 |
for (int i = 0; i < childrenNames.length; i++) { |
| 195 |
final String childName= childrenNames[i]; |
195 |
final String childName= childrenNames[i]; |
| 196 |
final Preferences childNode= node.node(childName); |
196 |
final Preferences childNode= node.node(childName); |
| 197 |
final BugzillaModel child= restoreChild(parent, childNode); |
197 |
final BugzillaModel child= restoreChild(parent, childNode); |
| 198 |
if (child != null) |
198 |
if (child != null) |
| 199 |
children.add(child); |
199 |
children.add(child); |
| 200 |
} |
200 |
} |
| 201 |
return (BugzillaModel[]) children.toArray(new BugzillaModel[children.size()]); |
201 |
return (BugzillaModel[]) children.toArray(new BugzillaModel[children.size()]); |
| 202 |
} |
202 |
} |
| 203 |
|
203 |
|
| 204 |
private static IPersistenceAdapter getPersistenceAdapter(String type) { |
204 |
private static IPersistenceAdapter getPersistenceAdapter(String type) { |
| 205 |
Class typeClass = (Class)type2classMap.get(type); |
205 |
Class typeClass = (Class)type2classMap.get(type); |
| 206 |
if (typeClass != null) { |
206 |
if (typeClass != null) { |
| 207 |
Object adapter = BugzillaAdapterFactory.getPersistenceAdapter(typeClass); |
207 |
Object adapter = BugzillaAdapterFactory.getPersistenceAdapter(typeClass); |
| 208 |
if (adapter instanceof IPersistenceAdapter) |
208 |
if (adapter instanceof IPersistenceAdapter) |
| 209 |
return (IPersistenceAdapter)adapter; |
209 |
return (IPersistenceAdapter)adapter; |
| 210 |
} |
210 |
} |
| 211 |
return null; |
211 |
return null; |
| 212 |
} |
212 |
} |
| 213 |
|
213 |
|
| 214 |
/** |
214 |
/** |
| 215 |
* The provider has been added so persist it's state |
215 |
* The provider has been added so persist it's state |
| 216 |
* @param provider |
216 |
* @param provider |
| 217 |
*/ |
217 |
*/ |
| 218 |
public static void providerAdded(BugzillaProvider provider) { |
218 |
public static void providerAdded(BugzillaProvider provider) { |
| 219 |
IPersistenceAdapter adapter = getPersistenceAdapter(provider); |
219 |
IPersistenceAdapter adapter = getPersistenceAdapter(provider); |
| 220 |
if (adapter != null) { |
220 |
if (adapter != null) { |
| 221 |
adapter.storeElement(provider, true /* flush to disk */); |
221 |
adapter.storeElement(provider, true /* flush to disk */); |
| 222 |
} |
222 |
} |
| 223 |
provider.getEventHandler().addProviderListener(listener ); |
223 |
provider.getEventHandler().addProviderListener(listener ); |
| 224 |
} |
224 |
} |
| 225 |
|
225 |
|
| 226 |
/** |
226 |
/** |
| 227 |
* The provider has been removed so purge any persisted state |
227 |
* The provider has been removed so purge any persisted state |
| 228 |
* @param provider |
228 |
* @param provider |
| 229 |
*/ |
229 |
*/ |
| 230 |
public static void providerRemoved(BugzillaProvider provider) { |
230 |
public static void providerRemoved(BugzillaProvider provider) { |
| 231 |
IPersistenceAdapter adapter = getPersistenceAdapter(provider); |
231 |
IPersistenceAdapter adapter = getPersistenceAdapter(provider); |
| 232 |
if (adapter != null) { |
232 |
if (adapter != null) { |
| 233 |
adapter.purgeChild(null, provider, true /* flush to disk */); |
233 |
adapter.purgeChild(null, provider, true /* flush to disk */); |
| 234 |
} |
234 |
} |
| 235 |
provider.getEventHandler().removeProviderListener(listener); |
235 |
provider.getEventHandler().removeProviderListener(listener); |
| 236 |
} |
236 |
} |
| 237 |
|
237 |
|
| 238 |
/** |
238 |
/** |
| 239 |
* @param container |
239 |
* @param container |
| 240 |
* @return |
240 |
*/ |
| 241 |
*/ |
241 |
public static Preferences getPreferenceNode(BugzillaContainer container) { |
| 242 |
public static Preferences getPreferenceNode(BugzillaContainer container) { |
242 |
return AbstractPersistenceAdapter.getPreferences(container); |
| 243 |
return AbstractPersistenceAdapter.getPreferences(container); |
243 |
} |
| 244 |
} |
244 |
|
| 245 |
|
245 |
/* |
| 246 |
/* |
246 |
* Do not allow instantiation |
| 247 |
* Do not allow instantiation |
247 |
*/ |
| 248 |
*/ |
248 |
private PersistenceManager() { |
| 249 |
private PersistenceManager() { |
249 |
} |
| 250 |
} |
250 |
|
| 251 |
|
251 |
} |
| 252 |
} |
|
|