You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@roller.apache.org by sn...@apache.org on 2009/03/16 21:40:08 UTC

svn commit: r755000 [1/4] - in /roller/trunk: apps/weblogger/ apps/weblogger/nbproject/ apps/weblogger/src/java/META-INF/ apps/weblogger/src/java/org/apache/roller/weblogger/business/ apps/weblogger/src/java/org/apache/roller/weblogger/business/jpa/ ap...

Author: snoopdave
Date: Mon Mar 16 20:40:06 2009
New Revision: 755000

URL: http://svn.apache.org/viewvc?rev=755000&view=rev
Log:
Adding OAuth support for Roller, details are here:
    https://issues.apache.org/roller/browse/ROL-1798

Added:
    roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/OAuthManager.java
    roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/jpa/JPAOAuthManagerImpl.java
    roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/pojos/OAuthAccessorRecord.java
    roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/pojos/OAuthAccessorRecord.orm.xml
    roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/pojos/OAuthConsumerRecord.java
    roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/pojos/OAuthConsumerRecord.orm.xml
    roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/ui/struts2/core/OAuthAuthorize.java
    roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/ui/struts2/core/OAuthKeys.java
    roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/webservices/oauth/
    roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/webservices/oauth/AccessTokenServlet.java
    roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/webservices/oauth/AuthorizationServlet.java
    roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/webservices/oauth/RequestTokenServlet.java
    roller/trunk/apps/weblogger/test/java/org/apache/roller/weblogger/business/jpa/
    roller/trunk/apps/weblogger/test/java/org/apache/roller/weblogger/business/jpa/JPAOAuthManagerTest.java
    roller/trunk/apps/weblogger/velocity.log.1
    roller/trunk/apps/weblogger/web/WEB-INF/jsps/core/OAuthAuthorize.jsp
    roller/trunk/apps/weblogger/web/WEB-INF/jsps/core/OAuthKeys.jsp
    roller/trunk/tools/lib/rome-1.0.jar   (with props)
    roller/trunk/tools/lib/rome-fetcher-1.0.jar   (with props)
    roller/trunk/tools/lib/rome-propono-1.0.jar   (with props)
    roller/trunk/tools/oauth/
    roller/trunk/tools/oauth/commons-httpclient-3.1.jar   (with props)
    roller/trunk/tools/oauth/httpclient-4.0-beta1.jar   (with props)
    roller/trunk/tools/oauth/httpcore-4.0-beta2.jar   (with props)
    roller/trunk/tools/oauth/oauth-core-20090121.jar   (with props)
Removed:
    roller/trunk/apps/weblogger/src/sql/400-to-410-migration.vm
    roller/trunk/tools/lib/rome-0.9.1-dev.jar
    roller/trunk/tools/lib/rome-fetcher-0.9.jar
    roller/trunk/tools/lib/rome-propono-0.7.jar
Modified:
    roller/trunk/apps/weblogger/build.properties
    roller/trunk/apps/weblogger/build.xml
    roller/trunk/apps/weblogger/nbproject/project.xml
    roller/trunk/apps/weblogger/properties.xmlf
    roller/trunk/apps/weblogger/src/java/META-INF/persistence.xml
    roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/MultiWeblogURLStrategy.java
    roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/URLStrategy.java
    roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/Weblogger.java
    roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/WebloggerImpl.java
    roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerImpl.java
    roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerModule.java
    roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/startup/DatabaseInstaller.java
    roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/config/runtimeConfigDefs.xml
    roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/pojos/Weblog.java
    roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/WeblogRequestMapper.java
    roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/model/URLModel.java
    roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/servlets/PageServlet.java
    roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/util/MailUtil.java
    roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandler.java
    roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/webservices/atomprotocol/RollerAtomHandlerFactory.java
    roller/trunk/apps/weblogger/src/sql/400-to-500-migration.vm
    roller/trunk/apps/weblogger/src/sql/createdb.vm
    roller/trunk/apps/weblogger/test/java/org/apache/roller/weblogger/business/SupplementalWeblogServicesTestSuite.java
    roller/trunk/apps/weblogger/web/WEB-INF/classes/ApplicationResources.properties
    roller/trunk/apps/weblogger/web/WEB-INF/classes/struts.xml
    roller/trunk/apps/weblogger/web/WEB-INF/jsps/core/MainMenu.jsp
    roller/trunk/apps/weblogger/web/WEB-INF/jsps/core/MainMenuSidebar.jsp
    roller/trunk/apps/weblogger/web/WEB-INF/tiles.xml
    roller/trunk/apps/weblogger/web/WEB-INF/web.xml

Modified: roller/trunk/apps/weblogger/build.properties
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/build.properties?rev=755000&r1=754999&r2=755000&view=diff
==============================================================================
--- roller/trunk/apps/weblogger/build.properties (original)
+++ roller/trunk/apps/weblogger/build.properties Mon Mar 16 20:40:06 2009
@@ -3,7 +3,7 @@
 basedir=.
 
 # what version is this?
-ro.version=4.1-dev
+ro.version=5.0-dev
 
 # compile time settings
 build.debug=true

Modified: roller/trunk/apps/weblogger/build.xml
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/build.xml?rev=755000&r1=754999&r2=755000&view=diff
==============================================================================
--- roller/trunk/apps/weblogger/build.xml (original)
+++ roller/trunk/apps/weblogger/build.xml Mon Mar 16 20:40:06 2009
@@ -263,6 +263,7 @@
             <fileset refid="spring.jars" /> 
             <fileset refid="jstl.jars" />
             <fileset refid="xmlrpc.jars" />
+            <fileset refid="oauth.jars" />
             
             <fileset refid="roller-core.jars" />
             <fileset refid="roller-planet.jars" />

Modified: roller/trunk/apps/weblogger/nbproject/project.xml
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/nbproject/project.xml?rev=755000&r1=754999&r2=755000&view=diff
==============================================================================
--- roller/trunk/apps/weblogger/nbproject/project.xml (original)
+++ roller/trunk/apps/weblogger/nbproject/project.xml Mon Mar 16 20:40:06 2009
@@ -4,15 +4,20 @@
     <configuration>
         <general-data xmlns="http://www.netbeans.org/ns/freeform-project/1">
             <!-- Do not use Project Properties customizer when editing this file manually. -->
-            <name>roller_weblogger_trunk</name>
+            <name>workspace - roller_weblogger_trunk</name>
             <properties>
                 <property name="ant.script">build.xml</property>
             </properties>
             <folders>
                 <source-folder>
-                    <label>src/sql</label>
-                    <type>java</type>
-                    <location>src/sql</location>
+                    <label>web</label>
+                    <type>doc_root</type>
+                    <location>web</location>
+                </source-folder>
+                <source-folder>
+                    <label>WEB-INF</label>
+                    <type>web_inf</type>
+                    <location>web/WEB-INF</location>
                 </source-folder>
                 <source-folder>
                     <label>src</label>
@@ -20,6 +25,11 @@
                     <location>src/java</location>
                 </source-folder>
                 <source-folder>
+                    <label>src/sql</label>
+                    <type>java</type>
+                    <location>src/sql</location>
+                </source-folder>
+                <source-folder>
                     <label>test/java</label>
                     <type>java</type>
                     <location>test/java</location>
@@ -29,16 +39,6 @@
                     <type>java</type>
                     <location>docs/examples/plugins/pluginmodel/src</location>
                 </source-folder>
-                <source-folder>
-                    <label>web</label>
-                    <type>doc_root</type>
-                    <location>web</location>
-                </source-folder>
-                <source-folder>
-                    <label>WEB-INF</label>
-                    <type>web_inf</type>
-                    <location>web/WEB-INF</location>
-                </source-folder>
             </folders>
             <ide-actions>
                 <action name="build">
@@ -96,14 +96,14 @@
                         <location>web/WEB-INF</location>
                     </source-folder>
                     <source-folder style="packages">
-                        <label>src/sql</label>
-                        <location>src/sql</location>
-                    </source-folder>
-                    <source-folder style="packages">
                         <label>src</label>
                         <location>src/java</location>
                     </source-folder>
                     <source-folder style="packages">
+                        <label>src/sql</label>
+                        <location>src/sql</location>
+                    </source-folder>
+                    <source-folder style="packages">
                         <label>test/java</label>
                         <location>test/java</location>
                     </source-folder>
@@ -132,14 +132,13 @@
                 <package-root>src/java</package-root>
                 <package-root>test/java</package-root>
                 <package-root>docs/examples/plugins/pluginmodel/src</package-root>
