View Javadoc

1   /*
2    * This file is a part of CAST project.
3    * (c) Copyright 2007, AGH University of Science & Technology
4    * https://caribou.iisg.agh.edu.pl/trac/cast
5    *
6    * Licensed under the Eclipse Public License, Version 1.0 (the "License").
7    * You may not use this file except in compliance with the License.
8    * You may obtain a copy of the License at
9    * http://www.eclipse.org/legal/epl-v10.html
10   */
11  /*
12   * File: AbstractPersistenceProvider.java
13   * Created: 2009-07-27
14   * Author: tmilos
15   * $Id$
16   */
17  
18  package pl.edu.agh.cast.data.persistence;
19  
20  import java.util.Collection;
21  import java.util.Collections;
22  import java.util.HashMap;
23  import java.util.LinkedList;
24  import java.util.List;
25  import java.util.Map;
26  import java.util.UUID;
27  
28  import org.eclipse.core.runtime.IProgressMonitor;
29  import org.eclipse.osgi.util.NLS;
30  
31  import pl.edu.agh.cast.data.model.DataSetDescriptor;
32  import pl.edu.agh.cast.data.model.IDataSet;
33  import pl.edu.agh.cast.data.model.IElement;
34  import pl.edu.agh.cast.data.model.Type;
35  import pl.edu.agh.cast.data.model.domain.DomainDataSetDescriptor;
36  import pl.edu.agh.cast.data.model.presentation.IPresentationDataSet;
37  import pl.edu.agh.cast.data.model.presentation.IPresentationElement;
38  import pl.edu.agh.cast.data.model.presentation.PresentationDataSetDescriptor;
39  import pl.edu.agh.cast.data.model.visual.IVisualDataSet;
40  import pl.edu.agh.cast.data.model.visual.VisualDataSetDescriptor;
41  import pl.edu.agh.cast.util.Messages;
42  
43  /**
44   * Abstract implementation of {@link IPersistenceProvider} interface. Provides common implementations of utility
45   * methods.
46   *
47   * @author AGH CAST Team
48   */
49  public abstract class AbstractPersistenceProvider implements IPersistenceProvider {
50  
51  	private String config;
52  
53  	// BEGIN Descriptors
54  
55  	/**
56  	 * {@inheritDoc}
57  	 *
58  	 * @see pl.edu.agh.cast.data.persistence.IPersistenceProvider#getDataSetDescriptors(pl.edu.agh.cast.data.model.Type)
59  	 */
60  	@Override
61  	public List<DataSetDescriptor> getDataSetDescriptors(Type dsType) {
62  		LinkedList<DataSetDescriptor> descriptors = new LinkedList<DataSetDescriptor>();
63  
64  		for (DataSetDescriptor dsd : getDataSetDescriptors()) {
65  			if (dsd != null && dsd.getType() != null && dsd.getType().isSubtypeOf(dsType)) {
66  				descriptors.add(dsd);
67  			}
68  		}
69  
70  		return Collections.unmodifiableList(descriptors);
71  	}
72  
73  	/**
74  	 * {@inheritDoc}
75  	 *
76  	 * @see pl.edu.agh.cast.data.persistence.IPersistenceProvider#getDomainDataSetDescriptors()
77  	 */
78  	@Override
79  	public List<DomainDataSetDescriptor> getDomainDataSetDescriptors() {
80  		return filterDescriptors(getDataSetDescriptors(), DomainDataSetDescriptor.class);
81  	}
82  
83  	/**
84  	 * {@inheritDoc}
85  	 *
86  	 * @see pl.edu.agh.cast.data.persistence.IPersistenceProvider#getPresentationDataSetDescriptors()
87  	 */
88  	@Override
89  	public List<PresentationDataSetDescriptor> getPresentationDataSetDescriptors() {
90  		return filterDescriptors(getDataSetDescriptors(), PresentationDataSetDescriptor.class);
91  	}
92  
93  	/**
94  	 * {@inheritDoc}
95  	 *
96  	 * @see pl.edu.agh.cast.data.persistence.IPersistenceProvider#getVisualDataSetDescriptors()
97  	 */
98  	@Override
99  	public List<VisualDataSetDescriptor> getVisualDataSetDescriptors() {
100 		return filterDescriptors(getDataSetDescriptors(), VisualDataSetDescriptor.class);
101 	}
102 
103 	private static <T extends DataSetDescriptor> List<T> filterDescriptors(List<DataSetDescriptor> dsdList,
104 	        Class<T> descClass) {
105 		List<T> fList = new LinkedList<T>();
106 
107 		for (DataSetDescriptor dsd : dsdList) {
108 			if (descClass.isInstance(dsd)) {
109 				fList.add(descClass.cast(dsd));
110 			}
111 		}
112 
113 		return fList;
114 	}
115 
116 	// END Descriptors
117 
118 	// BEGIN Retrieve DataSet
119 
120 	/**
121 	 * {@inheritDoc}
122 	 *
123 	 * @see pl.edu.agh.cast.data.persistence.IPersistenceProvider
124 	 *      #getDataSet(pl.edu.agh.cast.data.model.DataSetDescriptor)
125 	 */
126 	@SuppressWarnings("unchecked")
127 	@Override
128 	public <T extends IDataSet<? extends IElement>> T getDataSet(DataSetDescriptor descriptor) {
129 		return (T)this.getDataSet(descriptor.getId());
130 	}
131 
132 	/**
133 	 * {@inheritDoc}
134 	 *
135 	 * @see pl.edu.agh.cast.data.persistence.IPersistenceProvider#getDataSets(java.util.Collection)
136 	 */
137 	@SuppressWarnings("unchecked")
138 	@Override
139 	public <T extends IDataSet<? extends IElement>> Map<UUID, T> getDataSets(Collection<DataSetDescriptor> descs) {
140 		Map<UUID, T> dsMap = new HashMap<UUID, T>(descs.size());
141 		for (DataSetDescriptor dsd : descs) {
142 			dsMap.put(dsd.getId(), (T)getDataSet(dsd));
143 		}
144 		return dsMap;
145 	}
146 
147 	/**
148 	 * {@inheritDoc}
149 	 *
150 	 * @see pl.edu.agh.cast.data.persistence.IPersistenceProvider#getDataSetsById(java.util.Collection)
151 	 */
152 	@SuppressWarnings("unchecked")
153 	@Override
154 	public <T extends IDataSet<? extends IElement>> Map<UUID, T> getDataSetsById(Collection<UUID> ids) {
155 		Map<UUID, T> dsMap = new HashMap<UUID, T>(ids.size());
156 		for (UUID id : ids) {
157 			dsMap.put(id, (T)getDataSet(id));
158 		}
159 		return dsMap;
160 	}
161 
162 	// END Retrieve DataSet
163 
164 	// BEGIN Save DataSet
165 
166 	/**
167 	 * {@inheritDoc}
168 	 *
169 	 * @see pl.edu.agh.cast.data.persistence.IPersistenceProvider#saveDataSet(pl.edu.agh.cast.data.model.IDataSet,
170 	 *      org.eclipse.core.runtime.IProgressMonitor)
171 	 */
172 	@Override
173 	public UUID saveDataSet(IDataSet<? extends IElement> dataSet, IProgressMonitor monitor) {
174 		monitor.beginTask(NLS.bind(Messages.AbstractPersistenceProvider_SaveSingleDS_ProgressTitle, dataSet.getName()),
175 		        IProgressMonitor.UNKNOWN);
176 		UUID id = saveDataSet(dataSet);
177 		monitor.done();
178 		return id;
179 	}
180 
181 	/**
182 	 * {@inheritDoc}
183 	 *
184 	 * @see pl.edu.agh.cast.data.persistence.IPersistenceProvider#saveDataSets(java.util.Collection)
185 	 */
186 	@Override
187 	public Map<UUID, UUID> saveDataSets(Collection<IDataSet<? extends IElement>> dataSets) {
188 		Map<UUID, UUID> idMap = new HashMap<UUID, UUID>(dataSets.size());
189 		for (IDataSet<? extends IElement> dataSet : dataSets) {
190 			idMap.put(dataSet.getId(), saveDataSet(dataSet));
191 		}
192 		return idMap;
193 	}
194 
195 	/**
196 	 * {@inheritDoc}
197 	 *
198 	 * @see pl.edu.agh.cast.data.persistence.IPersistenceProvider#saveDataSets(java.util.Collection,
199 	 *      org.eclipse.core.runtime.IProgressMonitor)
200 	 */
201 	@Override
202 	public Map<UUID, UUID> saveDataSets(Collection<IDataSet<? extends IElement>> dataSets, IProgressMonitor monitor) {
203 		monitor.beginTask(NLS.bind(Messages.AbstractPersistenceProvider_SaveMultiDS_ProgressTitle, dataSets.size()),
204 		        IProgressMonitor.UNKNOWN);
205 		Map<UUID, UUID> idMap = saveDataSets(dataSets);
206 		monitor.done();
207 		return idMap;
208 	}
209 
210 	/**
211 	 * {@inheritDoc}
212 	 *
213 	 * @see pl.edu.agh.cast.data.persistence.IPersistenceProvider
214 	 *      #saveDiagram(pl.edu.agh.cast.data.model.presentation.IPresentationDataSet)
215 	 */
216 	@SuppressWarnings("unchecked")
217 	@Override
218 	public <T extends IPresentationDataSet<? extends IPresentationElement<? extends IElement>>> T saveDiagram(
219 	        T presentationDataSet) {
220 		T savedPDS = null;
221 
222 		List<IDataSet<? extends IElement>> dataSets = new LinkedList<IDataSet<? extends IElement>>();
223 		dataSets.add(presentationDataSet);
224 		if (presentationDataSet.hasAssociatedVisualDataSet()) {
225 			dataSets.add(presentationDataSet.getVisualDataSet());
226 		}
227 
228 		Map<UUID, UUID> idMap = saveDataSets(dataSets);
229 
230 		Map<UUID, IDataSet<? extends IElement>> savedDataSets = getDataSetsById(idMap.values());
231 
232 		savedPDS = (T)savedDataSets.get(idMap.get(presentationDataSet.getId()));
233 
234 		if (presentationDataSet.getVisualDataSet() != null) {
235 			savedPDS.setVisualDataSet((IVisualDataSet)savedDataSets.get(idMap.get(presentationDataSet
236 			        .getVisualDataSet().getId())));
237 		}
238 
239 		return savedPDS;
240 	}
241 
242 	/**
243 	 * {@inheritDoc}
244 	 *
245 	 * @see pl.edu.agh.cast.data.persistence.IPersistenceProvider
246 	 *      #saveDiagram(pl.edu.agh.cast.data.model.presentation.IPresentationDataSet,
247 	 *      org.eclipse.core.runtime.IProgressMonitor)
248 	 */
249 	@Override
250 	public <T extends IPresentationDataSet<? extends IPresentationElement<? extends IElement>>> T saveDiagram(
251 	        T presentationDataSet, IProgressMonitor monitor) {
252 		monitor.beginTask(NLS.bind(Messages.AbstractPersistenceProvider_SaveMultiDS_ProgressTitle, 2),
253 		        IProgressMonitor.UNKNOWN);
254 		T savedPDS = saveDiagram(presentationDataSet);
255 		monitor.done();
256 		return savedPDS;
257 	}
258 
259 	// END Save DataSet
260 
261 	/**
262 	 * {@inheritDoc}
263 	 *
264 	 * @see pl.edu.agh.cast.data.persistence.IPersistenceProvider#setConfig(java.lang.String)
265 	 */
266 	@Override
267 	public void setConfig(String filePath) {
268 		this.config = filePath;
269 	}
270 
271 	public String getConfig() {
272 		return this.config;
273 	}
274 
275 	/**
276 	 * {@inheritDoc}
277 	 *
278 	 * @see pl.edu.agh.cast.data.persistence.IPersistenceProvider#renameDataSet(java.util.UUID, java.lang.String)
279 	 */
280 	@Override
281 	public UUID renameDataSet(UUID id, String newName) {
282 		IDataSet<IElement> ds = getDataSet(id);
283 		if (ds != null) {
284 			ds.setName(newName);
285 			return saveDataSet(ds);
286 		}
287 		return null;
288 	}
289 
290 }