1 package org
.argeo
.app
.ui
;
3 import static org
.argeo
.api
.cms
.ux
.CmsView
.CMS_VIEW_UID_PROPERTY
;
5 import java
.util
.Collections
;
6 import java
.util
.HashMap
;
7 import java
.util
.HashSet
;
9 import java
.util
.Locale
;
11 import java
.util
.Objects
;
13 import java
.util
.TreeMap
;
14 import java
.util
.TreeSet
;
16 import javax
.jcr
.Node
;
17 import javax
.jcr
.RepositoryException
;
18 import javax
.jcr
.nodetype
.NodeType
;
19 import javax
.xml
.namespace
.QName
;
21 import org
.argeo
.api
.acr
.Content
;
22 import org
.argeo
.api
.acr
.ContentRepository
;
23 import org
.argeo
.api
.acr
.spi
.ProvidedSession
;
24 import org
.argeo
.api
.cms
.CmsConstants
;
25 import org
.argeo
.api
.cms
.CmsEventSubscriber
;
26 import org
.argeo
.api
.cms
.CmsLog
;
27 import org
.argeo
.api
.cms
.CmsSession
;
28 import org
.argeo
.api
.cms
.ux
.CmsTheme
;
29 import org
.argeo
.api
.cms
.ux
.CmsUi
;
30 import org
.argeo
.api
.cms
.ux
.CmsView
;
31 import org
.argeo
.app
.api
.EntityConstants
;
32 import org
.argeo
.app
.api
.EntityNames
;
33 import org
.argeo
.app
.api
.EntityType
;
34 import org
.argeo
.app
.api
.RankedObject
;
35 import org
.argeo
.cms
.AbstractCmsApp
;
36 import org
.argeo
.cms
.CmsUserManager
;
37 import org
.argeo
.cms
.LocaleUtils
;
38 import org
.argeo
.cms
.Localized
;
39 import org
.argeo
.cms
.acr
.ContentUtils
;
40 import org
.argeo
.cms
.jcr
.CmsJcrUtils
;
41 import org
.argeo
.cms
.jcr
.acr
.JcrContent
;
42 import org
.argeo
.cms
.swt
.CmsSwtUtils
;
43 import org
.argeo
.cms
.swt
.acr
.SwtUiProvider
;
44 import org
.argeo
.cms
.swt
.dialogs
.CmsFeedback
;
45 import org
.argeo
.cms
.ux
.CmsUxUtils
;
46 import org
.argeo
.eclipse
.ui
.specific
.UiContext
;
47 import org
.argeo
.jcr
.JcrException
;
48 import org
.argeo
.util
.LangUtils
;
49 import org
.eclipse
.swt
.SWT
;
50 import org
.eclipse
.swt
.widgets
.Composite
;
51 import org
.osgi
.framework
.Constants
;
52 import org
.osgi
.service
.useradmin
.User
;
54 /** The Argeo Suite App. */
55 public class SuiteApp
extends AbstractCmsApp
implements CmsEventSubscriber
{
56 private final static CmsLog log
= CmsLog
.getLog(SuiteApp
.class);
58 public final static String PUBLIC_BASE_PATH_PROPERTY
= "publicBasePath";
59 public final static String DEFAULT_UI_NAME_PROPERTY
= "defaultUiName";
60 public final static String DEFAULT_THEME_ID_PROPERTY
= "defaultThemeId";
61 public final static String DEFAULT_LAYER_PROPERTY
= "defaultLayer";
62 private final static String LOGIN
= "login";
63 private final static String HOME_STATE
= "~";
65 private String publicBasePath
= null;
67 private String pidPrefix
;
68 private String headerPid
;
69 private String footerPid
;
70 private String leadPanePid
;
71 private String adminLeadPanePid
;
72 private String loginScreenPid
;
74 private String defaultUiName
= "app";
75 private String adminUiName
= "admin";
77 // FIXME such default names make refactoring more dangerous
79 private String defaultLayerPid
= "argeo.suite.ui.dashboardLayer";
81 private String defaultThemeId
= "org.argeo.app.theme.default";
83 private Map
<String
, RankedObject
<SwtUiProvider
>> uiProvidersByPid
= Collections
.synchronizedMap(new HashMap
<>());
84 private Map
<String
, RankedObject
<SwtUiProvider
>> uiProvidersByType
= Collections
.synchronizedMap(new HashMap
<>());
85 private Map
<String
, RankedObject
<SuiteLayer
>> layersByPid
= Collections
.synchronizedSortedMap(new TreeMap
<>());
86 private Map
<String
, RankedObject
<SuiteLayer
>> layersByType
= Collections
.synchronizedSortedMap(new TreeMap
<>());
88 private CmsUserManager cmsUserManager
;
90 // TODO make more optimal or via CmsSession/CmsView
91 private Map
<String
, SuiteUi
> managedUis
= new HashMap
<>();
94 private ContentRepository contentRepository
;
95 // private JcrContentProvider jcrContentProvider;
98 // private Repository repository;
100 public void init(Map
<String
, Object
> properties
) {
101 for (SuiteEvent event
: SuiteEvent
.values()) {
102 getCmsContext().getCmsEventBus().addEventSubscriber(event
.topic(), this);
105 if (log
.isDebugEnabled())
106 log
.info("Argeo Suite App started");
108 if (properties
.containsKey(DEFAULT_UI_NAME_PROPERTY
))
109 defaultUiName
= LangUtils
.get(properties
, DEFAULT_UI_NAME_PROPERTY
);
110 if (properties
.containsKey(DEFAULT_THEME_ID_PROPERTY
))
111 defaultThemeId
= LangUtils
.get(properties
, DEFAULT_THEME_ID_PROPERTY
);
112 if (properties
.containsKey(DEFAULT_LAYER_PROPERTY
))
113 defaultLayerPid
= LangUtils
.get(properties
, DEFAULT_LAYER_PROPERTY
);
114 publicBasePath
= LangUtils
.get(properties
, PUBLIC_BASE_PATH_PROPERTY
);
116 if (properties
.containsKey(Constants
.SERVICE_PID
)) {
117 String servicePid
= properties
.get(Constants
.SERVICE_PID
).toString();
118 if (servicePid
.endsWith(".app")) {
119 pidPrefix
= servicePid
.substring(0, servicePid
.length() - "app".length());
123 if (pidPrefix
== null)
124 throw new IllegalArgumentException("PID prefix must be set.");
126 headerPid
= pidPrefix
+ "header";
127 footerPid
= pidPrefix
+ "footer";
128 leadPanePid
= pidPrefix
+ "leadPane";
129 adminLeadPanePid
= pidPrefix
+ "adminLeadPane";
130 loginScreenPid
= pidPrefix
+ "loginScreen";
133 public void destroy(Map
<String
, Object
> properties
) {
134 for (SuiteUi ui
: managedUis
.values())
135 if (!ui
.isDisposed()) {
136 ui
.getDisplay().syncExec(() -> ui
.dispose());
138 if (log
.isDebugEnabled())
139 log
.info("Argeo Suite App stopped");
144 public Set
<String
> getUiNames() {
145 HashSet
<String
> uiNames
= new HashSet
<>();
146 uiNames
.add(defaultUiName
);
147 uiNames
.add(adminUiName
);
152 public CmsUi
initUi(Object parent
) {
153 Composite uiParent
= (Composite
) parent
;
154 String uiName
= uiParent
.getData(UI_NAME_PROPERTY
) != null ? uiParent
.getData(UI_NAME_PROPERTY
).toString()
156 CmsView cmsView
= CmsSwtUtils
.getCmsView(uiParent
);
158 throw new IllegalStateException("No CMS view is registered.");
159 CmsTheme theme
= getTheme(uiName
);
161 CmsSwtUtils
.registerCmsTheme(uiParent
.getShell(), theme
);
162 SuiteUi argeoSuiteUi
= new SuiteUi(uiParent
, SWT
.INHERIT_DEFAULT
);
163 String uid
= cmsView
.getUid();
164 managedUis
.put(uid
, argeoSuiteUi
);
165 argeoSuiteUi
.addDisposeListener((e
) -> {
166 managedUis
.remove(uid
);
167 if (log
.isDebugEnabled())
168 log
.debug("Suite UI " + uid
+ " has been disposed.");
174 public String
getThemeId(String uiName
) {
175 String themeId
= System
.getProperty("org.argeo.app.theme.default");
178 return defaultThemeId
;
182 public void refreshUi(CmsUi cmsUi
, String state
) {
184 Content context
= null;
185 SuiteUi ui
= (SuiteUi
) cmsUi
;
187 String uiName
= Objects
.toString(ui
.getParent().getData(UI_NAME_PROPERTY
), null);
189 throw new IllegalStateException("UI name should not be null");
190 CmsView cmsView
= CmsSwtUtils
.getCmsView(ui
);
192 ProvidedSession contentSession
= (ProvidedSession
) CmsUxUtils
.getContentSession(contentRepository
, cmsView
);
194 SwtUiProvider headerUiProvider
= findUiProvider(headerPid
);
195 SwtUiProvider footerUiProvider
= findUiProvider(footerPid
);
196 SwtUiProvider leadPaneUiProvider
;
197 if (adminUiName
.equals(uiName
)) {
198 leadPaneUiProvider
= findUiProvider(adminLeadPanePid
);
200 leadPaneUiProvider
= findUiProvider(leadPanePid
);
203 Localized appTitle
= null;
204 if (headerUiProvider
instanceof DefaultHeader
) {
205 appTitle
= ((DefaultHeader
) headerUiProvider
).getTitle();
207 ui
.setTitle(appTitle
);
209 if (cmsView
.isAnonymous() && publicBasePath
== null) {// internal app, must login
211 if (headerUiProvider
!= null)
212 refreshPart(headerUiProvider
, ui
.getHeader(), context
);
213 ui
.refreshBelowHeader(false);
214 refreshPart(findUiProvider(loginScreenPid
), ui
.getBelowHeader(), context
);
215 if (footerUiProvider
!= null)
216 refreshPart(footerUiProvider
, ui
.getFooter(), context
);
217 ui
.layout(true, true);
220 if (LOGIN
.equals(state
))
222 CmsSession cmsSession
= cmsView
.getCmsSession();
223 if (ui
.getUserDirNode() == null) {
224 // FIXME NPE on CMSSession when logging in from anonymous
225 if (cmsSession
== null || cmsView
.isAnonymous()) {
226 assert publicBasePath
!= null;
227 Content userDir
= contentSession
228 .get(ContentUtils
.SLASH
+ CmsConstants
.SYS_WORKSPACE
+ publicBasePath
);
229 ui
.setUserDir(userDir
);
230 // ui.initSessions(getRepository(), publicBasePath);
232 // Session adminSession = null;
234 // adminSession = CmsJcrUtils.openDataAdminSession(getRepository(), null);
235 // Node userDirNode = SuiteUtils.getOrCreateCmsSessionNode(adminSession, cmsSession);
236 // Content userDir = contentSession.get(CmsConstants.SYS_WORKSPACE + userDirNode.getPath());
237 // ui.setUserDir(userDir);
238 //// ui.initSessions(getRepository(), userDirNode.getPath());
240 // Jcr.logout(adminSession);
242 Content userDir
= contentSession
.getSessionRunDir();
243 ui
.setUserDir(userDir
);
246 initLocale(cmsSession
);
247 context
= stateToNode(ui
, state
);
249 context
= ui
.getUserDirNode();
251 if (headerUiProvider
!= null)
252 refreshPart(headerUiProvider
, ui
.getHeader(), context
);
253 ui
.refreshBelowHeader(true);
254 for (String key
: layersByPid
.keySet()) {
255 SuiteLayer layer
= layersByPid
.get(key
).get();
256 ui
.addLayer(key
, layer
);
259 if (leadPaneUiProvider
!= null)
260 refreshPart(leadPaneUiProvider
, ui
.getLeadPane(), context
);
261 if (footerUiProvider
!= null)
262 refreshPart(footerUiProvider
, ui
.getFooter(), context
);
263 ui
.layout(true, true);
264 setState(ui
, state
!= null ? state
: defaultLayerPid
);
266 } catch (Exception e
) {
267 CmsFeedback
.show("Unexpected exception", e
);
271 private void initLocale(CmsSession cmsSession
) {
272 if (cmsSession
== null)
274 Locale locale
= cmsSession
.getLocale();
275 UiContext
.setLocale(locale
);
276 LocaleUtils
.setThreadLocale(locale
);
280 private void refreshPart(SwtUiProvider uiProvider
, Composite part
, Content context
) {
281 CmsSwtUtils
.clear(part
);
282 uiProvider
.createUiPart(part
, context
);
285 private SwtUiProvider
findUiProvider(String pid
) {
286 if (!uiProvidersByPid
.containsKey(pid
))
288 return uiProvidersByPid
.get(pid
).get();
291 private SuiteLayer
findLayer(String pid
) {
292 if (!layersByPid
.containsKey(pid
))
294 return layersByPid
.get(pid
).get();
297 private <T
> T
findByType(Map
<String
, RankedObject
<T
>> byType
, Content content
) {
299 throw new IllegalArgumentException("A node should be provided");
301 if (content
instanceof JcrContent
) {
302 Node context
= ((JcrContent
) content
).getJcrNode();
305 Set
<String
> types
= new TreeSet
<>();
306 for (NodeType mixinType
: context
.getMixinNodeTypes()) {
307 String mixinTypeName
= mixinType
.getName();
308 if (byType
.containsKey(mixinTypeName
)) {
309 types
.add(mixinTypeName
);
311 for (NodeType superType
: mixinType
.getDeclaredSupertypes()) {
312 if (byType
.containsKey(superType
.getName())) {
313 types
.add(superType
.getName());
318 NodeType primaryType
= context
.getPrimaryNodeType();
319 String primaryTypeName
= primaryType
.getName();
320 if (byType
.containsKey(primaryTypeName
)) {
321 types
.add(primaryTypeName
);
323 for (NodeType superType
: primaryType
.getDeclaredSupertypes()) {
324 if (byType
.containsKey(superType
.getName())) {
325 types
.add(superType
.getName());
329 if (context
.isNodeType(EntityType
.entity
.get())) {
330 if (context
.hasProperty(EntityNames
.ENTITY_TYPE
)) {
331 String entityTypeName
= context
.getProperty(EntityNames
.ENTITY_TYPE
).getString();
332 if (byType
.containsKey(entityTypeName
)) {
333 types
.add(entityTypeName
);
338 // if (context.getPath().equals("/")) {// root node
339 // types.add("nt:folder");
341 if (CmsJcrUtils
.isUserHome(context
) && byType
.containsKey("nt:folder")) {// home node
342 types
.add("nt:folder");
345 if (types
.size() == 0)
346 throw new IllegalArgumentException(
347 "No type found for " + context
+ " (" + listTypes(context
) + ")");
348 String type
= types
.iterator().next();
349 if (!byType
.containsKey(type
))
350 throw new IllegalArgumentException("No component found for " + context
+ " with type " + type
);
351 return byType
.get(type
).get();
352 } catch (RepositoryException e
) {
353 throw new IllegalStateException(e
);
358 List
<QName
> objectClasses
= content
.getContentClasses();
359 Set
<String
> types
= new TreeSet
<>();
360 for (QName cc
: objectClasses
) {
361 String type
= cc
.getPrefix() + ":" + cc
.getLocalPart();
362 if (byType
.containsKey(type
))
365 if (types
.size() == 0)
366 throw new IllegalArgumentException("No type found for " + content
+ " (" + objectClasses
+ ")");
367 String type
= types
.iterator().next();
368 if (!byType
.containsKey(type
))
369 throw new IllegalArgumentException("No component found for " + content
+ " with type " + type
);
370 return byType
.get(type
).get();
371 // throw new UnsupportedOperationException("Content " +
372 // content.getClass().getName() + " is not supported.");
376 private static String
listTypes(Node context
) {
378 StringBuilder sb
= new StringBuilder();
379 sb
.append(context
.getPrimaryNodeType().getName());
380 for (NodeType superType
: context
.getPrimaryNodeType().getDeclaredSupertypes()) {
382 sb
.append(superType
.getName());
385 for (NodeType nodeType
: context
.getMixinNodeTypes()) {
387 sb
.append(nodeType
.getName());
388 if (nodeType
.getName().equals(EntityType
.local
.get()))
389 sb
.append('/').append(context
.getProperty(EntityNames
.ENTITY_TYPE
).getString());
390 for (NodeType superType
: nodeType
.getDeclaredSupertypes()) {
392 sb
.append(superType
.getName());
395 return sb
.toString();
396 } catch (RepositoryException e
) {
397 throw new JcrException(e
);
402 public void setState(CmsUi cmsUi
, String state
) {
405 if (!state
.startsWith("/")) {
406 if (cmsUi
instanceof SuiteUi
) {
407 SuiteUi ui
= (SuiteUi
) cmsUi
;
408 if (LOGIN
.equals(state
)) {
409 String appTitle
= "";
410 if (ui
.getTitle() != null)
411 appTitle
= ui
.getTitle().lead();
412 ui
.getCmsView().stateChanged(state
, appTitle
);
415 Map
<String
, Object
> properties
= new HashMap
<>();
416 String layerId
= HOME_STATE
.equals(state
) ? defaultLayerPid
: state
;
417 properties
.put(SuiteEvent
.LAYER
, layerId
);
418 properties
.put(SuiteEvent
.NODE_PATH
, HOME_STATE
);
419 ui
.getCmsView().sendEvent(SuiteEvent
.switchLayer
.topic(), properties
);
423 SuiteUi suiteUi
= (SuiteUi
) cmsUi
;
424 Content node
= stateToNode(suiteUi
, state
);
426 suiteUi
.getCmsView().navigateTo(HOME_STATE
);
428 suiteUi
.getCmsView().sendEvent(SuiteEvent
.switchLayer
.topic(), SuiteEvent
.eventProperties(node
));
429 suiteUi
.getCmsView().sendEvent(SuiteEvent
.refreshPart
.topic(), SuiteEvent
.eventProperties(node
));
433 // TODO move it to an internal package?
434 static String
nodeToState(Content node
) {
435 return node
.getPath();
438 private Content
stateToNode(SuiteUi suiteUi
, String state
) {
441 if (state
== null || !state
.startsWith("/"))
445 // String path = state.substring(1);
447 // if (path.equals("")) {
451 // int index = path.indexOf('/');
453 // log.error("Cannot interpret " + state);
454 //// cmsView.navigateTo("~");
456 // } else if (index > 0) {
457 // workspace = path.substring(0, index);
458 // path = path.substring(index);
459 // } else {// index<0, assuming root node
465 ProvidedSession contentSession
= (ProvidedSession
) CmsUxUtils
.getContentSession(contentRepository
,
466 suiteUi
.getCmsView());
467 return contentSession
.get(path
);
468 // Session session = jcrContentProvider.getJcrSession(contentSession, workspace);
469 //// Session session = suiteUi.getSession(workspace);
470 // if (session == null)
472 // Node node = Jcr.getNode(session, path);
481 public void onEvent(String topic
, Map
<String
, Object
> event
) {
483 // Specific UI related events
484 SuiteUi ui
= getRelatedUi(event
);
487 ui
.getCmsView().runAs(() -> {
489 String appTitle
= "";
490 if (ui
.getTitle() != null)
491 appTitle
= ui
.getTitle().lead() + " - ";
493 // String currentLayerId = ui.getCurrentLayerId();
494 // SuiteLayer currentLayer = currentLayerId != null ? layersByPid.get(currentLayerId).get() : null;
495 if (SuiteUiUtils
.isTopic(topic
, SuiteEvent
.refreshPart
)) {
496 Content node
= getNode(ui
, event
);
499 SwtUiProvider uiProvider
= findByType(uiProvidersByType
, node
);
500 SuiteLayer layer
= findByType(layersByType
, node
);
501 ui
.switchToLayer(layer
, node
);
502 layer
.view(uiProvider
, ui
.getCurrentWorkArea(), node
);
503 ui
.getCmsView().stateChanged(nodeToState(node
), appTitle
+ CmsUxUtils
.getTitle(node
));
504 } else if (SuiteUiUtils
.isTopic(topic
, SuiteEvent
.openNewPart
)) {
505 Content node
= getNode(ui
, event
);
508 SwtUiProvider uiProvider
= findByType(uiProvidersByType
, node
);
509 SuiteLayer layer
= findByType(layersByType
, node
);
510 ui
.switchToLayer(layer
, node
);
511 layer
.open(uiProvider
, ui
.getCurrentWorkArea(), node
);
512 ui
.getCmsView().stateChanged(nodeToState(node
), appTitle
+ CmsUxUtils
.getTitle(node
));
513 } else if (SuiteUiUtils
.isTopic(topic
, SuiteEvent
.switchLayer
)) {
514 String layerId
= get(event
, SuiteEvent
.LAYER
);
515 if (layerId
!= null) {
516 // ui.switchToLayer(layerId, ui.getUserDir());
517 SuiteLayer suiteLayer
= findLayer(layerId
);
518 if (suiteLayer
== null)
519 throw new IllegalArgumentException("No layer '" + layerId
+ "' available.");
520 Localized layerTitle
= suiteLayer
.getTitle();
521 // FIXME make sure we don't rebuild the work area twice
522 Composite workArea
= ui
.switchToLayer(layerId
, ui
.getUserDirNode());
524 if (layerTitle
!= null)
525 title
= layerTitle
.lead();
526 Content nodeFromState
= getNode(ui
, event
);
527 if (nodeFromState
!= null && nodeFromState
.getPath().equals(ui
.getUserDirNode().getPath())) {
528 // default layer view is forced
529 String state
= defaultLayerPid
.equals(layerId
) ?
"~" : layerId
;
530 ui
.getCmsView().stateChanged(state
, appTitle
+ title
);
531 suiteLayer
.view(null, workArea
, nodeFromState
);
533 Content layerCurrentContext
= suiteLayer
.getCurrentContext(workArea
);
534 if (layerCurrentContext
!= null) {
535 // layer was already showing a context so we set the state to it
536 ui
.getCmsView().stateChanged(nodeToState(layerCurrentContext
),
537 appTitle
+ CmsUxUtils
.getTitle(layerCurrentContext
));
539 // no context was shown
540 ui
.getCmsView().stateChanged(layerId
, appTitle
+ title
);
544 Content node
= getNode(ui
, event
);
546 SuiteLayer layer
= findByType(layersByType
, node
);
547 ui
.switchToLayer(layer
, node
);
551 } catch (Exception e
) {
552 log
.error("Cannot handle event " + event
, e
);
553 // CmsView.getCmsView(ui).exception(e);
558 private Content
getNode(SuiteUi ui
, Map
<String
, Object
> event
) {
559 ProvidedSession contentSession
= (ProvidedSession
) CmsUxUtils
.getContentSession(contentRepository
,
562 String path
= get(event
, SuiteEvent
.CONTENT_PATH
);
564 // String nodePath = get(event, SuiteEvent.NODE_PATH);
565 if (path
!= null && path
.equals(HOME_STATE
))
566 return ui
.getUserDir();
567 // String workspace = get(event, SuiteEvent.WORKSPACE);
569 // Session session = jcrContentProvider.getJcrSession(contentSession, workspace);
570 //// Session session = ui.getSession(workspace);
574 String username
= get(event
, SuiteEvent
.USERNAME
);
575 if (username
== null)
577 User user
= cmsUserManager
.getUser(username
);
580 node
= ContentUtils
.roleToContent(cmsUserManager
, contentSession
, user
);
583 // userDn = new LdapName(user.getName());
584 // } catch (InvalidNameException e) {
585 // throw new IllegalArgumentException("Badly formatted username", e);
587 // String userNodePath = SuiteUtils.getUserNodePath(userDn);
588 // FIXME deal with home path
590 // if (Jcr.itemExists(session, userNodePath))
591 // node = Jcr.getNode(session, userNodePath);
593 // Session adminSession = null;
595 // adminSession = CmsJcrUtils.openDataAdminSession(getRepository(), workspace);
596 // SuiteUtils.getOrCreateUserNode(adminSession, userDn);
598 // Jcr.logout(adminSession);
600 // node = Jcr.getNode(session, userNodePath);
603 node
= contentSession
.get(path
);
608 private SuiteUi
getRelatedUi(Map
<String
, Object
> eventProperties
) {
609 return managedUis
.get(get(eventProperties
, CMS_VIEW_UID_PROPERTY
));
612 public static String
get(Map
<String
, Object
> eventProperties
, String key
) {
613 Object value
= eventProperties
.get(key
);
616 // throw new IllegalArgumentException("Property " + key + " must be set");
617 return value
.toString();
622 * Dependency injection.
625 public void addUiProvider(SwtUiProvider uiProvider
, Map
<String
, Object
> properties
) {
626 if (properties
.containsKey(Constants
.SERVICE_PID
)) {
627 String pid
= (String
) properties
.get(Constants
.SERVICE_PID
);
628 RankedObject
.putIfHigherRank(uiProvidersByPid
, pid
, uiProvider
, properties
);
630 if (properties
.containsKey(EntityConstants
.TYPE
)) {
631 List
<String
> types
= LangUtils
.toStringList(properties
.get(EntityConstants
.TYPE
));
632 for (String type
: types
)
633 RankedObject
.putIfHigherRank(uiProvidersByType
, type
, uiProvider
, properties
);
637 public void removeUiProvider(SwtUiProvider uiProvider
, Map
<String
, Object
> properties
) {
638 if (properties
.containsKey(Constants
.SERVICE_PID
)) {
639 String pid
= (String
) properties
.get(Constants
.SERVICE_PID
);
640 if (uiProvidersByPid
.containsKey(pid
)) {
641 if (uiProvidersByPid
.get(pid
).equals(new RankedObject
<SwtUiProvider
>(uiProvider
, properties
))) {
642 uiProvidersByPid
.remove(pid
);
646 if (properties
.containsKey(EntityConstants
.TYPE
)) {
647 List
<String
> types
= LangUtils
.toStringList(properties
.get(EntityConstants
.TYPE
));
648 for (String type
: types
) {
649 if (uiProvidersByType
.containsKey(type
)) {
650 if (uiProvidersByType
.get(type
).equals(new RankedObject
<SwtUiProvider
>(uiProvider
, properties
))) {
651 uiProvidersByType
.remove(type
);
658 public void addLayer(SuiteLayer layer
, Map
<String
, Object
> properties
) {
659 if (properties
.containsKey(Constants
.SERVICE_PID
)) {
660 String pid
= (String
) properties
.get(Constants
.SERVICE_PID
);
661 RankedObject
.putIfHigherRank(layersByPid
, pid
, layer
, properties
);
663 if (properties
.containsKey(EntityConstants
.TYPE
)) {
664 List
<String
> types
= LangUtils
.toStringList(properties
.get(EntityConstants
.TYPE
));
665 for (String type
: types
)
666 RankedObject
.putIfHigherRank(layersByType
, type
, layer
, properties
);
670 public void removeLayer(SuiteLayer layer
, Map
<String
, Object
> properties
) {
671 if (properties
.containsKey(Constants
.SERVICE_PID
)) {
672 String pid
= (String
) properties
.get(Constants
.SERVICE_PID
);
673 if (layersByPid
.containsKey(pid
)) {
674 if (layersByPid
.get(pid
).equals(new RankedObject
<SuiteLayer
>(layer
, properties
))) {
675 layersByPid
.remove(pid
);
679 if (properties
.containsKey(EntityConstants
.TYPE
)) {
680 List
<String
> types
= LangUtils
.toStringList(properties
.get(EntityConstants
.TYPE
));
681 for (String type
: types
) {
682 if (layersByType
.containsKey(type
)) {
683 if (layersByType
.get(type
).equals(new RankedObject
<SuiteLayer
>(layer
, properties
))) {
684 layersByType
.remove(type
);
691 public void setCmsUserManager(CmsUserManager cmsUserManager
) {
692 this.cmsUserManager
= cmsUserManager
;
695 // protected Repository getRepository() {
696 // return repository;
699 // public void setRepository(Repository repository) {
700 // this.repository = repository;
703 protected ContentRepository
getContentRepository() {
704 return contentRepository
;
707 public void setContentRepository(ContentRepository contentRepository
) {
708 this.contentRepository
= contentRepository
;
711 // public void setJcrContentProvider(JcrContentProvider jcrContentProvider) {
712 // this.jcrContentProvider = jcrContentProvider;