-                <classpath mode="compile">../../tools/roller-core/roller-core.jar:../../tools/roller-planet/roller-planet-business.jar:../../tools/buildtime/activation.jar:../../tools/buildtime/mail.jar:../../tools/buildtime/tomcat-5.0.28/jsp-api.jar:../../tools/buildtime/tomcat-5.0.28/servlet-api.jar:../../tools/lib/commons-codec-1.3.jar:../../tools/lib/commons-collections-3.2.jar:../../tools/lib/commons-digester-1.6.jar:../../tools/lib/commons-id-0.1-SNAPSHOT.jar:../../tools/lib/commons-lang-2.1.jar:../../tools/lib/commons-logging-1.0.4.jar:../../tools/lib/concurrent-1.3.2.jar:../../tools/lib/guice-1.0.jar:../../tools/lib/jaxen-full.jar:../../tools/lib/jdom.jar:../../tools/lib/log4j-1.2.11.jar:../../tools/lib/lucene-1.4.3.jar:../../tools/lib/rome-0.9.1-dev.jar:../../tools/lib/rome-fetcher-0.9.jar:../../tools/lib/saxpath.jar:../../tools/lib/taglibs-string.jar:../../tools/lib/velocity-1.5.jar:../../tools/openjpa-0.9.7/geronimo-j2ee-connector_1.5_spec-1.0.1.jar:../../tools/op
 enjpa-0.9.7/geronimo-jpa_3.0_spec-1.0.jar:../../tools/openjpa-0.9.7/geronimo-jta_1.0.1B_spec-1.0.1.jar:../../tools/openjpa-0.9.7/openjpa-0.9.7-incubating.jar:../../tools/openjpa-0.9.7/serp-1.11.0.jar:../../tools/xmlrpc-3.0/lib/ws-commons-util-1.0.1.jar:../../tools/xmlrpc-3.0/lib/xmlrpc-client-3.0.jar:../../tools/xmlrpc-3.0/lib/xmlrpc-common-3.0.jar:../../tools/xmlrpc-3.0/lib/xmlrpc-server-3.0.jar:../../tools/jakarta-taglibs-standard-1.1.2/lib/jstl.jar:../../tools/jakarta-taglibs-standard-1.1.2/lib/serializer.jar:../../tools/jakarta-taglibs-standard-1.1.2/lib/standard.jar:../../tools/jakarta-taglibs-standard-1.1.2/lib/xalan.jar:../../tools/buildtime/junit-4.1.jar:../../tools/buildtime/ant-1.7.0/ant.jar:../../tools/buildtime/derbyclient.jar:../../tools/buildtime/derby.jar:../../tools/buildtime/derbynet.jar:../../tools/buildtime/mockrunner-0.35/lib/mockrunner-servlet.jar:../../tools/buildtime/mockrunner-0.35/lib/mockrunner-struts.jar:../../tools/buildtime/mockrunner-0.35/lib/mo
 ckrunner.jar:../../tools/buildtime/mockrunner-0.35/lib/nekohtml.jar:../../tools/struts-2.0.9/lib/antlr-2.7.2.jar:../../tools/struts-2.0.9/lib/commons-beanutils-1.6.jar:../../tools/struts-2.0.9/lib/commons-chain-1.1.jar:../../tools/struts-2.0.9/lib/commons-fileupload-1.2.jar:../../tools/struts-2.0.9/lib/commons-io-1.3.1.jar:../../tools/struts-2.0.9/lib/commons-validator-1.3.0.jar:../../tools/struts-2.0.9/lib/freemarker-2.3.8.jar:../../tools/struts-2.0.9/lib/ognl-2.6.11.jar:../../tools/struts-2.0.9/lib/oro-2.0.8.jar:../../tools/struts-2.0.9/lib/struts2-core-2.0.9.jar:../../tools/struts-2.0.9/lib/struts2-spring-plugin-2.0.9.jar:../../tools/struts-2.0.9/lib/struts2-tiles-plugin-2.0.9.jar:../../tools/struts-2.0.9/lib/tiles-api-2.0.4.jar:../../tools/struts-2.0.9/lib/tiles-core-2.0.4.jar:../../tools/struts-2.0.9/lib/tiles-jsp-2.0.4.jar:../../tools/struts-2.0.9/lib/xwork-2.0.4.jar:../../tools/lib/commons-httpclient-3.0.1.jar:../../tools/lib/rome-propono-0.7.jar:../../tools/lib/dom3-
 xercesImpl.jar:../../tools/lib/nekohtml.jar:../../tools/lib/openxri-syntax.jar:../../tools/lib/apache-xml-security.jar:../../tools/lib/dom3-xml-apis.jar:../../tools/lib/openxri-client.jar:../../tools/spring-2.5/spring-2.5.4.jar:../../tools/spring-2.5/spring-security-openid-2.0.3.jar:../../tools/spring-2.5/spring-ldap-1.2.1.jar:../../tools/spring-2.5/spring-security-taglibs-2.0.3.jar:../../tools/spring-2.5/spring-security-acl-2.0.3.jar:../../tools/spring-2.5/spring-web-2.5.4.jar:../../tools/spring-2.5/spring-security-core-2.0.3.jar</classpath>
+                <classpath mode="compile">../../tools/roller-core/roller-core.jar:../../tools/roller-planet/roller-planet-business.jar:../../tools/buildtime/activation.jar:../../tools/buildtime/mail.jar:../../tools/buildtime/tomcat-5.0.28/jsp-api.jar:../../tools/buildtime/tomcat-5.0.28/servlet-api.jar:../../tools/lib/commons-codec-1.3.jar:../../tools/lib/commons-collections-3.2.jar:../../tools/lib/commons-digester-1.6.jar:../../tools/lib/commons-id-0.1-SNAPSHOT.jar:../../tools/lib/commons-lang-2.1.jar:../../tools/lib/commons-logging-1.0.4.jar:../../tools/lib/concurrent-1.3.2.jar:../../tools/lib/guice-1.0.jar:../../tools/lib/jaxen-full.jar:../../tools/lib/jdom.jar:../../tools/lib/log4j-1.2.11.jar:../../tools/lib/lucene-1.4.3.jar:../../tools/lib/rome-fetcher-0.9.jar:../../tools/lib/saxpath.jar:../../tools/lib/taglibs-string.jar:../../tools/lib/velocity-1.5.jar:../../tools/openjpa-0.9.7/geronimo-j2ee-connector_1.5_spec-1.0.1.jar:../../tools/openjpa-0.9.7/geronimo-jpa_3.0_spec-1
 .0.jar:../../tools/openjpa-0.9.7/geronimo-jta_1.0.1B_spec-1.0.1.jar:../../tools/openjpa-0.9.7/openjpa-0.9.7-incubating.jar:../../tools/openjpa-0.9.7/serp-1.11.0.jar:../../tools/xmlrpc-3.0/lib/ws-commons-util-1.0.1.jar:../../tools/xmlrpc-3.0/lib/xmlrpc-client-3.0.jar:../../tools/xmlrpc-3.0/lib/xmlrpc-common-3.0.jar:../../tools/xmlrpc-3.0/lib/xmlrpc-server-3.0.jar:../../tools/jakarta-taglibs-standard-1.1.2/lib/jstl.jar:../../tools/jakarta-taglibs-standard-1.1.2/lib/serializer.jar:../../tools/jakarta-taglibs-standard-1.1.2/lib/standard.jar:../../tools/jakarta-taglibs-standard-1.1.2/lib/xalan.jar:../../tools/buildtime/junit-4.1.jar:../../tools/buildtime/ant-1.7.0/ant.jar:../../tools/buildtime/derbyclient.jar:../../tools/buildtime/derby.jar:../../tools/buildtime/derbynet.jar:../../tools/buildtime/mockrunner-0.35/lib/mockrunner-servlet.jar:../../tools/buildtime/mockrunner-0.35/lib/mockrunner-struts.jar:../../tools/buildtime/mockrunner-0.35/lib/mockrunner.jar:../../tools/buildtime/
 mockrunner-0.35/lib/nekohtml.jar:../../tools/struts-2.0.9/lib/antlr-2.7.2.jar:../../tools/struts-2.0.9/lib/commons-beanutils-1.6.jar:../../tools/struts-2.0.9/lib/commons-chain-1.1.jar:../../tools/struts-2.0.9/lib/commons-fileupload-1.2.jar:../../tools/struts-2.0.9/lib/commons-io-1.3.1.jar:../../tools/struts-2.0.9/lib/commons-validator-1.3.0.jar:../../tools/struts-2.0.9/lib/freemarker-2.3.8.jar:../../tools/struts-2.0.9/lib/ognl-2.6.11.jar:../../tools/struts-2.0.9/lib/oro-2.0.8.jar:../../tools/struts-2.0.9/lib/struts2-core-2.0.9.jar:../../tools/struts-2.0.9/lib/struts2-spring-plugin-2.0.9.jar:../../tools/struts-2.0.9/lib/struts2-tiles-plugin-2.0.9.jar:../../tools/struts-2.0.9/lib/tiles-api-2.0.4.jar:../../tools/struts-2.0.9/lib/tiles-core-2.0.4.jar:../../tools/struts-2.0.9/lib/tiles-jsp-2.0.4.jar:../../tools/struts-2.0.9/lib/xwork-2.0.4.jar:../../tools/lib/commons-httpclient-3.0.1.jar:../../tools/lib/dom3-xercesImpl.jar:../../tools/lib/nekohtml.jar:../../tools/lib/openxri-synt
 ax.jar:../../tools/lib/apache-xml-security.jar:../../tools/lib/dom3-xml-apis.jar:../../tools/lib/openxri-client.jar:../../tools/spring-2.5/spring-2.5.4.jar:../../tools/spring-2.5/spring-security-openid-2.0.3.jar:../../tools/spring-2.5/spring-ldap-1.2.1.jar:../../tools/spring-2.5/spring-security-taglibs-2.0.3.jar:../../tools/spring-2.5/spring-security-acl-2.0.3.jar:../../tools/spring-2.5/spring-web-2.5.4.jar:../../tools/spring-2.5/spring-security-core-2.0.3.jar:../../tools/oauth/commons-httpclient-3.1.jar:../../tools/oauth/httpclient-4.0-beta1.jar:../../tools/oauth/httpcore-4.0-beta2.jar:../../tools/oauth/oauth-core-20090121.jar:../../tools/lib/rome-1.0.jar:../../tools/lib/rome-fetcher-1.0.jar:../../tools/lib/rome-propono-1.0.jar</classpath>
                 <source-level>1.5</source-level>
             </compilation-unit>
         </java-data>
         <web-data xmlns="http://www.netbeans.org/ns/freeform-project-web/2">
             <web-module>
                 <doc-root>web</doc-root>
-                <classpath/>
                 <context-path>/roller</context-path>
                 <j2ee-spec-level>1.5</j2ee-spec-level>
                 <web-inf>web/WEB-INF</web-inf>

Modified: roller/trunk/apps/weblogger/properties.xmlf
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/properties.xmlf?rev=755000&r1=754999&r2=755000&view=diff
==============================================================================
--- roller/trunk/apps/weblogger/properties.xmlf (original)
+++ roller/trunk/apps/weblogger/properties.xmlf Mon Mar 16 20:40:06 2009
@@ -97,9 +97,9 @@
     <include name="jdom.jar"/>
     <include name="lucene-1.4.3.jar"/>
     <include name="log4j-1.2.11.jar"/>
