diff options
Diffstat (limited to '')
10 files changed, 171 insertions, 116 deletions
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs index 3f00534..7cb075e 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs | |||
@@ -85,24 +85,27 @@ namespace OpenSim.Services.Connectors.SimianGrid | |||
85 | 85 | ||
86 | public void Initialise(IConfigSource source) | 86 | public void Initialise(IConfigSource source) |
87 | { | 87 | { |
88 | IConfig gridConfig = source.Configs["AssetService"]; | 88 | if (Simian.IsSimianEnabled(source, "AssetServices")) |
89 | if (gridConfig == null) | ||
90 | { | 89 | { |
91 | m_log.Error("[ASSET CONNECTOR]: AssetService missing from OpenSim.ini"); | 90 | IConfig gridConfig = source.Configs["AssetService"]; |
92 | throw new Exception("Asset connector init error"); | 91 | if (gridConfig == null) |
93 | } | 92 | { |
93 | m_log.Error("[ASSET CONNECTOR]: AssetService missing from OpenSim.ini"); | ||
94 | throw new Exception("Asset connector init error"); | ||
95 | } | ||
94 | 96 | ||
95 | string serviceUrl = gridConfig.GetString("AssetServerURI"); | 97 | string serviceUrl = gridConfig.GetString("AssetServerURI"); |
96 | if (String.IsNullOrEmpty(serviceUrl)) | 98 | if (String.IsNullOrEmpty(serviceUrl)) |
97 | { | 99 | { |
98 | m_log.Info("[ASSET CONNECTOR]: No AssetServerURI in section AssetService, skipping SimianAssetServiceConnector"); | 100 | m_log.Error("[ASSET CONNECTOR]: No AssetServerURI in section AssetService"); |
99 | return; | 101 | throw new Exception("Asset connector init error"); |
100 | } | 102 | } |
101 | 103 | ||
102 | if (!serviceUrl.EndsWith("/")) | 104 | if (!serviceUrl.EndsWith("/")) |
103 | serviceUrl = serviceUrl + '/'; | 105 | serviceUrl = serviceUrl + '/'; |
104 | 106 | ||
105 | m_serverUrl = serviceUrl; | 107 | m_serverUrl = serviceUrl; |
108 | } | ||
106 | } | 109 | } |
107 | 110 | ||
108 | #region IAssetService | 111 | #region IAssetService |
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianAuthenticationServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianAuthenticationServiceConnector.cs index 0876efb..6317b87 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianAuthenticationServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianAuthenticationServiceConnector.cs | |||
@@ -73,21 +73,24 @@ namespace OpenSim.Services.Connectors.SimianGrid | |||
73 | 73 | ||
74 | public void Initialise(IConfigSource source) | 74 | public void Initialise(IConfigSource source) |
75 | { | 75 | { |
76 | IConfig assetConfig = source.Configs["AuthenticationService"]; | 76 | if (Simian.IsSimianEnabled(source, "AuthenticationServices")) |
77 | if (assetConfig == null) | ||
78 | { | 77 | { |
79 | m_log.Error("[AUTH CONNECTOR]: AuthenticationService missing from OpenSim.ini"); | 78 | IConfig assetConfig = source.Configs["AuthenticationService"]; |
80 | throw new Exception("Authentication connector init error"); | 79 | if (assetConfig == null) |
81 | } | 80 | { |
81 | m_log.Error("[AUTH CONNECTOR]: AuthenticationService missing from OpenSim.ini"); | ||
82 | throw new Exception("Authentication connector init error"); | ||
83 | } | ||
82 | 84 | ||
83 | string serviceURI = assetConfig.GetString("AuthenticationServerURI"); | 85 | string serviceURI = assetConfig.GetString("AuthenticationServerURI"); |
84 | if (String.IsNullOrEmpty(serviceURI)) | 86 | if (String.IsNullOrEmpty(serviceURI)) |
85 | { | 87 | { |
86 | m_log.Info("[AUTH CONNECTOR]: No Server URI named in section AuthenticationService, skipping SimianAuthenticationServiceConnector"); | 88 | m_log.Error("[AUTH CONNECTOR]: No Server URI named in section AuthenticationService"); |
87 | return; | 89 | throw new Exception("Authentication connector init error"); |
88 | } | 90 | } |
89 | 91 | ||
90 | m_serverUrl = serviceURI; | 92 | m_serverUrl = serviceURI; |
93 | } | ||
91 | } | 94 | } |
92 | 95 | ||
93 | public string Authenticate(UUID principalID, string password, int lifetime) | 96 | public string Authenticate(UUID principalID, string password, int lifetime) |
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianAvatarServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianAvatarServiceConnector.cs index 697bb43..a18cb22 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianAvatarServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianAvatarServiceConnector.cs | |||
@@ -78,24 +78,27 @@ namespace OpenSim.Services.Connectors.SimianGrid | |||
78 | 78 | ||
79 | public void Initialise(IConfigSource source) | 79 | public void Initialise(IConfigSource source) |
80 | { | 80 | { |
81 | IConfig gridConfig = source.Configs["AvatarService"]; | 81 | if (Simian.IsSimianEnabled(source, "AvatarServices")) |
82 | if (gridConfig == null) | ||
83 | { | 82 | { |
84 | m_log.Error("[AVATAR CONNECTOR]: AvatarService missing from OpenSim.ini"); | 83 | IConfig gridConfig = source.Configs["AvatarService"]; |
85 | throw new Exception("Avatar connector init error"); | 84 | if (gridConfig == null) |
86 | } | 85 | { |
86 | m_log.Error("[AVATAR CONNECTOR]: AvatarService missing from OpenSim.ini"); | ||
87 | throw new Exception("Avatar connector init error"); | ||
88 | } | ||
87 | 89 | ||
88 | string serviceUrl = gridConfig.GetString("AvatarServerURI"); | 90 | string serviceUrl = gridConfig.GetString("AvatarServerURI"); |
89 | if (String.IsNullOrEmpty(serviceUrl)) | 91 | if (String.IsNullOrEmpty(serviceUrl)) |
90 | { | 92 | { |
91 | m_log.Info("[AVATAR CONNECTOR]: No AvatarServerURI in section AvatarService, skipping SimianAvatarServiceConnector"); | 93 | m_log.Error("[AVATAR CONNECTOR]: No AvatarServerURI in section AvatarService"); |
92 | return; | 94 | throw new Exception("Avatar connector init error"); |
93 | } | 95 | } |
94 | 96 | ||
95 | if (!serviceUrl.EndsWith("/")) | 97 | if (!serviceUrl.EndsWith("/")) |
96 | serviceUrl = serviceUrl + '/'; | 98 | serviceUrl = serviceUrl + '/'; |
97 | 99 | ||
98 | m_serverUrl = serviceUrl; | 100 | m_serverUrl = serviceUrl; |
101 | } | ||
99 | } | 102 | } |
100 | 103 | ||
101 | #region IAvatarService | 104 | #region IAvatarService |
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianFriendsServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianFriendsServiceConnector.cs index abb98a3..b3ecc7e 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianFriendsServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianFriendsServiceConnector.cs | |||
@@ -76,21 +76,24 @@ namespace OpenSim.Services.Connectors.SimianGrid | |||
76 | 76 | ||
77 | public void Initialise(IConfigSource source) | 77 | public void Initialise(IConfigSource source) |
78 | { | 78 | { |
79 | IConfig assetConfig = source.Configs["FriendsService"]; | 79 | if (Simian.IsSimianEnabled(source, "FriendsServices")) |
80 | if (assetConfig == null) | ||
81 | { | 80 | { |
82 | m_log.Error("[FRIENDS CONNECTOR]: FriendsService missing from OpenSim.ini"); | 81 | IConfig assetConfig = source.Configs["FriendsService"]; |
83 | throw new Exception("Friends connector init error"); | 82 | if (assetConfig == null) |
84 | } | 83 | { |
84 | m_log.Error("[FRIENDS CONNECTOR]: FriendsService missing from OpenSim.ini"); | ||
85 | throw new Exception("Friends connector init error"); | ||
86 | } | ||
85 | 87 | ||
86 | string serviceURI = assetConfig.GetString("FriendsServerURI"); | 88 | string serviceURI = assetConfig.GetString("FriendsServerURI"); |
87 | if (String.IsNullOrEmpty(serviceURI)) | 89 | if (String.IsNullOrEmpty(serviceURI)) |
88 | { | 90 | { |
89 | m_log.Info("[FRIENDS CONNECTOR]: No Server URI named in section FriendsService, skipping SimianFriendsServiceConnector"); | 91 | m_log.Error("[FRIENDS CONNECTOR]: No Server URI named in section FriendsService"); |
90 | return; | 92 | throw new Exception("Friends connector init error"); |
91 | } | 93 | } |
92 | 94 | ||
93 | m_serverUrl = serviceURI; | 95 | m_serverUrl = serviceURI; |
96 | } | ||
94 | } | 97 | } |
95 | 98 | ||
96 | #region IFriendsService | 99 | #region IFriendsService |
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianGrid.cs b/OpenSim/Services/Connectors/SimianGrid/SimianGrid.cs index 41ed2f1..c3de98e 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianGrid.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianGrid.cs | |||
@@ -25,7 +25,23 @@ | |||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | */ | 26 | */ |
27 | 27 | ||
28 | using System; | ||
28 | using Mono.Addins; | 29 | using Mono.Addins; |
30 | using Nini.Config; | ||
29 | 31 | ||
30 | [assembly: Addin("SimianGrid", "1.0")] | 32 | [assembly: Addin("SimianGrid", "1.0")] |
31 | [assembly: AddinDependency("OpenSim", "0.5")] | 33 | [assembly: AddinDependency("OpenSim", "0.5")] |
34 | |||
35 | public static class Simian | ||
36 | { | ||
37 | public static bool IsSimianEnabled(IConfigSource config, string moduleName) | ||
38 | { | ||
39 | if (config.Configs["Modules"] != null) | ||
40 | { | ||
41 | string module = config.Configs["Modules"].GetString("AuthenticationServices"); | ||
42 | return !String.IsNullOrEmpty(module) && module.Contains("Simian"); | ||
43 | } | ||
44 | |||
45 | return false; | ||
46 | } | ||
47 | } \ No newline at end of file | ||
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs index ef943ec..eebdf14 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs | |||
@@ -80,21 +80,24 @@ namespace OpenSim.Services.Connectors.SimianGrid | |||
80 | 80 | ||
81 | public void Initialise(IConfigSource source) | 81 | public void Initialise(IConfigSource source) |
82 | { | 82 | { |
83 | IConfig gridConfig = source.Configs["GridService"]; | 83 | if (Simian.IsSimianEnabled(source, "GridServices")) |
84 | if (gridConfig == null) | ||
85 | { | 84 | { |
86 | m_log.Error("[GRID CONNECTOR]: GridService missing from OpenSim.ini"); | 85 | IConfig gridConfig = source.Configs["GridService"]; |
87 | throw new Exception("Grid connector init error"); | 86 | if (gridConfig == null) |
88 | } | 87 | { |
88 | m_log.Error("[GRID CONNECTOR]: GridService missing from OpenSim.ini"); | ||
89 | throw new Exception("Grid connector init error"); | ||
90 | } | ||
89 | 91 | ||
90 | string serviceUrl = gridConfig.GetString("GridServerURI"); | 92 | string serviceUrl = gridConfig.GetString("GridServerURI"); |
91 | if (String.IsNullOrEmpty(serviceUrl)) | 93 | if (String.IsNullOrEmpty(serviceUrl)) |
92 | { | 94 | { |
93 | m_log.Info("[GRID CONNECTOR]: No Server URI named in section GridService, skipping SimianGridServiceConnector"); | 95 | m_log.Error("[GRID CONNECTOR]: No Server URI named in section GridService"); |
94 | return; | 96 | throw new Exception("Grid connector init error"); |
95 | } | 97 | } |
96 | 98 | ||
97 | m_serverUrl = serviceUrl; | 99 | m_serverUrl = serviceUrl; |
100 | } | ||
98 | } | 101 | } |
99 | 102 | ||
100 | #region IGridService | 103 | #region IGridService |
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs index a41e493..891782f 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs | |||
@@ -92,23 +92,38 @@ namespace OpenSim.Services.Connectors.SimianGrid | |||
92 | 92 | ||
93 | public void Initialise(IConfigSource source) | 93 | public void Initialise(IConfigSource source) |
94 | { | 94 | { |
95 | IConfig gridConfig = source.Configs["InventoryService"]; | 95 | if (Simian.IsSimianEnabled(source, "InventoryServices")) |
96 | if (gridConfig == null) | ||
97 | { | 96 | { |
98 | m_log.Error("[INVENTORY CONNECTOR]: InventoryService missing from OpenSim.ini"); | 97 | IConfig gridConfig = source.Configs["InventoryService"]; |
99 | throw new Exception("Inventory connector init error"); | 98 | if (gridConfig == null) |
100 | } | 99 | { |
100 | m_log.Error("[INVENTORY CONNECTOR]: InventoryService missing from OpenSim.ini"); | ||
101 | throw new Exception("Inventory connector init error"); | ||
102 | } | ||
101 | 103 | ||
102 | string serviceUrl = gridConfig.GetString("InventoryServerURI"); | 104 | string serviceUrl = gridConfig.GetString("InventoryServerURI"); |
103 | if (String.IsNullOrEmpty(serviceUrl)) | 105 | if (String.IsNullOrEmpty(serviceUrl)) |
104 | { | 106 | { |
105 | m_log.Info("[INVENTORY CONNECTOR]: No Server URI named in section InventoryService, skipping SimianInventoryServiceConnector"); | 107 | m_log.Error("[INVENTORY CONNECTOR]: No Server URI named in section InventoryService"); |
106 | return; | 108 | throw new Exception("Inventory connector init error"); |
107 | } | 109 | } |
108 | 110 | ||
109 | // FIXME: Get the user server URL too | 111 | m_serverUrl = serviceUrl; |
110 | 112 | ||
111 | m_serverUrl = serviceUrl; | 113 | gridConfig = source.Configs["UserAccountService"]; |
114 | if (gridConfig != null) | ||
115 | { | ||
116 | serviceUrl = gridConfig.GetString("UserAccountServerURI"); | ||
117 | if (!String.IsNullOrEmpty(serviceUrl)) | ||
118 | m_userServerUrl = serviceUrl; | ||
119 | else | ||
120 | m_log.Info("[INVENTORY CONNECTOR]: No Server URI named in section UserAccountService"); | ||
121 | } | ||
122 | else | ||
123 | { | ||
124 | m_log.Warn("[INVENTORY CONNECTOR]: UserAccountService missing from OpenSim.ini"); | ||
125 | } | ||
126 | } | ||
112 | } | 127 | } |
113 | 128 | ||
114 | /// <summary> | 129 | /// <summary> |
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs index fa387ba..1b5edf4 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs | |||
@@ -104,21 +104,24 @@ namespace OpenSim.Services.Connectors.SimianGrid | |||
104 | 104 | ||
105 | public void Initialise(IConfigSource source) | 105 | public void Initialise(IConfigSource source) |
106 | { | 106 | { |
107 | IConfig gridConfig = source.Configs["PresenceService"]; | 107 | if (Simian.IsSimianEnabled(source, "PresenceServices")) |
108 | if (gridConfig == null) | ||
109 | { | 108 | { |
110 | m_log.Error("[PRESENCE CONNECTOR]: PresenceService missing from OpenSim.ini"); | 109 | IConfig gridConfig = source.Configs["PresenceService"]; |
111 | throw new Exception("Presence connector init error"); | 110 | if (gridConfig == null) |
112 | } | 111 | { |
112 | m_log.Error("[PRESENCE CONNECTOR]: PresenceService missing from OpenSim.ini"); | ||
113 | throw new Exception("Presence connector init error"); | ||
114 | } | ||
113 | 115 | ||
114 | string serviceUrl = gridConfig.GetString("PresenceServerURI"); | 116 | string serviceUrl = gridConfig.GetString("PresenceServerURI"); |
115 | if (String.IsNullOrEmpty(serviceUrl)) | 117 | if (String.IsNullOrEmpty(serviceUrl)) |
116 | { | 118 | { |
117 | m_log.Info("[PRESENCE CONNECTOR]: No PresenceServerURI in section PresenceService, skipping SimianPresenceServiceConnector"); | 119 | m_log.Error("[PRESENCE CONNECTOR]: No PresenceServerURI in section PresenceService"); |
118 | return; | 120 | throw new Exception("Presence connector init error"); |
119 | } | 121 | } |
120 | 122 | ||
121 | m_serverUrl = serviceUrl; | 123 | m_serverUrl = serviceUrl; |
124 | } | ||
122 | } | 125 | } |
123 | 126 | ||
124 | #region IPresenceService | 127 | #region IPresenceService |
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianProfiles.cs b/OpenSim/Services/Connectors/SimianGrid/SimianProfiles.cs index 3c93725..9c226fb 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianProfiles.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianProfiles.cs | |||
@@ -88,24 +88,27 @@ namespace OpenSim.Services.Connectors.SimianGrid | |||
88 | 88 | ||
89 | public void Initialise(IConfigSource source) | 89 | public void Initialise(IConfigSource source) |
90 | { | 90 | { |
91 | IConfig gridConfig = source.Configs["UserAccountService"]; | 91 | if (Simian.IsSimianEnabled(source, "UserAccountServices")) |
92 | if (gridConfig == null) | ||
93 | { | 92 | { |
94 | m_log.Error("[PROFILES]: UserAccountService missing from OpenSim.ini"); | 93 | IConfig gridConfig = source.Configs["UserAccountService"]; |
95 | throw new Exception("Profiles init error"); | 94 | if (gridConfig == null) |
96 | } | 95 | { |
96 | m_log.Error("[PROFILES]: UserAccountService missing from OpenSim.ini"); | ||
97 | throw new Exception("Profiles init error"); | ||
98 | } | ||
97 | 99 | ||
98 | string serviceUrl = gridConfig.GetString("UserAccountServerURI"); | 100 | string serviceUrl = gridConfig.GetString("UserAccountServerURI"); |
99 | if (String.IsNullOrEmpty(serviceUrl)) | 101 | if (String.IsNullOrEmpty(serviceUrl)) |
100 | { | 102 | { |
101 | m_log.Info("[PROFILES]: No UserAccountServerURI in section UserAccountService, skipping SimianProfiles"); | 103 | m_log.Error("[PROFILES]: No UserAccountServerURI in section UserAccountService"); |
102 | return; | 104 | throw new Exception("Profiles init error"); |
103 | } | 105 | } |
104 | 106 | ||
105 | if (!serviceUrl.EndsWith("/")) | 107 | if (!serviceUrl.EndsWith("/")) |
106 | serviceUrl = serviceUrl + '/'; | 108 | serviceUrl = serviceUrl + '/'; |
107 | 109 | ||
108 | m_serverUrl = serviceUrl; | 110 | m_serverUrl = serviceUrl; |
111 | } | ||
109 | } | 112 | } |
110 | 113 | ||
111 | private void ClientConnectHandler(IClientCore clientCore) | 114 | private void ClientConnectHandler(IClientCore clientCore) |
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs index 3a35d9a..bb0ac57 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs | |||
@@ -77,22 +77,25 @@ namespace OpenSim.Services.Connectors.SimianGrid | |||
77 | 77 | ||
78 | public void Initialise(IConfigSource source) | 78 | public void Initialise(IConfigSource source) |
79 | { | 79 | { |
80 | IConfig assetConfig = source.Configs["UserAccountService"]; | 80 | if (Simian.IsSimianEnabled(source, "UserAccountServices")) |
81 | if (assetConfig == null) | ||
82 | { | 81 | { |
83 | m_log.Error("[ACCOUNT CONNECTOR]: UserAccountService missing from OpenSim.ini"); | 82 | IConfig assetConfig = source.Configs["UserAccountService"]; |
84 | throw new Exception("User account connector init error"); | 83 | if (assetConfig == null) |
85 | } | 84 | { |
85 | m_log.Error("[ACCOUNT CONNECTOR]: UserAccountService missing from OpenSim.ini"); | ||
86 | throw new Exception("User account connector init error"); | ||
87 | } | ||
86 | 88 | ||
87 | string serviceURI = assetConfig.GetString("UserAccountServerURI"); | 89 | string serviceURI = assetConfig.GetString("UserAccountServerURI"); |
88 | if (String.IsNullOrEmpty(serviceURI)) | 90 | if (String.IsNullOrEmpty(serviceURI)) |
89 | { | 91 | { |
90 | m_log.Info("[ACCOUNT CONNECTOR]: No UserAccountServerURI in section UserAccountService, skipping SimianUserAccountServiceConnector"); | 92 | m_log.Error("[ACCOUNT CONNECTOR]: No UserAccountServerURI in section UserAccountService, skipping SimianUserAccountServiceConnector"); |
91 | return; | 93 | throw new Exception("User account connector init error"); |
92 | } | 94 | } |
93 | 95 | ||
94 | m_accountCache = new ExpiringCache<UUID, UserAccount>(); | 96 | m_accountCache = new ExpiringCache<UUID, UserAccount>(); |
95 | m_serverUrl = serviceURI; | 97 | m_serverUrl = serviceURI; |
98 | } | ||
96 | } | 99 | } |
97 | 100 | ||
98 | public UserAccount GetUserAccount(UUID scopeID, string firstName, string lastName) | 101 | public UserAccount GetUserAccount(UUID scopeID, string firstName, string lastName) |