Wednesday, December 30, 2015

SharePoint Emails

Send email per https://www.collaboris.com/blogs/collaboris-blog/mark-jones/2012/11/06/code-sample-how-to-programmatically-send-an-email-in-sharepoint#.VoH5A_krLak or using straight smtpclient per http://sharepoint.stackexchange.com/questions/98192/issue-when-setting-from-in-the-sputility-sendemail. In the end used this: http://www.sharepointbriefing.com/spcode/article.php/3840566/How-To-Send-Email-with-SPUtility.htm slightly modified:

        private static Boolean SendEmail(SPWeb web, string email, string subject, string body)
        {
            try
            {
                bool flag = false;
                SPSecurity.RunWithElevatedPrivileges(
                  delegate ()
                  {
                              flag = SPUtility.SendEmail(web, true, true,
                                             email,
                                             subject,
                                             body);
                  });
                return flag;
            }
            catch (System.Exception exp)
            {
                // Do some error logging
                return false;
            }
        }


SharePoint 2013 List Item Receiver Test and Deploy

Create a test list item event receiver per http://onceinawhilescribble.blogspot.com/2013/05/creating-simple-event-receiver-in.html
hit F5 or debug it to be sure it works as expected.
Deployment:
Right-click project node in Solution Explorer and choose publish.
Follow http://jaxsharepoint.blogspot.com/2013/06/deploying-wsp-to-sharepoint-2013.html and http://sharepoint.stackexchange.com/questions/140592/create-wsp-package-in-visual-studio-2013
to deploy the WSP to local server.


PS C:\Users\user1\Documents> add-spsolution "C:\Users\user1\Documents\SharePointProject1.wsp"

Name                           SolutionId                           Deployed
----                           ----------                           --------
sharepointproject1.wsp         51fbac1e-e23f-4dc4-a8c7-a9190577b206 False


PS C:\Users\user1\Documents> install-spsolution -identity "sharepointproject1.wsp" -gacdeployment
PS C:\Users\user1\Documents>

Verify sharepointproject1.wsp shows as deployed in http://myserver/_admin/Solutions.aspx
Get GUID of new feature, using this method http://iamprogrammerdotnet.blogspot.com/2012/03/enabledisable-feature-sharepoint-2010.html
or rename .wsp to .cab, extract the Feature.xml and copy the guid from the id attribute of the Feature element. Then enable the feature:
PS C:\Users\user1\Documents> enable-spfeature -identity "046347fa-aa0b-4a29-846e-eff84970a4fb" -url http://myserver/sites/teamsitecol1/

Verify it's activated in http://myserver/sites/teamsitecol1/_layouts/15/ManageFeatures.aspx and that it still works by creating new item in DocumentLog when adding item to target list.

In Visual Studio make small change to output that gets added to new list item. Do a "publish" as before. Then update the solution:
PS C:\Users\user1\Documents> update-spsolution -identity "sharepointproject1.wsp" -gacdeployment -literalpath "C:\Users\user1\Documents\sharepointproject1.wsp"
Repeat test and make sure new change is reflected.

Noticed I needed to rename the feature so that it uses a non-default name as shown in http://myserver/sites/teamsitecol1/_layouts/15/ManageFeatures.aspx

In Visual Studio, expand the feature and open the xml file; add an attribute called "Title" e.g. Title="My Feature" to the Feature element.

Then disable the feature in http://myserver/sites/teamsitecol1/_layouts/15/ManageFeatures.aspx and retract the existing solution from the SharePoint 2013 Management Shell:
uninstall-spsolution -identity "sharepointproject1.wsp"
remove-spsolution -identity "sharepointproject1.wsp" -force -confirm:$false

Then redploy as before.

Monday, December 28, 2015

SharePoint Outgoing Email to Exchange

Setting up SharePoint 2013 single-server farm to connect to Exchange 2016.