-    <include name="rome-0.9.1-dev.jar"/>
-    <include name="rome-propono-0.7.jar"/>
-    <include name="rome-fetcher-0.9.jar"/>
+    <include name="rome-1.0.jar"/>
+    <include name="rome-propono-1.0.jar"/>
+    <include name="rome-fetcher-1.0.jar"/>
     <include name="velocity-1.5.jar"/>
     <include name="guice-1.0.jar"/>
 </fileset>
@@ -145,6 +145,10 @@
     <include name="xmlrpc-server-3.0.jar"/>
 </fileset>
 
+<fileset id="oauth.jars" dir="${ro.tools}/oauth">
+    <include name="*.jar"/>
+</fileset>
+
 <fileset id="roller-core.jars" dir="${ro.tools}/roller-core">
     <include name="*.jar"/>
 </fileset>
@@ -163,6 +167,7 @@
     <fileset refid="mail.jars"/>
     <fileset refid="roller-core.jars" />
     <fileset refid="xmlrpc.jars"/>
+    <fileset refid="oauth.jars"/>
     <fileset refid="roller-planet.jars" />
     <!-- JPA bytecode enhancement apparently wants JPA classes everywhere -->
     <fileset refid="jpa.jars" />

Modified: roller/trunk/apps/weblogger/src/java/META-INF/persistence.xml
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/src/java/META-INF/persistence.xml?rev=755000&r1=754999&r2=755000&view=diff
==============================================================================
--- roller/trunk/apps/weblogger/src/java/META-INF/persistence.xml (original)
+++ roller/trunk/apps/weblogger/src/java/META-INF/persistence.xml Mon Mar 16 20:40:06 2009
@@ -6,28 +6,30 @@
         <jta-data-source>java:comp/env/jdbc/rollerdb</jta-data-source>
         <provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider>
         -->
-        <mapping-file>org/apache/roller/weblogger/pojos/AutoPing.orm.xml                       </mapping-file>
-        <mapping-file>org/apache/roller/weblogger/pojos/WeblogBookmark.orm.xml                 </mapping-file>
-        <mapping-file>org/apache/roller/weblogger/pojos/WeblogEntryComment.orm.xml             </mapping-file>
-        <mapping-file>org/apache/roller/weblogger/pojos/WeblogEntryAttribute.orm.xml           </mapping-file>
-        <mapping-file>org/apache/roller/weblogger/pojos/WeblogBookmarkFolder.orm.xml           </mapping-file>
-        <mapping-file>org/apache/roller/weblogger/pojos/WeblogHitCount.orm.xml                 </mapping-file>
-        <mapping-file>org/apache/roller/weblogger/pojos/PingQueueEntry.orm.xml                 </mapping-file>
-        <mapping-file>org/apache/roller/weblogger/pojos/PingTarget.orm.xml                     </mapping-file>
-        <mapping-file>org/apache/roller/weblogger/pojos/WeblogReferrer.orm.xml                 </mapping-file>
-        <mapping-file>org/apache/roller/weblogger/pojos/UserRole.orm.xml                       </mapping-file>
-        <mapping-file>org/apache/roller/weblogger/pojos/RuntimeConfigProperty.orm.xml          </mapping-file>
-        <mapping-file>org/apache/roller/weblogger/pojos/TaskLock.orm.xml                       </mapping-file>
-        <mapping-file>org/apache/roller/weblogger/pojos/User.orm.xml                           </mapping-file>
-        <mapping-file>org/apache/roller/weblogger/pojos/WeblogCategory.orm.xml                 </mapping-file>
-        <mapping-file>org/apache/roller/weblogger/pojos/WeblogEntry.orm.xml                    </mapping-file>
-        <mapping-file>org/apache/roller/weblogger/pojos/WeblogEntryTagAggregate.orm.xml        </mapping-file>
-        <mapping-file>org/apache/roller/weblogger/pojos/WeblogEntryTag.orm.xml                 </mapping-file>
-        <mapping-file>org/apache/roller/weblogger/pojos/WeblogTemplate.orm.xml                 </mapping-file>
-        <mapping-file>org/apache/roller/weblogger/pojos/ObjectPermission.orm.xml               </mapping-file>
-        <mapping-file>org/apache/roller/weblogger/pojos/WeblogPermission.orm.xml               </mapping-file>
-        <mapping-file>org/apache/roller/weblogger/pojos/Weblog.orm.xml                         </mapping-file>
-        <mapping-file>org/apache/roller/weblogger/pojos/UserAttribute.orm.xml                  </mapping-file>	
+        <mapping-file>org/apache/roller/weblogger/pojos/AutoPing.orm.xml                </mapping-file>
+        <mapping-file>org/apache/roller/weblogger/pojos/WeblogBookmark.orm.xml          </mapping-file>
+        <mapping-file>org/apache/roller/weblogger/pojos/WeblogEntryComment.orm.xml      </mapping-file>
+        <mapping-file>org/apache/roller/weblogger/pojos/WeblogEntryAttribute.orm.xml    </mapping-file>
+        <mapping-file>org/apache/roller/weblogger/pojos/WeblogBookmarkFolder.orm.xml    </mapping-file>
+        <mapping-file>org/apache/roller/weblogger/pojos/WeblogHitCount.orm.xml          </mapping-file>
+        <mapping-file>org/apache/roller/weblogger/pojos/PingQueueEntry.orm.xml          </mapping-file>
+        <mapping-file>org/apache/roller/weblogger/pojos/PingTarget.orm.xml              </mapping-file>
+        <mapping-file>org/apache/roller/weblogger/pojos/WeblogReferrer.orm.xml          </mapping-file>
+        <mapping-file>org/apache/roller/weblogger/pojos/UserRole.orm.xml                </mapping-file>
+        <mapping-file>org/apache/roller/weblogger/pojos/RuntimeConfigProperty.orm.xml   </mapping-file>
+        <mapping-file>org/apache/roller/weblogger/pojos/TaskLock.orm.xml                </mapping-file>
+        <mapping-file>org/apache/roller/weblogger/pojos/User.orm.xml                    </mapping-file>
+        <mapping-file>org/apache/roller/weblogger/pojos/WeblogCategory.orm.xml          </mapping-file>
+        <mapping-file>org/apache/roller/weblogger/pojos/WeblogEntry.orm.xml             </mapping-file>
+        <mapping-file>org/apache/roller/weblogger/pojos/WeblogEntryTagAggregate.orm.xml </mapping-file>
+        <mapping-file>org/apache/roller/weblogger/pojos/WeblogEntryTag.orm.xml          </mapping-file>
+        <mapping-file>org/apache/roller/weblogger/pojos/WeblogTemplate.orm.xml          </mapping-file>
+        <mapping-file>org/apache/roller/weblogger/pojos/ObjectPermission.orm.xml        </mapping-file>
+        <mapping-file>org/apache/roller/weblogger/pojos/WeblogPermission.orm.xml        </mapping-file>
+        <mapping-file>org/apache/roller/weblogger/pojos/Weblog.orm.xml                  </mapping-file>
+        <mapping-file>org/apache/roller/weblogger/pojos/UserAttribute.orm.xml           </mapping-file>
+        <mapping-file>org/apache/roller/weblogger/pojos/OAuthConsumerRecord.orm.xml     </mapping-file>
+        <mapping-file>org/apache/roller/weblogger/pojos/OAuthAccessorRecord.orm.xml     </mapping-file>
     </persistence-unit> 
     
 </persistence>

Modified: roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/MultiWeblogURLStrategy.java
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/MultiWeblogURLStrategy.java?rev=755000&r1=754999&r2=755000&view=diff
==============================================================================
--- roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/MultiWeblogURLStrategy.java (original)
+++ roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/MultiWeblogURLStrategy.java Mon Mar 16 20:40:06 2009
@@ -22,6 +22,7 @@
 import java.util.List;
 import java.util.Map;
 import org.apache.commons.lang.StringUtils;
+import org.apache.roller.weblogger.config.WebloggerConfig;
 import org.apache.roller.weblogger.config.WebloggerRuntimeConfig;
 import org.apache.roller.weblogger.pojos.Weblog;
 import org.apache.roller.weblogger.util.URLUtilities;
@@ -49,25 +50,26 @@
     public String getWeblogURL(Weblog weblog,
                                             String locale,
                                             boolean absolute) {
-        
-        if(weblog == null) {
-            return null;
-        }
-        
+
         StringBuffer url = new StringBuffer();
-        
-        if(absolute) {
-            url.append(WebloggerRuntimeConfig.getAbsoluteContextURL());
+        if (absolute) {
+            String weblogAbsoluteURL =
+                WebloggerConfig.getProperty("weblog.absoluteurl." + weblog.getHandle());
+            if (weblogAbsoluteURL != null) {
+                url.append(weblogAbsoluteURL);
+            } else {
+                url.append(WebloggerRuntimeConfig.getAbsoluteContextURL());
+            }
         } else {
             url.append(WebloggerRuntimeConfig.getRelativeContextURL());
         }
-        
+
         url.append("/").append(weblog.getHandle()).append("/");
-        
+
         if(locale != null) {
             url.append(locale).append("/");
         }
-        
+
         return url.toString();
     }
     
@@ -406,6 +408,18 @@
     public String getOpenSearchWeblogURL(String weblogHandle) {
         return WebloggerRuntimeConfig.getAbsoluteContextURL() + "/roller-services/opensearch/" + weblogHandle;
     }
+
+    public String getOAuthRequestTokenURL() {
+        return WebloggerRuntimeConfig.getAbsoluteContextURL() + "/roller-services/oauth/requestToken";
+    }
+
+    public String getOAuthAuthorizationURL() {
+        return WebloggerRuntimeConfig.getAbsoluteContextURL() + "/roller-services/oauth/authorize";
+    }
+
+    public String getOAuthAccessTokenURL() {
+        return WebloggerRuntimeConfig.getAbsoluteContextURL() + "/roller-services/oauth/accessToken";
+    }
     
 }
 

