/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 com.mycompany;
import io.milton.common.Path;
import io.milton.http.ResourceFactory;
import io.milton.http.values.HrefList;
import io.milton.resource.OAuth2Provider;
import io.milton.resource.OAuth2ProviderBean;
import io.milton.resource.Resource;
import java.util.Arrays;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* For iCal, start off by opening a calendar at
*
* http://localhost:8080/users/userA/ - iCal will discover the calendar inside
* that user.
*
* For Mozilla clients (eg thunderbird) connect directly to the calendar url,
* eg
*
* http://localhost:8080/users/userA/calendars/cal1/
*
* @author brad
*/
public class TResourceFactory implements ResourceFactory {
private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(TResourceFactory.class);
public final static Map<String, OAuth2Provider> mapOfOauthProviders = new HashMap<String, OAuth2Provider>();
public static final TFolderResource ROOT = new TFolderResource((TFolderResource) null, "http://localhost:8080");
static TFolderResource users;
static TFolderResource principals;
static {
principals = new TFolderResource(ROOT, "p");
users = principals; // same as sabresav demo
//users = new TFolderResource( principals, "users" );
addUser(users, "userA", "password", "userA@somewhere.com", "ACME", "555 1111");
addUser(users, "userB", "password", "userB@somewhere.com", "ACME", "555 1121");
addUser(users, "userC", "password", "userC@somewhere.com", "ACME", "555 1131");
List<String> fbScopes = Arrays.asList("email");
OAuth2Provider p = new OAuth2ProviderBean("fb",
"https://graph.facebook.com/oauth/authorize",
"131804060198305",
"3acb294b071c9aec86d60ae3daf32a93",
"http://localhost:8080/",
"https://graph.facebook.com/oauth/access_token",
"https://graph.facebook.com/me",
fbScopes);
mapOfOauthProviders.put("fb", p);
List<String> googleScopes = Arrays.asList( "profile");
p = new OAuth2ProviderBean(
"google", // our internal ID
"https://accounts.google.com/o/oauth2/auth", // authorisation url
"22595264249-rs4r73t1qk345tn8u75p9qt3lsf3qv2n.apps.googleusercontent.com", // client ID
"8GCs-I-LLqxi8UkTQ0qHbYAv", // client secret
"http://localhost:8080/", // return url
"https://www.googleapis.com/oauth2/v3/token", // URL to call to get an access token from an access code
"https://www.googleapis.com/plus/v1/people/me", // URL to call to get profile information
googleScopes
);
mapOfOauthProviders.put("google", p);
}
public static TCalDavPrincipal getUser(String name) {
return (TCalDavPrincipal) users.child(name);
}
public static TCalDavPrincipal addUser(TFolderResource users, String name, String password, String email, String org, String phone) {
TCalDavPrincipal user = new TCalDavPrincipal(users, name, password, null, null, null);
user.setGivenName("joe");
user.setSurName("blogs" + users.children.size());
user.setMail(email);
user.setOrganizationName(org);
user.setTelephonenumber(phone);
TFolderResource files = new TFolderResource(user, "files");
TFolderResource calendars = new TFolderResource(user, "calendars");
TCalendarResource cal1 = new TCalendarResource(calendars, "cal1");
TEvent e = new TEvent(cal1, "event1.ics");
e.setiCalData(createICalData());
TFolderResource addressBooks = new TFolderResource(user, "abs");
user.setAddressBookHome(addressBooks);
TAddressBookResource addressBook1 = new TAddressBookResource(addressBooks, "addressbook");
//System.out.println("created address book: " + addressBook1.getHref());
addContact(addressBook1, "ed@blah.com", "ed", "ward", "111 222 333", "contact1.vcf");
addContact(addressBook1, "sam@blah.com", "sam", "smith", "111 222 444", "contact2.vcf");
addContact(addressBook1, "john@blah.com", "john", "long", "111 222 555", "contact3.vcf");
user.setCalendarHome(calendars);
return user;
}
private static void addContact(TAddressBookResource ab, String email, String givenName, String surName, String phone, String filename) {
TContact c1 = new TContact(ab, filename);
c1.setData(getCardDavData(givenName, surName, phone, email));
}
public static TCalDavPrincipal findUser(String name) {
if (name.contains("@")) {
name = name.substring(0, name.indexOf("@"));
}
System.out.println("find user:" + name);
for (Resource r : users.children) {
if (r.getName().equals(name)) {
return (TCalDavPrincipal) r;
}
}
return null;
}
static HrefList getPrincipalCollectionHrefs() {
HrefList list = new HrefList();
list.add("/users/");
return list;
}
@Override
public Resource getResource(String host, String url) {
log.debug("getResource: url: " + url);
Path path = Path.path(url);
Resource r = find(path);
log.debug("_found: " + r + " for url: " + url + " and path: " + path);
return r;
}
private Resource find(Path path) {
if (path.isRoot()) {
return ROOT;
}
Resource rParent = find(path.getParent());
if (rParent == null) {
return null;
}
if (rParent instanceof TFolderResource) {
TFolderResource folder = (TFolderResource) rParent;
for (Resource rChild : folder.getChildren()) {
if (rChild.getName().equals(path.getName())) {
return rChild;
}
}
log.warn("Resource: " + path.getName() + " not found in collection: " + path.getParent() + " of type: " + rParent.getClass());
} else {
if (rParent != null) {
log.warn("parent is not a folder: " + path.getParent() + " is a: " + rParent.getClass());
} else {
log.warn("parent not found: " + path.getParent());
}
}
return null;
}
public List<Resource> getUsers() {
System.out.println("TResourcEFactory: " + users.children);
return users.children;
}
public static String createICalData() {
Calendar cal = Calendar.getInstance();
String start = format(cal);
cal.add(Calendar.HOUR, 2);
String finish = format(cal);
String s = "";
s += "BEGIN:VCALENDAR\n";
s += "PRODID:-//MailEnable.com MailEnable Calendar V1.1//EN\n";
s += "VERSION:2.0\n";
s += "METHOD:PUBLISH\n";
s += "BEGIN:VTIMEZONE\n";
s += "TZID:America/New_York\n";
s += "X-LIC-LOCATION:America/New_York\n";
s += "BEGIN:DAYLIGHT\n";
s += "TZOFFSETFROM:-0500\n";
s += "TZOFFSETTO:-0400\n";
s += "TZNAME:EDT\n";
s += "DTSTART:19700308T020000\n";
s += "RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3\n";
s += "END:DAYLIGHT\n";
s += "BEGIN:STANDARD\n";
s += "TZOFFSETFROM:-0400\n";
s += "TZOFFSETTO:-0500\n";
s += "TZNAME:EST\n";
s += "DTSTART:19701101T020000\n";
s += "RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11\n";
s += "END:STANDARD\n";
s += "END:VTIMEZONE\n";
s += "BEGIN:VEVENT\n";
s += "CREATED:20091113T212858Z\n";
s += "LAST-MODIFIED:20090814T231840Z\n";
s += "DTSTAMP:20090814T231840Z\n";
s += "UID:0C4DBFA762A44E359A373562C9DE463A.CAL\n";
s += "SUMMARY:consona\n";
s += "PRIORITY:5\n";
s += "ORGANIZER:mailto:vvvvv@zzzz.com\n";
s += "DTSTART:" + start + "\n";
s += "DTEND:" + finish + "\n";
s += "CLASS:PUBLIC\n";
s += "TRANSP:OPAQUE\n";
s += "SEQUENCE:0\n";
s += "X-MICROSOFT-CDO-ALLDAYEVENT:FALSE\n";
s += "X-MICROSOFT-CDO-IMPORTANCE:0\n";
s += "X-MICROSOFT-CDO-BUSYSTATUS:1\n";
s += "END:VEVENT\n";
s += "END:VCALENDAR\n";
return s;
}
private static String getCardDavData(String givenName, String surName, String phone, String email) {
String s = "";
s += "BEGIN:VCARD\n";
s += "VERSION:3.0\n";
s += "N:" + givenName + ";" + surName + ";;;\n";
s += "FN:" + givenName + " " + surName + "\n";
s += "TEL;type=WORK;type=pref:" + phone + "\n";
s += "ADR;type=WORK;type=pref;LABEL=\"42 Plantation St.\nBaytown, LA 30314\nUnited States of America\"\n";
s += "EMAIL:" + email + "\n";
s += "UID:95490BEA-5793-4E3B-8788-054C8B394F68-ABSPlugin\n";
s += "REV:2011-12-15T01:04:25Z\n";
s += "END:VCARD\n";
return s;
}
private static String format(Calendar cal) {
// "20090820T180000Z";
String s = "" + cal.get(Calendar.YEAR);
s += pad2(cal.get(Calendar.MONTH) + 1);
s += pad2(cal.get(Calendar.DATE));
s += "T";
s += pad2(cal.get(Calendar.HOUR_OF_DAY));
s += pad2(cal.get(Calendar.MINUTE));
s += pad2(cal.get(Calendar.SECOND));
s += "Z";
return s;
}
private static String pad2(int i) {
if (i < 10) {
return "0" + i;
} else {
return i + "";
}
}
}