After installing prerequisites in a new Windows Server 2012 R2 (and installing all available windows updates after installation failed first time) per https://technet.microsoft.com/EN-US/library/bb125224(v=exchg.160).aspx run Setup.exe per https://technet.microsoft.com/EN-US/library/bb124778(v=exchg.160).aspx

Needed to run setup.exe a few times due to failures connecting to the domain controller, each time it would pick up where it left off.

After a final reboot, open Exchange Management Shell from all apps.
To get the autodiscover.xml do:
Get-ClientAccessService | fl AutoDiscoverServiceInternalUri
for OWA and ECP check the servers / virtual directories tab in Exchange Administrative Center from all apps AKA 'ecp'
In ECP you can also add mail boxes from the recipients tab.

Found out the frequent disconnects to the server could be fixed by changing the connection on the DC to wired from wireless.
Trying to figure out why outlook wouldn't connect. Tried https://myfqdnexchange/Autodiscover/Autodiscover.xml but got an error about "Could not load file or assembly ‘Microsoft.Exchange.Security'"
Taking a cue from https://exchangeranger.wordpress.com/2015/06/12/exchange-2013-cu8-application-event-warning-1310-microsoft-exchange-security-assembly/ copied SharedWebConfig.config from C:\Program Files\Microsoft\Exchange Server\V15\FrontEnd\HttpProxy to C:\Program Files\Microsoft\Exchange Server\V15\ClientAccess
Then it gave me a 600 error which is actually indicative that everything is working! And sure enough, able to auto connect through Outlook (after deleting the corrupted profile from previous attempts from control panel, mail).
Note: I was able to connect from Outlook 2016. I added a host file entry with autodiscover.mydomain.com x.x.x.x but I'm not sure if that was necessary. Regardless I couldn't connect from Outlook 2013 (coudn't find server). But I was able to connect to owa via https://servername.mydomain.com/owa.


Then followed: http://sharepointgeorge.com/2010/configuring-outgoing-email-sharepoint-2010/
For the receiver connector selected "Frontend Transport" instead of Hub Transport because I heard on https://www.youtube.com/watch?v=73UBX_oJfgk that the latter is buggy.
For the CA Outgoing E-mail settings part, following https://alinimer.wordpress.com/2014/09/25/configure-outgoing-e-mail-for-sharepoint-20102013-to-using-office-365-or-gmail-relay/ instead, i.e. will relay through local SMTP server service (which is set in Services to start automatically), this is in case I wish to ditch Exchange and go with gmail in the future. For outbound security part, I will leave anonymous for now to connect to Exchange. So for Outbound Connections leave at port 25 (Exchange). For smart host, entered the FQDN of the Exchange server. For SMTP E-mail setting in IIS part, checked "Use localhost" box instead of entering the FQDN of the local server.

Set up an email address for a test user: Application Management, Manage Service Applications, User Profile Service Application, Manage User Profiles and add the test user's exchange email as the Work email property. Had to wait around 1/2 hour before it would show up as the test user's email under "Send me alerts by:" in the tasks list "New Alert" screen. Thought about enabling AD synchronization but it looked to complicated and outside of scope of this lab. Verified alert was sent to test user upon test user creating alert and task created. Couldn't do the "Send e-mail when ownership is assigned" test because apparently that feature was removed from SharePoint 2013, see http://sharepoint.stackexchange.com/questions/65056/send-email-when-ownership-is-assigned-due-date-functionality.

Followed https://technet.microsoft.com/en-us/library/jj657457(v=exchg.160).aspx to allow sending to non-exchange email addresses associated with user profiles in SharePoint.

Thursday, December 17, 2015

Spring Test plus Mockito

Testing a @RestController running in Spring Boot that calls a service and returns a file stream. To unit test it relied on Spring Test plus Mockito almost exactly as described here http://webcache.googleusercontent.com/search?q=cache:qcBgvzvFo7AJ:www.luckyryan.com/2013/08/24/unit-test-controllers-spring-mvc-test/+&cd=2&hl=en&ct=clnk&gl=us original page works now: http://www.luckyryan.com/2013/08/24/unit-test-controllers-spring-mvc-test/

The method under test returns a wrapped inputstream as shown here: http://stackoverflow.com/a/26537519/2066936
Mocked inputstream as shown here: http://stackoverflow.com/a/6371858

Sunday, October 4, 2015

SharePoint API Research

Seeing whether SharePoint 2013 supports creating related entries by doing the following from the OData 2 spec:
Alternatively a client can create and Link an Entry to a related Entry by leveraging the addressing scheme if the server supports addressing related items. For example, if a server implements the OData URI conventions described in [OData-URI], the address …/Categories(10)/Products points at all the products in the specified category. When a POST request is issued against that products collection (instead of the top-level products collection) the server will create the new product Entry and automatically Link it to the parent category. Clients may combine this method and the previous one to create an Entry that is related to another one implicitly through the relationship implied in the URL, and related to other Entries by explicitly-specified Links in the request body.
http://www.odata.org/documentation/odata-version-2-0/operations/

Thursday, June 25, 2015

Tomcat on OpenShift

Basically needed a testing/learning environment for Spring because doing Spring on JBoss is too cumbersome for me.

Followed a combination of:
https://blog.openshift.com/free-apache-tomcat-hosting-in-the-cloud-for-java-applications-its-called-openshift/
https://blog.openshift.com/how-to-run-apache-tomcat-8-on-openshift/
Did for Tomcat 7. The latter describes the correct env var to use: OPENSHIFT_DIY_IP

Added a user to tomcat-users.xml per the first link so that I could access the manager app. Uploaded a test war (taken from http://www.michael-thomas.com/tech/apache/tomcat/tutorial_firststeps_tomcat/) and verified the application loads.

Friday, March 13, 2015

Grizzly scanning JAX-RS Providers?

Spent half a day troubleshooting issue where Jersey serialization was not working; evidently my RuntimeTypeAdapterFactory that was supposed to be registered as a GSON adapter -- through the following registration path: RuntimeTypeAdapterFactory --> javax.ws.rs.ext.MessageBodyWriter<Object> --> org.glassfish.jersey.client.ClientConfig --> org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory -- wasn't evidently since breakpoints in the MessageBodyWriter weren't getting hit. I was working in Eclipse and had set the project as a higher order dependency via both the project "Order and Export" and the run configuration classpath. Still SOME MessageBodyWriter was registered since I saw its log4j debug output. The funny thing is that the breakpoint in my development MessageBodyWriter was getting hit in the constructor, but not the writeTo method. So that tells me both classes -- the old one and the new one (in a different package) were getting loaded into the classpath and mine was definitely getting created and registered per the above registration path. Could the issue be due to caching? No. Tried clean project, restart Eclipse, etc. Then I started fiddling with the registration path, inserting a test writer from another package. This time that test writer produced writeTo output. But switching back to my desired dev version did not "reset" any cache whether Grizzly or Jersey if there is such a thing. I did not see my dev version getting hit. Then I deleted the test version AND moved the dev version of the MessageBodyWriter to the same project as the Grizzly server and that did the trick. This was inherited code and I started looking at it for clues as to the explanation. Being new to Jersey and JAX-RS I hadn't noticed that one of the annotations on the MessageBodyWriter was @javax.ws.rs.ext.Provider. A quick google search for GSON Jersey integration took me to the following blog http://eclipsesource.com/blogs/2012/11/02/integrating-gson-into-a-jax-rs-based-application/ where it explains that the server scans for @Providers to use. Sure enough, removing the @Provider annotation on the test MessageBodyWriter caused it to not replace my target MessageBodyWriter. So evidently Grizzly tries to behave like a JEE container and scans like one or perhaps it's just following spec (but if it were, then it should have at least produced a warning I believe). Either way, moral of the story is, if you are registring a provider with Grizzly manually via some programmatic registration path such as the one above, DO NOT annotate the providers with @Provider or else you won't know which one is actually being used to do the serialization at runtime!