Added: roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/OAuthManager.java
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/OAuthManager.java?rev=755000&view=auto
==============================================================================
--- roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/OAuthManager.java (added)
+++ roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/OAuthManager.java Mon Mar 16 20:40:06 2009
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2007 AOL, LLC.
+ *
+ * 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 org.apache.roller.weblogger.business;
+
+import java.io.IOException;
+
+import net.oauth.OAuthAccessor;
+import net.oauth.OAuthConsumer;
+import net.oauth.OAuthException;
+import net.oauth.OAuthMessage;
+import net.oauth.OAuthProblemException;
+import net.oauth.OAuthServiceProvider;
+import net.oauth.OAuthValidator;
+import org.apache.roller.weblogger.WebloggerException;
+
+
+/**
+ * Management of and access to configured and persistent OAuth objects.
+ */
+public interface OAuthManager {
+
+    /**
+     * Get validator to be used to OAuth validate messages.
+     */
+    public OAuthServiceProvider getServiceProvider();
+
+    /**
+     * Get validator to be used to OAuth validate messages.
+     */
+    public OAuthValidator getValidator();
+
+    /**
+     * Get the site-wide consumer.
+     */
+    public OAuthConsumer getConsumer()
+            throws WebloggerException;
+
+    /**
+     * Get consumer corresponding to request.
+     */
+    public OAuthConsumer getConsumerByUsername(String username)
+            throws WebloggerException;
+
+    /**
+     * Get consumer corresponding to request.
+     */
+    public OAuthConsumer getConsumer(
+            OAuthMessage requestMessage)
+            throws IOException, OAuthProblemException;
+
+    /**
+     * Add a site-wide consumer provided a key, there can only be one.
+     */
+    public OAuthConsumer addConsumer(String consumerKey)
+            throws OAuthException, WebloggerException;
+
+    /**
+     * Store a new consumer for specified user, each user can have only one.
+     */
+    public OAuthConsumer addConsumer(String username, String consumerKey)
+            throws OAuthException;
+
+    /**
+     * Get the access token and token secret for the given request.
+     * If token is provided, it better be good; otherwise exception.
+     * If consumer key is provided and no accessor exists, will return null.
+     *
+     * @param requestMessage Request with token or consumer key
+     * @return Accessor or null if consumer key does not have a token yet
+     * @throws OAuthProblemException If provided token is bad
+     * @throws java.io.IOException on IO error
+     */
+    public OAuthAccessor getAccessor(OAuthMessage requestMessage)
+            throws IOException, OAuthProblemException;
+
+    /**
+     * Set the access token 
+     */
+    public void markAsAuthorized(OAuthAccessor accessor, String userId)
+            throws OAuthException;    
+
+    /**
+     * Generate a fresh request token and secret for a consumer.
+     * 
+     * @throws OAuthException
+     */
+    public void generateRequestToken(
+            OAuthAccessor accessor)
+            throws OAuthException;
+    
+    /**
+     * Generate a fresh request token and secret for a consumer.
+     * 
+     * @throws OAuthException
+     */
+    public void generateAccessToken(OAuthAccessor accessor)
+            throws OAuthException;
+}

Modified: roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/URLStrategy.java
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/URLStrategy.java?rev=755000&r1=754999&r2=755000&view=diff
==============================================================================
--- roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/URLStrategy.java (original)
+++ roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/URLStrategy.java Mon Mar 16 20:40:06 2009
@@ -218,5 +218,14 @@
      * Get url to JSON tags service url, optionally for a given weblog.
      */
     public String getWeblogTagsJsonURL(Weblog weblog, boolean absolute, int pageNum);
-    
+
+
+    /* Get URL for obtaining OAuth Request Token */
+    public String getOAuthRequestTokenURL();
+
+    /* Get URL authorizing an OAuth Request Token */
+    public String getOAuthAuthorizationURL();
+
+    /* Get URL for obtaining OAuth Access Token */
+    public String getOAuthAccessTokenURL();
 }

Modified: roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/Weblogger.java
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/Weblogger.java?rev=755000&r1=754999&r2=755000&view=diff
==============================================================================
--- roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/Weblogger.java (original)
+++ roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/Weblogger.java Mon Mar 16 20:40:06 2009
@@ -19,6 +19,7 @@
 package org.apache.roller.weblogger.business;
 
 import org.apache.roller.weblogger.WebloggerException;
+import org.apache.roller.weblogger.business.jpa.JPAOAuthManagerImpl;
 import org.apache.roller.weblogger.business.plugins.PluginManager;
 import org.apache.roller.weblogger.business.pings.AutoPingManager;
 import org.apache.roller.weblogger.business.pings.PingQueueManager;
