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: ResourceRegistry.java
13   * Created: 2009-07-22
14   * Author: kpietak
15   * $Id$
16   */
17  
18  package pl.edu.agh.cast.resource;
19  
20  import java.util.Collections;
21  import java.util.HashMap;
22  import java.util.LinkedList;
23  import java.util.List;
24  import java.util.Map;
25  
26  import org.apache.log4j.Logger;
27  
28  import pl.edu.agh.cast.Activator;
29  
30  /**
31   * Default implementation of {@link IResourceRegistry}.
32   *
33   * @author AGH CAST Team
34   */
35  public class ResourceRegistry implements IResourceRegistry {
36  
37  	private static Logger log = Activator.getLogger();
38  
39  	private Map<String, IVisualResource> idToResourceMap;
40  
41  	private Map<String, List<IVisualResource>> tagToResourcesMap;
42  
43  	private IVisualResourcesProvidersReader providersReader;
44  
45  	/**
46  	 * Constructor.
47  	 */
48  	public ResourceRegistry() {
49  		idToResourceMap = new HashMap<String, IVisualResource>();
50  		tagToResourcesMap = new HashMap<String, List<IVisualResource>>();
51  		providersReader = new RCPVisualResourcesProvidersReader();
52  	}
53  
54  	/**
55  	 * {@inheritDoc}
56  	 *
57  	 * @see pl.edu.agh.cast.resource.IResourceRegistry#getResource(java.lang.String)
58  	 */
59  	@Override
60  	public IVisualResource getResource(String id) {
61  		if (id == null) {
62  			throw new IllegalArgumentException("Cannot get resource with null id"); //$NON-NLS-1$
63  		}
64  		return idToResourceMap.get(id);
65  	}
66  
67  	/**
68  	 * {@inheritDoc}
69  	 *
70  	 * @see pl.edu.agh.cast.resource.IResourceRegistry#getResource(java.lang.String, java.lang.String)
71  	 */
72  	@Override
73  	public IVisualResource getResource(String id, String defaultId) {
74  		IVisualResource resource = getResource(id);
75  		if (resource == null) {
76  			resource = getResource(defaultId);
77  		}
78  		return resource;
79  	}
80  
81  	/**
82  	 * {@inheritDoc}
83  	 *
84  	 * @see pl.edu.agh.cast.resource.IResourceRegistry#getResources(java.lang.String)
85  	 */
86  	@SuppressWarnings("unchecked")
87  	@Override
88  	public List<IVisualResource> getResources(String tag) {
89  		if (tag == null) {
90  			throw new IllegalArgumentException("Cannot get resources by null tag"); //$NON-NLS-1$
91  		}
92  		return tagToResourcesMap.containsKey(tag) ? tagToResourcesMap.get(tag) : Collections.EMPTY_LIST;
93  	}
94  
95  	/**
96  	 * {@inheritDoc}
97  	 *
98  	 * @see pl.edu.agh.cast.resource.IResourceRegistry#initalize()
99  	 */
100 	@Override
101 	public void initalize() throws ResourceException {
102 		log.info("Initializing resource registry..."); //$NON-NLS-1$
103 		List<IVisualResourcesProvider> providers = providersReader.getVisualResourcesProviders();
104 		for (IVisualResourcesProvider provider : providers) {
105 			for (IVisualResource resource : provider.getVisualResources()) {
106 				register(resource);
107 			}
108 		}
109 	}
110 
111 	/**
112 	 * {@inheritDoc}
113 	 *
114 	 * @see pl.edu.agh.cast.resource.IResourceRegistry#dispose()
115 	 */
116 	@Override
117 	public void dispose() {
118 		for (IVisualResource resource : idToResourceMap.values()) {
119 			resource.dispose();
120 		}
121 		idToResourceMap.clear();
122 		tagToResourcesMap.clear();
123 		log.info("Resource registry disposed"); //$NON-NLS-1$
124 
125 	}
126 
127 	/**
128 	 * {@inheritDoc}
129 	 *
130 	 * @see pl.edu.agh.cast.resource.IResourceRegistry#register(pl.edu.agh.cast.resource.VisualResourceEntry)
131 	 */
132 	@Override
133 	public void register(IVisualResource resource) throws ResourceException {
134 		if (resource == null) {
135 			throw new IllegalArgumentException("Cannot register null resource"); //$NON-NLS-1$
136 		}
137 		String id = resource.getId();
138 		if (id == null || id.isEmpty()) {
139 			throw new IllegalArgumentException("Cannot register resource with null or empty id"); //$NON-NLS-1$
140 		}
141 		// register resource by id
142 		if (idToResourceMap.containsKey(id)) {
143 			throw new ResourceException(String.format("Resource with id %1$ already exists", id)); //$NON-NLS-1$
144 		}
145 		idToResourceMap.put(id, resource);
146 
147 		// register resource by all it's tags
148 		List<String> tags = resource.getTags();
149 		if (tags != null) {
150 			for (String tag : tags) {
151 				if (!tagToResourcesMap.containsKey(tag)) {
152 					tagToResourcesMap.put(tag, new LinkedList<IVisualResource>());
153 				}
154 				List<IVisualResource> values = tagToResourcesMap.get(tag);
155 				values.add(resource);
156 			}
157 		}
158 		log.info(String.format("Resource with id %1$s added to resource registry", id)); //$NON-NLS-1$
159 	}
160 
161 	/**
162 	 * {@inheritDoc}
163 	 *
164 	 * @see pl.edu.agh.cast.resource.IResourceRegistry#unregister(java.lang.String)
165 	 */
166 	@SuppressWarnings("nls")
167 	@Override
168 	public boolean unregister(String id) throws ResourceException {
169 		if (id == null) {
170 			throw new IllegalArgumentException("Cannot unregister resource with null id");
171 		}
172 		if (idToResourceMap.containsKey(id)) {
173 			IVisualResource resource = idToResourceMap.remove(id);
174 			List<String> tags = resource.getTags();
175 			if (tags != null) {
176 				for (String tag : tags) {
177 					List<IVisualResource> values = tagToResourcesMap.get(tag);
178 					values.remove(resource);
179 				}
180 			}
181 			resource.dispose();
182 			log.info(String.format("Resource with id %1$s disposed and removed from resource registry", id));
183 			return true;
184 		} else {
185 			// resource does not exists
186 			log.warn(String.format("Cannot unregister resource: Resource with id %1$s does not exists"));
187 			return false;
188 		}
189 
190 	}
191 
192 	protected void setResourcesProvidersReader(IVisualResourcesProvidersReader reader) {
193 		this.providersReader = reader;
194 	}
195 
196 	/**
197 	 * Interface for objects which reads available resources providers.
198 	 *
199 	 * @author AGH CAST Team
200 	 */
201 	interface IVisualResourcesProvidersReader {
202 
203 		/**
204 		 * Gets visual resources providers
205 		 *
206 		 * @return list of resources providers
207 		 */
208 		List<IVisualResourcesProvider> getVisualResourcesProviders();
209 	}
210 
211 	/**
212 	 * Default implementation of {@link IVisualResourcesProvidersReader} which reads resources providers from
213 	 * <code>pl.edu.agh.cast.resource.provider</code> extension point.
214 	 *
215 	 * @author AGH CAST Team
216 	 */
217 	class RCPVisualResourcesProvidersReader implements IVisualResourcesProvidersReader {
218 
219 		/**
220 		 * {@inheritDoc}
221 		 *
222 		 * @see pl.edu.agh.cast.resource.ResourceRegistry.IVisualResourcesProvidersReader#getVisualResourcesProviders()
223 		 */
224 		@Override
225 		public List<IVisualResourcesProvider> getVisualResourcesProviders() {
226 			return Activator.getResourcesProviders();
227 		}
228 
229 	}
230 
231 }