diff --git a/connector-scim2/pom.xml b/connector-scim2/pom.xml
index 8b7c46f..b924a7e 100644
--- a/connector-scim2/pom.xml
+++ b/connector-scim2/pom.xml
@@ -27,7 +27,7 @@
edu.unc.polygon
connector-scim2
- .1-SNAPSHOT
+ .2-SNAPSHOT
jar
Scim2 Connector
diff --git a/connector-scim2/src/main/java/edu/unc/polygon/connector/scim2/Scim2Connector.java b/connector-scim2/src/main/java/edu/unc/polygon/connector/scim2/Scim2Connector.java
index 73f4615..3f2312d 100644
--- a/connector-scim2/src/main/java/edu/unc/polygon/connector/scim2/Scim2Connector.java
+++ b/connector-scim2/src/main/java/edu/unc/polygon/connector/scim2/Scim2Connector.java
@@ -57,6 +57,7 @@
import java.io.IOException;
import java.lang.Object;
import java.util.Base64;
+import java.time.LocalDateTime;
import com.evolveum.polygon.rest.AbstractRestConnector;
@@ -65,7 +66,7 @@
*
*/
@ConnectorClass(displayNameKey = "connector.federation.manager.display", configurationClass = Scim2Configuration.class)
-public class Scim2Connector extends AbstractRestConnector implements TestOp, SchemaOp, Connector, SearchOp {
+public class Scim2Connector extends AbstractRestConnector implements TestOp, SchemaOp, Connector, SearchOp, SyncOp {
private static final Log LOG = Log.getLog(Scim2Connector.class);
private static final String ATTR_ID = "id"; //__UID__
@@ -198,6 +199,144 @@ public FilterTranslator createFilterTranslator(ObjectClass oc, Oper
return new Scim2FilterTranslator();
}
+ @Override
+ public SyncToken getLatestSyncToken(ObjectClass objectClass) {
+ return new SyncToken(LocalDateTime.now().toString() + "Z");
+ }
+
+ @Override
+ public void sync(ObjectClass oc, SyncToken fromToken, SyncResultsHandler handler, OperationOptions oo) {
+ if (fromToken == null) {
+ fromToken = getLatestSyncToken(oc);
+ }
+ LOG.info("starting sync");
+ LOG.info("ObjectClass.ACCOUNT_NAME is " + ObjectClass.ACCOUNT_NAME);
+ LOG.info("sync ObjectClass is " + oc.getObjectClassValue() + "--");
+ LOG.info("fromToken value is " + fromToken);
+ String Scim2Attributes = "";
+ String Scim2ExcludedAttributes = "";
+ String Scim2Filter = "";
+ String Scim2SortBy = "";
+ String Scim2SortOrder = "";
+ String Scim2StartIndex = "0";
+ String Scim2Count = "2000";
+ /* if (configuration.getScim2Attributes() != null && !StringUtil.isEmpty(configuration.getScim2Attributes())) {
+ Scim2Attributes = "attributes=" + configuration.getScim2Attributes();
+ }
+ if (configuration.getScim2ExcludedAttributes() != null && !StringUtil.isEmpty(configuration.getScim2ExcludedAttributes())) {
+ Scim2ExcludedAttributes = "excludedAttributes=" + configuration.getScim2ExcludedAttributes();
+ }
+ if (configuration.getScim2Filter() != null && !StringUtil.isEmpty(configuration.getScim2Filter())) {
+ Scim2Filter = "filter=" + configuration.getScim2Filter();
+ }
+ if (configuration.getScim2SortBy() != null && !StringUtil.isEmpty(configuration.getScim2SortBy())) {
+ Scim2SortBy = "sortBy=" + configuration.getScim2SortBy();
+ }
+ if (configuration.getScim2SortOrder() != null && !StringUtil.isEmpty(configuration.getScim2SortOrder())) {
+ Scim2SortOrder = "sortOrder=" + configuration.getScim2SortOrder();
+ }*/
+ if (configuration.getScim2StartIndex() != null && !StringUtil.isEmpty(configuration.getScim2StartIndex())) {
+ Scim2StartIndex = "startIndex=" + configuration.getScim2StartIndex();
+ }
+ if (configuration.getScim2Count() != null && !StringUtil.isEmpty(configuration.getScim2Count())) {
+ Scim2Count = "count=" + configuration.getScim2Count();
+ }
+ //Integer pagedResultsOffset = oo.getPagedResultsOffset();
+ Integer startIndex = new Integer(Scim2StartIndex);
+ String parameters = "";
+ if (!StringUtil.isEmpty(configuration.getScim2Attributes())) {
+ parameters = "&attributes=" + configuration.getScim2Attributes();
+ }
+ if (!StringUtil.isEmpty(configuration.getScim2ExcludedAttributes())) {
+ parameters = parameters + "&excludedAttributes=" + configuration.getScim2ExcludedAttributes();
+ }
+ if (!StringUtil.isEmpty(configuration.getScim2Filter())) {
+ parameters = parameters + "&filter=" + configuration.getScim2Filter() + "and (meta.created gt %22" + fromToken + "%22 or onyen.expirationDate gt %22" + fromToken + "%22)";
+ }
+ else {
+ parameters = parameters + "&filter=" + "meta.created gt %22" + fromToken + "%22 or onyen.expirationDate gt %22" + fromToken + "%22";
+ }
+ if (!StringUtil.isEmpty(configuration.getScim2SortBy())) {
+ parameters = parameters + "&sortBy=" + configuration.getScim2SortBy();
+ }
+ if (!StringUtil.isEmpty(configuration.getScim2SortOrder())) {
+ parameters = parameters + "&sortOrder=" + configuration.getScim2SortOrder();
+ }
+ LOG.info("Parameters for sync searcch are " + parameters);
+ boolean morePages = true;
+ while ( morePages ) {
+ try {
+ CloseableHttpClient client = HttpClients.createDefault();
+ HttpRequestBase restGet;
+ restGet = new HttpGet(configuration.getServiceAddress() + "/scim/v2/onyen/Users/?startIndex=" + Scim2StartIndex + "&count=" + Scim2Count + parameters );
+ authHeader(restGet);
+ //CloseableHttpResponse getResponse = client.execute(restGet);
+ //processResponseErrors(getResponse);
+ JSONObject searchResponseJson = new JSONObject();
+ searchResponseJson = callRequest(restGet);
+ FileWriter file9 = new FileWriter("/tmp/file9.txt");
+ file9.write(searchResponseJson.toString());
+ System.out.println("Successfully Copied JSON Object to File...");
+ System.out.println("\nJSON Object: " + searchResponseJson);
+ file9.flush();
+ file9.close();
+ JSONArray peopleArray = new JSONArray();
+ if ( searchResponseJson.has("Resources") && searchResponseJson.get("Resources") != null ) {
+ peopleArray = searchResponseJson.getJSONArray("Resources");
+ Integer Scim2CountInteger = new Integer(Scim2Count);
+ if ( peopleArray.length() < Scim2CountInteger ) {
+ morePages = false;
+ }
+ else {
+ startIndex = startIndex + Scim2CountInteger;
+ Scim2StartIndex = startIndex.toString();
+ }
+ for ( int i = 0; i < peopleArray.length(); i++ ) {
+ JSONObject personJson = peopleArray.getJSONObject(i);
+ LOG.info(">>> processing ID " + i);
+ //handleUserId( handler, personJson );
+ SyncDeltaBuilder builder = new SyncDeltaBuilder();
+ builder.setDeltaType(SyncDeltaType.CREATE_OR_UPDATE);
+ builder.setObjectClass(ObjectClass.ACCOUNT);
+ builder.setToken(fromToken);
+ LOG.info("Building sync connector object for " + String.valueOf(personJson.getString(ATTR_ID)));
+ ConnectorObjectBuilder objectBuild = new ConnectorObjectBuilder();
+ objectBuild.setUid(new Uid(String.valueOf(personJson.getString(ATTR_ID))));
+ String [] potentialAttributes = { ATTR_ID, ATTR_EXTERNAL_ID, ATTR_USER_NAME, ATTR_ACTIVE};
+ for ( String potentialAttribute: potentialAttributes ) {
+ LOG.info(">>> checking for attribute " + potentialAttribute );
+ if ( personJson.has(potentialAttribute) && personJson.get(potentialAttribute) != null && !JSONObject.NULL.equals(personJson.get(potentialAttribute)) ) {
+ LOG.info(">>> found attribute " + potentialAttribute );
+ if ( potentialAttribute.equals(ATTR_USER_NAME) ) {
+ //builder.setName(attributes.getString(potentialAttribute));
+ objectBuild.setName(personJson.getString(ATTR_USER_NAME));
+ }
+ if ( potentialAttribute.equals(ATTR_ID) ) {
+ objectBuild.setUid(personJson.getString(ATTR_ID));
+ }
+ if ( potentialAttribute.equals(ATTR_ACTIVE) ) {
+ addAttr(objectBuild, potentialAttribute, personJson.getBoolean(potentialAttribute));
+ }
+ else {
+ addAttr(objectBuild, potentialAttribute, personJson.getString(potentialAttribute));
+ }
+ }
+ }
+ ConnectorObject connectorObject = objectBuild.build();
+ builder.setObject(connectorObject);
+ handler.handle(builder.build());
+ }
+ }
+ else {
+ LOG.info("No data object found in response");
+ }
+
+ } catch (IOException IOE) {
+ throw new ConnectorIOException(IOE.getMessage(), IOE);
+ }
+ }
+ }
+
@Override
public void executeQuery(ObjectClass oc, Scim2Filter filter, ResultsHandler handler, OperationOptions oo) {
LOG.info("starting executeQuery");
@@ -209,7 +348,7 @@ public void executeQuery(ObjectClass oc, Scim2Filter filter, ResultsHandler hand
String Scim2SortBy = "";
String Scim2SortOrder = "";
String Scim2StartIndex = "0";
- String Scim2Count = "200";
+ String Scim2Count = "2000";
if (configuration.getScim2Attributes() != null && !StringUtil.isEmpty(configuration.getScim2Attributes())) {
Scim2Attributes = "attributes=" + configuration.getScim2Attributes();
}