@@ -35,8 +36,7 @@
  * The main entry point interface of the Weblogger business tier.
  */
 public interface Weblogger {
-    
-    
+
     /**
      * 
      * Get UserManager associated with this Weblogger instance.
@@ -52,6 +52,13 @@
     
     
     /**
+     *
+     * Get OAuthManager associated with this Weblogger instance.
+     */
+    public OAuthManager getOAuthManager();
+
+
+    /**
      * 
      * Get WeblogManager associated with this Weblogger instance.
      */

Modified: roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/WebloggerImpl.java
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/WebloggerImpl.java?rev=755000&r1=754999&r2=755000&view=diff
==============================================================================
--- roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/WebloggerImpl.java (original)
+++ roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/WebloggerImpl.java Mon Mar 16 20:40:06 2009
@@ -18,7 +18,6 @@
 
 package org.apache.roller.weblogger.business;
 
-import org.apache.roller.weblogger.business.plugins.PluginManagerImpl;
 import org.apache.roller.weblogger.business.plugins.PluginManager;
 import java.io.IOException;
 import java.util.Properties;
@@ -30,7 +29,6 @@
 import org.apache.roller.weblogger.business.pings.PingTargetManager;
 import org.apache.roller.weblogger.business.referrers.RefererManager;
 import org.apache.roller.weblogger.business.referrers.ReferrerQueueManager;
-import org.apache.roller.weblogger.business.referrers.ReferrerQueueManagerImpl;
 import org.apache.roller.weblogger.business.search.IndexManager;
 import org.apache.roller.weblogger.business.runnable.ThreadManager;
 import org.apache.roller.weblogger.business.themes.ThemeManager;
@@ -64,6 +62,7 @@
     private final UserManager          userManager;
     private final WeblogManager        weblogManager;
     private final WeblogEntryManager   weblogEntryManager;
+    private final OAuthManager         oauthManager;
     
     // url strategy
     private final URLStrategy          urlStrategy;
@@ -91,6 +90,7 @@
         UserManager          userManager,
         WeblogManager        weblogManager,
         WeblogEntryManager   weblogEntryManager,
+        OAuthManager         oauthManager,
         URLStrategy          urlStrategy) throws WebloggerException { 
                 
         this.autoPingManager     = autoPingManager;
@@ -108,6 +108,7 @@
         this.userManager         = userManager;
         this.weblogManager       = weblogManager;
         this.weblogEntryManager  = weblogEntryManager;
+        this.oauthManager        = oauthManager;
         this.urlStrategy         = urlStrategy;
         
         Properties props = new Properties();
@@ -264,15 +265,25 @@
     
     
     /**
-     * 
-     * 
+     *
+     *
      * @see org.apache.roller.weblogger.modelWebloggerr#getPluginManager()
      */
     public PluginManager getPluginManager() {
         return pluginManager;
     }
-    
-    
+
+
+    /**
+     *
+     *
+     * @see org.apache.roller.weblogger.modelWebloggerr#getOauthManager()
+     */
+    public OAuthManager getOAuthManager() {
+        return oauthManager;
+    }
+
+
     /**
      * @inheritDoc
      */

Added: roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/jpa/JPAOAuthManagerImpl.java
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/jpa/JPAOAuthManagerImpl.java?rev=755000&view=auto
==============================================================================
--- roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/jpa/JPAOAuthManagerImpl.java (added)
+++ roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/jpa/JPAOAuthManagerImpl.java Mon Mar 16 20:40:06 2009
@@ -0,0 +1,405 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  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.  For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+
+package org.apache.roller.weblogger.business.jpa;
+
+import java.io.IOException; 
+import java.sql.Timestamp;
+import java.util.Date;
+import java.util.UUID;
+import javax.persistence.Query;
+import net.oauth.OAuthAccessor;
+import net.oauth.OAuthConsumer;
+import net.oauth.OAuthException;
+import net.oauth.OAuthMessage;
+import net.oauth.OAuthProblemException;
+import net.oauth.OAuthServiceProvider;
+import net.oauth.OAuthValidator;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.roller.weblogger.WebloggerException;
+import org.apache.roller.weblogger.business.OAuthManager;
+import org.apache.roller.weblogger.business.Weblogger;
+import org.apache.roller.weblogger.pojos.OAuthAccessorRecord;
+import org.apache.roller.weblogger.pojos.OAuthConsumerRecord;
+
+
+/**
+ * JPA based OAuth manager implementation.
+ */
+public class JPAOAuthManagerImpl implements OAuthManager {
+    private final Weblogger roller;
+    private final JPAPersistenceStrategy strategy;
+    private final OAuthValidator validator;
+
+    /**
+     * The logger instance for this class.
+     */
+    private static Log log = LogFactory
+            .getFactory().getInstance(JPAOAuthManagerImpl.class);
+
+
+    @com.google.inject.Inject
+    public JPAOAuthManagerImpl(
+            Weblogger roller,
+            JPAPersistenceStrategy strategy,
+            OAuthValidator validator) {
+        this.roller = roller;
+        this.strategy = strategy;
+        this.validator = validator;
+    }
+    
+    public OAuthServiceProvider getServiceProvider() {
+        return new OAuthServiceProvider(
+            roller.getUrlStrategy().getOAuthRequestTokenURL(),
+            roller.getUrlStrategy().getOAuthAuthorizationURL(),
+            roller.getUrlStrategy().getOAuthAccessTokenURL());
+    }
+
+    public OAuthValidator getValidator() {
+        return validator;
+    }
+
+    public OAuthConsumer getConsumer(
+            OAuthMessage requestMessage)
+            throws IOException, OAuthProblemException {
+
+        OAuthConsumer consumer = null;
+        // try to load from local cache if not throw exception
+        String consumer_key = requestMessage.getConsumerKey();
+
+        consumer = getConsumerByKey(consumer_key);
+
+        if(consumer == null) {
+            OAuthProblemException problem = new OAuthProblemException("token_rejected");
+            throw problem;
+        }
+
+        return consumer;
+    }
+    
+    /**
+     * Get the access token and token secret for the given oauth_token. 
+     */
+    public OAuthAccessor getAccessor(OAuthMessage requestMessage)
+            throws IOException, OAuthProblemException {
+
+        String consumerToken = requestMessage.getToken();
+        OAuthAccessor accessor = null;
+        if (StringUtils.isNotEmpty(consumerToken)) {
+            // caller provided a token, it better be good or else
+            accessor = getAccessorByToken(consumerToken);
+            if (accessor == null){
+                OAuthProblemException problem = new OAuthProblemException("token_expired");
+                throw problem;
+            }
+        }
+
+        String consumerKey = requestMessage.getConsumerKey();
+        if (accessor == null && StringUtils.isNotEmpty(consumerKey)) {
+            // caller provided contumer key, do we have an accessor yet
+            accessor = getAccessorByKey(consumerKey);
+        }
+        return accessor;
+    }
+
+    /**
+     * Set the access token 
+     */
+    public void markAsAuthorized(OAuthAccessor accessor, String userId)
+            throws OAuthException {
+        try {
+            OAuthAccessorRecord record = (OAuthAccessorRecord) strategy.load(
+                OAuthAccessorRecord.class, accessor.consumer.consumerKey);
+            record.setUserName(userId);
+            record.setAuthorized(Boolean.TRUE);
+            strategy.store(record);
+            
+        } catch (WebloggerException ex) {
+            throw new OAuthException("ERROR: setting authorization flag", ex);
+        }
+    }
+
+    /**
+     * Generate a fresh request token and secret for a consumer.
+     * @throws OAuthException
+     */
+    public void generateRequestToken(
+            OAuthAccessor accessor)
+            throws OAuthException {
+
+        // generate oauth_token and oauth_secret
+        String consumer_key = (String) accessor.consumer.consumerKey;
+        // generate token and secret based on consumer_key
+
+        // for now use md5 of name + current time as token
+        String token_data = consumer_key + System.nanoTime();
+        String token = DigestUtils.md5Hex(token_data);
+        // for now use md5 of name + current time + token as secret
+        String secret_data = consumer_key + System.nanoTime() + token;
+        String secret = DigestUtils.md5Hex(secret_data);
+
+        accessor.requestToken = token;
+        accessor.tokenSecret = secret;
+        accessor.accessToken = null;
+
+        // add to the local cache
+        addAccessor(accessor);
+    }
+    
+    /**
+     * Generate a fresh request token and secret for a consumer.
+     * @throws OAuthException
+     */
+    public void generateAccessToken(OAuthAccessor accessor)
+            throws OAuthException {
+
+        // generate oauth_token and oauth_secret
+        // generate token and secret based on consumer_key
+        String consumer_key = (String) accessor.consumer.consumerKey;
+
+        // unless we already have one
+        try {
+            // in that case, just return it
+            OAuthAccessorRecord record = (OAuthAccessorRecord) strategy.load(
+                OAuthAccessorRecord.class, accessor.consumer.consumerKey);
+            if (record != null) {
+                accessor.accessToken = record.getAccessToken();
+                accessor.tokenSecret = record.getTokenSecret();
+                return;
+            }
+            
+        } catch (WebloggerException ex) {
+            throw new OAuthException("ERROR: getting access token", ex);
+        }
+
+        // for now use md5 of name + current time as token
+        String token_data = consumer_key + System.nanoTime();
+        String token = DigestUtils.md5Hex(token_data);
+
+        try {
+            OAuthAccessorRecord record = (OAuthAccessorRecord) strategy.load(
+                OAuthAccessorRecord.class, accessor.consumer.consumerKey);
+            record.setRequestToken(null);
+            record.setAccessToken(token);
+            strategy.store(record);
+
+        } catch (WebloggerException ex) {
+            throw new OAuthException("ERROR: generating access token", ex);
+        }
+    }
+
+    public OAuthConsumer addConsumer(String username, String consumerKey) throws OAuthException {
+
+        OAuthConsumerRecord record = new OAuthConsumerRecord();
+        record.setConsumerKey(consumerKey);
+        record.setUserName(username);
+        record.setConsumerSecret(UUID.randomUUID().toString());
+
+        try {
+            strategy.store(record);
+        } catch (WebloggerException ex) {
+            throw new OAuthException("ERROR storing accessor", ex);
+        }
+        
+        OAuthConsumer consumer = new OAuthConsumer(
+            null,
+            record.getConsumerKey(),
+            record.getConsumerSecret(),
+            getServiceProvider());
+
+        return consumer;
+    }
+
+    public OAuthConsumer addConsumer(String consumerKey) 
+            throws OAuthException, WebloggerException {
+        if (getConsumer() == null) {
+            return addConsumer(null, consumerKey);
+        } else {
+            throw new OAuthException("ERROR: cannot have more than one site-wide consumer");
+        }
+    }
+
+    public OAuthConsumer getConsumer() throws WebloggerException {
+        OAuthConsumerRecord record = null;
+        try {
+            Query q = strategy.getNamedQuery("OAuthConsumerRecord.getSiteWideConsumer");
+            record = (OAuthConsumerRecord)q.getSingleResult();
+
+        } catch (Throwable ex) {
+            log.debug("ERROR fetching site-wide consumer", ex);
+        }
+        if (record != null) {
+            OAuthConsumer consumer = new OAuthConsumer(
+                null,
+                record.getConsumerKey(),
+                record.getConsumerSecret(),
+                getServiceProvider());
+            return consumer;
+        }
+        return null;
+    }
+
+    public OAuthConsumer getConsumerByUsername(String username) throws WebloggerException {
+        OAuthConsumerRecord record = null;
+        try {
+            Query q = strategy.getNamedQuery("OAuthConsumerRecord.getByUsername");
+            q.setParameter(1, username);
+            record = (OAuthConsumerRecord)q.getSingleResult();
+
+        } catch (Throwable ex) {
+            log.debug("ERROR fetching consumer", ex);
+        }
+        if (record != null) {
+            OAuthConsumer consumer = new OAuthConsumer(
+                null,
+                record.getConsumerKey(),
+                record.getConsumerSecret(),
+                getServiceProvider());
+            consumer.setProperty("userName", record.getUserName());
+            return consumer;
+        }
+        return null;
+    }
+
+    
+    //--------------------------------------------- package protected internals
+
+    OAuthConsumer consumerFromRecord(OAuthConsumerRecord record) {
+        OAuthConsumer consumer = null;
+        if (record != null) {
+            consumer = new OAuthConsumer(
+                null,
+                record.getConsumerKey(),
+                record.getConsumerSecret(),
+                getServiceProvider());
+            if (record.getUserName() != null) {
+                consumer.setProperty("userId", record.getUserName());
+            }
+        }
+        return consumer;
+    }
+
+    OAuthAccessor accessorFromRecord(OAuthAccessorRecord record) {
+        OAuthAccessor accessor = null;
+        if (record != null) {
+            accessor =
+                new OAuthAccessor(getConsumerByKey(record.getConsumerKey()));
+            accessor.accessToken = record.getAccessToken();
+            accessor.requestToken = record.getRequestToken();
+            accessor.tokenSecret = record.getTokenSecret();
+            if (record.getAuthorized() != null) {
+                accessor.setProperty("authorized", record.getAuthorized());
+            }
+            if (record.getUserName() != null) {
+                accessor.setProperty("userId", record.getUserName());
+            }
+        }
+        return accessor;
+    }
+
+    OAuthConsumer getConsumerByKey(String consumerKey) {
+        OAuthConsumerRecord record = null;
+        try {
+            Query q = strategy.getNamedQuery("OAuthConsumerRecord.getByConsumerKey");
+            q.setParameter(1, consumerKey);
+            record = (OAuthConsumerRecord)q.getSingleResult();
+
+        } catch (Throwable ex) {
+            log.debug("ERROR fetching consumer", ex);
+        }
+        return consumerFromRecord(record);
+    }
+
+    void addAccessor(OAuthAccessor accessor) throws OAuthException {
+
+        OAuthAccessorRecord record = new OAuthAccessorRecord();
+        record.setConsumerKey(accessor.consumer.consumerKey);
+        record.setRequestToken(accessor.requestToken);
+        record.setAccessToken(accessor.accessToken);
+        record.setTokenSecret(accessor.tokenSecret);
+        if (accessor.getProperty("userId") != null) {
+            record.setUserName((String)accessor.getProperty("userId"));
+        }
+
+        if (record.getCreated() != null) {
+            record.setCreated(record.getCreated());
+        } else {
+            record.setCreated(new Timestamp(new Date().getTime()));
+        }
+        
+        if (record.getUpdated() != null) {
+            record.setUpdated(record.getUpdated());
+        } else {
+            record.setUpdated(record.getCreated());
+        }
+
+        if (accessor.getProperty("authorized") != null) {
+            record.setAuthorized((Boolean)accessor.getProperty("authorized"));
+        }
+        try {
+            strategy.store(record);
+        } catch (WebloggerException ex) {
+            throw new OAuthException("ERROR storing accessor", ex);
+        }
+    }
+
+    OAuthAccessor getAccessorByKey(String consumerKey) {
+        OAuthAccessorRecord record = null;
+        try {
+            Query q = strategy.getNamedQuery("OAuthAccessorRecord.getByKey");
+            q.setParameter(1, consumerKey);
+            record = (OAuthAccessorRecord)q.getSingleResult();
+
+        } catch (Throwable ex) {
+            log.debug("ERROR fetching accessor", ex);
+        }
+        return accessorFromRecord(record);
+    }
+
+    OAuthAccessor getAccessorByToken(String token) {
+        OAuthAccessorRecord record = null;
+        try {
+            Query q = strategy.getNamedQuery("OAuthAccessorRecord.getByToken");
+            q.setParameter(1, token);
+            record = (OAuthAccessorRecord)q.getSingleResult();
+
+        } catch (Throwable ex) {
+            log.debug("ERROR fetching accessor", ex);
+        }
+        return accessorFromRecord(record);
+    }
+
+    void removeConsumer(OAuthConsumer consumer) throws OAuthException {
+        try {
+            strategy.remove(OAuthConsumerRecord.class, consumer.consumerKey);
+        } catch (WebloggerException ex) {
+            throw new OAuthException("ERROR removing consumer", ex);
+        }
+    }
+
+    void removeAccessor(OAuthAccessor accessor) throws OAuthException {
+        try {
+            strategy.remove(OAuthAccessorRecord.class, accessor.consumer.consumerKey);
+        } catch (WebloggerException ex) {
+            throw new OAuthException("ERROR removing accessor", ex);
+        }
+    }
+}

Modified: roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerImpl.java
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerImpl.java?rev=755000&r1=754999&r2=755000&view=diff
==============================================================================
--- roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerImpl.java (original)
+++ roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerImpl.java Mon Mar 16 20:40:06 2009
@@ -22,6 +22,7 @@
 import org.apache.roller.weblogger.WebloggerException;
 import org.apache.roller.weblogger.business.BookmarkManager;
 import org.apache.roller.weblogger.business.FileManager;
+import org.apache.roller.weblogger.business.OAuthManager;
 import org.apache.roller.weblogger.business.PropertiesManager;
 import org.apache.roller.weblogger.business.URLStrategy;
 import org.apache.roller.weblogger.business.WebloggerImpl;
@@ -74,6 +75,7 @@
         UserManager          userManager,
         WeblogManager        weblogManager,
         WeblogEntryManager   weblogEntryManager,
+        OAuthManager         oauthManager,
         URLStrategy          urlStrategy) throws WebloggerException {
         
         super(
@@ -92,6 +94,7 @@
             userManager,
             weblogManager,
             weblogEntryManager,
+            oauthManager,
             urlStrategy);
         
         this.strategy = strategy;
@@ -117,5 +120,4 @@
         // then let parent do its thing
         super.shutdown();
     }
