0001: /*
0002: * Copyright ? 2006 Sun Microsystems, Inc. All rights reserved.
0003: *
0004: * Sun Microsystems, Inc. has intellectual property rights relating to
0005: * technology embodied in the product that is described in this document.
0006: * In particular, and without limitation, these intellectual property
0007: * rights may include one or more of the U.S. patents listed at
0008: * http://www.sun.com/patents and one or more additional patents or
0009: * pending patent applications in the U.S. and in other countries.
0010: *
0011: * U.S. Government Rights - Commercial software. Government users are subject
0012: * to the Sun Microsystems, Inc. standard license agreement and applicable
0013: * provisions of the FAR and its supplements. Use is subject to license terms.
0014: * This distribution may include materials developed by third parties.
0015: * Sun, Sun Microsystems, the Sun logo and Java are trademarks or registered
0016: * trademarks of Sun Microsystems, Inc. in the U.S. and other countries.
0017: */
0018: package com.sun.portal.app.blog.provision;
0019:
0020: import com.iplanet.sso.SSOToken;
0021: import com.iplanet.sso.SSOTokenManager;
0022: import com.iplanet.sso.SSOException;
0023: import com.sun.portal.app.blog.BlogPortletException;
0024: import com.sun.portal.app.blog.EntrySerializer;
0025: import com.sun.portal.app.blog.password.PasswordGenerator;
0026: import com.sun.portal.app.blog.Resources;
0027: import com.sun.portal.app.blog.env.AbstractSearch;
0028: import com.sun.portal.app.blog.env.PortletProvisionPrefs;
0029: import com.sun.portal.app.blog.env.Prefs;
0030: import com.sun.portal.app.blog.env.Search;
0031: import com.sun.portal.app.blog.httpverb.Delete;
0032: import com.sun.portal.app.blog.httpverb.Get;
0033: import com.sun.portal.app.blog.httpverb.Post;
0034: import com.sun.portal.app.blog.httpverb.HttpVerbException;
0035: import com.sun.portal.app.blog.httpverb.Put;
0036: import com.sun.portal.portlet.service.provision.GenericPortletProvisionListener;
0037: import com.sun.portal.portlet.service.provision.PortletProvisionEvent;
0038: import com.sun.portal.portlet.service.provision.PortletProvisionException;
0039: import com.sun.portal.community.CommunityId;
0040: import com.sun.syndication.feed.atom.Content;
0041: import com.sun.syndication.feed.atom.Entry;
0042: import com.sun.syndication.feed.atom.Feed;
0043: import com.sun.syndication.feed.atom.Link;
0044: import com.sun.syndication.io.FeedException;
0045: import com.sun.syndication.io.WireFeedInput;
0046: import java.io.ByteArrayInputStream;
0047: import java.io.IOException;
0048: import java.io.InputStream;
0049: import java.io.UnsupportedEncodingException;
0050: import java.net.MalformedURLException;
0051: import java.net.URL;
0052: import java.text.MessageFormat;
0053: import java.util.Collections;
0054: import java.util.Iterator;
0055: import java.util.List;
0056: import java.util.Locale;
0057: import java.util.Set;
0058: import java.util.TimeZone;
0059: import java.util.HashSet;
0060: import javax.servlet.http.HttpServletRequest;
0061: import javax.servlet.http.HttpServletResponse;
0062: import org.jdom.JDOMException;
0063: import org.apache.roller.webservices.adminapi.sdk.MemberEntry;
0064: import org.apache.roller.webservices.adminapi.sdk.MemberEntrySet;
0065: import org.apache.roller.webservices.adminapi.sdk.UnexpectedRootElementException;
0066: import org.apache.roller.webservices.adminapi.sdk.UserEntry;
0067: import org.apache.roller.webservices.adminapi.sdk.UserEntrySet;
0068: import org.apache.roller.webservices.adminapi.sdk.WeblogEntry;
0069: import org.apache.roller.webservices.adminapi.sdk.WeblogEntrySet;
0070: import org.xml.sax.InputSource;
0071:
0072: public class BlogProvisioningListener extends
0073: GenericPortletProvisionListener {
0074: private static AbstractSearch search = AbstractSearch.getInstance();
0075:
0076: public void init(javax.portlet.PortletContext context)
0077: throws PortletProvisionException {
0078: super .init(context);
0079: }
0080:
0081: public void handleProvisionEvent(PortletProvisionEvent event)
0082: throws PortletProvisionException {
0083: if (event.getType() == PortletProvisionEvent.EVENT_TYPE_CREATED) {
0084: doCreate(event);
0085: } else if (event.getType() == PortletProvisionEvent.EVENT_TYPE_DESTROYED) {
0086: doPurge(event, true, true, true);
0087: } else if ((event.getType() == PortletProvisionEvent.EVENT_TYPE_UNDELETED)
0088: || (event.getType() == PortletProvisionEvent.EVENT_TYPE_ENABLED)) {
0089: doEnable(event);
0090: } else if ((event.getType() == PortletProvisionEvent.EVENT_TYPE_DELETED)
0091: || (event.getType() == PortletProvisionEvent.EVENT_TYPE_DISABLED)) {
0092: doDisable(event);
0093: }
0094: }
0095:
0096: public void doCreate(PortletProvisionEvent ppe)
0097: throws PortletProvisionException {
0098: boolean weblogCreated = false;
0099: boolean userCreated = false;
0100: boolean prefsSet = false;
0101:
0102: try {
0103: ppe.getHttpServletRequest().getSession().invalidate();
0104:
0105: // grab this and hold onto it, we'll need it in a couple of place
0106: String pw = getWeblogUserPassword(ppe);
0107:
0108: //
0109: // be robust about this ...
0110: //
0111:
0112: //
0113: // 1. if the weblog user already exist, re-set its values
0114: // to those we expect
0115: // the weblog user is ours. make sure it exists and is created /
0116: // configured by us.
0117: //
0118:
0119: if (existsWeblogUser(ppe)) {
0120: resetWeblogUser(ppe, pw);
0121: setUserEnabled(ppe, true);
0122: } else {
0123: userCreated = true;
0124: createWeblogUser(ppe, pw);
0125: }
0126:
0127: //
0128: // 2. if the weblog already exists, don't try to re-create it
0129: // or remove it first or anything else. we support this situation.
0130: //
0131:
0132: WeblogEntry we;
0133: if (existsWeblog(ppe)) {
0134: we = getWeblog(ppe);
0135: // ensure that it is enabled
0136: setWeblogEnabled(ppe, true);
0137: } else {
0138: weblogCreated = true;
0139: we = createWeblog(ppe);
0140: }
0141:
0142: //
0143: // 3. make sure that the weblog user is an ADMIN in the community
0144: // this is *normally* taken care of by simply creating the community
0145: // w/ the weblog user set to the creating user ... however, if the
0146: // weblog already exists, we cannot be sure of its state. typically,
0147: // the permissions check succeeds and there's nothing to do
0148: //
0149:
0150: if (!weblogUserHasPermission(ppe,
0151: MemberEntry.Permissions.ADMIN)) {
0152: addWeblogUserMembership(ppe,
0153: MemberEntry.Permissions.ADMIN);
0154: }
0155:
0156: // set up preferences to access weblog with ghost user
0157: // this allows the portlet to work after community creation
0158: // user is expected to edit the portlet and either
0159: // create a new user, or enter existing credentials
0160: Prefs prefs = new PortletProvisionPrefs(ppe
0161: .getPortletProvisionPreferences("member"));
0162: prefs.setHandle(getWeblogHandle(ppe));
0163: prefs.setAppEntriesUrl(we.getAppEntriesUrl());
0164: prefs.setAppUserName(getWeblogUserName(ppe));
0165: prefs.setAppUserPassword(pw);
0166: prefs.store();
0167: prefsSet = true;
0168:
0169: // index weblog into search server
0170: // NOTE: we have to do this AFTER we set the APP
0171: // credentials, as it gets the weblog URL and title
0172: // from the APP service
0173: Feed feed = getWeblogFeed(ppe);
0174: indexWeblog(ppe, feed);
0175:
0176: // post a nice welcome message into the community weblog
0177: postWelcome(ppe, feed, we.getAppEntriesUrl(),
0178: getWeblogUserName(ppe), pw);
0179: } catch (PortletProvisionException ppex) {
0180: // TODO: it is not technically correct to purge here
0181: // we should only purge if we created it in the first place
0182: // the resource might have already existed
0183: doPurge(ppe, weblogCreated, userCreated, prefsSet);
0184: throw ppex;
0185: } catch (BlogPortletException bpe) {
0186: doPurge(ppe, weblogCreated, userCreated, prefsSet);
0187: throw new PortletProvisionException(
0188: "BlogProvisioningListener", bpe);
0189: }
0190: }
0191:
0192: private void doPurge(PortletProvisionEvent ppe,
0193: boolean purgeWeblog, boolean purgeUser, boolean clearPrefs)
0194: throws PortletProvisionException {
0195: ppe.getHttpServletRequest().getSession().invalidate();
0196:
0197: try {
0198: Feed feed = getWeblogFeed(ppe);
0199: deindexEntries(ppe, feed);
0200: deindexWeblog(ppe, feed);
0201: } catch (PortletProvisionException ppe1) {
0202: // nothing
0203: }
0204:
0205: // only try to delete the weblog if it exists
0206: if (purgeWeblog && existsWeblog(ppe)) {
0207: try {
0208: deleteWeblog(ppe);
0209: } catch (PortletProvisionException ppe2) {
0210: // nothing
0211: }
0212: }
0213:
0214: // only delete the weblog user if it exists
0215: if (purgeUser && existsWeblogUser(ppe)) {
0216: try {
0217: deleteWeblogUser(ppe);
0218: } catch (PortletProvisionException ppe3) {
0219: // nothing
0220: }
0221: }
0222:
0223: if (clearPrefs) {
0224: try {
0225: Prefs prefs = new PortletProvisionPrefs(ppe
0226: .getPortletProvisionPreferences("member"));
0227: prefs.setHandle("");
0228: prefs.setAppEntriesUrl("");
0229: prefs.setAppUserName("");
0230: prefs.setAppUserPassword("");
0231: } catch (BlogPortletException bpe) {
0232: // nothing
0233: }
0234: }
0235: }
0236:
0237: public void doDisable(PortletProvisionEvent ppe)
0238: throws PortletProvisionException {
0239: ppe.getHttpServletRequest().getSession().invalidate();
0240:
0241: try {
0242: Feed feed = getWeblogFeed(ppe);
0243: deindexEntries(ppe, feed);
0244: deindexWeblog(ppe, feed);
0245: } catch (PortletProvisionException ppe3) {
0246: // nothing
0247: }
0248:
0249: // only try to disable the weblog if it exists
0250: if (existsWeblog(ppe)) {
0251: try {
0252: setWeblogEnabled(ppe, false);
0253: } catch (PortletProvisionException ppe3) {
0254: // nothing
0255: }
0256:
0257: }
0258:
0259: // only disable the weblog user if it exists
0260: if (existsWeblogUser(ppe)) {
0261: try {
0262: setUserEnabled(ppe, false);
0263: } catch (PortletProvisionException ppe3) {
0264: // nothing
0265: }
0266:
0267: }
0268: }
0269:
0270: public void doEnable(PortletProvisionEvent ppe)
0271: throws PortletProvisionException {
0272: ppe.getHttpServletRequest().getSession().invalidate();
0273:
0274: setUserEnabled(ppe, true);
0275: setWeblogEnabled(ppe, true);
0276:
0277: Feed feed = getWeblogFeed(ppe);
0278: indexEntries(ppe, feed);
0279: indexWeblog(ppe, feed);
0280: }
0281:
0282: private void addWeblogUserMembership(PortletProvisionEvent ppe,
0283: String perm) throws PortletProvisionException {
0284: try {
0285: Prefs prefs = new PortletProvisionPrefs(ppe
0286: .getPortletProvisionPreferences("member"));
0287:
0288: MemberEntry memberEntry = new MemberEntry(
0289: getWeblogHandle(ppe), getWeblogUserName(ppe), prefs
0290: .getAappUrl());
0291: memberEntry.setPermission(perm);
0292:
0293: MemberEntrySet mes = new MemberEntrySet(prefs.getAappUrl());
0294: mes.setEntries(new MemberEntry[] { memberEntry });
0295:
0296: String url = mes.getHref();
0297: String body = mes.toString();
0298:
0299: post(url, prefs.getAappUserName(), prefs
0300: .getAappUserPassword(), body,
0301: "application/xml; utf8");
0302: } catch (BlogPortletException bpe) {
0303: throw new PortletProvisionException(
0304: "BlogProvisioningListener", bpe);
0305: }
0306:
0307: }
0308:
0309: private boolean existsWeblogUser(PortletProvisionEvent ppe)
0310: throws PortletProvisionException {
0311: try {
0312: Prefs prefs = new PortletProvisionPrefs(ppe
0313: .getPortletProvisionPreferences("member"));
0314:
0315: UserEntry ue = new UserEntry(getWeblogUserName(ppe), prefs
0316: .getAappUrl());
0317: String url = ue.getHref();
0318:
0319: return exists(url, prefs.getAappUserName(), prefs
0320: .getAappUserPassword());
0321: } catch (BlogPortletException bpe) {
0322: throw new PortletProvisionException(
0323: "BlogProvisioningListener", bpe);
0324: }
0325:
0326: }
0327:
0328: private boolean existsWeblog(PortletProvisionEvent ppe)
0329: throws PortletProvisionException {
0330: try {
0331: Prefs prefs = new PortletProvisionPrefs(ppe
0332: .getPortletProvisionPreferences("member"));
0333:
0334: WeblogEntry we = new WeblogEntry(getWeblogHandle(ppe),
0335: prefs.getAappUrl());
0336: String url = we.getHref();
0337:
0338: return exists(url, prefs.getAappUserName(), prefs
0339: .getAappUserPassword());
0340: } catch (BlogPortletException bpe) {
0341: throw new PortletProvisionException(
0342: "BlogProvisioningListener", bpe);
0343: }
0344:
0345: }
0346:
0347: private void deleteWeblogUser(PortletProvisionEvent ppe)
0348: throws PortletProvisionException {
0349: try {
0350: Prefs prefs = new PortletProvisionPrefs(ppe
0351: .getPortletProvisionPreferences("member"));
0352:
0353: UserEntry ue = new UserEntry(getWeblogUserName(ppe), prefs
0354: .getAappUrl());
0355: String url = ue.getHref();
0356:
0357: delete(url, prefs.getAappUserName(), prefs
0358: .getAappUserPassword());
0359: } catch (BlogPortletException bpe) {
0360: throw new PortletProvisionException(
0361: "BlogProvisioningListener", bpe);
0362: }
0363:
0364: }
0365:
0366: private void delete(String url, String user, String pw)
0367: throws PortletProvisionException {
0368: try {
0369: Delete delete = new Delete(new URL(url), user, pw);
0370: int status = delete.execute();
0371: if (!delete.success()) {
0372: throw new PortletProvisionException(
0373: "BlogProvisioningListener",
0374: "DELETE failed, http status code=" + status);
0375: }
0376: } catch (MalformedURLException mfue) {
0377: throw new PortletProvisionException(
0378: "BlogProvisioningListener", mfue);
0379: } catch (HttpVerbException ve) {
0380: throw new PortletProvisionException(
0381: "BlogProvisioningListener", ve);
0382: }
0383: }
0384:
0385: private InputStream get(String url, String user, String pw)
0386: throws PortletProvisionException {
0387: try {
0388: Get get = new Get(new URL(url), user, pw);
0389: int status = get.execute();
0390: if (!get.success()) {
0391: throw new PortletProvisionException(
0392: "BlogProvisioningListener",
0393: "GET failed, http status code=" + status);
0394: }
0395: InputStream bodyStream = get.getResponseBody();
0396: return bodyStream;
0397: } catch (MalformedURLException mfue) {
0398: throw new PortletProvisionException(
0399: "BlogProvisioningListener", mfue);
0400: } catch (HttpVerbException ve) {
0401: throw new PortletProvisionException(
0402: "BlogProvisioningListener", ve);
0403: }
0404: }
0405:
0406: private void deleteWeblog(PortletProvisionEvent ppe)
0407: throws PortletProvisionException {
0408: try {
0409: Prefs prefs = new PortletProvisionPrefs(ppe
0410: .getPortletProvisionPreferences("member"));
0411:
0412: WeblogEntry we = new WeblogEntry(getWeblogHandle(ppe),
0413: prefs.getAappUrl());
0414: String url = we.getHref();
0415:
0416: delete(url, prefs.getAappUserName(), prefs
0417: .getAappUserPassword());
0418: } catch (BlogPortletException bpe) {
0419: throw new PortletProvisionException(
0420: "BlogProvisioningListener", bpe);
0421: }
0422: }
0423:
0424: private void setWeblogEnabled(PortletProvisionEvent ppe,
0425: boolean enabled) throws PortletProvisionException {
0426: try {
0427: Prefs prefs = new PortletProvisionPrefs(ppe
0428: .getPortletProvisionPreferences("member"));
0429:
0430: WeblogEntry we = new WeblogEntry(getWeblogHandle(ppe),
0431: prefs.getAappUrl());
0432: we.setEnabled(Boolean.valueOf(enabled));
0433:
0434: WeblogEntrySet wes = new WeblogEntrySet(prefs.getAappUrl());
0435: wes.setEntries(new WeblogEntry[] { we });
0436:
0437: String url = wes.getHref();
0438: String body = wes.toString();
0439:
0440: put(url, prefs.getAappUserName(), prefs
0441: .getAappUserPassword(), body,
0442: "application/xml; utf8");
0443: } catch (BlogPortletException bpe) {
0444: throw new PortletProvisionException(
0445: "BlogProvisioningListener", bpe);
0446: }
0447: }
0448:
0449: private void setUserEnabled(PortletProvisionEvent ppe,
0450: boolean enabled) throws PortletProvisionException {
0451: try {
0452: Prefs prefs = new PortletProvisionPrefs(ppe
0453: .getPortletProvisionPreferences("member"));
0454:
0455: UserEntry ue = new UserEntry(getWeblogUserName(ppe), prefs
0456: .getAappUrl());
0457: ue.setEnabled(Boolean.valueOf(enabled));
0458:
0459: UserEntrySet ues = new UserEntrySet(prefs.getAappUrl());
0460: ues.setEntries(new UserEntry[] { ue });
0461:
0462: String url = ues.getHref();
0463: String body = ues.toString();
0464:
0465: put(url, prefs.getAappUserName(), prefs
0466: .getAappUserPassword(), body,
0467: "application/xml; utf8");
0468: } catch (BlogPortletException bpe) {
0469: throw new PortletProvisionException(
0470: "BlogProvisioningListener", bpe);
0471: }
0472: }
0473:
0474: private WeblogEntry createWeblog(PortletProvisionEvent ppe)
0475: throws PortletProvisionException {
0476: try {
0477: Prefs prefs = new PortletProvisionPrefs(ppe
0478: .getPortletProvisionPreferences("member"));
0479: AbstractSearch srch = search.getNewInstance(prefs);
0480: srch.setHttpRequest(ppe.getHttpServletRequest());
0481:
0482: WeblogEntry we = new WeblogEntry(getWeblogHandle(ppe),
0483: prefs.getAappUrl());
0484:
0485: we.setName(getWeblogName(ppe));
0486: we.setDescription(getWeblogDescription(ppe));
0487: we.setCreatingUser(getWeblogUserName(ppe));
0488: we.setEmailAddress("");
0489: we.setLocale(getLocale(ppe).toString());
0490: we.setTimezone(getTimeZone(ppe).getID());
0491:
0492: WeblogEntrySet wes = new WeblogEntrySet(prefs.getAappUrl());
0493: wes.setEntries(new WeblogEntry[] { we });
0494:
0495: String url = wes.getHref();
0496: String body = wes.toString();
0497:
0498: try {
0499: InputStream responseStream = post(url, prefs
0500: .getAappUserName(),
0501: prefs.getAappUserPassword(), body,
0502: "application/xml; utf8");
0503: WeblogEntrySet wesResponse = new WeblogEntrySet(
0504: responseStream, prefs.getAappUrl());
0505: if (wesResponse.getEntries() == null
0506: && wesResponse.getEntries().length == 0) {
0507: throw new PortletProvisionException(
0508: "BlogProvisioningListener",
0509: "failed to get response after weblog creation");
0510: }
0511:
0512: return (WeblogEntry) wesResponse.getEntries()[0];
0513: } catch (JDOMException je) {
0514: throw new PortletProvisionException(
0515: "BlogProvisioningListener", je);
0516: } catch (IOException ioe) {
0517: throw new PortletProvisionException(
0518: "BlogProvisioningListener", ioe);
0519: } catch (UnexpectedRootElementException mee) {
0520: throw new PortletProvisionException(
0521: "BlogProvisioningListener", mee);
0522: }
0523: } catch (BlogPortletException bpe) {
0524: throw new PortletProvisionException(
0525: "BlogProvisioningListener", bpe);
0526: }
0527: }
0528:
0529: private void indexWeblog(PortletProvisionEvent ppe, Feed feed)
0530: throws PortletProvisionException {
0531: String weblogLink = getWeblogLink(feed);
0532: String title = getWeblogName(ppe);
0533: String content = getWeblogDescription(ppe);
0534:
0535: // if we can't get the link or the title, we cannot index
0536: // feed is not required to give us those
0537: if (weblogLink != null && weblogLink.length() > 0
0538: && title != null && title.length() > 0) {
0539: insertSearch(ppe, weblogLink, title, content);
0540: }
0541: }
0542:
0543: private void deindexWeblog(PortletProvisionEvent ppe, Feed feed)
0544: throws PortletProvisionException {
0545: String weblogLink = getWeblogLink(feed);
0546:
0547: // if we can't get the link, we cannot deindex
0548: // feed is not required to give us those
0549: if (weblogLink != null && weblogLink.length() > 0) {
0550: deleteSearch(ppe, weblogLink);
0551: }
0552: }
0553:
0554: private void indexEntry(PortletProvisionEvent ppe, Feed feed,
0555: Entry entry) throws PortletProvisionException {
0556: String entryLink = getEntryLink(entry);
0557: String title = entry.getTitle();
0558: String content = ((Content) entry.getContents().get(0))
0559: .getValue();
0560:
0561: // if we can't get the link or the title, we cannot index
0562: // feed is not required to give us those
0563: if (entryLink != null && entryLink.length() > 0
0564: && title != null && title.length() > 0) {
0565: insertSearch(ppe, entryLink, title, content);
0566: }
0567: }
0568:
0569: private void deindexEntries(PortletProvisionEvent ppe, Feed feed)
0570: throws PortletProvisionException {
0571: List entries = feed.getEntries();
0572: if (entries != null) {
0573: for (Iterator i = entries.iterator(); i.hasNext();) {
0574: Entry entry = (Entry) i.next();
0575: String entryLink = getEntryLink(entry);
0576: if (entryLink != null && entryLink.length() > 0) {
0577: deleteSearch(ppe, entryLink);
0578: }
0579: }
0580: }
0581: }
0582:
0583: private void indexEntries(PortletProvisionEvent ppe, Feed feed)
0584: throws PortletProvisionException {
0585: List entries = feed.getEntries();
0586: if (entries != null) {
0587: for (Iterator i = entries.iterator(); i.hasNext();) {
0588: Entry entry = (Entry) i.next();
0589: indexEntry(ppe, feed, entry);
0590: }
0591: }
0592: }
0593:
0594: private void insertSearch(PortletProvisionEvent ppe, String url,
0595: String title, String content)
0596: throws PortletProvisionException {
0597: try {
0598: Prefs prefs = new PortletProvisionPrefs(ppe
0599: .getPortletProvisionPreferences("member"));
0600: AbstractSearch srch = search.getNewInstance(prefs);
0601: srch.setHttpRequest(ppe.getHttpServletRequest());
0602:
0603: srch.insert(url, title, content);
0604: } catch (BlogPortletException bpe) {
0605: throw new PortletProvisionException(
0606: "BlogProvisioningListener", bpe);
0607: }
0608: }
0609:
0610: private void deleteSearch(PortletProvisionEvent ppe, String url)
0611: throws PortletProvisionException {
0612: try {
0613: Prefs prefs = new PortletProvisionPrefs(ppe
0614: .getPortletProvisionPreferences("member"));
0615: AbstractSearch srch = search.getNewInstance(prefs);
0616: srch.setHttpRequest(ppe.getHttpServletRequest());
0617:
0618: srch.delete(url);
0619: } catch (BlogPortletException bpe) {
0620: throw new PortletProvisionException(
0621: "BlogProvisioningListener", bpe);
0622: }
0623: }
0624:
0625: private WeblogEntry getWeblog(PortletProvisionEvent ppe)
0626: throws PortletProvisionException {
0627: try {
0628: Prefs prefs = new PortletProvisionPrefs(ppe
0629: .getPortletProvisionPreferences("member"));
0630:
0631: WeblogEntry we = new WeblogEntry(getWeblogHandle(ppe),
0632: prefs.getAappUrl());
0633:
0634: String url = we.getHref();
0635:
0636: InputStream responseStream = get(url, prefs
0637: .getAappUserName(), prefs.getAappUserPassword());
0638: WeblogEntrySet wesResponse = new WeblogEntrySet(
0639: responseStream, prefs.getAappUrl());
0640: if (wesResponse.getEntries() == null
0641: && wesResponse.getEntries().length == 0) {
0642: throw new PortletProvisionException(
0643: "BlogProvisioningListener",
0644: "failed to get response after weblog creation");
0645: }
0646: return (WeblogEntry) wesResponse.getEntries()[0];
0647: } catch (JDOMException je) {
0648: throw new PortletProvisionException(
0649: "BlogProvisioningListener", je);
0650: } catch (IOException ioe) {
0651: throw new PortletProvisionException(
0652: "BlogProvisioningListener", ioe);
0653: } catch (UnexpectedRootElementException mee) {
0654: throw new PortletProvisionException(
0655: "BlogProvisioningListener", mee);
0656: } catch (BlogPortletException bpe) {
0657: throw new PortletProvisionException(
0658: "BlogProvisioningListener", bpe);
0659: }
0660: }
0661:
0662: private Feed getWeblogFeed(PortletProvisionEvent ppe)
0663: throws PortletProvisionException {
0664: try {
0665: Prefs prefs = new PortletProvisionPrefs(ppe
0666: .getPortletProvisionPreferences("member"));
0667: InputStream is = get(prefs.getAppEntriesUrl(), prefs
0668: .getAppUserName(), prefs.getAppUserPassword());
0669:
0670: InputSource src = new InputSource(is);
0671: WireFeedInput input = new WireFeedInput();
0672: Feed feed = (Feed) input.build(src);
0673:
0674: return feed;
0675: } catch (BlogPortletException bpe) {
0676: throw new PortletProvisionException(
0677: "BlogProvisioningListener", bpe);
0678: } catch (FeedException fe) {
0679: throw new PortletProvisionException(
0680: "BlogProvisioningListener", fe);
0681: }
0682: }
0683:
0684: private String getWeblogLink(Feed feed)
0685: throws PortletProvisionException {
0686: List altLinks = feed.getAlternateLinks();
0687: if (altLinks == null || altLinks.size() == 0) {
0688: return null;
0689: }
0690:
0691: Link link = (Link) altLinks.get(0);
0692: return link.getHref();
0693: }
0694:
0695: private String getEntryLink(Entry entry)
0696: throws PortletProvisionException {
0697: List altLinks = entry.getAlternateLinks();
0698: if (altLinks == null || altLinks.size() == 0) {
0699: return null;
0700: }
0701:
0702: Link link = (Link) altLinks.get(0);
0703: return link.getHref();
0704: }
0705:
0706: private void createWeblogUser(PortletProvisionEvent ppe,
0707: String password) throws PortletProvisionException {
0708: try {
0709: Prefs prefs = new PortletProvisionPrefs(ppe
0710: .getPortletProvisionPreferences("member"));
0711:
0712: UserEntry userEntry = new UserEntry(getWeblogUserName(ppe),
0713: prefs.getAappUrl());
0714:
0715: userEntry.setFullName(getWeblogUserFullName(ppe));
0716: userEntry.setPassword(password);
0717: userEntry.setLocale(getLocale(ppe).toString());
0718: userEntry.setTimezone(getTimeZone(ppe).getID());
0719: userEntry.setEmailAddress("");
0720:
0721: UserEntrySet ues = new UserEntrySet(prefs.getAappUrl());
0722: ues.setEntries(new UserEntry[] { userEntry });
0723:
0724: String url = ues.getHref();
0725: String body = ues.toString();
0726:
0727: post(url, prefs.getAappUserName(), prefs
0728: .getAappUserPassword(), body,
0729: "application/xml; utf8");
0730: } catch (BlogPortletException bpe) {
0731: throw new PortletProvisionException(
0732: "BlogProvisioningListener", bpe);
0733: }
0734: }
0735:
0736: private void resetWeblogUser(PortletProvisionEvent ppe,
0737: String password) throws PortletProvisionException {
0738: try {
0739: Prefs prefs = new PortletProvisionPrefs(ppe
0740: .getPortletProvisionPreferences("member"));
0741:
0742: UserEntry userEntry = new UserEntry(getWeblogUserName(ppe),
0743: prefs.getAappUrl());
0744:
0745: userEntry.setFullName(getWeblogUserFullName(ppe));
0746: userEntry.setPassword(password);
0747: userEntry.setLocale(getLocale(ppe).toString());
0748: userEntry.setTimezone(getTimeZone(ppe).getID());
0749: userEntry.setEmailAddress("");
0750:
0751: UserEntrySet ues = new UserEntrySet(prefs.getAappUrl());
0752: ues.setEntries(new UserEntry[] { userEntry });
0753:
0754: String url = ues.getHref();
0755: String body = ues.toString();
0756:
0757: put(url, prefs.getAappUserName(), prefs
0758: .getAappUserPassword(), body,
0759: "application/xml; utf8");
0760: } catch (BlogPortletException bpe) {
0761: throw new PortletProvisionException(
0762: "BlogProvisioningListener", bpe);
0763: }
0764: }
0765:
0766: private boolean weblogUserHasPermission(PortletProvisionEvent ppe,
0767: String perm) throws PortletProvisionException {
0768: Set perms = getWeblogUserPermissions(ppe);
0769: boolean contains = perms.contains(perm);
0770:
0771: return contains;
0772: }
0773:
0774: private Set getWeblogUserPermissions(PortletProvisionEvent ppe)
0775: throws PortletProvisionException {
0776: try {
0777: Prefs prefs = new PortletProvisionPrefs(ppe
0778: .getPortletProvisionPreferences("member"));
0779:
0780: MemberEntry me = new MemberEntry(getWeblogHandle(ppe),
0781: getWeblogUserName(ppe), prefs.getAappUrl());
0782: String url = me.getHref();
0783:
0784: try {
0785: Get get = new Get(new URL(url),
0786: prefs.getAappUserName(), prefs
0787: .getAappUserPassword());
0788: int status = get.execute();
0789: if (!get.success()) {
0790: return Collections.EMPTY_SET;
0791: }
0792: InputStream bodyStream = get.getResponseBody();
0793: MemberEntrySet mes = new MemberEntrySet(bodyStream,
0794: prefs.getAappUrl());
0795: org.apache.roller.webservices.adminapi.sdk.Entry[] entries = mes
0796: .getEntries();
0797: Set perms = null;
0798: if (entries != null) {
0799: perms = new HashSet();
0800: for (int i = 0; i < entries.length; i++) {
0801: MemberEntry entry = (MemberEntry) entries[i];
0802: perms.add(entry.getPermission());
0803: }
0804: }
0805:
0806: return perms;
0807: } catch (MalformedURLException mfue) {
0808: throw new PortletProvisionException(
0809: "BlogProvisioningListener", mfue);
0810: } catch (HttpVerbException ve) {
0811: throw new PortletProvisionException(
0812: "BlogProvisioningListener", ve);
0813: } catch (JDOMException je) {
0814: throw new PortletProvisionException(
0815: "BlogProvisioningListener", je);
0816: } catch (IOException ioe) {
0817: throw new PortletProvisionException(
0818: "BlogProvisioningListener", ioe);
0819: } catch (UnexpectedRootElementException uree) {
0820: throw new PortletProvisionException(
0821: "BlogProvisioningListener", uree);
0822: }
0823: } catch (BlogPortletException bpe) {
0824: throw new PortletProvisionException(
0825: "BlogProvisioningListener", bpe);
0826: }
0827: }
0828:
0829: private boolean exists(String url, String user, String pw)
0830: throws PortletProvisionException {
0831: try {
0832: Get get = new Get(new URL(url), user, pw);
0833: int status = get.execute();
0834: if (status == HttpServletResponse.SC_NOT_FOUND) {
0835: return false;
0836: }
0837:
0838: if (get.success()) {
0839: return true;
0840: }
0841:
0842: throw new PortletProvisionException(
0843: "BlogProvisioningListener",
0844: "GET failed, http status code=" + status);
0845: } catch (MalformedURLException mfue) {
0846: throw new PortletProvisionException(
0847: "BlogProvisioningListener", mfue);
0848: } catch (HttpVerbException ve) {
0849: throw new PortletProvisionException(
0850: "BlogProvisioningListener", ve);
0851: }
0852: }
0853:
0854: private InputStream post(String url, String user, String pw,
0855: String body, String contentType)
0856: throws PortletProvisionException {
0857: try {
0858: InputStream bodyStream = new ByteArrayInputStream(body
0859: .getBytes("UTF-8"));
0860:
0861: Post post = new Post(new URL(url), user, pw, bodyStream,
0862: contentType);
0863: int status = post.execute();
0864: if (!post.success()) {
0865: throw new PortletProvisionException(
0866: "BlogProvisioningListener",
0867: "POST failed, http status code=" + status);
0868: }
0869:
0870: InputStream responseStream = post.getResponseBody();
0871: return responseStream;
0872: } catch (UnsupportedEncodingException uec) {
0873: throw new PortletProvisionException(
0874: "BlogProvisioningListener", uec);
0875: } catch (MalformedURLException mfue) {
0876: throw new PortletProvisionException(
0877: "BlogProvisioningListener", mfue);
0878: } catch (HttpVerbException ve) {
0879: throw new PortletProvisionException(
0880: "BlogProvisioningListener", ve);
0881: }
0882: }
0883:
0884: private InputStream put(String url, String user, String pw,
0885: String body, String contentType)
0886: throws PortletProvisionException {
0887: try {
0888: InputStream bodyStream = new ByteArrayInputStream(body
0889: .getBytes("UTF-8"));
0890:
0891: Put put = new Put(new URL(url), user, pw, bodyStream,
0892: contentType);
0893: int status = put.execute();
0894: if (!put.success()) {
0895: throw new PortletProvisionException(
0896: "BlogProvisioningListener",
0897: "PUT failed, http status code=" + status);
0898: }
0899:
0900: InputStream responseStream = put.getResponseBody();
0901: return responseStream;
0902: } catch (UnsupportedEncodingException uec) {
0903: throw new PortletProvisionException(
0904: "BlogProvisioningListener", uec);
0905: } catch (MalformedURLException mfue) {
0906: throw new PortletProvisionException(
0907: "BlogProvisioningListener", mfue);
0908: } catch (HttpVerbException ve) {
0909: throw new PortletProvisionException(
0910: "BlogProvisioningListener", ve);
0911: }
0912: }
0913:
0914: private static String getWeblogUserName(PortletProvisionEvent ppe) {
0915: return new CommunityId(ppe.getCommunityPrincipalId()).getName()
0916: + "shared";
0917: }
0918:
0919: private String getWeblogUserFullName(PortletProvisionEvent ppe) {
0920: Resources resources = new Resources(
0921: "com.sun.portal.app.blog.provision.BlogProvisioningListener",
0922: getLocale(ppe));
0923: String name = resources.get("fullName");
0924:
0925: Object[] args = { new CommunityId(ppe.getCommunityPrincipalId())
0926: .getName() };
0927:
0928: name = MessageFormat.format(name, args);
0929:
0930: return name;
0931: }
0932:
0933: private String getWeblogUserPassword(PortletProvisionEvent ppe) {
0934: PasswordGenerator pg = new PasswordGenerator(8);
0935: return pg.get();
0936: }
0937:
0938: private static String getWeblogHandle(PortletProvisionEvent ppe) {
0939: return new CommunityId(ppe.getCommunityPrincipalId()).getName();
0940: }
0941:
0942: private static String getWeblogName(PortletProvisionEvent ppe) {
0943: Resources resources = new Resources(
0944: "com.sun.portal.app.blog.provision.BlogProvisioningListener",
0945: getLocale(ppe));
0946: String name = resources.get("weblogName");
0947:
0948: Object[] args = { new CommunityId(ppe.getCommunityPrincipalId())
0949: .getName() };
0950:
0951: name = MessageFormat.format(name, args);
0952:
0953: return name;
0954: }
0955:
0956: private static String getWeblogDescription(PortletProvisionEvent ppe) {
0957: Resources resources = new Resources(
0958: "com.sun.portal.app.blog.provision.BlogProvisioningListener",
0959: getLocale(ppe));
0960: String desc = resources.get("weblogDescription");
0961:
0962: Object[] args = { new CommunityId(ppe.getCommunityPrincipalId())
0963: .getName() };
0964:
0965: desc = MessageFormat.format(desc, args);
0966:
0967: return desc;
0968: }
0969:
0970: private static Locale getLocale(PortletProvisionEvent ppe) {
0971: HttpServletRequest req = ppe.getHttpServletRequest();
0972: Locale locale = req.getLocale();
0973: if (locale == null) {
0974: locale = Locale.getDefault();
0975: }
0976:
0977: return locale;
0978: }
0979:
0980: private TimeZone getTimeZone(PortletProvisionEvent ppe) {
0981: return TimeZone.getDefault();
0982: }
0983:
0984: private void postWelcome(PortletProvisionEvent ppe, Feed feed,
0985: String url, String user, String pw)
0986: throws PortletProvisionException {
0987: try {
0988: Prefs prefs = new PortletProvisionPrefs(ppe
0989: .getPortletProvisionPreferences("member"));
0990: Resources resources = new Resources(
0991: "com.sun.portal.app.blog.provision.BlogProvisioningListener",
0992: getLocale(ppe));
0993: String body = resources.get("welcomePostContent");
0994:
0995: Object[] args = {
0996: new CommunityId(ppe.getCommunityPrincipalId())
0997: .getName(), user, prefs.getUserUrl() };
0998:
0999: body = MessageFormat.format(body, args);
1000:
1001: Entry entry = new Entry();
1002: String title = resources.get("welcomePostTitle");
1003: entry.setTitle(title);
1004: Content c = new Content();
1005: c.setValue(body);
1006: entry.setContents(Collections.singletonList(c));
1007:
1008: String content;
1009:
1010: try {
1011: content = EntrySerializer.toString(entry);
1012: } catch (FeedException fe) {
1013: throw new PortletProvisionException(
1014: "BlogProvisioningListener", fe);
1015: } catch (IOException ioe) {
1016: throw new PortletProvisionException(
1017: "BlogProvisioningListener", ioe);
1018: }
1019:
1020: InputStream is = post(url, user, pw, content,
1021: "application/atom+xml; utf8");
1022: Entry newEntry;
1023:
1024: try {
1025: newEntry = EntrySerializer.toEntry(is);
1026: } catch (FeedException fe) {
1027: throw new PortletProvisionException(
1028: "BlogProvisioningListener", fe);
1029: } catch (IOException ioe) {
1030: throw new PortletProvisionException(
1031: "BlogProvisioningListener", ioe);
1032: } catch (JDOMException je) {
1033: throw new PortletProvisionException(
1034: "BlogProvisioningListener", je);
1035: }
1036:
1037: // index
1038: indexEntry(ppe, feed, newEntry);
1039: } catch (BlogPortletException bpe) {
1040: throw new PortletProvisionException(
1041: "BlogProvisioningListener", bpe);
1042: }
1043: }
1044: }
|