Skip to content

Commit

Permalink
Added sync capability to connector
Browse files Browse the repository at this point in the history
  • Loading branch information
ethan committed May 21, 2020
1 parent e829445 commit 3589081
Show file tree
Hide file tree
Showing 2 changed files with 142 additions and 3 deletions.
2 changes: 1 addition & 1 deletion connector-scim2/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@

<groupId>edu.unc.polygon</groupId>
<artifactId>connector-scim2</artifactId>
<version>.1-SNAPSHOT</version>
<version>.2-SNAPSHOT</version>
<packaging>jar</packaging>

<name>Scim2 Connector</name>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -65,7 +66,7 @@
*
*/
@ConnectorClass(displayNameKey = "connector.federation.manager.display", configurationClass = Scim2Configuration.class)
public class Scim2Connector extends AbstractRestConnector<Scim2Configuration> implements TestOp, SchemaOp, Connector, SearchOp<Scim2Filter> {
public class Scim2Connector extends AbstractRestConnector<Scim2Configuration> implements TestOp, SchemaOp, Connector, SearchOp<Scim2Filter>, SyncOp {

private static final Log LOG = Log.getLog(Scim2Connector.class);
private static final String ATTR_ID = "id"; //__UID__
Expand Down Expand Up @@ -198,6 +199,144 @@ public FilterTranslator<Scim2Filter> 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");
Expand All @@ -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();
}
Expand Down

0 comments on commit 3589081

Please sign in to comment.