-    
 }

Modified: roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerModule.java
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerModule.java?rev=755000&r1=754999&r2=755000&view=diff
==============================================================================
--- roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerModule.java (original)
+++ roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerModule.java Mon Mar 16 20:40:06 2009
@@ -20,10 +20,13 @@
 
 import com.google.inject.Binder;
 import com.google.inject.Module;
+import net.oauth.OAuthValidator;
+import net.oauth.SimpleOAuthValidator;
 import org.apache.roller.weblogger.business.BookmarkManager;
 import org.apache.roller.weblogger.business.FileManager;
 import org.apache.roller.weblogger.business.FileManagerImpl;
 import org.apache.roller.weblogger.business.MultiWeblogURLStrategy;
+import org.apache.roller.weblogger.business.OAuthManager;
 import org.apache.roller.weblogger.business.PropertiesManager;
 import org.apache.roller.weblogger.business.URLStrategy;
 import org.apache.roller.weblogger.business.Weblogger;
@@ -67,6 +70,9 @@
         binder.bind(UserManager.class).to(         JPAUserManagerImpl.class);   
         binder.bind(WeblogManager.class).to(       JPAWeblogManagerImpl.class);   
         binder.bind(WeblogEntryManager.class).to(  JPAWeblogEntryManagerImpl.class);   
+        binder.bind(OAuthManager.class).to(        JPAOAuthManagerImpl.class);
+
+        binder.bind(OAuthValidator.class).to(      SimpleOAuthValidator.class);
                 
         binder.bind(ReferrerQueueManager.class).to(ReferrerQueueManagerImpl.class); 
         binder.bind(FileManager.class).to(         FileManagerImpl.class);   

Modified: roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/startup/DatabaseInstaller.java
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/startup/DatabaseInstaller.java?rev=755000&r1=754999&r2=755000&view=diff
==============================================================================
--- roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/startup/DatabaseInstaller.java (original)
+++ roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/business/startup/DatabaseInstaller.java Mon Mar 16 20:40:06 2009
@@ -245,9 +245,9 @@
                 upgradeTo400(con, runScripts);
                 dbversion = 400;
             }
