diff --git a/connector-federation-manager/pom.xml b/connector-federation-manager/pom.xml
new file mode 100644
index 0000000..be0ee68
--- /dev/null
+++ b/connector-federation-manager/pom.xml
@@ -0,0 +1,94 @@
+
+
+
+ 4.0.0
+
+
+ polygon
+ com.evolveum.polygon
+ 1.5.0.0
+
+
+ edu.unc.polygon
+ connector-federation-manager
+ .1-SNAPSHOT
+ jar
+
+ Federation Manager Connector
+
+
+ edu.unc.polygon.connector.federationManager
+ FederationManagerConnector
+
+
+
+
+ evolveum-nexus-releases
+ Internal Releases
+ http://nexus.evolveum.com/nexus/content/repositories/releases/
+
+
+ evolveum-nexus-snapshots
+ Internal Releases
+ http://nexus.evolveum.com/nexus/content/repositories/snapshots/
+
+
+ apache-snapshots
+ Apache Snapshots
+ http://repository.apache.org/snapshots/
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ org.apache.maven.plugins
+ maven-resources-plugin
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+
+
+
+
+ connector-rest
+ com.evolveum.polygon
+ 1.4.2.14-SNAPSHOT
+
+
+ org.json
+ json
+ 20190722
+
+
+
+
+
+
diff --git a/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerConfiguration.java b/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerConfiguration.java
new file mode 100644
index 0000000..d3d3395
--- /dev/null
+++ b/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerConfiguration.java
@@ -0,0 +1,30 @@
+package edu.unc.polygon.connector.federationManager;
+
+import com.evolveum.polygon.rest.AbstractRestConfiguration;
+import org.identityconnectors.common.logging.Log;
+import org.identityconnectors.framework.common.exceptions.ConfigurationException;
+import org.identityconnectors.framework.common.objects.ObjectClass;
+import org.identityconnectors.framework.spi.AbstractConfiguration;
+import org.identityconnectors.framework.spi.ConfigurationProperty;
+
+import java.io.*;
+import java.nio.charset.Charset;
+import java.util.*;
+
+
+/**
+ * @author ekromhout@gmail.com
+ *
+ */
+public class FederationManagerConfiguration extends AbstractRestConfiguration {
+
+ private static final Log LOG = Log.getLog(FederationManagerConfiguration.class);
+
+@Override
+ public void validate() {
+ // TODO
+ }
+
+}
+
+
diff --git a/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerConnector.java b/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerConnector.java
new file mode 100644
index 0000000..083a02d
--- /dev/null
+++ b/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerConnector.java
@@ -0,0 +1,248 @@
+package edu.unc.polygon.connector.federationManager;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpRequest;
+import org.apache.http.entity.ByteArrayEntity;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpPatch;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.util.EntityUtils;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.auth.AuthenticationException;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.client.methods.*;
+import org.apache.http.annotation.NotThreadSafe;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.json.JSONException;
+import org.identityconnectors.common.Base64;
+import org.identityconnectors.common.StringUtil;
+import org.identityconnectors.framework.common.objects.ObjectClassInfoBuilder;
+import org.identityconnectors.framework.common.objects.Schema;
+import org.identityconnectors.framework.common.objects.SchemaBuilder;
+import org.identityconnectors.framework.spi.Configuration;
+import org.identityconnectors.framework.spi.Connector;
+import org.identityconnectors.framework.spi.PoolableConnector;
+import org.identityconnectors.framework.spi.ConnectorClass;
+import org.identityconnectors.framework.spi.operations.*;
+import org.identityconnectors.framework.common.exceptions.*;
+import org.identityconnectors.framework.common.exceptions.ConfigurationException;
+import org.identityconnectors.framework.common.exceptions.ConnectorException;
+import org.identityconnectors.framework.common.objects.*;
+import org.identityconnectors.common.logging.Log;
+import org.identityconnectors.common.security.GuardedString;
+import org.identityconnectors.framework.common.objects.filter.FilterTranslator;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.ArrayList;
+import java.io.*;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.lang.Object;
+
+
+import com.evolveum.polygon.rest.AbstractRestConnector;
+/**
+ * @author ethan@unc.edu
+ *
+ */
+@ConnectorClass(displayNameKey = "connector.federation.manager.display", configurationClass = FederationManagerConfiguration.class)
+public class FederationManagerConnector extends AbstractRestConnector implements TestOp, SchemaOp, PoolableConnector, SearchOp {
+
+ private static final Log LOG = Log.getLog(FederationManagerConnector.class);
+ private static final String ATTR_ID = "id"; //__UID__
+ private static final String ATTR_ORGANIZATION_ID = "organization_id";
+ public static final String ATTR_MAIL = "email";
+ public static final String ATTR_FAX_NUMBER = "faxnumber";
+ public static final String ATTR_MOBILE_NUMBER = "mobilenumber";
+ public static final String ATTR_PHONE_NUMBER = "phonenumber";
+ //public static final String ATTR_ROLES = "roles";
+ public static final String ATTR_FIRST_NAME = "firstname";
+ public static final String ATTR_LAST_NAME = "lastname";
+ public static final String ATTR_MIDDLE_NAME = "middlename";
+ public static final String ATTR_INFORMAL_NAME = "informalname";
+ public static final String ATTR_WEBSITE = "website";
+ public static final String CONTENT_TYPE = "application/json";
+
+
+ private FederationManagerConfiguration configuration;
+
+ @Override
+ public void init(Configuration configuration) {
+ LOG.info(">>> Initializing connector");
+
+ if (!(configuration instanceof FederationManagerConfiguration)) {
+ throw new ConfigurationException("Configuration is not instance of " + FederationManagerConfiguration.class.getName());
+ }
+
+ FederationManagerConfiguration wordpressConfig = (FederationManagerConfiguration) configuration;
+ wordpressConfig.validate();
+ this.configuration = wordpressConfig;
+ //super.init(configuration);
+ getConfiguration();
+ LOG.info(">>> Connector initialization finished");
+ }
+ @Override
+ public void dispose() {
+ configuration = null;
+ //handler = null;
+ }
+ @Override
+ public void test() {
+
+ }
+
+ @Override
+ public void checkAlive() {
+ test();
+ }
+
+ @Override
+ public Schema schema() {
+ SchemaBuilder schemaBuilder = new SchemaBuilder(FederationManagerConnector.class);
+ //Begin Account Objectclass
+ Set accountAttributes = new HashSet();
+ AttributeInfoBuilder id = new AttributeInfoBuilder();
+ id.setName("ATTR_ID");
+ id.setCreateable(true);
+ id.setUpdateable(true);
+ id.setReadable(true);
+ id.setRequired(true);
+ id.setMultiValued(false);
+ accountAttributes.add(id.build());
+ AttributeInfoBuilder email = new AttributeInfoBuilder();
+ email.setName("ATTR_EMAIL");
+ email.setCreateable(true);
+ email.setUpdateable(true);
+ email.setReadable(true);
+ email.setRequired(false);
+ email.setMultiValued(true);
+ accountAttributes.add(email.build());
+ AttributeInfoBuilder faxnumber = new AttributeInfoBuilder();
+ faxnumber.setName("ATTR_FAX_NUMBER");
+ faxnumber.setCreateable(true);
+ faxnumber.setUpdateable(true);
+ faxnumber.setReadable(true);
+ faxnumber.setRequired(false);
+ faxnumber.setMultiValued(false);
+ accountAttributes.add(faxnumber.build());
+ AttributeInfoBuilder firstname = new AttributeInfoBuilder();
+ firstname.setName("ATTR_FIRST_NAME");
+ firstname.setCreateable(true);
+ firstname.setUpdateable(true);
+ firstname.setReadable(true);
+ firstname.setRequired(false);
+ firstname.setMultiValued(false);
+ accountAttributes.add(firstname.build());
+ AttributeInfoBuilder informalname = new AttributeInfoBuilder();
+ informalname.setName("ATTR_INFORMAL_NAME");
+ informalname.setCreateable(true);
+ informalname.setUpdateable(true);
+ informalname.setReadable(true);
+ informalname.setRequired(false);
+ informalname.setMultiValued(false);
+ accountAttributes.add(informalname.build());
+ AttributeInfoBuilder lastname = new AttributeInfoBuilder();
+ lastname.setName("ATTR_LAST_NAME");
+ lastname.setCreateable(true);
+ lastname.setUpdateable(true);
+ lastname.setReadable(true);
+ lastname.setRequired(false);
+ lastname.setMultiValued(false);
+ accountAttributes.add(lastname.build());
+ AttributeInfoBuilder middlename = new AttributeInfoBuilder();
+ middlename.setName("ATTR_MIDDLE_NAME");
+ middlename.setCreateable(true);
+ middlename.setUpdateable(true);
+ middlename.setReadable(true);
+ middlename.setRequired(false);
+ middlename.setMultiValued(false);
+ accountAttributes.add(middlename.build());
+ AttributeInfoBuilder mobilenumber = new AttributeInfoBuilder();
+ mobilenumber.setName("ATTR_MOBILE_NAME");
+ mobilenumber.setCreateable(true);
+ mobilenumber.setUpdateable(true);
+ mobilenumber.setReadable(true);
+ mobilenumber.setRequired(false);
+ mobilenumber.setMultiValued(false);
+ accountAttributes.add(mobilenumber.build());
+ AttributeInfoBuilder organization_id = new AttributeInfoBuilder();
+ organization_id.setName("ATTR_ORGANIZATION_ID");
+ organization_id.setCreateable(true);
+ organization_id.setUpdateable(true);
+ organization_id.setReadable(true);
+ organization_id.setRequired(false);
+ organization_id.setMultiValued(false);
+ accountAttributes.add(organization_id.build());
+ AttributeInfoBuilder phonenumber = new AttributeInfoBuilder();
+ phonenumber.setName("ATTR_PHONE_NUMBER");
+ phonenumber.setCreateable(true);
+ phonenumber.setUpdateable(true);
+ phonenumber.setReadable(true);
+ phonenumber.setRequired(false);
+ phonenumber.setMultiValued(false);
+ accountAttributes.add(phonenumber.build());
+ AttributeInfoBuilder website = new AttributeInfoBuilder();
+ website.setName("ATTR_WEBSITE");
+ website.setCreateable(true);
+ website.setUpdateable(true);
+ website.setReadable(true);
+ website.setRequired(false);
+ website.setMultiValued(false);
+ accountAttributes.add(website.build());
+ accountAttributes.add(OperationalAttributeInfos.ENABLE);
+ schemaBuilder.defineObjectClass(ObjectClass.ACCOUNT.getDisplayNameKey(),accountAttributes);
+ //Finish Account Objectclass, add others before return if needed
+ LOG.info(">>> schema finished");
+ return schemaBuilder.build();
+
+
+
+ }
+
+ public FilterTranslator createFilterTranslator(ObjectClass oc, OperationOptions oo) {
+ LOG.info("inside createFilterTranslator");
+ return new FederationManagerFilterTranslator();
+ }
+
+ @Override
+ public void executeQuery(ObjectClass oc, FederationManagerFilter filter, ResultsHandler handler, OperationOptions oo) {
+ if ( oc.is(ObjectClass.ACCOUNT_NAME)) {
+ if (filter != null && filter.byUid != null) {
+ //not sure if this use case exists yet
+ }
+
+ else if (filter != null && filter.byName != null) {
+ //not sure if this use case exists yet
+ }
+
+ else if (filter != null && filter.byEmailAddress != null) {
+ //not sure if this use case exists yet
+ }
+
+ else {
+ //wide open search
+ }
+
+
+
+
+ }
+
+ }
+}
diff --git a/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerFilter.java b/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerFilter.java
new file mode 100644
index 0000000..d1028b6
--- /dev/null
+++ b/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerFilter.java
@@ -0,0 +1,19 @@
+package edu.unc.polygon.connector.federationManager;
+
+/**
+ *
+ */
+public class FederationManagerFilter {
+ public String byName;
+ public String byUid;
+ public String byEmailAddress;
+
+ @Override
+ public String toString() {
+ return "FederationManagerFilter{" +
+ "byName='" + byName + '\'' +
+ ", byUid=" + byUid +
+ ", byEmailAddress='" + byEmailAddress + '\'' +
+ '}';
+ }
+}
diff --git a/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerFilterTranslator.java b/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerFilterTranslator.java
new file mode 100644
index 0000000..0f7b56b
--- /dev/null
+++ b/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerFilterTranslator.java
@@ -0,0 +1,64 @@
+/*
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package edu.unc.polygon.connector.federationManager;
+
+import org.identityconnectors.common.logging.Log;
+import org.identityconnectors.framework.common.objects.Attribute;
+import org.identityconnectors.framework.common.objects.Name;
+import org.identityconnectors.framework.common.objects.Uid;
+import org.identityconnectors.framework.common.objects.filter.AbstractFilterTranslator;
+import org.identityconnectors.framework.common.objects.filter.EqualsFilter;
+
+/**
+ */
+public class FederationManagerFilterTranslator extends AbstractFilterTranslator {
+ private static final Log LOG = Log.getLog(FederationManagerFilterTranslator.class);
+
+ @Override
+ protected FederationManagerFilter createEqualsExpression(EqualsFilter filter, boolean not) {
+ LOG.ok("createEqualsExpression, filter: {0}, not: {1}", filter, not);
+
+ if (not) {
+ return null; // not supported
+ }
+
+ Attribute attr = filter.getAttribute();
+ LOG.ok("attr.getName: {0}, attr.getValue: {1}, Uid.NAME: {2}, Name.NAME: {3}", attr.getName(), attr.getValue(), Uid.NAME, Name.NAME);
+ if (Uid.NAME.equals(attr.getName())) {
+ if (attr.getValue() != null && attr.getValue().get(0) != null) {
+ FederationManagerFilter lf = new FederationManagerFilter();
+ lf.byUid = String.valueOf(attr.getValue().get(0));
+ LOG.ok("lf.byUid: {0}, attr.getValue().get(0): {1}", lf.byUid, attr.getValue().get(0));
+ return lf;
+ }
+ }
+ else if (Name.NAME.equals(attr.getName())) {
+ if (attr.getValue() != null && attr.getValue().get(0) != null) {
+ FederationManagerFilter lf = new FederationManagerFilter();
+ lf.byName = String.valueOf(attr.getValue().get(0));
+ return lf;
+ }
+ }
+ else if (FederationManagerConnector.ATTR_MAIL.equals(attr.getName())) {
+ if (attr.getValue() != null && attr.getValue().get(0) != null) {
+ FederationManagerFilter lf = new FederationManagerFilter();
+ lf.byEmailAddress = String.valueOf(attr.getValue().get(0));
+ return lf;
+ }
+ }
+
+ return null; // not supported
+ }
+}
diff --git a/connector-federation-manager/target/classes/edu/unc/polygon/connector/federationManager/FederationManagerConfiguration.class b/connector-federation-manager/target/classes/edu/unc/polygon/connector/federationManager/FederationManagerConfiguration.class
new file mode 100644
index 0000000..a193683
Binary files /dev/null and b/connector-federation-manager/target/classes/edu/unc/polygon/connector/federationManager/FederationManagerConfiguration.class differ
diff --git a/connector-federation-manager/target/classes/edu/unc/polygon/connector/federationManager/FederationManagerConnector.class b/connector-federation-manager/target/classes/edu/unc/polygon/connector/federationManager/FederationManagerConnector.class
new file mode 100644
index 0000000..dd91a0f
Binary files /dev/null and b/connector-federation-manager/target/classes/edu/unc/polygon/connector/federationManager/FederationManagerConnector.class differ
diff --git a/connector-federation-manager/target/classes/edu/unc/polygon/connector/federationManager/FederationManagerFilter.class b/connector-federation-manager/target/classes/edu/unc/polygon/connector/federationManager/FederationManagerFilter.class
new file mode 100644
index 0000000..17e6f92
Binary files /dev/null and b/connector-federation-manager/target/classes/edu/unc/polygon/connector/federationManager/FederationManagerFilter.class differ
diff --git a/connector-federation-manager/target/classes/edu/unc/polygon/connector/federationManager/FederationManagerFilterTranslator.class b/connector-federation-manager/target/classes/edu/unc/polygon/connector/federationManager/FederationManagerFilterTranslator.class
new file mode 100644
index 0000000..b941882
Binary files /dev/null and b/connector-federation-manager/target/classes/edu/unc/polygon/connector/federationManager/FederationManagerFilterTranslator.class differ
diff --git a/connector-federation-manager/target/connector-federation-manager-.1-SNAPSHOT.jar b/connector-federation-manager/target/connector-federation-manager-.1-SNAPSHOT.jar
new file mode 100644
index 0000000..df201b9
Binary files /dev/null and b/connector-federation-manager/target/connector-federation-manager-.1-SNAPSHOT.jar differ
diff --git a/connector-federation-manager/target/maven-archiver/pom.properties b/connector-federation-manager/target/maven-archiver/pom.properties
new file mode 100644
index 0000000..0513a05
--- /dev/null
+++ b/connector-federation-manager/target/maven-archiver/pom.properties
@@ -0,0 +1,5 @@
+#Generated by Maven
+#Fri Aug 30 09:32:14 EDT 2019
+version=.1-SNAPSHOT
+groupId=edu.unc.polygon
+artifactId=connector-federation-manager
diff --git a/connector-federation-manager/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/connector-federation-manager/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
new file mode 100644
index 0000000..8bb0bd4
--- /dev/null
+++ b/connector-federation-manager/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
@@ -0,0 +1,4 @@
+edu/unc/polygon/connector/federationManager/FederationManagerFilterTranslator.class
+edu/unc/polygon/connector/federationManager/FederationManagerConfiguration.class
+edu/unc/polygon/connector/federationManager/FederationManagerFilter.class
+edu/unc/polygon/connector/federationManager/FederationManagerConnector.class
diff --git a/connector-federation-manager/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/connector-federation-manager/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
new file mode 100644
index 0000000..80c3b97
--- /dev/null
+++ b/connector-federation-manager/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
@@ -0,0 +1,4 @@
+/home/ekromhout/src/midpoint-connectors/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerFilterTranslator.java
+/home/ekromhout/src/midpoint-connectors/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerConnector.java
+/home/ekromhout/src/midpoint-connectors/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerFilter.java
+/home/ekromhout/src/midpoint-connectors/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerConfiguration.java