Hi,
here are the enhancements we [ForgeRock] would like to see in the next coming 1.4.X.Y release
of the connector framework.
Feel free to add/comment...
1- Improve Framework exceptions
We think about adding more exceptions to the framework.
SchemaViolationException for example
2- Allow distinction between CREATE and UPDATE in Sync operation
Currently, there is only DELETE or CREATE_UPDATE type of events in Sync.
Adding a CREATE and UPDATE distinctive events would be good.
3- Byte support
currently not supported as an attribute type
4- __ANY__ special ObjectClass for Sync()
Sync() operation needs an objectClass to be passed to specify
which object class should be synced. In some situation, one may need
to get any kind of Sync events, regardless of the objectClass.
For that, we propose to create a special system __ANY__ objectclass that would
indicate the connector to collect any events.
5- Session Context in the pool
The poolable connectors do not have a way to persist connection information to optimize
connection handling. This can be workarounded using some static structures, but it is prone to
error and confusion.
The poolable connectors should be able to share connection informations between instances.
-- Francesco Chicchiriccò ASF Member, Apache Syncope PMC chair, Apache Cocoon PMC Member http://people.apache.org/~ilgrosso/
On 02/07/2013 15:41, Gael Allioux wrote:
Hi,
here are the enhancements we [ForgeRock] would like to see in the next coming 1.4.X.Y release
of the connector framework.
Feel free to add/comment...
Hi Gael,
see my comments inline; one preliminary question, though: is there already any existing implementation / poc of the elements enlisted below?
Regards.
1- Improve Framework exceptions
We think about adding more exceptions to the framework.
SchemaViolationException for example
Nice idea in general: do you already have a complete set of exceptions to be added in mind?
2- Allow distinction between CREATE and UPDATE in Sync operation
Currently, there is only DELETE or CREATE_UPDATE type of events in Sync.
Adding a CREATE and UPDATE distinctive events would be good.
I am actually +-0 for this: could you provide some concrete use case where it makes sense to distinguish between CREATE and UPDATE during sync()?
+1
3- Byte support
currently not supported as an attribute type
+1
4- __ANY__ special ObjectClass for Sync()
Sync() operation needs an objectClass to be passed to specify
which object class should be synced. In some situation, one may need
to get any kind of Sync events, regardless of the objectClass.
For that, we propose to create a special system __ANY__ objectclass that would
indicate the connector to collect any events.
+1
+1
5- Session Context in the pool
The poolable connectors do not have a way to persist connection information to optimize
connection handling. This can be workarounded using some static structures, but it is prone to
error and confusion.
The poolable connectors should be able to share connection informations between instances.
+1
Ideally implementing this would push some external dependency like as Commons Pool [1], but this would conflict with the "0 dependency" policy of the framework; from the other side, I am not that happy of reinventing the wheel for pool management...
[1] http://commons.apache.org/proper/commons-pool/
-- Francesco Chicchiriccò ASF Member, Apache Syncope PMC chair, Apache Cocoon PMC Member http://people.apache.org/~ilgrosso/
--
You received this message because you are subscribed to the Google Groups "connid-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to connid-dev+...@googlegroups.com.
Visit this group at http://groups.google.com/group/connid-dev.
For more options, visit https://groups.google.com/groups/opt_out.
1- Improve Framework exceptions
We think about adding more exceptions to the framework.
SchemaViolationException for example
Nice idea in general: do you already have a complete set of exceptions to be added in mind?
--
Radovan Semancik
Software Architect
evolveum.com
What exception to throw if one of the Required attribute is empty/null (This is another question, what is the difference between, the attribute is not present, the value of attribute is null, the value of attribute is empty).I think this is where we need a SchemaViolationException with details, what's expected and what's the current value.What exception to throw if a not-creatable attribute was specified.I think this is where we need a SchemaViolationException with details, explaining the value must be empty/null (see comment above!).If the target object already exits then throw AlreadyExistsException.
The Connector implementer must make sure a failed operation is rolled back and it can be executed later. We know there are some system it's not possible. Once the object was created it can not be deleted any more and it can not be recreated. The connector itself is stateless so it has not any retry mechanism and it can not just try to update if the object is already exists because then the update and the create can not be differentiated and all operation would be an "upsert". The application can have its own retry implementation but it must know to change from create to update instead. To be able to signal this to the application we may need a PartiallyModifiedException or just a PartiallyCreatedException. This would mean the create operation must be changed to update and resend. The delete and update call should be resend.
The Framework does not use any transaction management and I'd like to keep it as simple as we can but the optional MVCC revision has no costs. As I wrote before the Uid class was extended with revision property. This also requires some additional exception.What exception to throw if the target resource requires the revision and it was not provided. PreconditionRequiredException see: 428 Precondition RequiredWhat exception to throw if the target resource requires the revision and it does not match. PreconditionFailedException see: 412 Precondition Failed
There is one none clear use case but in case I mention it. An exception that is thrown during a operation on a resource when such an operation would result in a conflict. For example: when a patch/update conflicts with the object state. The object has the attribute with null value and the removeAttributeValues is called. see: 409 Conflict
What exception to throw if a not-updateable attribute was specified.I think this is where we need a SchemaViolationException with details, explaining the value must be empty/null (see comment at CreateOp!).
As Radovan mentioned the class loading problem. My opinion the ConnectorException should never wrap third-party classes and expose them to the application. These exceptions has to be "serialised" in some way and exposed as they would come from .Net or over the network.
So my proposal is to collect somewhere on wiki our use cases and find the best solution. I think OpenIDM, MidPoint and Syncope has its own exceptions and adapter to adapt the ConnectorException exceptions to the application specific exceptions. I think this is where we can change the exception in a way it can produce meaningful messages and the application can use them better. These three product may have enough use-case coverage to verify the final design of the exceptions. I try to find the best match to map them to OpenIDM exceptions and if you can do the same with the other application then I think we get a very good result.
There must be some generic rules applicable for all operations.
What exception to throw if the operation is not supported on the given objectClass? Mostly the application prevents to make such calls but the connectors must response in a common way.
What exception to throw if one of the required input parameter of the method is null?I think this is handled by the Framework and we can guarantee it never happens. The framework throws NullPointerException or IllegalArgumentException and the Connector developer does not need to do anything.
All operation throws InvalidCredentialException if the remote framework key is invalid. This can be confused with the "authenticate" implementation exception unless ...
If the __UID__ is not known then thrown UnknownUidException seems a bit inconvenient unless it's known in what context it was thrown. For example the "authenticate" may turn into a Security exception and a CRUD operation may turn into a NotFoundException.
What exception to throw if a single-valued attribute has more then one values.I think this is where we need a SchemaViolationException with details, what's expected and what's the current value.
I assume all three product use the TestOp if possible to validate the newly configured connector. That goes overt the initialisation process and then call the SPI operation. We can take is as a generic scenario to call any SPI operation.
Configuration#validateThis method throws very wide range of RuntimeException.Connector#initThis method throws very wide range of RuntimeException.PoolableConnector#checkAliveThis method throws very wide range of RuntimeException.TestOpThis method throws very wide range of RuntimeException.These methods can throw any RuntimeException or Error or ClassNotFoundException etc.
The CommonObjectHandlers lose some information because it serialises only the message and also the Exception class is change too unfortunately. I think this has to be fixed too.
-----------------AuthenticateOpIf the username is not known then thrown UnknownUidException.If the password does not match then throw InvalidPasswordException.If the password is expired then throw PasswordExpiredException.What exception to throw if the account is disabled or locked? The InvalidCredentialException may get confused with the Remote "the remote framework key is invalid" case!!!
AccountExpiredException Signals that a user account has expired. MISSINGAccountLockedException Signals that an account was locked. MISSINGAccountNotFoundException Signals that an account was not found. <-- UnknownUidExceptionCredentialExpiredException Signals that a Credential has expired. <-- PasswordExpiredExceptionCredentialNotFoundException Signals that a credential was not found. MISSINGFailedLoginException Signals that user authentication failed. <-- InvalidPasswordException
ResolveUsernameOpIf the username is not known then thrown UnknownUidException, otherwise follow the common guideline.
CreateOpWhat exception to throw if one of the Required attribute is empty/null (This is another question, what is the difference between, the attribute is not present, the value of attribute is null, the value of attribute is empty).I think this is where we need a SchemaViolationException with details, what's expected and what's the current value.
What exception to throw if a not-creatable attribute was specified.I think this is where we need a SchemaViolationException with details, explaining the value must be empty/null (see comment above!).
If the target object already exits then throw AlreadyExistsException.
The Connector implementer must make sure a failed operation is rolled back and it can be executed later. We know there are some system it's not possible.
Once the object was created it can not be deleted any more and it can not be recreated. The connector itself is stateless so it has not any retry mechanism and it can not just try to update if the object is already exists because then the update and the create can not be differentiated and all operation would be an "upsert". The application can have its own retry implementation but it must know to change from create to update instead. To be able to signal this to the application we may need a PartiallyModifiedException or just a PartiallyCreatedException. This would mean the create operation must be changed to update and resend. The delete and update call should be resend.
DeleteOpThe Framework does not use any transaction management and I'd like to keep it as simple as we can but the optional MVCC revision has no costs. As I wrote before the Uid class was extended with revision property. This also requires some additional exception.What exception to throw if the target resource requires the revision and it was not provided. PreconditionRequiredException see: 428 Precondition RequiredWhat exception to throw if the target resource requires the revision and it does not match. PreconditionFailedException see: 412 Precondition Failed
UpdateAttributeValuesOpThere is one none clear use case but in case I mention it. An exception that is thrown during a operation on a resource when such an operation would result in a conflict. For example: when a patch/update conflicts with the object state. The object has the attribute with null value and the removeAttributeValues is called. see: 409 ConflictUpdateOpWhat exception to throw if a not-updateable attribute was specified.I think this is where we need a SchemaViolationException with details, explaining the value must be empty/null (see comment at CreateOp!).
Hi,
On 07/08/2013 12:40 PM, László Hordós wrote:
As Radovan mentioned the class loading problem. My opinion the ConnectorException should never wrap third-party classes and expose them to the application. These exceptions has to be "serialised" in some way and exposed as they would come from .Net or over the network.
Well, I initially thought so as well. But this will not work well. The ConnectorException subclasses has very little information about what went wrong. The original cause will be lost together with a stacktrace. This will make troubleshooting of the connector code very difficult. I've found that actually exposing inner exception through the API is a lesser evil. If they are exposed then the IDM may at least log a complete stacktrace and then get rid of it before passing that exception up. IDM can also inspect the inner exceptions for known problems of connectors that do poor exception handling. And let's not be naive. Doing proper error and exception handling is very difficult. Even though we fix the ICF exceptions and the documentation and tutorial there always be connectors that do poor error handling. If we disallow inner exceptions then what we will oftne get is just ConfigurationException("Boooo! Some parameter was wrong!"). And not even a line number to guess what parameter might be wrong. I guess that it will only make things worse.
So my proposal is to collect somewhere on wiki our use cases and find the best solution. I think OpenIDM, MidPoint and Syncope has its own exceptions and adapter to adapt the ConnectorException exceptions to the application specific exceptions. I think this is where we can change the exception in a way it can produce meaningful messages and the application can use them better. These three product may have enough use-case coverage to verify the final design of the exceptions. I try to find the best match to map them to OpenIDM exceptions and if you can do the same with the other application then I think we get a very good result.
We have already did this in midPoint. That's the reason I'm saying that I'm happy with the current set of exceptions (except for missing schema violation).
There must be some generic rules applicable for all operations.
Sure.
...What exception to throw if the operation is not supported on the given objectClass? Mostly the application prevents to make such calls but the connectors must response in a common way.
What exception to throw if one of the required input parameter of the method is null?I think this is handled by the Framework and we can guarantee it never happens. The framework throws NullPointerException or IllegalArgumentException and the Connector developer does not need to do anything.
I don't think that we need to reinvent all the exceptions that are already in Java. I guess that throwing java.lang.UnsupportedOperationException is quite fine if an unsupported operation is invoked. Similarly IllegalArgumentException for API inputs that obviously violate interface contract (e.g. providing null where a non-null value is mandated). IlegalStateException may be used if an operation is invoked in wrong connector state (e.g. operation on uninitialized connector). I would propose that the framework should never throw NPE (unless there is a bug). IIRC the framework throws NPE now for some wrong inputs which is quite confusing. But if a connector throws NPE then I guess that might just get thrown from the API side as well without any change. The API consumer could (and really should) catch it and report in an appropriate way. But providing the original exception will help connector developer to diagnose the problem.
All operation throws InvalidCredentialException if the remote framework key is invalid. This can be confused with the "authenticate" implementation exception unless ...
Well, yes. When you mention this maybe we somehow need to distinguish internal ICF errors (e.g. error communicating with remote connector server) from the external errors (error communicating with the resource). I think that would be good thing to do.
If the __UID__ is not known then thrown UnknownUidException seems a bit inconvenient unless it's known in what context it was thrown. For example the "authenticate" may turn into a Security exception and a CRUD operation may turn into a NotFoundException.
I guess that well-written connectors usually have ways how to distinguish the situation when an object is not present (e.g. LDAP object not found) and when authentication failed due to other reasons (e.g. wrong password). Yes, I agree that there might be cases when this cannot be distinguished and in such a case it is OK to just throw the exception that is most appropriate. But I guess that UnknownUidException was created for operations such as update or delete where the object is explicitly addressed by UID.
What exception to throw if a single-valued attribute has more then one values.I think this is where we need a SchemaViolationException with details, what's expected and what's the current value.
Right, SchemaViolationException. But the details are tricky. Many systems will not provide any details or will provide the details only in unstructured text message. There also might be several attributes that violate the schema and may violate it in different way. And sometimes the situation is not that clear anyway (e.g. schema for "choice" attributes: one or the other needs to be present). Therefore if you want design it properly you will need quite a complicated structure to describe what caused the violation. We have tried the simple way in midPoint already. Our SchemaException has a field for attribute that caused the violation. But it is almost never used in practice. Well-specified text message usually describes the situation much better.
I assume all three product use the TestOp if possible to validate the newly configured connector. That goes overt the initialisation process and then call the SPI operation. We can take is as a generic scenario to call any SPI operation.
Configuration#validateThis method throws very wide range of RuntimeException.Connector#initThis method throws very wide range of RuntimeException.PoolableConnector#checkAliveThis method throws very wide range of RuntimeException.TestOpThis method throws very wide range of RuntimeException.These methods can throw any RuntimeException or Error or ClassNotFoundException etc.
I guess these also needs to be limited to the common set of exceptions. But I see that as a lower priority. The exceptions from TestOp are usually only displayed to the user. There is no compensation mechanism bound to them. So the computer-processability of there exceptions is not that important.
The CommonObjectHandlers lose some information because it serialises only the message and also the Exception class is change too unfortunately. I think this has to be fixed too.
I'm not sure what are you referring to? Are you referring to ResultHandler as used e.g. in SearchApiOp? Or some part of internal implementation? Is it something wrong with the interface contract or just implementation problem?
-----------------AuthenticateOpIf the username is not known then thrown UnknownUidException.If the password does not match then throw InvalidPasswordException.If the password is expired then throw PasswordExpiredException.What exception to throw if the account is disabled or locked? The InvalidCredentialException may get confused with the Remote "the remote framework key is invalid" case!!!
For disabled or locked I would use PermissionDeniedException. But I guess it is OK to use ConnectorSecurityException superclass for any case that is not properly described by its subclasses.
As for distinguishing framework problem from the resource problems as I mentioned above: yes would be a good idea. But how to do it elegantly without copy&pasting all the exceptions?
AccountExpiredException Signals that a user account has expired. MISSINGAccountLockedException Signals that an account was locked. MISSINGAccountNotFoundException Signals that an account was not found. <-- UnknownUidExceptionCredentialExpiredException Signals that a Credential has expired. <-- PasswordExpiredExceptionCredentialNotFoundException Signals that a credential was not found. MISSINGFailedLoginException Signals that user authentication failed. <-- InvalidPasswordException
If you like to introduce such a fine-grained error codes I guess it will not harm. But honestly I doubt that they will be heavily used. AFAIK most resource interfaces will just indicate a generic "login failed" error anyway (due to "security reasons") so I guess that most connectors will not be able to distinguish these fine shades of grey. But again, it can't hurt and the set that is used by JSR-196 seems to be reasonable.
ResolveUsernameOpIf the username is not known then thrown UnknownUidException, otherwise follow the common guideline.
Seems OK.
CreateOpWhat exception to throw if one of the Required attribute is empty/null (This is another question, what is the difference between, the attribute is not present, the value of attribute is null, the value of attribute is empty).I think this is where we need a SchemaViolationException with details, what's expected and what's the current value.
Right.
What exception to throw if a not-creatable attribute was specified.I think this is where we need a SchemaViolationException with details, explaining the value must be empty/null (see comment above!).
Yes.
If the target object already exits then throw AlreadyExistsException.
Yes.
The Connector implementer must make sure a failed operation is rolled back and it can be executed later. We know there are some system it's not possible.
I would say for most systems it is not possible in a generic case. Or at least not practical. I would not make this a hard requirement, but just a recommendation. Anyway, well-designed reconciliation process should recover any such half-finished operation.
Once the object was created it can not be deleted any more and it can not be recreated. The connector itself is stateless so it has not any retry mechanism and it can not just try to update if the object is already exists because then the update and the create can not be differentiated and all operation would be an "upsert". The application can have its own retry implementation but it must know to change from create to update instead. To be able to signal this to the application we may need a PartiallyModifiedException or just a PartiallyCreatedException. This would mean the create operation must be changed to update and resend. The delete and update call should be resend.
Introduce Partialy*Exception? Maybe. But there are cases when this cannot be detected anyway (e.g. timeout during waiting for create operation response). Therefore the API consumer cannot rely on this exception anyway and even ConnectorIOException may mean partially-executed operation. I think that practical value of such exception is very limited.
E.g. we have implemented error compensation and consistency system in midPoint almost a year ago. And we haven't needed such an exception. We rather need to know which exceptions are "safe" in terms that nothing was done and which are non-compensable (such as schema violation - that's why I miss it). All the rest must be considered as potential partial execution (including NPE, OOM, all the network errors, etc.). So I guess we do not need special "partial execution" exception. Just using any other than a "safe" exception is OK. And it may even better describe the error.
Surprisingly you will find that only a very little exceptions are really safe. E.g. if we mandate that "unknown uid" and "already exists" exceptions are consistency-safe then some connector operations will be difficult to implement. E.g. the infamous use of the secret ldapGroups attribute by LDAP connector. On the other hand if we mandate that "partial error" exception needs to be thrown in this case then then the original cause of the error may be lost. And the troubleshooting will become a nightmare. We may attempt to somehow merge these two concepts together but that may overcomplicate the system. And nobody will use it properly. This is very tricky. I would prefer simplicity and user-friendliness of the errors in this case. Anyway, the IDM needs to be very suspicious about what really happened on the resource in case of any error. I don't see that the framework can provide much assistance in this case.
DeleteOpThe Framework does not use any transaction management and I'd like to keep it as simple as we can but the optional MVCC revision has no costs. As I wrote before the Uid class was extended with revision property. This also requires some additional exception.What exception to throw if the target resource requires the revision and it was not provided. PreconditionRequiredException see: 428 Precondition RequiredWhat exception to throw if the target resource requires the revision and it does not match. PreconditionFailedException see: 412 Precondition Failed
Right. Actually, the MVCC has some cost, at least in exceptions and testing. But I agree that the cost is low and that it well justified. The exceptions that you are proposing seem OK to me.
There is at least one more exception not to forget for DeleteOp: UnknownUidException
UpdateAttributeValuesOpThere is one none clear use case but in case I mention it. An exception that is thrown during a operation on a resource when such an operation would result in a conflict. For example: when a patch/update conflicts with the object state. The object has the attribute with null value and the removeAttributeValues is called. see: 409 ConflictUpdateOpWhat exception to throw if a not-updateable attribute was specified.I think this is where we need a SchemaViolationException with details, explaining the value must be empty/null (see comment at CreateOp!).
Important exception not to forget about for update-related operations is AlreadyExistsException. Update includes renames and even without rename update can easily hit unique constraints in the resource. This needs to be indicated somehow. Especially in rename cases.
-- Radovan Semancik Software Architect evolveum.com
--
You received this message because you are subscribed to the Google Groups "connid-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to connid-dev+...@googlegroups.com.
Visit this group at http://groups.google.com/group/connid-dev.
For more options, visit https://groups.google.com/groups/opt_out.
Hi,
I'm glad we are on the same page. Could you point me to your wiki where you have this developer guide?
On 07/08/2013 12:40 PM, László Hordós wrote:
As Radovan mentioned the class loading problem. My opinion the ConnectorException should never wrap third-party classes and expose them to the application. These exceptions has to be "serialised" in some way and exposed as they would come from .Net or over the network.
Well, I initially thought so as well. But this will not work well. The ConnectorException subclasses has very little information about what went wrong. The original cause will be lost together with a stacktrace. This will make troubleshooting of the connector code very difficult. I've found that actually exposing inner exception through the API is a lesser evil. If they are exposed then the IDM may at least log a complete stacktrace and then get rid of it before passing that exception up. IDM can also inspect the inner exceptions for known problems of connectors that do poor exception handling. And let's not be naive. Doing proper error and exception handling is very difficult. Even though we fix the ICF exceptions and the documentation and tutorial there always be connectors that do poor error handling. If we disallow inner exceptions then what we will oftne get is just ConfigurationException("Boooo! Some parameter was wrong!"). And not even a line number to guess what parameter might be wrong. I guess that it will only make things worse.
I agree with your all statements but I think we need to fix this problem anyway because it's not a good idea to fully rely on the cause and the third-party exception. I don't want to disallow it but I want to find a better alternative. It may be a nice addition and you can maintain your com/evolveum/midpoint/provisioning/ucf/impl/IcfUtil.java and glue each and every connectors. We need to find the solution when the exception comes from remote server and the stacktrace is lost then do something more then, ConfigurationException("Boooo! Some parameter was wrong!"). I don't know the solution yet because I'm now aware of all situation we must cover. This is why I want to write the developer guide first and fill the gaps.
Just a wild idea after reading the entire mail I don't want to introduce error codes or so much new Exceptions for every case etc. and because we already wrap all Exception into a RuntimeException what about if we extend the CommonObjectHandlers to serialise the entire cause and on the server side it deserialize the stack down to the first ClassNotFound exception? I think it a good compromise. You can have you full stack trace as is now on local and from the remote server we can have the full JRE Throwable classes and the .Net exceptions can be programatically mapped too.
Well, yes. When you mention this maybe we somehow need to distinguish internal ICF errors (e.g. error communicating with remote connector server) from the external errors (error communicating with the resource). I think that would be good thing to do.
I think this exception must be well differenciated from the operational exceptions. This is a broken connection within the Framework and it can be retried later or use the next available connector server, etc.
I can think of these few cases but in these cases a cause can be examined:
- Connection failed because remote host is not accessible.
- Connection failed because SSL configuration problem (javax.net.ssl.SSLHandshakeException, java.security.cert.CertificateException)
- Connection failed because the remote framework key is invalid ----> (Change the implementation to not throw InvalidCredentialException)
- Connection failed because it was cut.
- Connection failed because timeout,
I need to investigate but I think in most of these cases the framework throw the original exception which is good for us.
If the __UID__ is not known then thrown UnknownUidException seems a bit inconvenient unless it's known in what context it was thrown. For example the "authenticate" may turn into a Security exception and a CRUD operation may turn into a NotFoundException.
I guess that well-written connectors usually have ways how to distinguish the situation when an object is not present (e.g. LDAP object not found) and when authentication failed due to other reasons (e.g. wrong password). Yes, I agree that there might be cases when this cannot be distinguished and in such a case it is OK to just throw the exception that is most appropriate. But I guess that UnknownUidException was created for operations such as update or delete where the object is explicitly addressed by UID.
I think I need to explain my concern better.
call authenticate(__ACCOUNT__, "non_existing", "password") throws UnknownUidExceptioncall update(__ACCOUNT__, "non_existing", [changeAttributes]) throws UnknownUidException
I think I answered my question because in idm I need to convert the update:UnknownUidException to NotFound and the authenticate:UnknownUidException to AccountNotFoundException anyway this is a different issue I realised.
AccountExpiredException Signals that a user account has expired. MISSINGAccountLockedException Signals that an account was locked. MISSINGAccountNotFoundException Signals that an account was not found. <-- UnknownUidExceptionCredentialExpiredException Signals that a Credential has expired. <-- PasswordExpiredExceptionCredentialNotFoundException Signals that a credential was not found. MISSINGFailedLoginException Signals that user authentication failed. <-- InvalidPasswordException
If you like to introduce such a fine-grained error codes I guess it will not harm. But honestly I doubt that they will be heavily used. AFAIK most resource interfaces will just indicate a generic "login failed" error anyway (due to "security reasons") so I guess that most connectors will not be able to distinguish these fine shades of grey. But again, it can't hurt and the set that is used by JSR-196 seems to be reasonable.
You right in most case not but there are many API which has this information in its AccessDenied exception and be honest, it's nice to have when you have a support case and you can say. "You must login first to AD and change the password, then you can use this authentication ;)"
Hi Francesco,
I don't think it is a good idea to discuss things at two places at one, especially if one of them is not really good for discussion (wiki). Let's continue discussion here and just document the consensus in wiki (if really necessary). Or even better document it in the form of resulting source code. All the important decisions (and even part of the motivation) needs to go to the javadoc anyway. This is part of the interface contract. Therefore if we do not have consensus yet let's continue discussion here. If we have the consensus let's update the source code right away (e.g. in a topic branch if we are not yet sure about it).
Let's keep the unnecessary bureaucracy to the minimum, please.
On 07/12/2013 11:45 AM, Francesco Chicchiriccò wrote:
Lazlo, Radovan,
first of all, let me say that I agree in general with the content of this last e-mail.
May I ask you to (a) report and (b) continue discussing on ConnId wiki?
I have created [1] as general container and child [2] for exception management: I now need your user ids so that I can enable editing.
Regards.
[1] https://connid.atlassian.net/wiki/display/BASE/%5BDISCUSS%5D+ConnId+1.4.0.0
[2] https://connid.atlassian.net/wiki/display/BASE/Exception+Management
Hi,
I agree with Radovan. Keep the discussion here and put the consensus in wiki or source code.
Hi,
I propose another little enhancement that could be convenient when it comes
to configuration UIs and Glossary for connectors:
Add a "description" string property to the AttributeInfo meta data. Quite often (think about SAP for example)
attribute name is not really helpful. Need to think about I18N and l10N as well...
WDYT?
On 21/08/2013 17:36, Gael Allioux wrote:
Hi,
I propose another little enhancement that could be convenient when it comes
to configuration UIs and Glossary for connectors:
Add a "description" string property to the AttributeInfo meta data. Quite often (think about SAP for example)
attribute name is not really helpful. Need to think about I18N and l10N as well...
WDYT?
+1
Regards.
-- Francesco Chicchiriccò ASF Member, Apache Syncope PMC chair, Apache Cocoon PMC Member http://people.apache.org/~ilgrosso/