-            if(dbversion < 410) {
-                upgradeTo410(con, runScripts);
-                dbversion = 410;
+            if(dbversion < 500) {
+                upgradeTo500(con, runScripts);
+                dbversion = 500;
             }
             
             // make sure the database version is the exact version
@@ -1121,25 +1121,25 @@
     /**
      * Upgrade database for Roller 4.1.0
      */
-    private void upgradeTo410(Connection con, boolean runScripts) throws StartupException {
+    private void upgradeTo500(Connection con, boolean runScripts) throws StartupException {
         
         // first we need to run upgrade scripts 
         SQLScriptRunner runner = null;
         try {    
             if (runScripts) {
                 String handle = getDatabaseHandle(con);
-                String scriptPath = handle + "/400-to-410-migration.sql";
+                String scriptPath = handle + "/400-to-500-migration.sql";
                 successMessage("Running database upgrade script: "+scriptPath);                
                 runner = new SQLScriptRunner(scripts.getDatabaseScript(scriptPath));
                 runner.runScript(con, true);
                 messages.addAll(runner.getMessages());
             }
         } catch(Exception ex) {
-            log.error("ERROR running 410 database upgrade script", ex);
+            log.error("ERROR running 500 database upgrade script", ex);
             if (runner != null) messages.addAll(runner.getMessages());
             
-            errorMessage("Problem upgrading database to version 410", ex);
-            throw new StartupException("Problem upgrading database to version 410", ex);
+            errorMessage("Problem upgrading database to version 500", ex);
+            throw new StartupException("Problem upgrading database to version 500", ex);
         }        
     }
 

Modified: roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/config/runtimeConfigDefs.xml
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/config/runtimeConfigDefs.xml?rev=755000&r1=754999&r2=755000&view=diff
==============================================================================
--- roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/config/runtimeConfigDefs.xml (original)
+++ roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/config/runtimeConfigDefs.xml Mon Mar 16 20:40:06 2009
@@ -80,9 +80,9 @@
          <type>boolean</type>
          <default-value>false</default-value>
       </property-def>
-      <property-def name="site.debugMode" key="configForm.debugMode">
+      <property-def name="site.allowUserWeblogCreation" key="configForm.allowUserWeblogCreation">
          <type>boolean</type>
-         <default-value>false</default-value>
+         <default-value>true</default-value>
       </property-def>
    </display-group >
 
@@ -116,6 +116,25 @@
    </display-group >
    
    
+   <display-group name="webServicesSettings" key="configForm.webServicesSettings" >
+
+      <property-def name="webservices.enableXmlRpc"  key="configForm.enableXmlRpc">
+         <type>boolean</type>
+         <default-value>false</default-value>
+      </property-def>
+
+      <property-def name="webservices.enableAtomPub"  key="configForm.enableAtomPub">
+         <type>boolean</type>
+         <default-value>false</default-value>
+      </property-def>
+
+      <property-def name="webservices.atomPubAuth"  key="configForm.AtomPubAuth">
+         <type>string</type>
+         <default-value>basic</default-value>
+      </property-def>
+
+   </display-group>
+
    <!-- Weblog Rendering Settings Group -->
    <display-group name="weblogSettings" key="configForm.weblogSettings" >
        

Added: roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/pojos/OAuthAccessorRecord.java
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/pojos/OAuthAccessorRecord.java?rev=755000&view=auto
==============================================================================
--- roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/pojos/OAuthAccessorRecord.java (added)
+++ roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/pojos/OAuthAccessorRecord.java Mon Mar 16 20:40:06 2009
@@ -0,0 +1,178 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  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.  For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+
+package org.apache.roller.weblogger.pojos;
+
+import java.io.Serializable;
+import java.sql.Timestamp;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+
+
+/**
+ * Stores data for an OAuth accessor
+ */
+public class OAuthAccessorRecord implements Serializable {
+    private String consumerKey;
+    private String requestToken;
+    private String accessToken;
+    private String tokenSecret;
+    private Timestamp created;
+    private Timestamp updated;
+    private Boolean authorized;
+    private String userName;
+
+    public OAuthAccessorRecord() {
+    }
+
+    /**
+     * @return the consumerKey
+     */
+    public String getConsumerKey() {
+        return consumerKey;
+    }
+
+    /**
+     * @param consumerKey the consumerKey to set
+     */
+    public void setConsumerKey(String consumerKey) {
+        this.consumerKey = consumerKey;
+    }
+
+    /**
+     * @return the requestToken
+     */
+    public String getRequestToken() {
+        return requestToken;
+    }
+
+    /**
+     * @param requestToken the requestToken to set
+     */
+    public void setRequestToken(String requestToken) {
+        this.requestToken = requestToken;
+    }
+
+    /**
+     * @return the accessToken
+     */
+    public String getAccessToken() {
+        return accessToken;
+    }
+
+    /**
+     * @param accessToken the accessToken to set
+     */
+    public void setAccessToken(String accessToken) {
+        this.accessToken = accessToken;
+    }
+
+    /**
+     * @return the tokenSecret
+     */
+    public String getTokenSecret() {
+        return tokenSecret;
+    }
+
+    /**
+     * @param tokenSecret the tokenSecret to set
+     */
+    public void setTokenSecret(String tokenSecret) {
+        this.tokenSecret = tokenSecret;
+    }
+
+    /**
+     * @return the created
+     */
+    public Timestamp getCreated() {
+        return created;
+    }
+
+    /**
+     * @param created the created to set
+     */
+    public void setCreated(Timestamp created) {
+        this.created = created;
+    }
+
+    /**
+     * @return the updated
+     */
+    public Timestamp getUpdated() {
+        return updated;
+    }
+
+    /**
+     * @param updated the updated to set
+     */
+    public void setUpdated(Timestamp updated) {
+        this.updated = updated;
+    }
+
+    //------------------------------------------------------- Good citizenship
+
+    public String toString() {
+        StringBuffer buf = new StringBuffer();
+        buf.append("{");
+        buf.append(this.getConsumerKey());
+        buf.append("}");
+        return buf.toString();
+    }
+
+    public boolean equals(Object other) {
+        if (other == this) return true;
+        if (other instanceof OAuthAccessorRecord != true) return false;
+        OAuthAccessorRecord o = (OAuthAccessorRecord)other;
+        return new EqualsBuilder()
+            .append(getConsumerKey(), o.getConsumerKey())
+            .isEquals();
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder().append(getConsumerKey()).toHashCode();
+    }
+
+    /**
+     * @return the authorized
+     */
+    public Boolean getAuthorized() {
+        return authorized;
+    }
+
+    /**
+     * @param authorized the authorized to set
+     */
+    public void setAuthorized(Boolean authorized) {
+        this.authorized = authorized;
+    }
+
+    /**
+     * @return the userName
+     */
+    public String getUserName() {
+        return userName;
+    }
+
+    /**
+     * @param userName the userName to set
+     */
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+}

Added: roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/pojos/OAuthAccessorRecord.orm.xml
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/pojos/OAuthAccessorRecord.orm.xml?rev=755000&view=auto
==============================================================================
--- roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/pojos/OAuthAccessorRecord.orm.xml (added)
+++ roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/pojos/OAuthAccessorRecord.orm.xml Mon Mar 16 20:40:06 2009
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<entity-mappings version="1.0" xmlns="http://java.sun.com/xml/ns/persistence/orm"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd">
+    <description>Persistence Metadata for Roller</description>
+    <persistence-unit-metadata>
+        <persistence-unit-defaults>
+            <access>PROPERTY</access>
+        </persistence-unit-defaults>
+    </persistence-unit-metadata>
+    <package>org.apache.roller.weblogger.pojos</package>
+    <entity metadata-complete="true" name="OAuthAccessorRecord"
+            class="org.apache.roller.weblogger.pojos.OAuthAccessorRecord">
+        <table name="rol_oauthaccessor"/>
+        <named-query name="OAuthAccessorRecord.getByKey">
+            <query>SELECT p FROM OAuthAccessorRecord p WHERE p.consumerKey = ?1</query>
+        </named-query>
+        <named-query name="OAuthAccessorRecord.getByToken">
+            <query>SELECT p FROM OAuthAccessorRecord p WHERE p.requestToken = ?1 OR p.accessToken = ?1</query>
+        </named-query>
+        <named-query name="OAuthAccessorRecord.getByUserName">
+            <query>SELECT p FROM OAuthAccessorRecord p WHERE p.userName = ?1</query>
+        </named-query>
+        <attributes>
+            <id name="consumerKey">
+                <column name="consumerkey"/>
+            </id>
+            <basic name="requestToken">
+                <column name="requesttoken" insertable="true" updatable="true" unique="false"/>
+            </basic>
+            <basic name="accessToken">
+                <column name="accesstoken" insertable="true" updatable="true" unique="false"/>
+            </basic>
+            <basic name="tokenSecret">
+                <column name="tokensecret" insertable="true" updatable="true" unique="false"/>
+            </basic>
+            <basic name="created">
+                <column name="created" insertable="true" updatable="true" unique="false"/>
+            </basic>
+            <basic name="updated">
+                <column name="updated" insertable="true" updatable="true" unique="false"/>
+            </basic>
+            <basic name="authorized">
+                <column name="authorized" insertable="true" updatable="true" unique="false"/>
+            </basic>
+            <basic name="userName">
+                <column name="username" insertable="true" updatable="true" unique="true"/>
+            </basic>
+        </attributes>
+    </entity>
+</entity-mappings>

Added: roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/pojos/OAuthConsumerRecord.java
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/pojos/OAuthConsumerRecord.java?rev=755000&view=auto
==============================================================================
--- roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/pojos/OAuthConsumerRecord.java (added)
+++ roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/pojos/OAuthConsumerRecord.java Mon Mar 16 20:40:06 2009
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  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.  For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+
+package org.apache.roller.weblogger.pojos;
+
+import java.io.Serializable;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+
+
+/**
+ * Stores data for an OAuth consumer key and secret.
+ * There can be up to one for the whole site and up to one per user.
+ */
+public class OAuthConsumerRecord implements Serializable {
+    private String consumerKey;
+    private String consumerSecret;
+    private String userName;
+
+    public OAuthConsumerRecord() {
+    }
+
+    /**
+     * @return the consumerKey
+     */
+    public String getConsumerKey() {
+        return consumerKey;
+    }
+
+    /**
+     * @param consumerKey the consumerKey to set
+     */
+    public void setConsumerKey(String consumerKey) {
+        this.consumerKey = consumerKey;
+    }
+
+    /**
+     * @return the consumerSecret
+     */
+    public String getConsumerSecret() {
+        return consumerSecret;
+    }
+
+    /**
+     * @param consumerSecret the consumerSecret to set
+     */
+    public void setConsumerSecret(String consumerSecret) {
+        this.consumerSecret = consumerSecret;
+    }
+    
+    /**
+     * @return the username
+     */
+    public String getUserName() {
+        return userName;
+    }
+
+    /**
+     * @param username the username to set
+     */
+    public void setUserName(String username) {
+        this.userName = username;
+    }
+
+    //------------------------------------------------------- Good citizenship
+
+    public String toString() {
+        StringBuffer buf = new StringBuffer();
+        buf.append("{");
+        buf.append(this.getConsumerKey());
+        buf.append("}");
+        return buf.toString();
+    }
+
+    public boolean equals(Object other) {
+        if (other == this) return true;
+        if (other instanceof OAuthConsumerRecord != true) return false;
+        OAuthConsumerRecord o = (OAuthConsumerRecord)other;
+        return new EqualsBuilder()
+            .append(getConsumerKey(), o.getConsumerKey())
+            .isEquals();
+    }
+
+    public int hashCode() {
+        return new HashCodeBuilder().append(getConsumerKey()).toHashCode();
+    }
+
+}

Added: roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/pojos/OAuthConsumerRecord.orm.xml
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/pojos/OAuthConsumerRecord.orm.xml?rev=755000&view=auto
==============================================================================
--- roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/pojos/OAuthConsumerRecord.orm.xml (added)
+++ roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/pojos/OAuthConsumerRecord.orm.xml Mon Mar 16 20:40:06 2009
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<entity-mappings version="1.0" xmlns="http://java.sun.com/xml/ns/persistence/orm"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd">
+    <description>Persistence Metadata for Roller</description>
+    <persistence-unit-metadata>
+        <persistence-unit-defaults>
+            <access>PROPERTY</access>
+        </persistence-unit-defaults>
+    </persistence-unit-metadata>
+    <package>org.apache.roller.weblogger.pojos</package>
+    <entity metadata-complete="true" name="OAuthConsumerRecord"
+            class="org.apache.roller.weblogger.pojos.OAuthConsumerRecord">
+        <table name="rol_oauthconsumer"/>
+        <named-query name="OAuthConsumerRecord.getByConsumerKey">
+            <query>SELECT p FROM OAuthConsumerRecord p WHERE p.consumerKey = ?1</query>
+        </named-query>
+        <named-query name="OAuthConsumerRecord.getByUsername">
+            <query>SELECT p FROM OAuthConsumerRecord p WHERE p.userName = ?1</query>
+        </named-query>
+        <named-query name="OAuthConsumerRecord.getSiteWideConsumer">
+            <query>SELECT p FROM OAuthConsumerRecord p WHERE p.userName IS NULL</query>
+        </named-query>
+        <attributes>
+            <id name="consumerKey">
+                <column name="consumerkey"/>
+            </id>
+            <basic name="consumerSecret">
+                <column name="consumersecret" insertable="true" updatable="true" unique="false"/>
+            </basic>
+            <basic name="userName">
+                <column name="username" insertable="true" updatable="true" unique="true"/>
+            </basic>
+        </attributes>
+    </entity>
+</entity-mappings>

Modified: roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/pojos/Weblog.java
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/pojos/Weblog.java?rev=755000&r1=754999&r2=755000&view=diff
==============================================================================
--- roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/pojos/Weblog.java (original)
+++ roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/pojos/Weblog.java Mon Mar 16 20:40:06 2009
@@ -45,6 +45,7 @@
 import org.apache.roller.weblogger.business.WeblogEntryManager;
 import org.apache.roller.util.UUIDGenerator;
 import org.apache.roller.weblogger.business.UserManager;
+import org.apache.roller.weblogger.config.WebloggerConfig;
 import org.apache.roller.weblogger.util.I18nUtils;
 
 
@@ -84,16 +85,16 @@
     private Date    dateCreated      = new java.util.Date();
     private Boolean defaultAllowComments = Boolean.TRUE;
     private int     defaultCommentDays = 0;
-    private Boolean moderateComments  = Boolean.FALSE;
+    private Boolean moderateComments = Boolean.FALSE;
     private int     entryDisplayCount = 15;
     private Date    lastModified     = new Date();
     private String  pageModels       = new String();
-    private boolean enableMultiLang = false;
-    private boolean showAllLangs = true;
+    private boolean enableMultiLang  = false;
+    private boolean showAllLangs     = true;
     private String  customStylesheetPath = null;
-    private String  iconPath = null;
-    private String  about = null;
-    private String  creator = null;     
+    private String  iconPath         = null;
+    private String  about            = null;
+    private String  creator          = null;
     
     // Associated objects
     private List           permissions = new ArrayList();
@@ -855,17 +856,18 @@
     }
     
     
-    /** 
+    /**
      * @roller.wrapPojoMethod type="simple"
      */
     public String getAbsoluteURL() {
-        // TODO: ATLAS reconcile entry.getPermaLink() with new URLs
-        String relPath = WebloggerRuntimeConfig.getAbsoluteContextURL();
-        return relPath + "/" + getHandle();
-        //return URLUtilities.getWeblogURL(this, null, true);
-    }
-    public void setAbsoluteURL(String url) {
-        // noop
+        String weblogAbsoluteURL =
+            WebloggerConfig.getProperty("weblog.absoluteurl." + getHandle());
+        if (weblogAbsoluteURL != null) {
+            return weblogAbsoluteURL + "/" + getHandle();
+        } else {
+            String relPath = WebloggerRuntimeConfig.getAbsoluteContextURL();
+            return relPath + "/" + getHandle();
+        }
     }
     
     
@@ -1260,5 +1262,4 @@
 
     /** No-op method to please XDoclet */
     public void setEntryCount(int ignored) {}
-    
 }

