blob: 8f1a816024bf6d2149a36b79a7240d9918475d03 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
/*
* Copyright 2000-2018 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.vaadin.osgi.liferay;
import java.util.Optional;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceObjects;
import org.osgi.framework.ServiceReference;
import org.osgi.service.log.LogService;
import com.vaadin.server.UIClassSelectionEvent;
import com.vaadin.server.UICreateEvent;
import com.vaadin.server.UIProvider;
import com.vaadin.ui.UI;
/**
* Vaadin {@link com.vaadin.server.UIProvider} that provides a single {@link UI}
* class provided through the registration of a {@link UI} as an OSGi service.
* <p>
* This only applies to Liferay Portal 7+ with OSGi support.
*
* @author Sampsa Sohlman
*
* @since 8.1
*/
@SuppressWarnings("serial")
public class OsgiUIProvider extends UIProvider {
private Class<UI> uiClass;
private ServiceObjects<UI> serviceObjects;
private boolean prototype;
private Optional<LogService> logService;
@SuppressWarnings("unchecked")
public OsgiUIProvider(ServiceObjects<UI> serviceObjects,
Optional<LogService> logService) {
super();
this.serviceObjects = serviceObjects;
this.logService = logService;
UI ui = serviceObjects.getService();
ServiceReference<UI> reference = serviceObjects.getServiceReference();
Object property = reference.getProperty(Constants.SERVICE_SCOPE);
prototype = Constants.SCOPE_PROTOTYPE.equals(property);
uiClass = (Class<UI>) ui.getClass();
serviceObjects.ungetService(ui);
}
@Override
public Class<? extends UI> getUIClass(UIClassSelectionEvent event) {
return uiClass;
}
@Override
public UI createInstance(UICreateEvent event) {
if (prototype) {
UI ui = serviceObjects.getService();
ui.addDetachListener(event2 -> serviceObjects.ungetService(ui));
return ui;
}
logService.ifPresent(log -> log.log(LogService.LOG_WARNING,
"UI services should have a prototype scope! Creating UI instance using the default constructor!"));
return super.createInstance(event);
}
public String getDefaultPortletName() {
return uiClass.getName();
}
public String getDefaultDisplayName() {
return uiClass.getSimpleName();
}
}
|