Merge remote-tracking branch 'origin/master' into bug2775

This commit is contained in:
Benjamin Barth committed 2016-06-09 16:32:49 +02:00
commit 480544df7a
1787 files changed
+188408 -21549

No files matched your search

@@ -1,2 +1,3 @@
eclipse.preferences.version=1
entryPointModules=
gwtCompileSettings=PGd3dC1jb21waWxlLXNldHRpbmdzPjxsb2ctbGV2ZWw+SU5GTzwvbG9nLWxldmVsPjxvdXRwdXQtc3R5bGU+T0JGVVNDQVRFRDwvb3V0cHV0LXN0eWxlPjxleHRyYS1hcmdzPjwhW0NEQVRBW11dPjwvZXh0cmEtYXJncz48dm0tYXJncz48IVtDREFUQVstWG14NTEybV1dPjwvdm0tYXJncz48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc3NlLmd3dC5IaWdoY2hhcnRzX0F1dG9pbmplY3Q8L2VudHJ5LXBvaW50LW1vZHVsZT48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc3NlLmd3dC5Db21tb25Db250cm9sQ1NTX0F1dG9pbmplY3Q8L2VudHJ5LXBvaW50LW1vZHVsZT48L2d3dC1jb21waWxlLXNldHRpbmdzPg\=\=
@@ -1,5 +1,7 @@
eclipse.preferences.version=1
encoding//src/com/sap/sse/gwt/client/controls/filestorage/StringMessages.properties=UTF-8
encoding//src/com/sap/sse/gwt/client/controls/filestorage/StringMessages_de.properties=UTF-8
encoding//src/com/sap/sse/gwt/client/controls/filestorage/StringMessages_ja.properties=UTF-8
encoding//src/com/sap/sse/gwt/client/controls/filestorage/StringMessages_ru.properties=UTF-8
encoding//src/com/sap/sse/gwt/client/controls/filestorage/StringMessages_zh.properties=UTF-8
encoding//src/com/sap/sse/gwt/client/controls/filestorage/StringMessages_zh_CN.properties=UTF-8
@@ -43,6 +43,7 @@ Export-Package: com.google.gwt.user.client.rpc.core.java.util,
com.sap.sse.gwt.client.player,
com.sap.sse.gwt.client.sapheader,
com.sap.sse.gwt.client.shared.components,
com.sap.sse.gwt.client.shared.perspective,
com.sap.sse.gwt.client.useragent,
com.sap.sse.gwt.common,
com.sap.sse.gwt.dispatch.client,
@@ -30,7 +30,7 @@ import com.google.gwt.view.client.SelectionChangeEvent;
public class RefreshableMultiSelectionModel<T> extends MultiSelectionModel<T>
implements RefreshableSelectionModel<T> {
final EntityIdentityComparator<T> comp;
private boolean dontcheckSelectionState = false;
private boolean dontCheckSelectionState = false;
private final ListDataProvider<T> listDataProvider;
/**
@@ -72,7 +72,7 @@ public class RefreshableMultiSelectionModel<T> extends MultiSelectionModel<T>
*/
@Override
public void setSelected(T item, boolean selected) {
if (comp == null || dontcheckSelectionState || item == null || getSelectedSet().isEmpty()) {
if (comp == null || dontCheckSelectionState || item == null || getSelectedSet().isEmpty()) {
super.setSelected(item, selected);
} else {
T wasSelectedBefore = null;
@@ -94,9 +94,9 @@ public class RefreshableMultiSelectionModel<T> extends MultiSelectionModel<T>
}
/**
* Refreshes the {@link RefreshableMultiSelectionModel} with the <code>newObjects</code>.All objects from the
* Refreshes the {@link RefreshableMultiSelectionModel} with the <code>newObjects</code>. All objects from the
* current selection that {@link EntityIdentityComparator#representSameEntity(Object, Object) represent the same
* entity} as an object from <code>newObjects</code> will be reselected. All others are de-selected. That means a
* entity} as an object from <code>newObjects</code> will be reselected. All others are de-selected. That means if a
* selected object is not contained in <code>newObjects</code> the object wouldn't be selected anymore. If this
* selection model has no {@link EntityIdentityComparator} set, this method will use the {@link #equals(Object)}
* method to compare. If an object is reselected it will be replaced with the new version of it.
@@ -111,8 +111,8 @@ public class RefreshableMultiSelectionModel<T> extends MultiSelectionModel<T>
*/
@Override
public void refreshSelectionModel(Iterable<T> newObjects) {
if (!dontcheckSelectionState) { // avoid endless recursions
dontcheckSelectionState = true;
if (!dontCheckSelectionState) { // avoid endless recursions
dontCheckSelectionState = true;
try {
final Set<T> selectedSet = getSelectedSet(); // gets the selected set as a non-live copy, so later
// changes to the selection won't change this set anymore
@@ -141,7 +141,7 @@ public class RefreshableMultiSelectionModel<T> extends MultiSelectionModel<T>
SelectionChangeEvent.fire(this);
}
} finally {
dontcheckSelectionState = false;
dontCheckSelectionState = false;
}
}
}
@@ -0,0 +1,27 @@
save=保存
remove=削除
ok=OK
cancel=取消
add=追加
edit=編集
serverError=サーバにアクセスしようとしてエラーが発生しました。ネットワーク接続を確認して、再試行してください。
close=終了
remoteProcedureCall=リモートプロシージャコール
serverReplies=サーバ応答
errorCommunicatingWithServer=サーバとの通信でエラー発生
active=有効
setAsActive=有効に設定
couldNotTestProperties=プロパティをテストできません
couldNotSetProperties=プロパティを設定できません
couldNotSetActiveService=有効なサービスを設定できません
couldNotLoadActiveService=有効なサービスをロードできません
couldNotLoadAvailableServices=利用可能なサービスをロードできません
refresh=リフレッシュ
name=名称
value=値
description=内容説明
error=エラー
configuration=設定
settings=設定
settingsForComponent={0} の設定
pleaseSelect=選択してください:
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" original="/usr/sap/ljs/app/Converter_1765894632275589659/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/StringMessages.properties" source-language="en">
<file datatype="javapropertyresourcebundle" original="/usr/sap/ljs/app/Converter_2475291648609719345/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/StringMessages.properties" source-language="en">
<header>
<skl>
<internal-file crc="85e48bcf9e250e66161b1b03d11cf699" form="base64">H4sIAAAAAAAAAH1SzU4jMQy+5yn8BIgXyKEa2MuuAFEEZ5O4naiZZOR4WiG0746TtLNod+Hi/2/8eb4UPJLdqjFMU9b4sTmTD/b+p3GYHEU7NGfQe7vx3pAPYm/VmEJ8JL5lzmw3CagGkJ1bmMnDaQyRAEVomiWkPUgGl5OgE5CRoKOv4CESFgI3kjvAW14YEskp86FOJ3IScgJMHoTfAPcY0pVxMReyQ7WNudADZ0d+YRowxnaGEKxFqNUz30eaY6Bity0D7qlp7Ic8TUsKDivhlyBjH7LtRuXzqQsnbZ+PMHpT0L+3aU73yKb0WLcIYIE+YFxeor/L8kRFlNxMLJXKUMuQsv4YbcC8dlaAfua/87rqi/G+v/IPjv5CdDaNvDZX1K+M/itY1N63uCOGiK/xAi3/YC8DF3hR5XZMZVS1mjcJJ7J3aswR40L2uVrjqTgOc30G9uZP3AXryiiTtAv7hbFNDZ+zqkbVqwreg7Xyowk+50RJ1i7sVOn3699mbu9yS1GfoD0/0tIy8wFPN7vhNwMAAA==</internal-file>
</skl>
<phase-group>
<phase company-name="SAP AG" date="2016-04-14T07:19:06Z" phase-name="file-creation" process-name="file-creation" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter"/>
<phase company-name="SAP AG" date="2016-05-11T12:24:39Z" phase-name="file-creation" process-name="file-creation" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter"/>
</phase-group>
<tool tool-company="SAP AG" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter" tool-name="TEW: Javascript .properties Flexible File Converter" tool-version="1.0.0"/>
<tool tool-company="SAP AG" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter" tool-name="TEW: Javascript .properties Flexible File Converter" tool-version="1.1.0"/>
</header>
<body>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="save" resname="save">
@@ -0,0 +1,124 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-05-30T12:19:28Z" original="/usr/sap/ljs/app/Converter_2475291648609719345/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/StringMessages.properties" source-language="en" target-language="ja">
<header>
<skl>
<internal-file crc="85e48bcf9e250e66161b1b03d11cf699" form="base64">H4sIAAAAAAAAAH1SzU4jMQy+5yn8BIgXyKEa2MuuAFEEZ5O4naiZZOR4WiG0746TtLNod+Hi/2/8eb4UPJLdqjFMU9b4sTmTD/b+p3GYHEU7NGfQe7vx3pAPYm/VmEJ8JL5lzmw3CagGkJ1bmMnDaQyRAEVomiWkPUgGl5OgE5CRoKOv4CESFgI3kjvAW14YEskp86FOJ3IScgJMHoTfAPcY0pVxMReyQ7WNudADZ0d+YRowxnaGEKxFqNUz30eaY6Bity0D7qlp7Ic8TUsKDivhlyBjH7LtRuXzqQsnbZ+PMHpT0L+3aU73yKb0WLcIYIE+YFxeor/L8kRFlNxMLJXKUMuQsv4YbcC8dlaAfua/87rqi/G+v/IPjv5CdDaNvDZX1K+M/itY1N63uCOGiK/xAi3/YC8DF3hR5XZMZVS1mjcJJ7J3aswR40L2uVrjqTgOc30G9uZP3AXryiiTtAv7hbFNDZ+zqkbVqwreg7Xyowk+50RJ1i7sVOn3699mbu9yS1GfoD0/0tIy8wFPN7vhNwMAAA==</internal-file>
</skl>
<phase-group>
<phase company-name="SAP AG" date="2016-05-11T12:24:39Z" phase-name="file-creation" process-name="file-creation" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter"/>
</phase-group>
<tool tool-company="SAP AG" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter" tool-name="TEW: Javascript .properties Flexible File Converter" tool-version="1.1.0"/>
</header>
<body>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="save" resname="save">
<source>Save</source>
<target state="signed-off">保存</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="remove" resname="remove">
<source>Remove</source>
<target state="signed-off">削除</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="ok" resname="ok">
<source>OK</source>
<target state="signed-off">OK</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="cancel" resname="cancel">
<source>Cancel</source>
<target state="signed-off">取消</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="add" resname="add">
<source>Add</source>
<target state="signed-off">追加</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="edit" resname="edit">
<source>Edit</source>
<target state="signed-off">編集</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="serverError" resname="serverError">
<source>An error occurred while attempting to contact the server. Please check your network connection and try again.</source>
<target state="signed-off">サーバにアクセスしようとしてエラーが発生しました。ネットワーク接続を確認して、再試行してください。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="close" resname="close">
<source>Close</source>
<target state="signed-off">終了</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="remoteProcedureCall" resname="remoteProcedureCall">
<source>Remote Procedure Call</source>
<target state="signed-off">リモートプロシージャコール</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="serverReplies" resname="serverReplies">
<source>Server replies</source>
<target state="signed-off">サーバ応答</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="errorCommunicatingWithServer" resname="errorCommunicatingWithServer">
<source>Error communicating with server</source>
<target state="signed-off">サーバとの通信でエラー発生</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="active" resname="active">
<source>Active</source>
<target state="signed-off">有効</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="setAsActive" resname="setAsActive">
<source>Set as active</source>
<target state="signed-off">有効に設定</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="couldNotTestProperties" resname="couldNotTestProperties">
<source>Could not test properties</source>
<target state="signed-off">プロパティをテストできません</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="couldNotSetProperties" resname="couldNotSetProperties">
<source>Could not set properties</source>
<target state="signed-off">プロパティを設定できません</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="couldNotSetActiveService" resname="couldNotSetActiveService">
<source>Could not set active service</source>
<target state="signed-off">有効なサービスを設定できません</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="couldNotLoadActiveService" resname="couldNotLoadActiveService">
<source>Could not load active service</source>
<target state="signed-off">有効なサービスをロードできません</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="couldNotLoadAvailableServices" resname="couldNotLoadAvailableServices">
<source>Could not load available services</source>
<target state="signed-off">利用可能なサービスをロードできません</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="refresh" resname="refresh">
<source>Refresh</source>
<target state="signed-off">リフレッシュ</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="name" resname="name">
<source>Name</source>
<target state="signed-off">名称</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="value" resname="value">
<source>Value</source>
<target state="signed-off">値</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="description" resname="description">
<source>Description</source>
<target state="signed-off">内容説明</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="error" resname="error">
<source>Error</source>
<target state="signed-off">エラー</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="configuration" resname="configuration">
<source>Configuration</source>
<target state="signed-off">設定</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="settings" resname="settings">
<source>Settings</source>
<target state="signed-off">設定</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="settingsForComponent" resname="settingsForComponent">
<source>Settings for <ph id="1">{0}</ph></source>
<target state="signed-off"><ph id="1">{0}</ph> の設定</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="pleaseSelect" resname="pleaseSelect">
<source>Please select</source>
<target state="signed-off">選択してください:</target>
</trans-unit>
</body>
</file>
</xliff>
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-04-18T13:56:50Z" original="/usr/sap/ljs/app/Converter_1765894632275589659/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/StringMessages.properties" source-language="en" target-language="ru">
<file datatype="javapropertyresourcebundle" date="2016-05-30T12:19:28Z" original="/usr/sap/ljs/app/Converter_2475291648609719345/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/StringMessages.properties" source-language="en" target-language="ru">
<header>
<skl>
<internal-file crc="85e48bcf9e250e66161b1b03d11cf699" form="base64">H4sIAAAAAAAAAH1SzU4jMQy+5yn8BIgXyKEa2MuuAFEEZ5O4naiZZOR4WiG0746TtLNod+Hi/2/8eb4UPJLdqjFMU9b4sTmTD/b+p3GYHEU7NGfQe7vx3pAPYm/VmEJ8JL5lzmw3CagGkJ1bmMnDaQyRAEVomiWkPUgGl5OgE5CRoKOv4CESFgI3kjvAW14YEskp86FOJ3IScgJMHoTfAPcY0pVxMReyQ7WNudADZ0d+YRowxnaGEKxFqNUz30eaY6Bity0D7qlp7Ic8TUsKDivhlyBjH7LtRuXzqQsnbZ+PMHpT0L+3aU73yKb0WLcIYIE+YFxeor/L8kRFlNxMLJXKUMuQsv4YbcC8dlaAfua/87rqi/G+v/IPjv5CdDaNvDZX1K+M/itY1N63uCOGiK/xAi3/YC8DF3hR5XZMZVS1mjcJJ7J3aswR40L2uVrjqTgOc30G9uZP3AXryiiTtAv7hbFNDZ+zqkbVqwreg7Xyowk+50RJ1i7sVOn3699mbu9yS1GfoD0/0tIy8wFPN7vhNwMAAA==</internal-file>
</skl>
<phase-group>
<phase company-name="SAP AG" date="2016-04-14T07:19:06Z" phase-name="file-creation" process-name="file-creation" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter"/>
<phase company-name="SAP AG" date="2016-05-11T12:24:39Z" phase-name="file-creation" process-name="file-creation" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter"/>
</phase-group>
<tool tool-company="SAP AG" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter" tool-name="TEW: Javascript .properties Flexible File Converter" tool-version="1.0.0"/>
<tool tool-company="SAP AG" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter" tool-name="TEW: Javascript .properties Flexible File Converter" tool-version="1.1.0"/>
</header>
<body>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="save" resname="save">
@@ -1,123 +1,123 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-04-18T13:56:50Z" original="/usr/sap/ljs/app/Converter_1765894632275589659/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/StringMessages.properties" source-language="en" target-language="zh-CN">
<file datatype="javapropertyresourcebundle" date="2016-05-30T12:19:28Z" original="/usr/sap/ljs/app/Converter_2475291648609719345/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/StringMessages.properties" source-language="en" target-language="zh-CN">
<header>
<skl>
<internal-file crc="85e48bcf9e250e66161b1b03d11cf699" form="base64">H4sIAAAAAAAAAH1SzU4jMQy+5yn8BIgXyKEa2MuuAFEEZ5O4naiZZOR4WiG0746TtLNod+Hi/2/8eb4UPJLdqjFMU9b4sTmTD/b+p3GYHEU7NGfQe7vx3pAPYm/VmEJ8JL5lzmw3CagGkJ1bmMnDaQyRAEVomiWkPUgGl5OgE5CRoKOv4CESFgI3kjvAW14YEskp86FOJ3IScgJMHoTfAPcY0pVxMReyQ7WNudADZ0d+YRowxnaGEKxFqNUz30eaY6Bity0D7qlp7Ic8TUsKDivhlyBjH7LtRuXzqQsnbZ+PMHpT0L+3aU73yKb0WLcIYIE+YFxeor/L8kRFlNxMLJXKUMuQsv4YbcC8dlaAfua/87rqi/G+v/IPjv5CdDaNvDZX1K+M/itY1N63uCOGiK/xAi3/YC8DF3hR5XZMZVS1mjcJJ7J3aswR40L2uVrjqTgOc30G9uZP3AXryiiTtAv7hbFNDZ+zqkbVqwreg7Xyowk+50RJ1i7sVOn3699mbu9yS1GfoD0/0tIy8wFPN7vhNwMAAA==</internal-file>
</skl>
<phase-group>
<phase company-name="SAP AG" date="2016-04-14T07:19:06Z" phase-name="file-creation" process-name="file-creation" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter"/>
<phase company-name="SAP AG" date="2016-05-11T12:24:39Z" phase-name="file-creation" process-name="file-creation" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter"/>
</phase-group>
<tool tool-company="SAP AG" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter" tool-name="TEW: Javascript .properties Flexible File Converter" tool-version="1.0.0"/>
<tool tool-company="SAP AG" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter" tool-name="TEW: Javascript .properties Flexible File Converter" tool-version="1.1.0"/>
</header>
<body>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="save" resname="save">
<source>Save</source>
<target>保存</target>
<target state="signed-off">保存</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="remove" resname="remove">
<source>Remove</source>
<target>删除</target>
<target state="signed-off">删除</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="ok" resname="ok">
<source>OK</source>
<target>确定</target>
<target state="signed-off">确定</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="cancel" resname="cancel">
<source>Cancel</source>
<target>取消</target>
<target state="signed-off">取消</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="add" resname="add">
<source>Add</source>
<target>添加</target>
<target state="signed-off">添加</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="edit" resname="edit">
<source>Edit</source>
<target>编辑</target>
<target state="signed-off">编辑</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="serverError" resname="serverError">
<source>An error occurred while attempting to contact the server. Please check your network connection and try again.</source>
<target>尝试联系服务器时出错。请检查网络连接,并重试。</target>
<target state="signed-off">尝试联系服务器时出错。请检查网络连接,并重试。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="close" resname="close">
<source>Close</source>
<target>关闭</target>
<target state="signed-off">关闭</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="remoteProcedureCall" resname="remoteProcedureCall">
<source>Remote Procedure Call</source>
<target>远程过程调用</target>
<target state="signed-off">远程过程调用</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="serverReplies" resname="serverReplies">
<source>Server replies</source>
<target>服务器应答</target>
<target state="signed-off">服务器应答</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="errorCommunicatingWithServer" resname="errorCommunicatingWithServer">
<source>Error communicating with server</source>
<target>与服务器通信时发生错误</target>
<target state="signed-off">与服务器通信时发生错误</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="active" resname="active">
<source>Active</source>
<target>已激活</target>
<target state="signed-off">已激活</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="setAsActive" resname="setAsActive">
<source>Set as active</source>
<target>设置为已激活</target>
<target state="signed-off">设置为已激活</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="couldNotTestProperties" resname="couldNotTestProperties">
<source>Could not test properties</source>
<target>无法测试属性</target>
<target state="signed-off">无法测试属性</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="couldNotSetProperties" resname="couldNotSetProperties">
<source>Could not set properties</source>
<target>无法设置属性</target>
<target state="signed-off">无法设置属性</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="couldNotSetActiveService" resname="couldNotSetActiveService">
<source>Could not set active service</source>
<target>无法设置已激活的服务</target>
<target state="signed-off">无法设置已激活的服务</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="couldNotLoadActiveService" resname="couldNotLoadActiveService">
<source>Could not load active service</source>
<target>无法加载已激活的服务</target>
<target state="signed-off">无法加载已激活的服务</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="couldNotLoadAvailableServices" resname="couldNotLoadAvailableServices">
<source>Could not load available services</source>
<target>无法加载可用的服务</target>
<target state="signed-off">无法加载可用的服务</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="refresh" resname="refresh">
<source>Refresh</source>
<target>刷新</target>
<target state="signed-off">刷新</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="name" resname="name">
<source>Name</source>
<target>名称</target>
<target state="signed-off">名称</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="value" resname="value">
<source>Value</source>
<target>值</target>
<target state="signed-off">值</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="description" resname="description">
<source>Description</source>
<target>描述</target>
<target state="signed-off">描述</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="error" resname="error">
<source>Error</source>
<target>错误</target>
<target state="signed-off">错误</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="configuration" resname="configuration">
<source>Configuration</source>
<target>配置</target>
<target state="signed-off">配置</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="settings" resname="settings">
<source>Settings</source>
<target>设置</target>
<target state="signed-off">设置</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="settingsForComponent" resname="settingsForComponent">
<source>Settings for <ph id="1">{0}</ph></source>
<target><ph id="1">{0}</ph>设置</target>
<target state="signed-off"><ph id="1">{0}</ph>设置</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="pleaseSelect" resname="pleaseSelect">
<source>Please select</source>
<target>请选择</target>
<target state="signed-off">请选择</target>
</trans-unit>
</body>
</file>
@@ -528,6 +528,10 @@ public abstract class DataEntryDialog<T> {
dateEntryDialog.getElement().getStyle().setCursor(cursor);
}
public void center() {
dateEntryDialog.center();
}
public void show() {
Widget additionalWidget = getAdditionalWidget();
if (additionalWidget != null) {
@@ -0,0 +1,23 @@
package com.sap.sse.gwt.client.panels;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.RequiresResize;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.WidgetCollection;
/**
* Utility class extending {@link FlowPanel} and implementing {@link RequiresResize} interface. All
* {@link #getChildren() children} also implementing {@link RequiresResize} are informed by calling their
* {@link RequiresResize#onResize()} method.
*/
public class ResizableFlowPanel extends FlowPanel implements RequiresResize {
@Override
public void onResize() {
WidgetCollection children = getChildren();
for (Widget widget : children) {
if (widget instanceof RequiresResize) {
((RequiresResize) widget).onResize();
}
}
}
}
@@ -23,7 +23,6 @@
vertical-align: top;
}
.siteheaderLeft {
position: relative; top:10px;left:10px;
display: inline-block;
@@ -54,9 +53,9 @@
}
.logotitle {
font-size: 1rem;
display: inline-block;
color: #f6f9fc;
font-weight: bold;
width: 150px;
height: 100%;
padding: 17px 15px 0 0;
@@ -64,9 +63,7 @@
text-align: right;
border-right: 1px solid rgb(180,180,180);
margin: 0px;
margin-left: -25px;
box-sizing: border-box;
}
.pagetitle {
@@ -0,0 +1,10 @@
package com.sap.sse.gwt.client.shared.components;
import com.sap.sse.common.settings.Settings;
public abstract class AbstractComponent<SettingsType extends Settings> implements Component<SettingsType> {
@Override
public String getId() {
return getLocalizedShortName();
}
}
@@ -0,0 +1,14 @@
package com.sap.sse.gwt.client.shared.components;
import java.io.Serializable;
import com.google.gwt.user.client.ui.Composite;
import com.sap.sse.common.settings.Settings;
public abstract class AbstractCompositeComponent<SettingsType extends Settings> extends Composite implements Component<SettingsType> {
@Override
public Serializable getId() {
return getLocalizedShortName();
}
}
@@ -16,4 +16,9 @@ public abstract class AbstractLazyComponent<SettingsType extends AbstractSetting
public String getDependentCssClassName() {
return null;
}
@Override
public String getId() {
return getLocalizedShortName();
}
}
@@ -1,9 +1,21 @@
package com.sap.sse.gwt.client.shared.components;
import java.io.Serializable;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.gwt.client.shared.perspective.Perspective;
public interface Component<SettingsType extends Settings> {
/**
* Each component instance has an ID that has to be unique in the context in which the component is used
* and has its siblings. In particular, multiple components of the same type but with distinct IDs may
* exist, e.g., multiple wind charts showing wind readings coming from different sensors. The uniqueness
* constraint applies only to the single level (in a composite pattern of components, such as
* {@link Perspective}) in which this component instance is used.
*/
Serializable getId();
/**
* @return the name to display to a user for quick navigation to this component
*/
@@ -33,6 +45,11 @@ public interface Component<SettingsType extends Settings> {
*/
SettingsDialogComponent<SettingsType> getSettingsDialogComponent();
/**
* @return the current settings of the component or {@code null} if the component has no settings.
*/
SettingsType getSettings();
/**
* Updates the settings of this component. Expected to be called when a settings dialog using this component's
* {@link #getSettingsDialogComponent()} has been confirmed.
@@ -0,0 +1,40 @@
package com.sap.sse.gwt.client.shared.components;
import java.io.Serializable;
import com.sap.sse.common.settings.Settings;
/**
* A {@link ComponentLifecycle} decouples the lifecycle of a component from the corresponding component instance. This way we
* can create, e.g., settings for a component with a settings dialog without the need to instantiate the component.
*
* @param <S>
* the Settings type
* @param <SDC>
* the SettingsDialogComponent type
* @author Frank Mittag
*/
public interface ComponentLifecycle<S extends Settings, SDC extends SettingsDialogComponent<S>> {
SDC getSettingsDialogComponent(S settings);
S createDefaultSettings();
S cloneSettings(S settings);
/**
* @return the display name of the component
*/
String getLocalizedShortName();
/**
* @return the id of the component
*/
Serializable getComponentId();
/**
* @return true if the component has settings that a user may change.
*/
boolean hasSettings();
}
@@ -1,14 +0,0 @@
package com.sap.sse.gwt.client.shared.components;
import com.google.gwt.user.client.ui.Widget;
public interface ComponentViewer {
Widget getViewerWidget();
String getViewerName();
Component<?> getRootComponent();
void forceLayout();
}
@@ -0,0 +1,31 @@
package com.sap.sse.gwt.client.shared.components;
import com.sap.sse.common.settings.AbstractSettings;
/**
* An abstract implementation of the component interfaces indented to use for components without the need of having settings.
* @author Frank
*
*/
public abstract class ComponentWithoutSettings extends AbstractComponent<AbstractSettings> {
@Override
public boolean hasSettings() {
return false;
}
@Override
public SettingsDialogComponent<AbstractSettings> getSettingsDialogComponent() {
return null;
}
@Override
public AbstractSettings getSettings() {
return null;
}
@Override
public void updateSettings(AbstractSettings newSettings) {
// no-op
}
}
@@ -1,26 +1,31 @@
package com.sap.sse.gwt.client.shared.components;
import com.sap.sse.common.Util;
import java.io.Serializable;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import com.sap.sse.common.settings.AbstractSettings;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.gwt.client.shared.perspective.Perspective;
import com.sap.sse.gwt.client.shared.perspective.PerspectiveCompositeSettings;
/**
* Groups settings for multiple {@link Component}s. This can be of particular interest when working with
* {@link Perspective}s and the perspective's {@link PerspectiveCompositeSettings composite settings}.
*/
public class CompositeSettings extends AbstractSettings {
public static class ComponentAndSettingsPair<SettingsType extends Settings> extends Util.Pair<Component<SettingsType>, SettingsType> {
private static final long serialVersionUID = -569811233041583043L;
private final Map<Serializable, Settings> settingsPerComponentId;
public ComponentAndSettingsPair(Component<SettingsType> a, SettingsType b) {
super(a, b);
}
public CompositeSettings(Map<Serializable, Settings> settingsPerComponentId) {
this.settingsPerComponentId = new HashMap<>(settingsPerComponentId);
}
public Map<Serializable, Settings> getSettingsPerComponentId() {
return Collections.unmodifiableMap(settingsPerComponentId);
}
private final Iterable<ComponentAndSettingsPair<?>> settingsPerComponent;
public CompositeSettings(Iterable<ComponentAndSettingsPair<?>> settingsPerComponent) {
this.settingsPerComponent = settingsPerComponent;
public <C extends ComponentLifecycle<S,?>, S extends Settings> Settings findSettingsByComponentId(Serializable componentId) {
return settingsPerComponentId.get(componentId);
}
public Iterable<ComponentAndSettingsPair<?>> getSettingsPerComponent() {
return settingsPerComponent;
}
}
@@ -1,91 +0,0 @@
package com.sap.sse.gwt.client.shared.components;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.gwt.client.shared.components.CompositeSettings.ComponentAndSettingsPair;
/**
* A component, that contains a collection of settings components in a tabbed panel.
*
* @author Axel Uhl (d043530), Lennart Hensler (D054527)
*/
public class CompositeTabbedSettingsComponent implements Component<CompositeSettings> {
private final Iterable<Component<?>> components;
private final String title;
public CompositeTabbedSettingsComponent(Iterable<Component<?>> components) {
this(components, null);
}
public CompositeTabbedSettingsComponent(Iterable<Component<?>> components, String title) {
this.components = components;
this.title = title;
}
@Override
public boolean hasSettings() {
for (Component<?> component : components) {
if (component.hasSettings()) {
return true;
}
}
return false;
}
@Override
public SettingsDialogComponent<CompositeSettings> getSettingsDialogComponent() {
return new CompositeTabbedSettingsDialogComponent(components);
}
@Override
public void updateSettings(CompositeSettings newSettings) {
for (CompositeSettings.ComponentAndSettingsPair<?> componentAndSettings : newSettings.getSettingsPerComponent()) {
updateSettings(componentAndSettings);
}
}
private <SettingsType extends Settings> void updateSettings(ComponentAndSettingsPair<SettingsType> componentAndSettings) {
componentAndSettings.getA().updateSettings(componentAndSettings.getB());
}
@Override
public String getLocalizedShortName() {
if (title != null && !title.isEmpty()) {
return title;
} else {
StringBuilder result = new StringBuilder();
boolean first = true;
for (Component<?> component : components) {
if (first) {
first = false;
} else {
result.append(" / ");
}
result.append(component.getLocalizedShortName());
}
return result.toString();
}
}
@Override
public Widget getEntryWidget() {
throw new RuntimeException("Virtual composite component doesn't have a widget of its own");
}
@Override
public boolean isVisible() {
return false;
}
@Override
public void setVisible(boolean visibility) {
throw new RuntimeException("Virtual composite component doesn't know how to make itself visible");
}
@Override
public String getDependentCssClassName() {
return null;
}
}
@@ -1,22 +0,0 @@
package com.sap.sse.gwt.client.shared.components;
import com.sap.sse.gwt.client.StringMessages;
/**
* A composite settings dialog that combines the settings of several {@link Component}s, providing a tab
* for each component.
*
* @author Axel Uhl (d043530)
*
*/
public class CompositeTabbedSettingsDialog extends SettingsDialog<CompositeSettings> {
public CompositeTabbedSettingsDialog(StringMessages stringConstants, final Iterable<Component<?>> components) {
this(stringConstants, components, null);
}
public CompositeTabbedSettingsDialog(StringMessages stringConstants, final Iterable<Component<?>> components, final String title) {
super(new CompositeTabbedSettingsComponent(components, title), stringConstants);
}
}
@@ -1,8 +1,10 @@
package com.sap.sse.gwt.client.shared.components;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.HashMap;
import java.util.Map;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.TabPanel;
@@ -11,7 +13,6 @@ import com.sap.sse.common.Util;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.Validator;
import com.sap.sse.gwt.client.shared.components.CompositeSettings.ComponentAndSettingsPair;
public class CompositeTabbedSettingsDialogComponent implements SettingsDialogComponent<CompositeSettings> {
@@ -21,7 +22,6 @@ public class CompositeTabbedSettingsDialogComponent implements SettingsDialogCom
public ComponentAndDialogComponent(Component<SettingsType> a, SettingsDialogComponent<SettingsType> b) {
super(a, b);
}
}
private final Collection<ComponentAndDialogComponent<?>> components;
@@ -52,17 +52,13 @@ public class CompositeTabbedSettingsDialogComponent implements SettingsDialogCom
@Override
public CompositeSettings getResult() {
Collection<ComponentAndSettingsPair<?>> settings = new HashSet<>();
Map<Serializable, Settings> settings = new HashMap<>();
for (ComponentAndDialogComponent<?> component : components) {
settings.add(getComponentAndSettings(component));
settings.put(component.getA().getId(), component.getB().getResult());
}
return new CompositeSettings(settings);
}
private <SettingsType extends Settings> ComponentAndSettingsPair<SettingsType> getComponentAndSettings(ComponentAndDialogComponent<SettingsType> component) {
return new ComponentAndSettingsPair<SettingsType>(component.getA(), component.getB().getResult());
}
@Override
public Validator<CompositeSettings> getValidator() {
return new CompositeValidator(components);
@@ -1,28 +1,29 @@
package com.sap.sse.gwt.client.shared.components;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.Validator;
import com.sap.sse.gwt.client.shared.components.CompositeSettings.ComponentAndSettingsPair;
import com.sap.sse.gwt.client.shared.components.CompositeTabbedSettingsDialogComponent.ComponentAndDialogComponent;
public class CompositeValidator implements Validator<CompositeSettings> {
private final Map<Component<?>, Validator<?>> validatorsMappedByComponent;
private final Map<Serializable, Validator<?>> validatorsMappedByComponent;
public CompositeValidator(Iterable<ComponentAndDialogComponent<?>> componentsAndDialogComponents) {
validatorsMappedByComponent = new HashMap<>();
for (ComponentAndDialogComponent<?> component : componentsAndDialogComponents) {
validatorsMappedByComponent.put(component.getA(), component.getB().getValidator());
validatorsMappedByComponent.put(component.getA().getId(), component.getB().getValidator());
}
}
@Override
public String getErrorMessage(CompositeSettings valueToValidate) {
StringBuilder result = new StringBuilder();
for (ComponentAndSettingsPair<?> componentAndSettings : valueToValidate.getSettingsPerComponent()) {
final StringBuilder result = new StringBuilder();
for (Entry<Serializable, Settings> componentAndSettings : valueToValidate.getSettingsPerComponentId().entrySet()) {
final String errorMessage = getErrorMessage(componentAndSettings);
if (errorMessage != null && !errorMessage.isEmpty()) {
result.append(errorMessage);
@@ -31,12 +32,12 @@ public class CompositeValidator implements Validator<CompositeSettings> {
return result.toString();
}
private <SettingsType extends Settings> String getErrorMessage(ComponentAndSettingsPair<SettingsType> componentAndSettings) {
private <SettingsType extends Settings> String getErrorMessage(Entry<Serializable, SettingsType> componentIdAndSettings) {
String errorMessage = null;
@SuppressWarnings("unchecked")
Validator<SettingsType> validator = (Validator<SettingsType>) validatorsMappedByComponent.get(componentAndSettings.getA());
final Validator<SettingsType> validator = (Validator<SettingsType>) validatorsMappedByComponent.get(componentIdAndSettings.getKey());
if (validator != null) {
errorMessage = validator.getErrorMessage(componentAndSettings.getB());
errorMessage = validator.getErrorMessage(componentIdAndSettings.getValue());
if (errorMessage != null && !errorMessage.isEmpty() && !getClass().equals(validator.getClass())) {
errorMessage += "; ";
}
@@ -17,6 +17,14 @@ public class SettingsDialog<SettingsType extends Settings> extends DataEntryDial
this(component, stringMessages, /* animationEnabled */ true);
}
public SettingsDialog(final Component<SettingsType> component, StringMessages stringMessages, boolean animationEnabled) {
this(component, component.getSettingsDialogComponent(), stringMessages, animationEnabled, null);
}
public SettingsDialog(final Component<SettingsType> component, StringMessages stringMessages, DialogCallback<SettingsType> callback) {
this(component, component.getSettingsDialogComponent(), stringMessages, /* animationEnabled */ true, callback);
}
/**
* Creates a settings button for <code>component</code> that, when clicked, opens a settings dialog for that
* component and when confirmed, updates that component's settings. The button has no CSS style attached to
@@ -43,26 +51,28 @@ public class SettingsDialog<SettingsType extends Settings> extends DataEntryDial
*/
private SettingsDialog(final Component<SettingsType> component,
SettingsDialogComponent<SettingsType> dialogComponent, StringMessages stringMessages,
boolean animationEnabled) {
boolean animationEnabled, final DialogCallback<SettingsType> callback) {
super(stringMessages.settingsForComponent(component.getLocalizedShortName()), null, stringMessages.ok(),
stringMessages.cancel(), dialogComponent.getValidator(), animationEnabled,
new DialogCallback<SettingsType>() {
@Override
public void cancel() {
}
@Override
public void ok(SettingsType newSettings) {
component.updateSettings(newSettings);
}
});
new DialogCallback<SettingsType>() {
@Override
public void cancel() {
if (callback != null) {
callback.cancel();
}
}
@Override
public void ok(SettingsType newSettings) {
component.updateSettings(newSettings);
if (callback != null) {
callback.ok(newSettings);
}
}
});
this.settingsDialogComponent = dialogComponent;
}
public SettingsDialog(final Component<SettingsType> component, StringMessages stringMessages, boolean animationEnabled) {
this(component, component.getSettingsDialogComponent(), stringMessages, animationEnabled);
}
@Override
protected Widget getAdditionalWidget() {
return settingsDialogComponent.getAdditionalWidget(this);
@@ -0,0 +1,107 @@
package com.sap.sse.gwt.client.shared.perspective;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.gwt.client.shared.components.AbstractCompositeComponent;
import com.sap.sse.gwt.client.shared.components.Component;
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
/**
* An abstract base class for a {@link Perspective} with a widget.
*
* @author Frank Mittag
*
*/
public abstract class AbstractPerspectiveComposite<PL extends PerspectiveLifecycle<PS>, PS extends Settings>
extends AbstractCompositeComponent<PerspectiveCompositeSettings<PS>> implements Perspective<PS> {
private final PL perspectiveLifecycle;
private PS perspectiveOwnSettings;
protected final List<Component<?>> components;
protected SettingsDialogComponent<PS> getPerspectiveSettingsDialogComponent(PS perspectiveSettings) {
return perspectiveLifecycle.getPerspectiveOwnSettingsDialogComponent(perspectiveSettings);
}
public AbstractPerspectiveComposite(PL perspectiveLifecycle, PS perspectiveSettings) {
this.components = new ArrayList<>();
this.perspectiveLifecycle = perspectiveLifecycle;
this.perspectiveOwnSettings = perspectiveSettings;
}
@Override
public PerspectiveCompositeSettings<PS> getSettings() {
Map<Serializable, Settings> settingsPerComponent = new HashMap<>();
for (Component<?> c : getComponents()) {
if (c.hasSettings()) {
settingsPerComponent.put(c.getId(), c.getSettings());
}
}
return new PerspectiveCompositeSettings<>(perspectiveOwnSettings, settingsPerComponent);
}
@Override
public void updateSettings(PerspectiveCompositeSettings<PS> newSettings) {
for (Entry<Serializable, Settings> componentAndSettings : newSettings.getSettingsPerComponentId().entrySet()) {
updateSettings(componentAndSettings);
}
this.perspectiveOwnSettings = newSettings.getPerspectiveOwnSettings();
}
private <S extends Settings> void updateSettings(Entry<Serializable, S> componentIdAndSettings) {
@SuppressWarnings("unchecked")
Component<S> component = (Component<S>) findComponentById(componentIdAndSettings.getKey());
if (component != null) {
component.updateSettings(componentIdAndSettings.getValue());
}
}
private Component<?> findComponentById(Serializable componentId) {
for (Component<?> component : getComponents()) {
if (component.getId().equals(componentId)) {
return component;
}
}
return null;
}
@Override
public Widget getEntryWidget() {
return this.asWidget();
}
public List<Component<?>> getComponents() {
return components;
}
@Override
public String getLocalizedShortName() {
return perspectiveLifecycle.getLocalizedShortName();
}
public boolean hasSettings() {
return perspectiveLifecycle.hasSettings();
}
@Override
public SettingsDialogComponent<PerspectiveCompositeSettings<PS>> getSettingsDialogComponent() {
return new PerspectiveCompositeTabbedSettingsDialogComponent<>(this);
}
protected PS getPerspectiveSettings() {
return perspectiveOwnSettings;
}
protected PL getPerspectiveLifecycle() {
return perspectiveLifecycle;
}
}
@@ -0,0 +1,58 @@
package com.sap.sse.gwt.client.shared.perspective;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.gwt.client.shared.components.ComponentLifecycle;
import com.sap.sse.gwt.client.shared.components.CompositeSettings;
/**
* An abstract base class for perspective lifecycle's. Subclasses need to add the {@link ComponentLifecycle} instances
* for their child components to the {@link #componentLifecycles} structure in their constructor.
*
* @param <PS>
* the perspective settings type
* @author Frank Mittag
*
*/
public abstract class AbstractPerspectiveLifecycle<PS extends Settings> implements PerspectiveLifecycle<PS> {
protected final List<ComponentLifecycle<?,?>> componentLifecycles;
public AbstractPerspectiveLifecycle() {
componentLifecycles = new ArrayList<>();
}
public PerspectiveCompositeTabbedSettingsDialogComponent<PS> getSettingsDialogComponent(PerspectiveCompositeSettings<PS> settings) {
PerspectiveLifecycleWithAllSettings<?, PS> perspectiveLifecycleWithAllSettings = new PerspectiveLifecycleWithAllSettings<>(this, settings);
return new PerspectiveCompositeTabbedSettingsDialogComponent<PS>(perspectiveLifecycleWithAllSettings);
}
@Override
public PerspectiveCompositeSettings<PS> createDefaultSettings() {
PS perspectiveOwnSettings = createPerspectiveOwnDefaultSettings();
return new PerspectiveCompositeSettings<>(perspectiveOwnSettings, getComponentIdsAndDefaultSettings().getSettingsPerComponentId());
}
protected CompositeSettings getComponentIdsAndDefaultSettings() {
Map<Serializable, Settings> componentIdsAndSettings = new HashMap<>();
for (ComponentLifecycle<?,?> componentLifecycle : componentLifecycles) {
componentIdsAndSettings.put(componentLifecycle.getComponentId(), componentLifecycle.createDefaultSettings());
}
CompositeSettings compositeSettings = new CompositeSettings(componentIdsAndSettings);
return compositeSettings;
}
public Iterable<ComponentLifecycle<?,?>> getComponentLifecycles() {
return componentLifecycles;
}
@Override
public Serializable getComponentId() {
return getLocalizedShortName();
}
}
@@ -0,0 +1,22 @@
package com.sap.sse.gwt.client.shared.perspective;
import java.util.List;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.gwt.client.shared.components.Component;
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
/**
* A perspective is a composition of UI components into a view/page. The perspective itself is also an {@link Component}
* and can have {@link Settings}.
*
* @param <PS>
* the {@link Perspective} settings type
*/
public interface Perspective<PS extends Settings> extends Component<PerspectiveCompositeSettings<PS>> {
List<Component<?>> getComponents();
SettingsDialogComponent<PS> getPerspectiveOwnSettingsDialogComponent();
boolean hasPerspectiveOwnSettings();
}
@@ -0,0 +1,81 @@
package com.sap.sse.gwt.client.shared.perspective;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.gwt.client.shared.components.AbstractComponent;
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
/**
* A component that contains a collection of settings components in a tabbed panel.
*
* @author Frank (c5163874)
* @param <PL>
* the {@link PerspectiveLifecycle} type
* @param <PS>
* the {@link Perspective} settings type
*/
public class PerspectiveCompositeLifecycleTabbedSettingsComponent<PL extends PerspectiveLifecycle<PS>, PS extends Settings>
extends AbstractComponent<PerspectiveCompositeSettings<PS>> {
private PerspectiveLifecycleWithAllSettings<PL, PS> perspectiveLifecycleWithAllSettings;
private final String title;
private PerspectiveCompositeSettings<PS> perspectiveCompositeSettings;
public PerspectiveCompositeLifecycleTabbedSettingsComponent(PerspectiveLifecycleWithAllSettings<PL, PS> perspectiveLifecycleWithAllSettings) {
this(perspectiveLifecycleWithAllSettings, null);
}
public PerspectiveCompositeLifecycleTabbedSettingsComponent(PerspectiveLifecycleWithAllSettings<PL, PS> perspectiveLifecycleWithAllSettings, String title) {
this.perspectiveLifecycleWithAllSettings = perspectiveLifecycleWithAllSettings;
this.perspectiveCompositeSettings = perspectiveLifecycleWithAllSettings.getAllSettings();
this.title = title;
}
@Override
public boolean hasSettings() {
return true;
}
@Override
public SettingsDialogComponent<PerspectiveCompositeSettings<PS>> getSettingsDialogComponent() {
return new PerspectiveCompositeTabbedSettingsDialogComponent<PS>(perspectiveLifecycleWithAllSettings);
}
@Override
public PerspectiveCompositeSettings<PS> getSettings() {
return perspectiveCompositeSettings;
}
@Override
public void updateSettings(PerspectiveCompositeSettings<PS> newSettings) {
this.perspectiveCompositeSettings = newSettings;
}
@Override
public String getLocalizedShortName() {
if (title != null && !title.isEmpty()) {
return title;
}
return perspectiveLifecycleWithAllSettings.getPerspectiveLifecycle().getLocalizedShortName();
}
@Override
public Widget getEntryWidget() {
throw new RuntimeException("Virtual composite component doesn't have a widget of its own");
}
@Override
public boolean isVisible() {
return false;
}
@Override
public void setVisible(boolean visibility) {
throw new RuntimeException("Virtual composite component doesn't know how to make itself visible");
}
@Override
public String getDependentCssClassName() {
return null;
}
}
@@ -0,0 +1,28 @@
package com.sap.sse.gwt.client.shared.perspective;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.gwt.client.StringMessages;
import com.sap.sse.gwt.client.shared.components.SettingsDialog;
/**
* A composite settings dialog that combines all settings of a perspective provide by a {@link PerspectiveLifecycle}.
*
* @author Frank Mittag (c5163874)
* @param <PL>
* the type of the PerspectiveLifecycle
* @param <PS>
* the type of the Perspective settings
*
*/
public class PerspectiveCompositeLifecycleTabbedSettingsDialog<PL extends PerspectiveLifecycle<PS>, PS extends Settings>
extends SettingsDialog<PerspectiveCompositeSettings<PS>> {
public PerspectiveCompositeLifecycleTabbedSettingsDialog(StringMessages stringConstants, PerspectiveLifecycleWithAllSettings<PL, PS> perspectiveLifecycleWithAllSettings, String title) {
super(new PerspectiveCompositeLifecycleTabbedSettingsComponent<PL,PS>(perspectiveLifecycleWithAllSettings, title), stringConstants);
}
public PerspectiveCompositeLifecycleTabbedSettingsDialog(StringMessages stringConstants, PerspectiveLifecycleWithAllSettings<PL, PS> perspectiveLifecycleWithAllSettings,
String title, DialogCallback<PerspectiveCompositeSettings<PS>> callback) {
super(new PerspectiveCompositeLifecycleTabbedSettingsComponent<PL,PS>(perspectiveLifecycleWithAllSettings, title), stringConstants, callback);
}
}
@@ -0,0 +1,47 @@
package com.sap.sse.gwt.client.shared.perspective;
import java.io.Serializable;
import java.util.Map;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.gwt.client.shared.components.Component;
import com.sap.sse.gwt.client.shared.components.CompositeSettings;
/**
* A composite settings class for a perspective aggregating the {@link #getPerspectiveOwnSettings() settings of the
* perspective itself} as well as the settings of all contained components. The perspective-specific settings are
* <em>not</em> part of the general composite settings' {@link #getSettingsPerComponentId()} result (although a
* {@link Perspective} is a {@link Component}) to make it clear that the perspective to which these settings belong is
* not nested in itself. Note that any of the component of the component/settings pairs returned by
* {@link #getSettingsPerComponentId()} may again be a perspective.
*
* @author Frank Mittag
*
* @param <PS>
* the {@link Perspective}'s own settings type; those could, e.g., hold settings such as how much space
* is assigned to which component, or how the perspective displays itself, such as embedded or not
*/
public class PerspectiveCompositeSettings<PS extends Settings> extends CompositeSettings {
private final PS perspectiveOwnSettings;
public PerspectiveCompositeSettings(PS perspectiveOwnSettings, Map<Serializable, Settings> settingsPerComponent) {
super(settingsPerComponent);
this.perspectiveOwnSettings = perspectiveOwnSettings;
}
/**
* @return the perspective-specific settings; those could, e.g., be settings that govern which of the components are
* currently visible or how the components are to be displayed in the context of the perspective; these
* settings may also control visualization properties for the perspective that are not specific to any
* particular component, such as a background color, presence of a general header or general refresh
* behavior.
*/
public PS getPerspectiveOwnSettings() {
return perspectiveOwnSettings;
}
public boolean hasSettings() {
return getSettingsPerComponentId() != null || perspectiveOwnSettings != null;
}
}
@@ -0,0 +1,205 @@
package com.sap.sse.gwt.client.shared.perspective;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
import com.sap.sse.gwt.client.shared.components.Component;
import com.sap.sse.gwt.client.shared.components.ComponentLifecycle;
import com.sap.sse.gwt.client.shared.components.CompositeSettings;
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
/**
* @author Frank Mittag
*
* @param <PS>
* the type of the perspective own settings
**/
public class PerspectiveCompositeTabbedSettingsDialogComponent<PS extends Settings>
implements SettingsDialogComponent<PerspectiveCompositeSettings<PS>> {
public static class ComponentIdWithSettingsAndDialogComponent<S extends Settings> {
private final Serializable componentId;
private final S settings;
private final SettingsDialogComponent<S> settingsDialog;
private final String componentName;
public ComponentIdWithSettingsAndDialogComponent(String componentName, Serializable componentId, S settings, SettingsDialogComponent<S> settingsDialog) {
this.componentName = componentName;
this.componentId = componentId;
this.settings = settings;
this.settingsDialog = settingsDialog;
}
public Serializable getComponentId() {
return componentId;
}
public S getSettings() {
return settings;
}
public SettingsDialogComponent<S> getSettingsDialog() {
return settingsDialog;
}
public String getComponentName() {
return componentName;
}
}
/**
* @param <PS>
* the {@link Perspective} own settings type
*/
public static class PerspectiveIdWithSettingsAndDialogComponent<PS extends Settings> {
private final PS perspectiveOwnSettings;
private final SettingsDialogComponent<PS> settingsDialog;
private final String perspectiveName;
public PerspectiveIdWithSettingsAndDialogComponent(String perspectiveName, PS perspectiveOwnSettings,
SettingsDialogComponent<PS> settingsDialog) {
this.perspectiveName = perspectiveName;
this.perspectiveOwnSettings = perspectiveOwnSettings;
this.settingsDialog = settingsDialog;
}
public PS getPerspectiveOwnSettings() {
return perspectiveOwnSettings;
}
public SettingsDialogComponent<PS> getSettingsDialog() {
return settingsDialog;
}
public String getPerspectiveName() {
return perspectiveName;
}
}
private final List<ComponentIdWithSettingsAndDialogComponent<?>> componentIdsAndDialogComponents;
private final PerspectiveIdWithSettingsAndDialogComponent<PS> perspectiveIdsAndSettingsDialog;
public PerspectiveCompositeTabbedSettingsDialogComponent(Perspective<PS> perspective) {
this.componentIdsAndDialogComponents = new ArrayList<>();
for (Component<?> component : perspective.getComponents()) {
componentIdsAndDialogComponents.add(createComponentAndDialogComponent(component));
}
perspectiveIdsAndSettingsDialog = createPerspectiveAndDialogComponent(perspective);
}
/**
* From the {@link PerspectiveLifecycle} {@link PerspectiveLifecycleWithAllSettings#getPerspectiveLifecycle()
* referenced} by {@code perspectiveLifecycleWithAllSettings}, this constructor grabs all the
* {@link ComponentLifecycle} objects for those nested components that have settings,
* {@link ComponentLifecycle#getSettingsDialogComponent(Settings) fetches their settings dialog component} and maps
* it in {@link #componentIdsAndDialogComponents}. Then, the
* {@link #createPerspectiveIdAndDialogComponent(PerspectiveLifecycle, Settings)} method assembles them, together
* with the perspective's own settings dialog component.
*/
public PerspectiveCompositeTabbedSettingsDialogComponent(PerspectiveLifecycleWithAllSettings<?, PS> perspectiveLifecycleWithAllSettings) {
this.componentIdsAndDialogComponents = new ArrayList<>();
CompositeSettings componentSettings = perspectiveLifecycleWithAllSettings.getComponentSettings();
for (ComponentLifecycle<?,?> componentLifecycle : perspectiveLifecycleWithAllSettings.getPerspectiveLifecycle().getComponentLifecycles()) {
if (componentLifecycle.hasSettings()) {
createComponentIdWithSettingsAndDialogComponent(componentSettings, componentLifecycle);
}
}
perspectiveIdsAndSettingsDialog = createPerspectiveIdAndDialogComponent(perspectiveLifecycleWithAllSettings.getPerspectiveLifecycle(),
perspectiveLifecycleWithAllSettings.getAllSettings().getPerspectiveOwnSettings());
}
private <S extends Settings, C extends Component<S>> void createComponentIdWithSettingsAndDialogComponent(CompositeSettings componentSettings,
ComponentLifecycle<S, ?> componentLifecycle) {
@SuppressWarnings("unchecked")
S settingsOfComponent = (S) componentSettings.findSettingsByComponentId(componentLifecycle.getComponentId());
this.componentIdsAndDialogComponents.add(new ComponentIdWithSettingsAndDialogComponent<S>(componentLifecycle.getLocalizedShortName(), componentLifecycle.getComponentId(), settingsOfComponent,
componentLifecycle.getSettingsDialogComponent(settingsOfComponent)));
}
/**
* Creates the dialog for the settings of perspective itself
* @param perspectiveLifecycleAndSettings
*/
private PerspectiveIdWithSettingsAndDialogComponent<PS> createPerspectiveIdAndDialogComponent(PerspectiveLifecycle<PS> perspectiveLifecycle, PS perspectiveOwnSettings) {
return new PerspectiveIdWithSettingsAndDialogComponent<PS>(perspectiveLifecycle.getLocalizedShortName(),
perspectiveOwnSettings, perspectiveLifecycle.getPerspectiveOwnSettingsDialogComponent(perspectiveOwnSettings));
}
private PerspectiveIdWithSettingsAndDialogComponent<PS> createPerspectiveAndDialogComponent(Perspective<PS> perspective) {
PerspectiveIdWithSettingsAndDialogComponent<PS> result = null;
if(perspective.hasPerspectiveOwnSettings()) {
result = new PerspectiveIdWithSettingsAndDialogComponent<PS>(perspective.getLocalizedShortName(),
perspective.getSettings().getPerspectiveOwnSettings(),
perspective.getPerspectiveOwnSettingsDialogComponent());
}
return result;
}
private <SettingsType extends Settings> ComponentIdWithSettingsAndDialogComponent<SettingsType> createComponentAndDialogComponent(Component<SettingsType> component) {
return new ComponentIdWithSettingsAndDialogComponent<SettingsType>(component.getLocalizedShortName(), component.getId(), component.getSettings(),
component.getSettingsDialogComponent());
}
private PS getPerspectiveOwnSettings(PerspectiveIdWithSettingsAndDialogComponent<PS> perspectiveAndDialog) {
return perspectiveAndDialog.getSettingsDialog().getResult();
}
@Override
public Widget getAdditionalWidget(final DataEntryDialog<?> dialog) {
TabPanel result = new TabPanel();
if(perspectiveIdsAndSettingsDialog != null) {
Widget w = perspectiveIdsAndSettingsDialog.getSettingsDialog().getAdditionalWidget((DataEntryDialog<?>) dialog);
result.add(w, perspectiveIdsAndSettingsDialog.getPerspectiveName());
}
for (ComponentIdWithSettingsAndDialogComponent<?> componentAndSettingsDialog : componentIdsAndDialogComponents) {
Widget w = componentAndSettingsDialog.getSettingsDialog().getAdditionalWidget((DataEntryDialog<?>) dialog);
result.add(w, componentAndSettingsDialog.getComponentName());
}
result.selectTab(0);
result.addSelectionHandler(new SelectionHandler<Integer>() {
@Override
public void onSelection(SelectionEvent<Integer> event) {
dialog.center();
}
});
return result;
}
@Override
public PerspectiveCompositeSettings<PS> getResult() {
PS perspectiveOwnSettings = perspectiveIdsAndSettingsDialog != null ? getPerspectiveOwnSettings(perspectiveIdsAndSettingsDialog) : null;
Map<Serializable, Settings> settings = new HashMap<>();
for (ComponentIdWithSettingsAndDialogComponent<?> componentAndDialog : componentIdsAndDialogComponents) {
settings.put(componentAndDialog.getComponentId(), componentAndDialog.getSettingsDialog().getResult());
}
return new PerspectiveCompositeSettings<PS>(perspectiveOwnSettings, settings);
}
@Override
public PerspectiveCompositeValidator<PS> getValidator() {
return new PerspectiveCompositeValidator<PS>(perspectiveIdsAndSettingsDialog, componentIdsAndDialogComponents);
}
@Override
public FocusWidget getFocusWidget() {
for (ComponentIdWithSettingsAndDialogComponent<?> componentAndSettingsDialog : componentIdsAndDialogComponents) {
FocusWidget fw = componentAndSettingsDialog.getSettingsDialog().getFocusWidget();
if (fw != null) {
return fw;
}
}
return null;
}
}
@@ -0,0 +1,68 @@
package com.sap.sse.gwt.client.shared.perspective;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.Validator;
import com.sap.sse.gwt.client.shared.perspective.PerspectiveCompositeTabbedSettingsDialogComponent.ComponentIdWithSettingsAndDialogComponent;
import com.sap.sse.gwt.client.shared.perspective.PerspectiveCompositeTabbedSettingsDialogComponent.PerspectiveIdWithSettingsAndDialogComponent;
/**
* @author Frank
*
* @param <PS>
* the type of the perspective own settings
**/
public class PerspectiveCompositeValidator<PS extends Settings> implements Validator<PerspectiveCompositeSettings<PS>> {
private final Map<Serializable, Validator<?>> validatorsMappedByComponent;
private final Validator<PS> perspectiveValidator;
public PerspectiveCompositeValidator(PerspectiveIdWithSettingsAndDialogComponent<PS> perspectiveAndDialogComponent, Iterable<ComponentIdWithSettingsAndDialogComponent<?>> componentsAndDialogComponents) {
this.perspectiveValidator = perspectiveAndDialogComponent.getSettingsDialog().getValidator();
validatorsMappedByComponent = new HashMap<>();
for (ComponentIdWithSettingsAndDialogComponent<?> componentsAndSettingsDialog : componentsAndDialogComponents) {
validatorsMappedByComponent.put(componentsAndSettingsDialog.getComponentId(), componentsAndSettingsDialog.getSettingsDialog().getValidator());
}
}
@Override
public String getErrorMessage(PerspectiveCompositeSettings<PS> valueToValidate) {
StringBuilder result = new StringBuilder();
for (Entry<Serializable, Settings> componentAndSettings : valueToValidate.getSettingsPerComponentId().entrySet()) {
final String errorMessage = getComponentErrorMessage(componentAndSettings);
if (errorMessage != null && !errorMessage.isEmpty()) {
result.append(errorMessage);
}
}
String perspectiveErrorMessage = getPerspectiveErrorMessage(valueToValidate.getPerspectiveOwnSettings());
if (perspectiveErrorMessage != null && !perspectiveErrorMessage.isEmpty()) {
result.append(perspectiveErrorMessage);
}
return result.toString();
}
private String getPerspectiveErrorMessage(PS perspectiveSettings) {
String errorMessage = null;
if (perspectiveValidator != null) {
errorMessage = perspectiveValidator.getErrorMessage(perspectiveSettings);
}
return errorMessage;
}
private <SettingsType extends Settings> String getComponentErrorMessage(Entry<Serializable, SettingsType> componentIdAndSettings) {
String errorMessage = null;
@SuppressWarnings("unchecked")
Validator<SettingsType> validator = (Validator<SettingsType>) validatorsMappedByComponent.get(componentIdAndSettings.getKey());
if (validator != null) {
errorMessage = validator.getErrorMessage(componentIdAndSettings.getValue());
if (errorMessage != null && !errorMessage.isEmpty() && !getClass().equals(validator.getClass())) {
errorMessage += "; ";
}
}
return errorMessage;
}
}
@@ -0,0 +1,21 @@
package com.sap.sse.gwt.client.shared.perspective;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.gwt.client.shared.components.ComponentLifecycle;
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
/**
* A lifecycle interface for a {@link Perspective}
*
* @param <PS>
* the perspective specific settings type
* @author Frank Mittag
*/
public interface PerspectiveLifecycle<PS extends Settings> extends
ComponentLifecycle<PerspectiveCompositeSettings<PS>, PerspectiveCompositeTabbedSettingsDialogComponent<PS>> {
Iterable<ComponentLifecycle<?,?>> getComponentLifecycles();
PS createPerspectiveOwnDefaultSettings();
SettingsDialogComponent<PS> getPerspectiveOwnSettingsDialogComponent(PS settings);
}
@@ -0,0 +1,51 @@
package com.sap.sse.gwt.client.shared.perspective;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.gwt.client.shared.components.ComponentLifecycle;
import com.sap.sse.gwt.client.shared.components.CompositeSettings;
/**
* A utility class keeping together a {@link PerspectiveLifecycle} and all it's component settings together with the corresponding ComponentLifecycle's
*
* @param <PL>
* the type of the perspective lifecycle
* @param <PS>
* the type of the perspective own settings
* @author Frank Mittag
*/
public class PerspectiveLifecycleWithAllSettings<PL extends PerspectiveLifecycle<PS>, PS extends Settings> {
private final PL perspectiveLifecycle;
private PerspectiveCompositeSettings<PS> allSettings;
public PerspectiveLifecycleWithAllSettings(PL perspectiveLifecycle, PerspectiveCompositeSettings<PS> allSettings) {
this.perspectiveLifecycle = perspectiveLifecycle;
this.allSettings = allSettings;
}
public PL getPerspectiveLifecycle() {
return perspectiveLifecycle;
}
public PS getPerspectiveSettings() {
return allSettings.getPerspectiveOwnSettings();
}
public CompositeSettings getComponentSettings() {
return allSettings;
}
public PerspectiveCompositeSettings<PS> getAllSettings() {
return allSettings;
}
public void setAllSettings(PerspectiveCompositeSettings<PS> allSettings) {
this.allSettings = allSettings;
}
public <C extends ComponentLifecycle<S,?>, S extends Settings> S findComponentSettingsByLifecycle(C componentLifecycle) {
@SuppressWarnings("unchecked")
final S result = (S) allSettings.findSettingsByComponentId(componentLifecycle.getComponentId());
return result;
}
}
@@ -1,7 +1,13 @@
package com.sap.sse.gwt.dispatch.servlets;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.google.gwt.user.client.rpc.SerializationException;
import com.google.gwt.user.server.rpc.RPCServletUtils;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.google.gwt.user.server.rpc.SerializationPolicy;
@@ -29,6 +35,36 @@ public abstract class ProxiedRemoteServiceServlet extends RemoteServiceServlet {
}
return super.doGetSerializationPolicy(request, moduleBaseURL, strongName);
}
@Override
protected void doUnexpectedFailure(Throwable e) {
if ((e.getCause() != null && e.getCause().getClass().getName().matches("org\\.apache\\.shiro\\.authz\\..*[Aa]uth.*Exception")) ||
(e instanceof SerializationException && e.getMessage().matches("Type 'org\\.apache\\.shiro\\.authz\\..*[Aa]uth.*Exception' was not included in the set of types which can be serialized.*"))) {
final HttpServletResponse servletResponse = getThreadLocalResponse();
try {
servletResponse.reset();
} catch (IllegalStateException ex) {
throw new RuntimeException("Unable to report failure", e);
}
ServletContext servletContext = getServletContext();
RPCServletUtils.writeResponseForUnexpectedFailure(servletContext, servletResponse, e);
servletContext.log("Exception while dispatching incoming RPC call", e.getCause()==null?e:e.getCause());
try {
servletResponse.setContentType("text/plain");
servletResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
try {
servletResponse.getOutputStream().write((e.getCause()==null?e:e.getCause()).getLocalizedMessage().getBytes("UTF-8"));
} catch (IllegalStateException ex) {
// Handle the (unexpected) case where getWriter() was previously used
servletResponse.getWriter().write("Couldn't write exception");
}
} catch (IOException ex) {
servletContext.log(
"respondWithUnexpectedFailure failed while sending the previous failure to the client", ex);
}
} else {
super.doUnexpectedFailure(e);
}
}
}