Modified: roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/WeblogRequestMapper.java
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/WeblogRequestMapper.java?rev=755000&r1=754999&r2=755000&view=diff
==============================================================================
--- roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/WeblogRequestMapper.java (original)
+++ roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/WeblogRequestMapper.java Mon Mar 16 20:40:06 2009
@@ -135,6 +135,16 @@
             log.debug("SKIPPED "+weblogHandle);
             return false;
         }
+
+        String weblogAbsoluteURL =
+            WebloggerConfig.getProperty("weblog.absoluteurl." + weblogHandle);
+        if (weblogAbsoluteURL != null) {
+            // An absolute URL is specified for this weblog, make sure request URL matches
+            if (!request.getRequestURL().toString().startsWith(weblogAbsoluteURL)) {
+                log.debug("SKIPPED "+weblogHandle);
+                return false;
+            }
+        }
         
         log.debug("WEBLOG_URL "+request.getServletPath());
         

Modified: roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/model/URLModel.java
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/model/URLModel.java?rev=755000&r1=754999&r2=755000&view=diff
==============================================================================
--- roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/model/URLModel.java (original)
+++ roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/model/URLModel.java Mon Mar 16 20:40:06 2009
@@ -27,6 +27,7 @@
 import org.apache.roller.weblogger.business.URLStrategy;
 import org.apache.roller.weblogger.business.WebloggerFactory;
 import org.apache.roller.weblogger.business.WeblogEntryManager;
+import org.apache.roller.weblogger.config.WebloggerConfig;
 import org.apache.roller.weblogger.config.WebloggerRuntimeConfig;
 import org.apache.roller.weblogger.pojos.WeblogEntry;
 import org.apache.roller.weblogger.pojos.Weblog;
@@ -89,7 +90,13 @@
     
     /** Absolute URL of Roller, e.g. http://localhost:8080/roller */
     public String getAbsoluteSite() {
-        return WebloggerRuntimeConfig.getAbsoluteContextURL();
+        String weblogAbsoluteURL =
+            WebloggerConfig.getProperty("weblog.absoluteurl." + weblog.getHandle());
+        if (weblogAbsoluteURL != null) {
+            return weblogAbsoluteURL;
+        } else {
+            return WebloggerRuntimeConfig.getAbsoluteContextURL();
+        }
     }
     
     

Modified: roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/servlets/PageServlet.java
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/servlets/PageServlet.java?rev=755000&r1=754999&r2=755000&view=diff
==============================================================================
--- roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/servlets/PageServlet.java (original)
+++ roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/servlets/PageServlet.java Mon Mar 16 20:40:06 2009
@@ -244,7 +244,7 @@
             }
 
             // If request specified tags section index, then look for custom template
-        } else if ("tags".equals(pageRequest.getContext()) && pageRequest.getTags() == null) {
+        } else if ("tags".equals(pageRequest.getContext()) && pageRequest.getTags() != null) {
             try {
                 page = weblog.getTheme().getTemplateByAction(ThemeTemplate.ACTION_TAGSINDEX);
             } catch (Exception e) {

Added: roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/ui/struts2/core/OAuthAuthorize.java
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/ui/struts2/core/OAuthAuthorize.java?rev=755000&view=auto
==============================================================================
--- roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/ui/struts2/core/OAuthAuthorize.java (added)
+++ roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/ui/struts2/core/OAuthAuthorize.java Mon Mar 16 20:40:06 2009
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  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.  For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+package org.apache.roller.weblogger.ui.struts2.core;
+
+import javax.servlet.http.HttpServletRequest;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.roller.weblogger.pojos.User;
+import org.apache.roller.weblogger.ui.struts2.util.UIAction;
+import org.apache.struts2.interceptor.ServletRequestAware;
+import org.apache.struts2.interceptor.validation.SkipValidation;
+
+
+/**
+ * Allow user to authorized OAuth access to his/her account.
+ */
+public class OAuthAuthorize extends UIAction implements ServletRequestAware {
+    private static Log log = LogFactory.getLog(OAuthAuthorize.class);
+    private String appDesc = null;
+    private String token = null;
+    private String callback = null;
+
+
+    public OAuthAuthorize() {
+        this.pageTitle = "oauthAuthorize.title";
+    }
+    
+    
+    // override default security, we do not require an action weblog
+    @Override
+    public boolean isWeblogRequired() {
+        return false;
+    }
+
+
+    @SkipValidation
+    @Override
+    public String execute() {
+        boolean flush = false;
+        
+        try {
+            User ud = getAuthenticatedUser();
+
+
+        } catch (Exception ex) {
+            log.error("ERROR fetching user information", ex);
+        }
+
+        return SUCCESS;
+    }
+
+    /**
+     * @return the appDesc
+     */
+    public String getAppDesc() {
+        return appDesc;
+    }
+
+    /**
+     * @return the token
+     */
+    public String getToken() {
+        return token;
+    }
+
+    /**
+     * @return the callback
+     */
+    public String getCallback() {
+        return callback;
+    }
+
+    /**
+     * @return the userName
+     */
+    public String getUserName() {
+        return getAuthenticatedUser().getUserName();
+    }
+
+    public void setServletRequest(HttpServletRequest request) {
+        this.appDesc = (String)request.getAttribute("CONS_DESC");
+        this.token = (String)request.getAttribute("TOKEN");
+        this.callback = (String)request.getAttribute("CALLBACK");
+        if (this.getCallback() == null) this.callback = "";
+    }
+}

Added: roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/ui/struts2/core/OAuthKeys.java
URL: http://svn.apache.org/viewvc/roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/ui/struts2/core/OAuthKeys.java?rev=755000&view=auto
==============================================================================
--- roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/ui/struts2/core/OAuthKeys.java (added)
+++ roller/trunk/apps/weblogger/src/java/org/apache/roller/weblogger/ui/struts2/core/OAuthKeys.java Mon Mar 16 20:40:06 2009
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  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.  For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+package org.apache.roller.weblogger.ui.struts2.core;
+
+import net.oauth.OAuthConsumer;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.roller.weblogger.business.OAuthManager;
+import org.apache.roller.weblogger.business.WebloggerFactory;
+import org.apache.roller.weblogger.config.WebloggerRuntimeConfig;
+import org.apache.roller.weblogger.pojos.User;
+import org.apache.roller.weblogger.ui.struts2.util.UIAction;
+import org.apache.struts2.interceptor.validation.SkipValidation;
+
+
+/**
+ * Allows user to view his/her OAuth consumer key and secret.
+ */
+public class OAuthKeys extends UIAction {
+    private static Log log = LogFactory.getLog(OAuthKeys.class);
+    private OAuthConsumer userConsumer;
+    private OAuthConsumer siteWideConsumer;
+
+    public OAuthKeys() {
+        this.pageTitle = "oauthKeys.title";
+    }
+    
+    
+    // override default security, we do not require an action weblog
+    public boolean isWeblogRequired() {
+        return false;
+    }
+
+
+    @SkipValidation
+    public String execute() {
+        boolean flush = false;
+        
+        try {
+            User ud = getAuthenticatedUser();
+            OAuthManager omgr = WebloggerFactory.getWeblogger().getOAuthManager();
+            userConsumer = omgr.getConsumerByUsername(ud.getUserName());
+            if (userConsumer == null) {
+                String consumerKey = DigestUtils.md5Hex(ud.getUserName());
+                userConsumer = omgr.addConsumer(ud.getUserName(), consumerKey);
+                flush = true;
+            }
+
+            if (isUserIsAdmin()) {
+                siteWideConsumer = omgr.getConsumer();
+                if (siteWideConsumer == null) {
+                    String consumerKey = DigestUtils.md5Hex(
+                        WebloggerRuntimeConfig.getAbsoluteContextURL());
+                    siteWideConsumer = omgr.addConsumer(consumerKey);
+                    flush = true;
+                }
+            }
+            
+            if (flush) {
+                WebloggerFactory.getWeblogger().flush();
+            }
+
+        } catch (Exception ex) {
+            log.error("ERROR creating or retrieving your OAuth information", ex);
+        }
+
+        return SUCCESS;
+    }
+
+    /**
+     * @return the user's consumer
+     */
+    public OAuthConsumer getUserConsumer() {
+        return userConsumer;
+    }
+
+    /**
+     * @return the site's consumer
+     */
+    public OAuthConsumer getSiteWideConsumer() {
+        return siteWideConsumer;
+    }
+}