mirror of
https://gitee.com/jmix/cuba.git
synced 2024-12-04 12:17:41 +08:00
PL-7975 Simplify overriding of WindowLoader, FrameLoader, LookupLoader, EditorLoader
This commit is contained in:
parent
57ac3f102a
commit
d370c650c0
@ -41,6 +41,7 @@ import com.haulmont.cuba.gui.events.sys.UiEventsMulticaster;
|
||||
import com.haulmont.cuba.gui.logging.UserActionsLogger;
|
||||
import com.haulmont.cuba.gui.theme.ThemeConstants;
|
||||
import com.haulmont.cuba.gui.theme.ThemeConstantsRepository;
|
||||
import com.haulmont.cuba.gui.xml.layout.ExternalUIComponentsSource;
|
||||
import com.haulmont.cuba.security.entity.User;
|
||||
import com.haulmont.cuba.security.global.LoginException;
|
||||
import com.haulmont.cuba.security.global.UserSession;
|
||||
@ -149,6 +150,8 @@ public class App implements ConnectionListener {
|
||||
initTestMode();
|
||||
initUI();
|
||||
initExceptionHandling();
|
||||
AppBeans.get(ExternalUIComponentsSource.class)
|
||||
.checkInitialized();
|
||||
} catch (Throwable t) {
|
||||
log.error("Error initializing application", t);
|
||||
System.exit(-1);
|
||||
|
@ -16,14 +16,144 @@
|
||||
|
||||
package com.haulmont.cuba.desktop.sys;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.haulmont.bali.util.Dom4j;
|
||||
import com.haulmont.cuba.core.global.Resources;
|
||||
import com.haulmont.cuba.core.sys.AppContext;
|
||||
import com.haulmont.cuba.desktop.App;
|
||||
import com.haulmont.cuba.gui.xml.layout.ExternalUIComponentsSource;
|
||||
import com.haulmont.cuba.gui.xml.layout.LayoutLoaderConfig;
|
||||
import com.haulmont.cuba.gui.xml.layout.loaders.FrameLoader;
|
||||
import com.haulmont.cuba.gui.xml.layout.loaders.WindowLoader;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.apache.commons.lang.text.StrTokenizer;
|
||||
import org.dom4j.Element;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Please notice that {@code DesktopExternalUIComponentsSource} registers only window loaders.
|
||||
*/
|
||||
@Component(ExternalUIComponentsSource.NAME)
|
||||
public class DesktopExternalUIComponentsSource implements ExternalUIComponentsSource {
|
||||
private static final String DESKTOP_COMPONENTS_CONFIG_XML_PROP = "cuba.desktop.componentsConfig";
|
||||
|
||||
private final Logger log = LoggerFactory.getLogger(DesktopExternalUIComponentsSource.class);
|
||||
|
||||
protected static final String WINDOW_LOADER_EL = "windowLoader";
|
||||
protected static final String FRAME_LOADER_EL = "frameLoader";
|
||||
protected static final String EDITOR_LOADER_EL = "editorLoader";
|
||||
protected static final String LOOKUP_LOADER_EL = "lookupLoader";
|
||||
|
||||
protected static final Map<String, Class<? extends FrameLoader>> loaders = ImmutableMap.of(
|
||||
WINDOW_LOADER_EL, WindowLoader.class,
|
||||
FRAME_LOADER_EL, FrameLoader.class,
|
||||
EDITOR_LOADER_EL, WindowLoader.Editor.class,
|
||||
LOOKUP_LOADER_EL, WindowLoader.Lookup.class
|
||||
);
|
||||
|
||||
@Inject
|
||||
protected Resources resources;
|
||||
|
||||
protected volatile boolean initialized;
|
||||
|
||||
@Override
|
||||
public void checkInitialized() {
|
||||
// do nothing
|
||||
// Desktop client does not support loading of external components
|
||||
if (!initialized) {
|
||||
synchronized (this) {
|
||||
if (!initialized) {
|
||||
log.debug("Init external UI components");
|
||||
|
||||
init();
|
||||
initialized = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void init() {
|
||||
try {
|
||||
_registerWindowLoaders();
|
||||
} catch (Exception e) {
|
||||
log.error("Error on custom UI components registration", e);
|
||||
}
|
||||
}
|
||||
|
||||
protected void _registerWindowLoaders() {
|
||||
String configName = AppContext.getProperty(DESKTOP_COMPONENTS_CONFIG_XML_PROP);
|
||||
StrTokenizer tokenizer = new StrTokenizer(configName);
|
||||
for (String location : tokenizer.getTokenArray()) {
|
||||
Resource resource = resources.getResource(location);
|
||||
if (resource.exists()) {
|
||||
InputStream stream = null;
|
||||
try {
|
||||
stream = resource.getInputStream();
|
||||
Element rootElement = Dom4j.readDocument(stream)
|
||||
.getRootElement();
|
||||
_loadWindowLoaders(rootElement);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
} finally {
|
||||
IOUtils.closeQuietly(stream);
|
||||
}
|
||||
} else {
|
||||
log.warn("Resource {} not found, ignore it", location);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
protected void _loadWindowLoaders(Element rootElement) {
|
||||
Class loader = loadWindowLoader(rootElement, WINDOW_LOADER_EL);
|
||||
if (loader != null) {
|
||||
LayoutLoaderConfig.registerWindowLoader(loader);
|
||||
}
|
||||
|
||||
loader = loadWindowLoader(rootElement, FRAME_LOADER_EL);
|
||||
if (loader != null) {
|
||||
LayoutLoaderConfig.registerFrameLoader(loader);
|
||||
}
|
||||
|
||||
loader = loadWindowLoader(rootElement, EDITOR_LOADER_EL);
|
||||
if (loader != null) {
|
||||
LayoutLoaderConfig.registerEditorLoader(loader);
|
||||
}
|
||||
|
||||
loader = loadWindowLoader(rootElement, LOOKUP_LOADER_EL);
|
||||
if (loader != null) {
|
||||
LayoutLoaderConfig.registerLookupLoader(loader);
|
||||
}
|
||||
}
|
||||
|
||||
protected Class loadWindowLoader(Element rootElement, String loaderElem) {
|
||||
ClassLoader classLoader = App.class.getClassLoader();
|
||||
|
||||
Element elem = rootElement.element(loaderElem);
|
||||
if (elem == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
String loaderClass = elem.element("class").getStringValue();
|
||||
try {
|
||||
Class clazz = classLoader.loadClass(loaderClass);
|
||||
|
||||
if (loaders.get(loaderElem).isAssignableFrom(clazz)) {
|
||||
//noinspection unchecked
|
||||
return clazz;
|
||||
}
|
||||
|
||||
log.warn("Class {} is not suitable as {}", loaderClass, loaderElem);
|
||||
} catch (ClassNotFoundException e) {
|
||||
log.warn("Unable to load window loader class: {}", loaderClass);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
@ -19,16 +19,14 @@
|
||||
<xs:schema targetNamespace="http://schemas.haulmont.com/cuba/components.xsd"
|
||||
xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns="http://schemas.haulmont.com/cuba/components.xsd"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
|
||||
elementFormDefault="qualified">
|
||||
<xs:element name="components">
|
||||
<xs:complexType>
|
||||
<xs:sequence minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:element name="component">
|
||||
<xs:complexType>
|
||||
<xs:all>
|
||||
<xs:element name="tag" minOccurs="0" maxOccurs="1">
|
||||
<xs:element name="tag" minOccurs="0">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:string">
|
||||
@ -37,7 +35,7 @@
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
|
||||
<xs:element name="name" minOccurs="1" maxOccurs="1">
|
||||
<xs:element name="name">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:string">
|
||||
@ -46,7 +44,7 @@
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
|
||||
<xs:element name="class" minOccurs="1" maxOccurs="1">
|
||||
<xs:element name="class">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:string">
|
||||
@ -55,7 +53,7 @@
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
|
||||
<xs:element name="componentLoader" minOccurs="1" maxOccurs="1">
|
||||
<xs:element name="componentLoader">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:string">
|
||||
@ -66,7 +64,30 @@
|
||||
</xs:all>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:group ref="loadersGroup" minOccurs="0"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
|
||||
<xs:group name="loadersGroup">
|
||||
<xs:all>
|
||||
<xs:element name="windowLoader" type="loaderType" minOccurs="0"/>
|
||||
<xs:element name="frameLoader" type="loaderType" minOccurs="0"/>
|
||||
<xs:element name="editorLoader" type="loaderType" minOccurs="0"/>
|
||||
<xs:element name="lookupLoader" type="loaderType" minOccurs="0"/>
|
||||
</xs:all>
|
||||
</xs:group>
|
||||
|
||||
<xs:complexType name="loaderType">
|
||||
<xs:sequence>
|
||||
<xs:element name="class">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:string">
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:schema>
|
@ -26,113 +26,99 @@ import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
public class LayoutLoaderConfig {
|
||||
|
||||
private Map<String, Class<? extends ComponentLoader>> loaders = new ConcurrentHashMap<>();
|
||||
private static Map<String, Class<? extends ComponentLoader>> loaders = new ConcurrentHashMap<>();
|
||||
|
||||
private static LayoutLoaderConfig windowLoaders = new LayoutLoaderConfig();
|
||||
private static LayoutLoaderConfig editorLoaders = new LayoutLoaderConfig();
|
||||
private static LayoutLoaderConfig lookupLoaders = new LayoutLoaderConfig();
|
||||
private static LayoutLoaderConfig frameLoaders = new LayoutLoaderConfig();
|
||||
private static Class<? extends WindowLoader> windowLoader = WindowLoader.class;
|
||||
private static Class<? extends FrameLoader> frameLoader = FrameLoader.class;
|
||||
private static Class<? extends WindowLoader.Editor> editorLoader = WindowLoader.Editor.class;
|
||||
private static Class<? extends WindowLoader.Lookup> lookupLoader = WindowLoader.Lookup.class;
|
||||
|
||||
private static Map<String, Class<? extends ComponentLoader>> customLoaders = new ConcurrentHashMap<>();
|
||||
private static LayoutLoaderConfig llc = new LayoutLoaderConfig();
|
||||
|
||||
static {
|
||||
windowLoaders.register("window", WindowLoader.class);
|
||||
registerComponents(windowLoaders);
|
||||
loaders.put(HBoxLayout.NAME, HBoxLayoutLoader.class);
|
||||
loaders.put(VBoxLayout.NAME, VBoxLayoutLoader.class);
|
||||
loaders.put(GridLayout.NAME, GridLayoutLoader.class);
|
||||
loaders.put(ScrollBoxLayout.NAME, ScrollBoxLayoutLoader.class);
|
||||
loaders.put(GroupBoxLayout.NAME, GroupBoxLayoutLoader.class);
|
||||
loaders.put(HtmlBoxLayout.NAME, HtmlBoxLayoutLoader.class);
|
||||
loaders.put(FlowBoxLayout.NAME, FlowBoxLayoutLoader.class);
|
||||
loaders.put(CssLayout.NAME, CssLayoutLoader.class);
|
||||
|
||||
editorLoaders.register("window", WindowLoader.Editor.class);
|
||||
registerComponents(editorLoaders);
|
||||
loaders.put(Button.NAME, ButtonLoader.class);
|
||||
loaders.put(LinkButton.NAME, LinkButtonLoader.class);
|
||||
loaders.put(CheckBox.NAME, CheckBoxLoader.class);
|
||||
loaders.put(Label.NAME, LabelLoader.class);
|
||||
loaders.put(Link.NAME, LinkLoader.class);
|
||||
|
||||
lookupLoaders.register("window", WindowLoader.Lookup.class);
|
||||
registerComponents(lookupLoaders);
|
||||
loaders.put(TextField.NAME, TextFieldLoader.class);
|
||||
loaders.put(MaskedField.NAME, MaskedFieldLoader.class);
|
||||
loaders.put(TextArea.NAME, ResizableTextAreaLoader.class);
|
||||
loaders.put(SourceCodeEditor.NAME, SourceCodeEditorLoader.class);
|
||||
loaders.put(PasswordField.NAME, PasswordFieldLoader.class);
|
||||
loaders.put(RichTextArea.NAME, RichTextAreaLoader.class);
|
||||
|
||||
frameLoaders.register("window", FrameLoader.class);
|
||||
registerComponents(frameLoaders);
|
||||
}
|
||||
loaders.put(DateField.NAME, DateFieldLoader.class);
|
||||
loaders.put(TimeField.NAME, TimeFieldLoader.class);
|
||||
loaders.put(DatePicker.NAME, DatePickerLoader.class);
|
||||
loaders.put(LookupField.NAME, LookupFieldLoader.class);
|
||||
loaders.put(SuggestionField.NAME, SuggestionFieldLoader.class);
|
||||
loaders.put(SuggestionPickerField.NAME, SuggestionPickerFieldLoader.class);
|
||||
loaders.put(PickerField.NAME, PickerFieldLoader.class);
|
||||
loaders.put(ColorPicker.NAME, ColorPickerLoader.class);
|
||||
loaders.put(LookupPickerField.NAME, LookupPickerFieldLoader.class);
|
||||
loaders.put(SearchPickerField.NAME, SearchPickerFieldLoader.class);
|
||||
loaders.put(OptionsGroup.NAME, OptionsGroupLoader.class);
|
||||
loaders.put(OptionsList.NAME, OptionsListLoader.class);
|
||||
loaders.put(FileUploadField.NAME, FileUploadFieldLoader.class);
|
||||
loaders.put(FileMultiUploadField.NAME, FileMultiUploadFieldLoader.class);
|
||||
loaders.put(CurrencyField.NAME, CurrencyFieldLoader.class);
|
||||
|
||||
private static void registerComponents(LayoutLoaderConfig config) {
|
||||
config.register(HBoxLayout.NAME, HBoxLayoutLoader.class);
|
||||
config.register(VBoxLayout.NAME, VBoxLayoutLoader.class);
|
||||
config.register(GridLayout.NAME, GridLayoutLoader.class);
|
||||
config.register(ScrollBoxLayout.NAME, ScrollBoxLayoutLoader.class);
|
||||
config.register(GroupBoxLayout.NAME, GroupBoxLayoutLoader.class);
|
||||
config.register(HtmlBoxLayout.NAME, HtmlBoxLayoutLoader.class);
|
||||
config.register(FlowBoxLayout.NAME, FlowBoxLayoutLoader.class);
|
||||
config.register(CssLayout.NAME, CssLayoutLoader.class);
|
||||
loaders.put(Table.NAME, TableLoader.class);
|
||||
loaders.put(TreeTable.NAME, TreeTableLoader.class);
|
||||
loaders.put(GroupTable.NAME, GroupTableLoader.class);
|
||||
loaders.put(DataGrid.NAME, DataGridLoader.class);
|
||||
|
||||
config.register(Button.NAME, ButtonLoader.class);
|
||||
config.register(LinkButton.NAME, LinkButtonLoader.class);
|
||||
config.register(CheckBox.NAME, CheckBoxLoader.class);
|
||||
config.register(Label.NAME, LabelLoader.class);
|
||||
config.register(Link.NAME, LinkLoader.class);
|
||||
loaders.put(Calendar.NAME, CalendarLoader.class);
|
||||
|
||||
config.register(TextField.NAME, TextFieldLoader.class);
|
||||
config.register(MaskedField.NAME, MaskedFieldLoader.class);
|
||||
config.register(TextArea.NAME, ResizableTextAreaLoader.class);
|
||||
config.register(SourceCodeEditor.NAME, SourceCodeEditorLoader.class);
|
||||
config.register(PasswordField.NAME, PasswordFieldLoader.class);
|
||||
config.register(RichTextArea.NAME, RichTextAreaLoader.class);
|
||||
|
||||
config.register(DateField.NAME, DateFieldLoader.class);
|
||||
config.register(TimeField.NAME, TimeFieldLoader.class);
|
||||
config.register(DatePicker.NAME, DatePickerLoader.class);
|
||||
config.register(LookupField.NAME, LookupFieldLoader.class);
|
||||
config.register(SuggestionField.NAME, SuggestionFieldLoader.class);
|
||||
config.register(SuggestionPickerField.NAME, SuggestionPickerFieldLoader.class);
|
||||
config.register(PickerField.NAME, PickerFieldLoader.class);
|
||||
config.register(ColorPicker.NAME, ColorPickerLoader.class);
|
||||
config.register(LookupPickerField.NAME, LookupPickerFieldLoader.class);
|
||||
config.register(SearchPickerField.NAME, SearchPickerFieldLoader.class);
|
||||
config.register(OptionsGroup.NAME, OptionsGroupLoader.class);
|
||||
config.register(OptionsList.NAME, OptionsListLoader.class);
|
||||
config.register(FileUploadField.NAME, FileUploadFieldLoader.class);
|
||||
config.register(FileMultiUploadField.NAME, FileMultiUploadFieldLoader.class);
|
||||
config.register(CurrencyField.NAME, CurrencyFieldLoader.class);
|
||||
|
||||
config.register(Table.NAME, TableLoader.class);
|
||||
config.register(TreeTable.NAME, TreeTableLoader.class);
|
||||
config.register(GroupTable.NAME, GroupTableLoader.class);
|
||||
config.register(DataGrid.NAME, DataGridLoader.class);
|
||||
|
||||
config.register(Calendar.NAME, CalendarLoader.class);
|
||||
|
||||
config.register(Frame.NAME, FrameComponentLoader.class);
|
||||
config.register("iframe", FrameComponentLoader.class); // for backward compatibility
|
||||
config.register(RuntimePropertiesFrame.NAME, RuntimePropertiesFrameLoader.class);
|
||||
config.register(SplitPanel.NAME, SplitPanelLoader.class);
|
||||
config.register(Tree.NAME, TreeLoader.class);
|
||||
config.register(TabSheet.NAME, TabSheetLoader.class);
|
||||
config.register(Accordion.NAME, AccordionLoader.class);
|
||||
config.register(Embedded.NAME, EmbeddedLoader.class);
|
||||
config.register(Image.NAME, ImageLoader.class);
|
||||
config.register(BrowserFrame.NAME, BrowserFrameLoader.class);
|
||||
config.register(Filter.NAME, FilterLoader.class);
|
||||
config.register(ButtonsPanel.NAME, ButtonsPanelLoader.class);
|
||||
config.register(PopupButton.NAME, PopupButtonLoader.class);
|
||||
config.register(PopupView.NAME, PopupViewLoader.class);
|
||||
config.register(FieldGroup.NAME, FieldGroupLoader.class);
|
||||
config.register(TokenList.NAME, TokenListLoader.class);
|
||||
config.register(WidgetsTree.NAME, WidgetsTreeLoader.class);
|
||||
config.register(TwinColumn.NAME, TwinColumnLoader.class);
|
||||
config.register(ProgressBar.NAME, ProgressBarLoader.class);
|
||||
config.register(SearchField.NAME, SearchFieldLoader.class);
|
||||
config.register(RelatedEntities.NAME, RelatedEntitiesLoader.class);
|
||||
config.register(BulkEditor.NAME, BulkEditorLoader.class);
|
||||
loaders.put(Frame.NAME, FrameComponentLoader.class);
|
||||
loaders.put("iframe", FrameComponentLoader.class); // for backward compatibility
|
||||
loaders.put(RuntimePropertiesFrame.NAME, RuntimePropertiesFrameLoader.class);
|
||||
loaders.put(SplitPanel.NAME, SplitPanelLoader.class);
|
||||
loaders.put(Tree.NAME, TreeLoader.class);
|
||||
loaders.put(TabSheet.NAME, TabSheetLoader.class);
|
||||
loaders.put(Accordion.NAME, AccordionLoader.class);
|
||||
loaders.put(Embedded.NAME, EmbeddedLoader.class);
|
||||
loaders.put(Image.NAME, ImageLoader.class);
|
||||
loaders.put(BrowserFrame.NAME, BrowserFrameLoader.class);
|
||||
loaders.put(Filter.NAME, FilterLoader.class);
|
||||
loaders.put(ButtonsPanel.NAME, ButtonsPanelLoader.class);
|
||||
loaders.put(PopupButton.NAME, PopupButtonLoader.class);
|
||||
loaders.put(PopupView.NAME, PopupViewLoader.class);
|
||||
loaders.put(FieldGroup.NAME, FieldGroupLoader.class);
|
||||
loaders.put(TokenList.NAME, TokenListLoader.class);
|
||||
loaders.put(WidgetsTree.NAME, WidgetsTreeLoader.class);
|
||||
loaders.put(TwinColumn.NAME, TwinColumnLoader.class);
|
||||
loaders.put(ProgressBar.NAME, ProgressBarLoader.class);
|
||||
loaders.put(SearchField.NAME, SearchFieldLoader.class);
|
||||
loaders.put(RelatedEntities.NAME, RelatedEntitiesLoader.class);
|
||||
loaders.put(BulkEditor.NAME, BulkEditorLoader.class);
|
||||
|
||||
/* Main window components */
|
||||
|
||||
config.register(AppMenu.NAME, AppMenuLoader.class);
|
||||
config.register(AppWorkArea.NAME, AppWorkAreaLoader.class);
|
||||
config.register(LogoutButton.NAME, LogoutButtonLoader.class);
|
||||
config.register(NewWindowButton.NAME, NewWindowButtonLoader.class);
|
||||
config.register(UserIndicator.NAME, UserIndicatorLoader.class);
|
||||
config.register(FoldersPane.NAME, FoldersPaneLoader.class);
|
||||
config.register(FtsField.NAME, FtsFieldLoader.class);
|
||||
config.register(TimeZoneIndicator.NAME, TimeZoneIndicatorLoader.class);
|
||||
config.register(SideMenu.NAME, SideMenuLoader.class);
|
||||
loaders.put(AppMenu.NAME, AppMenuLoader.class);
|
||||
loaders.put(AppWorkArea.NAME, AppWorkAreaLoader.class);
|
||||
loaders.put(LogoutButton.NAME, LogoutButtonLoader.class);
|
||||
loaders.put(NewWindowButton.NAME, NewWindowButtonLoader.class);
|
||||
loaders.put(UserIndicator.NAME, UserIndicatorLoader.class);
|
||||
loaders.put(FoldersPane.NAME, FoldersPaneLoader.class);
|
||||
loaders.put(FtsField.NAME, FtsFieldLoader.class);
|
||||
loaders.put(TimeZoneIndicator.NAME, TimeZoneIndicatorLoader.class);
|
||||
loaders.put(SideMenu.NAME, SideMenuLoader.class);
|
||||
}
|
||||
|
||||
public static void registerLoader(String tagName, Class<? extends ComponentLoader> aClass) {
|
||||
customLoaders.put(tagName, aClass);
|
||||
loaders.put(tagName, aClass);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -143,34 +129,49 @@ public class LayoutLoaderConfig {
|
||||
for (ComponentPalette palette : palettes) {
|
||||
Map<String, Class<? extends ComponentLoader>> loaders = palette.getLoaders();
|
||||
for (Map.Entry<String, Class<? extends ComponentLoader>> loaderEntry : loaders.entrySet()) {
|
||||
customLoaders.put(loaderEntry.getKey(), loaderEntry.getValue());
|
||||
loaders.put(loaderEntry.getKey(), loaderEntry.getValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static LayoutLoaderConfig getWindowLoaders() {
|
||||
return windowLoaders;
|
||||
llc.register("window", windowLoader);
|
||||
return llc;
|
||||
}
|
||||
|
||||
public static LayoutLoaderConfig getEditorLoaders() {
|
||||
return editorLoaders;
|
||||
llc.register("window", editorLoader);
|
||||
return llc;
|
||||
}
|
||||
|
||||
public static LayoutLoaderConfig getFrameLoaders() {
|
||||
return frameLoaders;
|
||||
llc.register("window", frameLoader);
|
||||
return llc;
|
||||
}
|
||||
|
||||
public static LayoutLoaderConfig getLookupLoaders() {
|
||||
return lookupLoaders;
|
||||
llc.register("window", lookupLoader);
|
||||
return llc;
|
||||
}
|
||||
|
||||
public Class<? extends ComponentLoader> getLoader(String name) {
|
||||
final Class<? extends ComponentLoader> loader = customLoaders.get(name);
|
||||
if (loader == null) {
|
||||
return loaders.get(name);
|
||||
}
|
||||
return loaders.get(name);
|
||||
}
|
||||
|
||||
return loader;
|
||||
public static void registerWindowLoader(Class<? extends WindowLoader> loader) {
|
||||
windowLoader = loader;
|
||||
}
|
||||
|
||||
public static void registerFrameLoader(Class<? extends FrameLoader> loader) {
|
||||
frameLoader = loader;
|
||||
}
|
||||
|
||||
public static void registerEditorLoader(Class<? extends WindowLoader.Editor> loader) {
|
||||
editorLoader = loader;
|
||||
}
|
||||
|
||||
public static void registerLookupLoader(Class<? extends WindowLoader.Lookup> loader) {
|
||||
lookupLoader = loader;
|
||||
}
|
||||
|
||||
protected void register(String tagName, Class<? extends ComponentLoader> loaderClass) {
|
||||
|
@ -17,6 +17,7 @@
|
||||
|
||||
package com.haulmont.cuba.web.sys;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.haulmont.bali.util.Dom4j;
|
||||
import com.haulmont.cuba.core.global.Resources;
|
||||
import com.haulmont.cuba.core.sys.AppContext;
|
||||
@ -24,12 +25,13 @@ import com.haulmont.cuba.gui.components.Component;
|
||||
import com.haulmont.cuba.gui.xml.layout.ComponentLoader;
|
||||
import com.haulmont.cuba.gui.xml.layout.ExternalUIComponentsSource;
|
||||
import com.haulmont.cuba.gui.xml.layout.LayoutLoaderConfig;
|
||||
import com.haulmont.cuba.gui.xml.layout.loaders.FrameLoader;
|
||||
import com.haulmont.cuba.gui.xml.layout.loaders.WindowLoader;
|
||||
import com.haulmont.cuba.web.App;
|
||||
import com.haulmont.cuba.web.gui.WebComponentsFactory;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.commons.lang.text.StrTokenizer;
|
||||
import org.dom4j.Document;
|
||||
import org.dom4j.Element;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -41,6 +43,7 @@ import java.io.InputStream;
|
||||
import java.net.URL;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static org.apache.commons.lang.StringUtils.trimToEmpty;
|
||||
|
||||
@ -55,6 +58,18 @@ public class WebExternalUIComponentsSource implements ExternalUIComponentsSource
|
||||
|
||||
private final Logger log = LoggerFactory.getLogger(WebExternalUIComponentsSource.class);
|
||||
|
||||
protected static final String WINDOW_LOADER_EL = "windowLoader";
|
||||
protected static final String FRAME_LOADER_EL = "frameLoader";
|
||||
protected static final String EDITOR_LOADER_EL = "editorLoader";
|
||||
protected static final String LOOKUP_LOADER_EL = "lookupLoader";
|
||||
|
||||
protected static final Map<String, Class<? extends FrameLoader>> loaders = ImmutableMap.of(
|
||||
WINDOW_LOADER_EL, WindowLoader.class,
|
||||
FRAME_LOADER_EL, FrameLoader.class,
|
||||
EDITOR_LOADER_EL, WindowLoader.Editor.class,
|
||||
LOOKUP_LOADER_EL, WindowLoader.Lookup.class
|
||||
);
|
||||
|
||||
@Inject
|
||||
protected Resources resources;
|
||||
|
||||
@ -123,11 +138,12 @@ public class WebExternalUIComponentsSource implements ExternalUIComponentsSource
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
protected void _registerComponent(InputStream is) throws ClassNotFoundException {
|
||||
ClassLoader classLoader = App.class.getClassLoader();
|
||||
|
||||
Document document = Dom4j.readDocument(is);
|
||||
List<Element> components = document.getRootElement().elements("component");
|
||||
Element rootElement = Dom4j.readDocument(is).getRootElement();
|
||||
List<Element> components = rootElement.elements("component");
|
||||
for (Element component : components) {
|
||||
String name = trimToEmpty(component.elementText("name"));
|
||||
String componentClassName = trimToEmpty(component.elementText("class"));
|
||||
@ -158,5 +174,55 @@ public class WebExternalUIComponentsSource implements ExternalUIComponentsSource
|
||||
componentLoaderClassName);
|
||||
}
|
||||
}
|
||||
|
||||
_loadWindowLoaders(rootElement);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
protected void _loadWindowLoaders(Element rootElement) {
|
||||
Class loader = loadWindowLoader(rootElement, WINDOW_LOADER_EL);
|
||||
if (loader != null) {
|
||||
LayoutLoaderConfig.registerWindowLoader(loader);
|
||||
}
|
||||
|
||||
loader = loadWindowLoader(rootElement, FRAME_LOADER_EL);
|
||||
if (loader != null) {
|
||||
LayoutLoaderConfig.registerFrameLoader(loader);
|
||||
}
|
||||
|
||||
loader = loadWindowLoader(rootElement, EDITOR_LOADER_EL);
|
||||
if (loader != null) {
|
||||
LayoutLoaderConfig.registerEditorLoader(loader);
|
||||
}
|
||||
|
||||
loader = loadWindowLoader(rootElement, LOOKUP_LOADER_EL);
|
||||
if (loader != null) {
|
||||
LayoutLoaderConfig.registerLookupLoader(loader);
|
||||
}
|
||||
}
|
||||
|
||||
protected Class loadWindowLoader(Element rootElement, String loaderElem) {
|
||||
ClassLoader classLoader = App.class.getClassLoader();
|
||||
|
||||
Element elem = rootElement.element(loaderElem);
|
||||
if (elem == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
String loaderClass = elem.element("class").getStringValue();
|
||||
try {
|
||||
Class clazz = classLoader.loadClass(loaderClass);
|
||||
|
||||
if (loaders.get(loaderElem).isAssignableFrom(clazz)) {
|
||||
//noinspection unchecked
|
||||
return clazz;
|
||||
}
|
||||
|
||||
log.warn("Class {} is not suitable as {}", loaderClass, loaderElem);
|
||||
} catch (ClassNotFoundException e) {
|
||||
log.warn("Unable to load window loader class: {}", loaderClass);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user