You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by tb...@apache.org on 2006/12/12 16:24:14 UTC

svn commit: r486187 [43/49] - in /directory/trunks/triplesec: ./ admin-api/ admin-api/src/ admin-api/src/main/ admin-api/src/main/java/ admin-api/src/main/java/org/ admin-api/src/main/java/org/safehaus/ admin-api/src/main/java/org/safehaus/triplesec/ a...

Added: directory/trunks/triplesec/webapp-config/src/test/resources/server.xml
URL: http://svn.apache.org/viewvc/directory/trunks/triplesec/webapp-config/src/test/resources/server.xml?view=auto&rev=486187
==============================================================================
--- directory/trunks/triplesec/webapp-config/src/test/resources/server.xml (added)
+++ directory/trunks/triplesec/webapp-config/src/test/resources/server.xml Tue Dec 12 07:23:31 2006
@@ -0,0 +1,250 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
+  "http://www.springframework.org/dtd/spring-beans.dtd">
+
+<beans>
+  <bean id="environment" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
+    <property name="properties">
+      <props>
+        <prop key="java.naming.security.authentication">simple</prop>
+        <prop key="java.naming.security.principal">uid=admin,ou=system</prop>
+        <prop key="java.naming.security.credentials">secret</prop>
+        <prop key="java.naming.provider.url">dc=example,dc=com</prop>
+        <prop key="java.naming.factory.state">org.safehaus.triplesec.store.ProfileStateFactory</prop>
+        <prop key="java.naming.factory.object">org.safehaus.triplesec.store.ProfileObjectFactory</prop>
+
+        <prop key="kdc.primary.realm">EXAMPLE.COM</prop>
+        <prop key="kdc.principal">krbtgt/EXAMPLE.COM@EXAMPLE.COM</prop>
+        <prop key="kdc.encryption.types">des-cbc-md5 des3-cbc-sha1 des3-cbc-md5 des-cbc-md4 des-cbc-crc</prop>
+        <prop key="kdc.entryBaseDn">ou=users,dc=example,dc=com</prop>
+        <prop key="kdc.java.naming.security.credentials">secret</prop>
+
+        <prop key="changepw.entryBaseDn">ou=users,dc=example,dc=com</prop>
+        <prop key="changepw.java.naming.security.credentials">secret</prop>
+        <prop key="changepw.principal">kadmin/changepw@EXAMPLE.COM</prop>
+
+        <!-- All times are in minutes -->
+        <prop key="kdc.allowable.clockskew">5</prop>
+        <prop key="kdc.tgs.maximum.ticket.lifetime">1440</prop>
+        <prop key="kdc.tgs.maximum.renewable.lifetime">10080</prop>
+        <prop key="kdc.pa.enc.timestamp.required">true</prop>
+        <prop key="kdc.tgs.empty.addresses.allowed">true</prop>
+        <prop key="kdc.tgs.forwardable.allowed">true</prop>
+        <prop key="kdc.tgs.proxiable.allowed">true</prop>
+        <prop key="kdc.tgs.postdate.allowed">true</prop>
+        <prop key="kdc.tgs.renewable.allowed">true</prop>
+
+        <prop key="safehaus.entry.basedn">ou=Users,dc=example,dc=com</prop>
+        <prop key="safehaus.load.testdata">true</prop>
+        <prop key="kerberos.sam.type.7">org.safehaus.triplesec.verifier.hotp.DefaultHotpSamVerifier</prop>
+      </props>
+    </property>
+  </bean>
+
+  <bean id="configuration" class="org.safehaus.triplesec.configuration.MutableTriplesecStartupConfiguration">
+    <property name="workingDirectory"><value>partitions</value></property>
+    <property name="allowAnonymousAccess"><value>false</value></property>
+    <property name="accessControlEnabled"><value>true</value></property>
+    <property name="ldapPort"><value>10389</value></property>
+    <property name="enableKerberos"><value>true</value></property>
+    <property name="enableNtp"><value>false</value></property>
+    <property name="enableChangePassword"><value>true</value></property>
+
+    <!-- Uncomment below to have the server load entries on startup!        -->
+    <!-- ldifDirectory property can point to a relative file, directory or  -->
+    <!-- can point to an absolute path to either using the URL path         -->
+    <!-- notation: i.e. file:///Users/jack/apacheds/ldifs                   -->
+
+    <!-- Entries will optionally be filtered using LdifLoadFilters in the   -->
+    <!-- order specified.  The included Krb5KdcEntryFilter will filter      -->
+    <!-- kerberos principals creating keys for them using their             -->
+    <!-- userPassword attribute if present.                                 -->
+
+    <!-- If missing the Triplesec server will use LDIF files under the conf -->
+    <!-- directory where it has been installed.                             -->
+
+    <!--
+    <property name="ldifDirectory">
+      <value>example.ldif</value>
+    </property>
+    -->
+    <property name="ldifFilters">
+      <list>
+        <bean class="org.apache.directory.server.protocol.shared.store.Krb5KdcEntryFilter"/>
+      </list>
+    </property>
+
+    <property name="activationConfiguration">
+      <bean class="org.safehaus.triplesec.configuration.ActivationConfiguration">
+        <property name="enableDecoyMidlet"><value>true</value></property>
+        <property name="otpLength"><value>6</value></property>
+        <property name="midletNameAttribute"><value>midletNameAttribute</value></property>
+      </bean>  
+    </property>    
+    
+    <property name="smsConfiguration">
+      <bean class="org.safehaus.triplesec.configuration.SmsConfiguration">
+        <property name="smsUsername"><value>hauskeys</value></property>
+        <property name="smsPassword"><value>secret</value></property>
+        <property name="smsAccountName"><value>demo</value></property>
+        <property name="smsTransportUrl"><value>http://www.nbroadcasting.com/customers/messages/Sender.asp</value></property>
+      </bean>  
+    </property>    
+    
+    <property name="smtpConfiguration">
+      <bean class="org.safehaus.triplesec.configuration.SmtpConfiguration">
+        <property name="smtpAuthenticate"><value>false</value></property>
+        <!-- uncomment and set above property if authentication is required by mail server
+             <property name="smtpUsername"><value>hauskeys</value></property>
+             <property name="smtpPassword"><value>secret</value></property>
+             -->
+             <property name="smtpHost"><value>localhost</value></property>
+             <property name="smtpSubject"><value>Triplesec Account Activated</value></property>
+             <property name="smtpFrom"><value>dev@safehaus.org</value></property>
+           </bean>  
+         </property>    
+         
+    <property name="contextPartitionConfigurations">
+      <set>
+        <ref bean="examplePartitionConfiguration"/>
+      </set>
+    </property>
+    <property name="bootstrapSchemas">
+      <set>
+        <bean class="org.apache.directory.server.core.schema.bootstrap.CorbaSchema"/>
+        <bean class="org.apache.directory.server.core.schema.bootstrap.CoreSchema"/>
+        <bean class="org.apache.directory.server.core.schema.bootstrap.CosineSchema"/>
+        <bean class="org.apache.directory.server.core.schema.bootstrap.ApacheSchema"/>
+        <bean class="org.apache.directory.server.core.schema.bootstrap.CollectiveSchema"/>
+        <bean class="org.apache.directory.server.core.schema.bootstrap.InetorgpersonSchema"/>
+        <bean class="org.apache.directory.server.core.schema.bootstrap.JavaSchema"/>
+        <bean class="org.apache.directory.server.core.schema.bootstrap.Krb5kdcSchema"/>
+        <bean class="org.apache.directory.server.core.schema.bootstrap.SystemSchema"/>
+        <bean class="org.safehaus.triplesec.store.schema.SafehausSchema"/>
+      </set>
+    </property>
+    
+    <property name="extendedOperationHandlers">
+      <list>
+        <bean class="org.apache.directory.server.ldap.support.extended.GracefulShutdownHandler"/>
+        <bean class="org.apache.directory.server.ldap.support.extended.LaunchDiagnosticUiHandler"/>
+      </list>
+    </property>  
+
+    <property name="interceptorConfigurations">
+      <list>
+        <bean class="org.apache.directory.server.core.configuration.MutableInterceptorConfiguration">
+          <property name="name"><value>normalizationService</value></property>
+          <property name="interceptor">
+            <bean class="org.apache.directory.server.core.normalization.NormalizationService" />
+          </property>
+        </bean>
+        <bean class="org.apache.directory.server.core.configuration.MutableInterceptorConfiguration">
+          <property name="name"><value>authenticationService</value></property>
+          <property name="interceptor">
+            <bean class="org.apache.directory.server.core.authn.AuthenticationService" />
+          </property>
+        </bean>
+        <bean class="org.apache.directory.server.core.configuration.MutableInterceptorConfiguration">
+          <property name="name"><value>referralService</value></property>
+          <property name="interceptor">
+            <bean class="org.apache.directory.server.core.referral.ReferralService" />
+          </property>
+        </bean>
+        <bean class="org.apache.directory.server.core.configuration.MutableInterceptorConfiguration">
+          <property name="name"><value>authorizationService</value></property>
+          <property name="interceptor">
+            <bean class="org.apache.directory.server.core.authz.AuthorizationService" />
+          </property>
+        </bean>
+        <bean class="org.apache.directory.server.core.configuration.MutableInterceptorConfiguration">
+          <property name="name"><value>defaultAuthorizationService</value></property>
+          <property name="interceptor">
+            <bean class="org.apache.directory.server.core.authz.DefaultAuthorizationService" />
+          </property>
+        </bean>
+        <bean class="org.apache.directory.server.core.configuration.MutableInterceptorConfiguration">
+          <property name="name"><value>exceptionService</value></property>
+          <property name="interceptor">
+            <bean class="org.apache.directory.server.core.exception.ExceptionService" />
+          </property>
+        </bean>
+        <bean class="org.apache.directory.server.core.configuration.MutableInterceptorConfiguration">
+          <property name="name"><value>schemaService</value></property>
+          <property name="interceptor">
+            <bean class="org.apache.directory.server.core.schema.SchemaService" />
+          </property>
+        </bean>
+        <bean class="org.apache.directory.server.core.configuration.MutableInterceptorConfiguration">
+          <property name="name"><value>subentryService</value></property>
+          <property name="interceptor">
+            <bean class="org.apache.directory.server.core.subtree.SubentryService" />
+          </property>
+        </bean>
+        <bean class="org.apache.directory.server.core.configuration.MutableInterceptorConfiguration">
+          <property name="name"><value>operationalAttributeService</value></property>
+          <property name="interceptor">
+            <bean class="org.apache.directory.server.core.operational.OperationalAttributeService" />
+          </property>
+        </bean>
+        <bean class="org.apache.directory.server.core.configuration.MutableInterceptorConfiguration">
+          <property name="name"><value>collectiveAttributeService</value></property>
+          <property name="interceptor">
+            <bean class="org.apache.directory.server.core.collective.CollectiveAttributeService" />
+          </property>
+        </bean>
+        <bean class="org.apache.directory.server.core.configuration.MutableInterceptorConfiguration">
+          <property name="name"><value>eventService</value></property>
+          <property name="interceptor">
+            <bean class="org.apache.directory.server.core.event.EventService" />
+          </property>
+        </bean>
+        <bean class="org.apache.directory.server.core.configuration.MutableInterceptorConfiguration">
+          <property name="name"><value>policyProtectionService</value></property>
+          <property name="interceptor">
+            <bean class="org.safehaus.triplesec.store.interceptor.PolicyProtectionInterceptor" />
+          </property>
+        </bean>
+      </list>
+    </property>
+  </bean>
+  
+  <bean id="examplePartitionConfiguration" class="org.apache.directory.server.core.configuration.MutablePartitionConfiguration">
+    <property name="name"><value>example</value></property>
+    <property name="suffix"><value>dc=example,dc=com</value></property>
+    <property name="indexedAttributes">
+      <set>
+        <value>objectClass</value>
+        <value>ou</value>
+        <value>dc</value>
+        <value>uid</value>
+        <value>profileId</value>
+        <value>roles</value>
+        <value>grants</value>
+        <value>denials</value>
+        <value>krb5PrincipalName</value>
+      </set>
+    </property>
+    <property name="contextEntry">
+      <value>
+        objectClass: top
+        objectClass: domain
+        objectClass: extensibleObject
+        dc: example
+        administrativeRole: accessControlSpecificArea
+        administrativeRole: collectiveAttributeSpecificArea
+      </value>
+    </property>
+  </bean>
+
+  <bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
+    <property name="customEditors">
+      <map>
+        <entry key="javax.naming.directory.Attributes">
+          <bean class="org.apache.directory.server.core.configuration.AttributesPropertyEditor"/>
+        </entry>
+      </map>
+   </property>
+  </bean>
+</beans>

Added: directory/trunks/triplesec/webapp-demo/pom.xml
URL: http://svn.apache.org/viewvc/directory/trunks/triplesec/webapp-demo/pom.xml?view=auto&rev=486187
==============================================================================
--- directory/trunks/triplesec/webapp-demo/pom.xml (added)
+++ directory/trunks/triplesec/webapp-demo/pom.xml Tue Dec 12 07:23:31 2006
@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+    http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License. 
+-->
+<project>
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.safehaus.triplesec</groupId>
+    <artifactId>build</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <artifactId>triplesec-webapp-demo</artifactId>
+  <name>Triplesec Webapp Demo (Wicket Based)</name>
+  <packaging>war</packaging>  
+  <build>
+    <finalName>demo</finalName>
+  </build>
+  <dependencies>
+    <dependency>
+      <groupId>wicket</groupId>
+      <artifactId>wicket-spring</artifactId>
+      <version>1.2-rc3</version>
+    </dependency>
+    <dependency>
+      <groupId>wicket</groupId>
+      <artifactId>wicket-extensions</artifactId>
+      <version>1.2-rc3</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.derby</groupId>
+      <artifactId>derby</artifactId>
+      <version>10.1.1.0</version>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>triplesec-jaas</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>triplesec-guardian-ldap</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>servletapi</groupId>
+      <artifactId>servletapi</artifactId>
+      <version>2.3</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+      <version>1.2.11</version>
+    </dependency>
+    <dependency>
+      <groupId>${pom.groupId}</groupId>
+      <artifactId>triplesec-integration</artifactId>
+      <version>${pom.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>${pom.groupId}</groupId>
+      <artifactId>triplesec-main</artifactId>
+      <version>${pom.version}</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>nlog4j</artifactId>
+      <version>1.2.25</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+      <version>1.2</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>jcharts</groupId>
+      <artifactId>jcharts</artifactId>
+      <version>0.6.0</version>
+    </dependency>
+   <dependency>
+      <groupId>commons-httpclient</groupId>
+      <artifactId>commons-httpclient</artifactId>
+      <version>3.0.1</version>
+   </dependency>
+  </dependencies>
+  <profiles>
+    <profile>
+      <id>default</id>
+      <activation>
+        <activeByDefault>true</activeByDefault>
+      </activation>
+      <build>
+        <plugins>
+           <plugin>
+              <artifactId>maven-surefire-plugin</artifactId>
+              <configuration>
+                <excludes>
+                  <!-- Do not run this test since it never exists -->
+                  <exclude>**/RunDemoUI.java</exclude>
+				  <!-- Avoid normal integration tests -->
+                  <exclude>**/*ITest.java</exclude>
+                  <exclude>**/*IntegrationTest.java</exclude>
+                </excludes>
+              </configuration>
+            </plugin>
+         </plugins>
+       </build>
+    </profile>
+    <profile>
+      <id>integration</id>
+      <activation>
+        <property><name>integration</name></property>
+      </activation>
+      <build>
+        <plugins>
+          <plugin>
+            <artifactId>maven-surefire-plugin</artifactId>
+            <configuration>
+              <systemProperties>
+                <property>
+                  <name>org.safehaus.triplesec.integration.resourcesDirectory</name>
+                  <value>${basedir}/src/test/resources</value>
+                </property>
+              </systemProperties>
+              <excludes>
+                <!-- Do not run this test since it never exists -->
+                <exclude>**/RunDemoUI.java</exclude>
+              </excludes>
+            </configuration>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+    <profile>
+      <id>ui</id>
+      <activation>
+        <property><name>ui</name></property>
+      </activation>
+      <build>
+        <plugins>
+          <plugin>
+            <artifactId>maven-surefire-plugin</artifactId>
+            <configuration>
+              <systemProperties>
+                <property>
+                  <name>org.safehaus.triplesec.integration.resourcesDirectory</name>
+                  <value>${basedir}/src/test/resources</value>
+                </property>
+                <property>
+                  <name>org.safehaus.triplesec.integration.webapps</name>
+                  <value>demo</value>
+                </property>
+                <property>
+                  <name>org.safehaus.triplesec.integration.webappWarBase.demo</name>
+                  <value>${basedir}/target/demo.war</value>
+                </property>
+              </systemProperties>
+              <includes>
+                <include>**/RunDemoUI.java</include>
+              </includes>
+              <excludes>
+                <exclude>**/*Test.java</exclude>
+              </excludes>
+            </configuration>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
+</project>

Added: directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/dao/AccountDao.java
URL: http://svn.apache.org/viewvc/directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/dao/AccountDao.java?view=auto&rev=486187
==============================================================================
--- directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/dao/AccountDao.java (added)
+++ directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/dao/AccountDao.java Tue Dec 12 07:23:31 2006
@@ -0,0 +1,52 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.safehaus.triplesec.demo.dao;
+
+import org.safehaus.triplesec.demo.model.Account;
+
+import java.util.Iterator;
+
+/**
+ * Interface for retrieving investment accounst from a database.
+ */
+public interface AccountDao
+{
+    /**
+     * @return total number of accounts available
+     */
+    int count();
+
+    /**
+     * @param qp sorting and paging info
+     * @return iterator over accounts
+     */
+    Iterator find( QueryParam qp );
+
+    /**
+     * @param uid user identifier for the account
+     * @return account with matching uid
+     */
+    Account get( String uid );
+
+    /**
+     * @param account to update
+     */
+    void update( Account account );
+}

Added: directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/dao/InvestmentsDao.java
URL: http://svn.apache.org/viewvc/directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/dao/InvestmentsDao.java?view=auto&rev=486187
==============================================================================
--- directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/dao/InvestmentsDao.java (added)
+++ directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/dao/InvestmentsDao.java Tue Dec 12 07:23:31 2006
@@ -0,0 +1,37 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.safehaus.triplesec.demo.dao;
+
+import org.safehaus.triplesec.demo.model.Investments;
+
+public interface InvestmentsDao
+{
+    void build() throws Exception;
+
+    void clean() throws Exception;
+    
+    Investments get( String uid ) throws Exception;
+
+    void insert( Investments investments ) throws Exception;
+
+    void update( Investments investments ) throws Exception;
+
+    void delete( String uid ) throws Exception;
+}

Added: directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/dao/QueryParam.java
URL: http://svn.apache.org/viewvc/directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/dao/QueryParam.java?view=auto&rev=486187
==============================================================================
--- directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/dao/QueryParam.java (added)
+++ directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/dao/QueryParam.java Tue Dec 12 07:23:31 2006
@@ -0,0 +1,85 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.safehaus.triplesec.demo.dao;
+
+/**
+ * Encapsulates the query parameters to be passed to the daos.
+ */
+public class QueryParam
+{
+    private int first;
+    private int count;
+    private String sort;
+    private boolean sortAsc;
+
+    /**
+     * Set to return <tt>count</tt> elements, starting at the
+     * <tt>first</tt> element.
+     *
+     * @param first first element to return
+     * @param count number of elements to return
+     */
+    public QueryParam( int first, int count )
+    {
+        this( first, count, null, true );
+    }
+
+    /**
+     * Set to return <tt>count</tt> sorted elements, starting at the
+     * <tt>first</tt> element.
+     *
+     * @param first first element to return
+     * @param count number of elements to return
+     * @param sort column to sort on
+     * @param sortAsc sort ascending or descending
+     */
+    public QueryParam( int first, int count, String sort, boolean sortAsc )
+    {
+        this.first = first;
+        this.count = count;
+        this.sort = sort;
+        this.sortAsc = sortAsc;
+    }
+
+    public int getFirst()
+    {
+        return first;
+    }
+
+    public int getCount()
+    {
+        return count;
+    }
+
+    public String getSort()
+    {
+        return sort;
+    }
+
+    public boolean isSortAsc()
+    {
+        return sortAsc;
+    }
+
+    public boolean hasSort()
+    {
+        return sort != null;
+    }
+}

Added: directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/dao/jdbc/JdbcInvestmentsDao.java
URL: http://svn.apache.org/viewvc/directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/dao/jdbc/JdbcInvestmentsDao.java?view=auto&rev=486187
==============================================================================
--- directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/dao/jdbc/JdbcInvestmentsDao.java (added)
+++ directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/dao/jdbc/JdbcInvestmentsDao.java Tue Dec 12 07:23:31 2006
@@ -0,0 +1,147 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.safehaus.triplesec.demo.dao.jdbc;
+
+import org.safehaus.triplesec.demo.dao.InvestmentsDao;
+import org.safehaus.triplesec.demo.model.Investments;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+
+public class JdbcInvestmentsDao implements InvestmentsDao
+{
+    private final Connection connection;
+
+
+    public JdbcInvestmentsDao ( Connection c )
+    {
+        connection = c;
+    }
+
+
+    public void clean() throws SQLException
+    {
+        Statement st = null;
+
+        try
+        {
+            st = connection.createStatement();
+            st.execute( "DROP TABLE INVESTMENTS" );
+        }
+        finally
+        {
+            if ( st != null ) { st.close(); }
+        }
+    }
+
+
+    public void build() throws SQLException
+    {
+        Statement st = null;
+
+        try
+        {
+            st = connection.createStatement();
+            st.execute( "CREATE TABLE INVESTMENTS ( UID CHAR(128), BONDS INT, TBILLS INT, EMERGING_MARKETS INT, TECH_STOCKS INT, VOLATILE_HIGH_YIELD INT )" );
+            st.execute( "CREATE UNIQUE INDEX uid_index ON INVESTMENTS ( UID )" );
+        }
+        finally
+        {
+            if ( st != null ) { st.close(); }
+        }
+    }
+
+
+    public Investments get( String uid ) throws SQLException
+    {
+        Investments investments;
+        Statement st = null;
+        ResultSet rs = null;
+
+        try
+        {
+            st = connection.createStatement();
+            rs = st.executeQuery( "SELECT * FROM INVESTMENTS WHERE UID = '" + uid + "'" );
+
+            while( rs.next() )
+            {
+                investments = new Investments( uid );
+                investments.setBonds( rs.getInt( "BONDS" ) );
+                investments.setTbills( rs.getInt( "TBILLS" ) );
+                investments.setEmergingMarkets( rs.getInt( "EMERGING_MARKETS" ) );
+                investments.setTechStocks( rs.getInt( "TECH_STOCKS" ) );
+                investments.setVolatileHighYield( rs.getInt( "VOLATILE_HIGH_YIELD" ) );
+                return investments;
+            }
+        }
+        finally
+        {
+            if ( st != null ) { st.close(); }
+            if ( rs != null ) { rs.close(); }
+        }
+
+        return null;
+    }
+
+
+    public void insert( Investments investments ) throws SQLException
+    {
+        Statement st = null;
+
+        try
+        {
+            st = connection.createStatement();
+            st.execute( "INSERT INTO INVESTMENTS VALUES ( '" + investments.getUid() + "', "
+                    + investments.getBonds() + ", " + investments.getTbills() + ", "
+                    + investments.getEmergingMarkets() + ", " + investments.getTechStocks() + ", "
+                    + investments.getVolatileHighYield() + " ) " );
+        }
+        finally
+        {
+            if ( st != null ) { st.close(); }
+        }
+    }
+
+
+    public void update( Investments investments ) throws SQLException
+    {
+        delete( investments.getUid() );
+        insert( investments );
+    }
+
+
+    public void delete( String uid ) throws SQLException
+    {
+        Statement st = null;
+
+        try
+        {
+            st = connection.createStatement();
+            st.execute( "DELETE FROM INVESTMENTS WHERE UID = '" + uid + "'" );
+        }
+        finally
+        {
+            if ( st != null ) { st.close(); }
+        }
+    }
+}

Added: directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/dao/mock/MockAccountDao.java
URL: http://svn.apache.org/viewvc/directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/dao/mock/MockAccountDao.java?view=auto&rev=486187
==============================================================================
--- directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/dao/mock/MockAccountDao.java (added)
+++ directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/dao/mock/MockAccountDao.java Tue Dec 12 07:23:31 2006
@@ -0,0 +1,162 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.safehaus.triplesec.demo.dao.mock;
+
+import org.safehaus.triplesec.demo.dao.AccountDao;
+import org.safehaus.triplesec.demo.dao.QueryParam;
+import org.safehaus.triplesec.demo.model.Account;
+import org.safehaus.triplesec.demo.service.Registry;
+import org.safehaus.triplesec.guardian.ApplicationPolicy;
+
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Comparator;
+
+/**
+ * A Dao implementation with an auto-generated embedded database. In
+ * a true implementation, this Dao would interface with a real database,
+ * but because we want to keep dependencies to a minimum, we generate our
+ * own database here.
+ */
+public class MockAccountDao implements AccountDao
+{
+    private Map map = Collections.synchronizedMap( new HashMap() );
+    private List uidIdx = Collections.synchronizedList( new ArrayList() );
+    private List uidDescIdx = Collections.synchronizedList( new ArrayList() );
+
+    public MockAccountDao()
+    {
+        ApplicationPolicy policy = Registry.policyManager().getAppPolicy();
+        for ( Iterator iter = policy.getProfileIdIterator(); iter.hasNext(); )
+        {
+            add( new Account( (String) iter.next() ) );
+        }
+        updateIndecies();
+    }
+
+    /**
+     * @return total number of accounts available
+     */
+    public int count()
+    {
+        return uidIdx.size();
+    }
+
+    /**
+     * @param qp sorting and paging info
+     * @return iterator over accounts
+     */
+    public Iterator find(QueryParam qp)
+    {
+        List sublist = getIndex( qp.getSort(), qp.isSortAsc() )
+                .subList( qp.getFirst(), qp.getFirst() + qp.getCount() );
+        return sublist.iterator();
+    }
+
+    protected List getIndex( String prop, boolean asc )
+    {
+        if ( prop == null )
+        {
+            return uidIdx;
+        }
+        return (asc) ? uidIdx : uidDescIdx;
+    }
+
+    /**
+     * Find account by user ID.
+     *
+     * @param uid user identifier for the account
+     * @return account with matching uid
+     */
+    public Account get( String uid )
+    {
+        Account accnt = (Account) map.get( uid );
+        if ( accnt == null )
+        {
+            // hmmmmmm... no account found... create one..
+            accnt = new Account( uid );
+            add( accnt );
+            updateIndecies();
+        }
+        return accnt;
+    }
+
+    /**
+     * @param newAccount account to update
+     */
+    public void update( final Account newAccount )
+    {
+        Account oldAccount = get( newAccount.getUid() );
+        delete( oldAccount );
+        save( newAccount );
+    }
+
+    protected void add( final Account account )
+    {
+        map.put( account.getUid(), account );
+        uidIdx.add( account );
+        uidDescIdx.add( account );
+    }
+
+    /**
+     * Add account to the database.
+     *
+     * @param account
+     */
+    public void save( final Account account )
+    {
+        // TODO probably should make sure there's not duplicates
+        add( account );
+        updateIndecies();
+    }
+
+    public void delete( final Account account )
+    {
+        map.remove( account.getUid() );
+
+        uidIdx.remove( account );
+        uidDescIdx.remove( account );
+    }
+
+    private void updateIndecies()
+    {
+        Collections.sort( uidIdx, new Comparator()
+        {
+            public int compare( Object arg0, Object arg1 )
+            {
+                return ( (Account) arg0 ).getUid().compareTo(
+                        ( (Account) arg1 ).getUid() );
+            }
+        });
+
+        Collections.sort( uidDescIdx, new Comparator()
+        {
+            public int compare( Object arg0, Object arg1 )
+            {
+                return ( (Account) arg1 ).getUid().compareTo(
+                        ( (Account) arg0 ).getUid() );
+            }
+        });
+    }
+}

Added: directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/model/Account.java
URL: http://svn.apache.org/viewvc/directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/model/Account.java?view=auto&rev=486187
==============================================================================
--- directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/model/Account.java (added)
+++ directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/model/Account.java Tue Dec 12 07:23:31 2006
@@ -0,0 +1,231 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.safehaus.triplesec.demo.model;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+
+public class Account implements Serializable
+{
+    private static final long serialVersionUID = 1316820604362304663L;
+
+    private String uid;
+    private int bonds;
+    private int techStocks;
+    private int volatileHighYield;
+    private int tBills;
+    private int foreign;
+
+    /** a constant unmodifiable list of funds */
+    public static final List FUNDS;
+
+    /** a constant unmodifiable Map of fund indices */
+    public static final Map INDICES;
+
+    static
+    {
+        ArrayList list = new ArrayList( 5 );
+        list.add( "Bonds" );
+        list.add( "T-Bills" );
+        list.add( "Foreign" );
+        list.add( "Tech Stocks" );
+        list.add( "Volatile High Yield" );
+        FUNDS = Collections.unmodifiableList( list );
+        HashMap map = new HashMap( 5 );
+        map.put( list.get( 0 ), new Integer( 0 ) );
+        map.put( list.get( 1 ), new Integer( 1 ) );
+        map.put( list.get( 2 ), new Integer( 2 ) );
+        map.put( list.get( 3 ), new Integer( 3 ) );
+        map.put( list.get( 4 ), new Integer( 4 ) );
+        INDICES = Collections.unmodifiableMap( map );
+    }
+
+    public Account( String uid )
+    {
+        this.uid = uid;
+        this.bonds = rint( 0, 1000 );
+        this.techStocks = rint( 0, 1000 );
+        this.volatileHighYield = rint( 0, 1000 );
+        this.tBills = rint( 0, 1000 );
+        this.foreign  = rint( 0, 1000 );
+    }
+
+    public String getUid()
+    {
+        return uid;
+    }
+
+    public int getBonds()
+    {
+        return bonds;
+    }
+
+    public void setBonds( int bonds )
+    {
+        this.bonds = bonds;
+    }
+
+    public int getTechStocks()
+    {
+        return techStocks;
+    }
+
+    public void setTechStocks( int techStocks )
+    {
+        this.techStocks = techStocks;
+    }
+
+    public int getVolatileHighYield()
+    {
+        return volatileHighYield;
+    }
+
+    public void setVolatileHighYield( int volatileHighYield )
+    {
+        this.volatileHighYield = volatileHighYield;
+    }
+
+    public int getTBills()
+    {
+        return tBills;
+    }
+
+    public void setTBills( int tBills )
+    {
+        this.tBills = tBills;
+    }
+
+    public int getForeign()
+    {
+        return foreign;
+    }
+
+    public void setForeign( int foreign )
+    {
+        this.foreign = foreign;
+    }
+
+    public static int getNumberOfFunds()
+    {
+        return FUNDS.size();
+    }
+
+    public static String getFund( int index )
+    {
+        return (String) FUNDS.get( index );
+    }
+
+    public static int getIndex( String fund )
+    {
+        return ( ( Integer ) INDICES.get( fund ) ).intValue();
+    }
+
+    public void set( int index, int value )
+    {
+        switch ( index )
+        {
+        case( 0 ):
+            setBonds( value );
+            break;
+        case( 1 ):
+            setTBills( value );
+            break;
+        case( 2 ):
+            setForeign( value );
+            break;
+        case( 3 ):
+            setTechStocks( value );
+            break;
+        case( 4 ):
+            setVolatileHighYield( value );
+            break;
+        default:
+            throw new IndexOutOfBoundsException( "Index value out of bounds: " + index );
+        }
+    }
+
+
+    public int get( int index )
+    {
+        switch ( index )
+        {
+        case( 0 ):
+            return getBonds();
+        case( 1 ):
+            return getTBills();
+        case( 2 ):
+            return getForeign();
+        case( 3 ):
+            return getTechStocks();
+        case( 4 ):
+            return getVolatileHighYield();
+        default:
+            throw new IndexOutOfBoundsException( "Index value out of bounds: " + index );
+        }
+    }
+
+
+    public void set( String fund, int value )
+    {
+        int index = getIndex( fund );
+
+        switch ( index )
+        {
+        case( 0 ):
+            setBonds( value );
+            break;
+        case( 1 ):
+            setTBills( value );
+            break;
+        case( 2 ):
+            setForeign( value );
+            break;
+        case( 3 ):
+            setTechStocks( value );
+            break;
+        case( 4 ):
+            setVolatileHighYield( value );
+            break;
+        default:
+            throw new IndexOutOfBoundsException( "Index value out of bounds: " + index );
+        }
+    }
+
+    private int rint( int min, int max )
+    {
+        return (int) ( Math.random() * ( max - min ) + max );
+    }
+
+
+    public String toString() {
+        return "Account{" +
+                "uid='" + uid + '\'' +
+                ", bonds=" + bonds +
+                ", techStocks=" + techStocks +
+                ", volatileHighYield=" + volatileHighYield +
+                ", tBills=" + tBills +
+                ", foreign=" + foreign +
+                '}';
+    }
+}

Added: directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/model/Investments.java
URL: http://svn.apache.org/viewvc/directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/model/Investments.java?view=auto&rev=486187
==============================================================================
--- directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/model/Investments.java (added)
+++ directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/model/Investments.java Tue Dec 12 07:23:31 2006
@@ -0,0 +1,229 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.safehaus.triplesec.demo.model;
+
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.io.Serializable;
+
+
+public class Investments implements Serializable
+{
+    private static final long serialVersionUID = 144993312912085394L;
+
+    private final String uid;
+    private int bonds = 10000;
+    private int techStocks = 10000;
+    private int volatileHighYield = 10000;
+    private int tbills = 10000;
+    private int emergingMarkets = 10000;
+
+
+    /** a constant unmodifiable list of funds */
+    public static final List FUNDS;
+
+    /** a constant unmodifiable Map of fund indices */
+    public static final Map INDICES;
+
+
+    static
+    {
+        ArrayList list = new ArrayList( 5 );
+        list.add( "Bonds" );
+        list.add( "T-Bills" );
+        list.add( "Emerging Markets" );
+        list.add( "Tech Stocks" );
+        list.add( "Volatile High Yield" );
+        FUNDS = Collections.unmodifiableList( list );
+        HashMap map = new HashMap( 5 );
+        map.put( list.get( 0 ), new Integer( 0 ) );
+        map.put( list.get( 1 ), new Integer( 1 ) );
+        map.put( list.get( 2 ), new Integer( 2 ) );
+        map.put( list.get( 3 ), new Integer( 3 ) );
+        map.put( list.get( 4 ), new Integer( 4 ) );
+        INDICES = Collections.unmodifiableMap( map );
+    }
+
+
+    public static int getNumberOfFunds()
+    {
+        return FUNDS.size();
+    }
+
+
+    public static String getFund( int index )
+    {
+        return ( String ) FUNDS.get( index );
+    }
+
+
+    public static int getIndex( String fund )
+    {
+        return ( ( Integer ) INDICES.get( fund ) ).intValue();
+    }
+
+
+    public void set( int index, int value )
+    {
+        switch ( index )
+        {
+        case( 0 ):
+            setBonds( value );
+            break;
+        case( 1 ):
+            setTbills( value );
+            break;
+        case( 2 ):
+            setEmergingMarkets( value );
+            break;
+        case( 3 ):
+            setTechStocks( value );
+            break;
+        case( 4 ):
+            setVolatileHighYield( value );
+            break;
+        default:
+            throw new IndexOutOfBoundsException( "Index value out of bounds: " + index );
+        }
+    }
+
+
+    public int get( int index )
+    {
+        switch ( index )
+        {
+        case( 0 ):
+            return getBonds();
+        case( 1 ):
+            return getTbills();
+        case( 2 ):
+            return getEmergingMarkets();
+        case( 3 ):
+            return getTechStocks();
+        case( 4 ):
+            return getVolatileHighYield();
+        default:
+            throw new IndexOutOfBoundsException( "Index value out of bounds: " + index );
+        }
+    }
+
+
+    public void set( String fund, int value )
+    {
+        int index = getIndex( fund );
+
+        switch ( index )
+        {
+        case( 0 ):
+            setBonds( value );
+            break;
+        case( 1 ):
+            setTbills( value );
+            break;
+        case( 2 ):
+            setEmergingMarkets( value );
+            break;
+        case( 3 ):
+            setTechStocks( value );
+            break;
+        case( 4 ):
+            setVolatileHighYield( value );
+            break;
+        default:
+            throw new IndexOutOfBoundsException( "Index value out of bounds: " + index );
+        }
+    }
+
+
+    public Investments( String uid )
+    {
+        this.uid = uid;
+    }
+
+
+    public String getUid()
+    {
+        return this.uid;
+    }
+
+
+    public void setBonds( int bonds )
+    {
+        this.bonds = bonds;
+    }
+
+
+    public int getBonds()
+    {
+        return bonds;
+    }
+
+
+    public void setTechStocks( int techStocks )
+    {
+        this.techStocks = techStocks;
+    }
+
+
+    public int getTechStocks()
+    {
+        return techStocks;
+    }
+
+
+    public void setVolatileHighYield( int volatileHighYield )
+    {
+        this.volatileHighYield = volatileHighYield;
+    }
+
+
+    public int getVolatileHighYield()
+    {
+        return volatileHighYield;
+    }
+
+
+    public void setTbills( int tbills )
+    {
+        this.tbills = tbills;
+    }
+
+
+    public int getTbills()
+    {
+        return tbills;
+    }
+
+
+    public void setEmergingMarkets( int emergingMarkets )
+    {
+        this.emergingMarkets = emergingMarkets;
+    }
+
+
+    public int getEmergingMarkets()
+    {
+        return emergingMarkets;
+    }
+}

Added: directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/security/AuthenticatedPage.java
URL: http://svn.apache.org/viewvc/directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/security/AuthenticatedPage.java?view=auto&rev=486187
==============================================================================
--- directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/security/AuthenticatedPage.java (added)
+++ directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/security/AuthenticatedPage.java Tue Dec 12 07:23:31 2006
@@ -0,0 +1,28 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.safehaus.triplesec.demo.security;
+
+/**
+ * Simple tagging interface that denotes a web page as requiring
+ * authentication to access.
+ */
+public interface AuthenticatedPage
+{
+}

Added: directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/security/AuthenticatedWebSession.java
URL: http://svn.apache.org/viewvc/directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/security/AuthenticatedWebSession.java?view=auto&rev=486187
==============================================================================
--- directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/security/AuthenticatedWebSession.java (added)
+++ directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/security/AuthenticatedWebSession.java Tue Dec 12 07:23:31 2006
@@ -0,0 +1,144 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.safehaus.triplesec.demo.security;
+
+import org.safehaus.triplesec.demo.service.Registry;
+import org.safehaus.triplesec.guardian.Profile;
+import org.safehaus.triplesec.jaas.AccountLockedOutException;
+import org.safehaus.triplesec.jaas.PreauthFailedException;
+import org.safehaus.triplesec.jaas.ResynchInProgressException;
+import org.safehaus.triplesec.jaas.ResynchStartingException;
+import org.safehaus.triplesec.jaas.SafehausPrincipal;
+import wicket.protocol.http.WebApplication;
+import wicket.protocol.http.WebSession;
+import wicket.util.string.Strings;
+
+import javax.security.auth.login.LoginException;
+
+/**
+ * Basic authenticated web session.
+ */
+public class AuthenticatedWebSession extends WebSession
+{
+    private static final long serialVersionUID = -6787285847550864854L;
+
+    private String errorMessage = null;
+    private String username;
+    private String password;
+    private SafehausPrincipal principal = null;
+
+    /**
+     * Construct the authenticated web session.
+     *
+     * @param application the web application
+     */
+    public AuthenticatedWebSession(final WebApplication application)
+    {
+        super( application );
+    }
+
+
+    /**
+     * Authenticates this session.
+     *
+     * @param username the username
+     * @param password the password
+     * @param passcode the passcode
+     * @return <b>true</b> if the user was authenticated successfully
+     */
+    public boolean authenticate( String username, String password, String passcode )
+    {
+        this.username = username;
+        if ( Strings.isEmpty( username ) )
+        {
+            errorMessage = "Missing credentials: Username not provided.";
+            principal = null;
+            return isAuthenticated();
+        }
+        this.password = password;
+        if ( Strings.isEmpty( password ) )
+        {
+            errorMessage = "Missing credentials: Password not provided.";
+            principal = null;
+            return isAuthenticated();
+        }
+
+        try
+        {
+            principal = Registry.policyManager().getPrincipal( username,
+                    password, passcode );
+        }
+        catch ( AccountLockedOutException e )
+        {
+            errorMessage = "Account locked for user '" + username + "'!";
+        }
+        catch ( PreauthFailedException e )
+        {
+            errorMessage = "Hotp authentication failed for user '" + username + "'!";
+        }
+        catch ( ResynchInProgressException e )
+        {
+            errorMessage = "User '" + username + "' is still out of sych! Please " +
+                    "enter another consecutive single-use password.";
+        }
+        catch ( ResynchStartingException e )
+        {
+            errorMessage = "User '" + username + "' is out of synch! Initiating " +
+                    "resynch protocol. Enter another consecutive single-use " +
+                    "password.";
+        }
+        catch ( LoginException e )
+        {
+            errorMessage = "User '" + username + "' failed authentication: " +
+                    e.getMessage();
+        }
+        return isAuthenticated();
+    }
+
+
+    public boolean isAuthenticated()
+    {
+        return principal != null;
+    }
+
+
+    public String getErrorMessage()
+    {
+        return errorMessage;
+    }
+
+
+    public String getPassword()
+    {
+        return password;
+    }
+
+
+    public String getUsername()
+    {
+        return username;
+    }
+
+
+    public Profile getUserProfile()
+    {
+        return principal != null ? principal.getAuthorizationProfile() : null;
+    }
+}

Added: directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/security/PageAuthorizationStrategy.java
URL: http://svn.apache.org/viewvc/directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/security/PageAuthorizationStrategy.java?view=auto&rev=486187
==============================================================================
--- directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/security/PageAuthorizationStrategy.java (added)
+++ directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/security/PageAuthorizationStrategy.java Tue Dec 12 07:23:31 2006
@@ -0,0 +1,39 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.safehaus.triplesec.demo.security;
+
+import wicket.authorization.strategies.page.SimplePageAuthorizationStrategy;
+import wicket.Session;
+
+/**
+ * Implementation of a web page authorization strategy.
+ */
+public class PageAuthorizationStrategy extends SimplePageAuthorizationStrategy
+{
+    public PageAuthorizationStrategy( Class securePageType, Class loginPageClass )
+    {
+        super( securePageType, loginPageClass );
+    }
+
+    protected boolean isAuthorized()
+    {
+        return (((AuthenticatedWebSession) Session.get()).isAuthenticated());
+    }
+}

Added: directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/service/DefaultPolicyManager.java
URL: http://svn.apache.org/viewvc/directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/service/DefaultPolicyManager.java?view=auto&rev=486187
==============================================================================
--- directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/service/DefaultPolicyManager.java (added)
+++ directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/service/DefaultPolicyManager.java Tue Dec 12 07:23:31 2006
@@ -0,0 +1,163 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.safehaus.triplesec.demo.service;
+
+import org.safehaus.triplesec.guardian.ApplicationPolicy;
+import org.safehaus.triplesec.guardian.ApplicationPolicyFactory;
+import org.safehaus.triplesec.jaas.SafehausPrincipal;
+import org.safehaus.triplesec.jaas.RealmCallback;
+import org.safehaus.triplesec.jaas.PolicyCallback;
+import org.safehaus.triplesec.jaas.PasscodeCallback;
+import org.safehaus.triplesec.jaas.SafehausLoginModule;
+
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.UnsupportedCallbackException;
+import javax.security.auth.callback.NameCallback;
+import javax.security.auth.callback.PasswordCallback;
+import javax.security.auth.spi.LoginModule;
+import javax.security.auth.Subject;
+import javax.security.auth.login.LoginException;
+import java.util.Properties;
+import java.util.Map;
+import java.util.HashMap;
+import java.io.IOException;
+
+public class DefaultPolicyManager implements PolicyManager
+{
+    private String realm;
+    private String ldapDriver;
+    private String url;
+    private Properties ldapProperties;
+
+    public ApplicationPolicy getAppPolicy()
+    {
+        try
+        {
+            Class.forName( ldapDriver );
+        }
+        catch ( ClassNotFoundException e )
+        {
+            throw new RuntimeException( e );
+        }
+        return ApplicationPolicyFactory.newInstance( url, ldapProperties );
+    }
+
+    public void setLdapDriver( String ldapDriver )
+    {
+        this.ldapDriver = ldapDriver;
+    }
+
+    public void setUrl( String url )
+    {
+        this.url = url;
+    }
+
+    public void setLdapProperties( Properties ldapProperties )
+    {
+        this.ldapProperties = ldapProperties;
+    }
+
+    public String getRealm()
+    {
+        return realm;
+    }
+
+    public SafehausPrincipal getPrincipal( String userid,
+                                           String password,
+                                           String passcode ) throws LoginException
+    {
+        SafehausPrincipal principal = null;
+        LoginModule module = new SafehausLoginModule();
+        Subject subject = new Subject();
+        Map options = new HashMap();
+        options.put( SafehausLoginModule.ALLOW_ADMIN, "true" );
+        module.initialize( subject,
+                new DemoHandler( userid, password, passcode ),
+                new HashMap(), options );
+        boolean result = module.login();
+        result &= module.commit();
+        if ( result )
+        {
+            Object[] principals = subject.getPrincipals().toArray();
+            if ( principals.length > 0 )
+            {
+                principal = (SafehausPrincipal) principals[0];
+            }
+        }
+        return principal;
+    }
+
+    public void setRealm( String realm )
+    {
+        this.realm = realm;
+    }
+
+    /**
+     * Simple handler implementation for this Demo.
+     */
+    private class DemoHandler implements CallbackHandler
+    {
+        private String userId;
+        private String password;
+        private String passcode;
+
+        public DemoHandler( String userId, String password, String passcode )
+        {
+            this.userId = userId;
+            this.password = password;
+            this.passcode = passcode;
+        }
+
+        public void handle(Callback[] callbacks)
+                throws IOException, UnsupportedCallbackException
+        {
+            for ( int i = 0; i < callbacks.length; i++ )
+            {
+                if ( callbacks[i] instanceof NameCallback )
+                {
+                    NameCallback ncb = ( NameCallback ) callbacks[i];
+                    ncb.setName( userId );
+                }
+                else if ( callbacks[i] instanceof PasswordCallback )
+                {
+                    PasswordCallback pcb = ( PasswordCallback ) callbacks[i];
+                    pcb.setPassword( password.toCharArray() );
+                }
+                else if ( callbacks[i] instanceof RealmCallback )
+                {
+                    RealmCallback rcb = ( RealmCallback ) callbacks[i];
+                    rcb.setRealm( realm.toUpperCase() );
+                }
+                else if ( callbacks[i] instanceof PolicyCallback )
+                {
+                    PolicyCallback pcb = ( PolicyCallback ) callbacks[i];
+                    pcb.setPolicy( getAppPolicy() );
+                }
+                else if ( callbacks[i] instanceof PasscodeCallback )
+                {
+                    PasscodeCallback pcb = ( PasscodeCallback ) callbacks[i];
+                    pcb.setPasscode( passcode );
+                }
+            }
+        }
+    }
+
+}

Added: directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/service/DefaultSmsManager.java
URL: http://svn.apache.org/viewvc/directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/service/DefaultSmsManager.java?view=auto&rev=486187
==============================================================================
--- directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/service/DefaultSmsManager.java (added)
+++ directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/service/DefaultSmsManager.java Tue Dec 12 07:23:31 2006
@@ -0,0 +1,137 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.safehaus.triplesec.demo.service;
+
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpMethod;
+import org.apache.commons.httpclient.NameValuePair;
+import org.apache.commons.httpclient.methods.PostMethod;
+
+public class DefaultSmsManager implements SmsManager {
+    private String smsTransportUrl;
+    private String smsUsername;
+    private String smsPassword;
+    private String smsAccountName;
+    private String wapUrl;
+
+    public void sendSmsMessage( String mobile, String carrier, String username )
+            throws Exception
+    {
+        // Note: we will rely on clients to provide non-null input variables
+        // and just throw RuntimeExceptions if we get a null value
+        if ( mobile == null || carrier == null || username == null )
+        {
+            throw new RuntimeException( "Input variable(s) have illegal NULL values" );
+        }
+
+        // trim mobile number if necessary...
+        if ( mobile.startsWith( "+" ) )
+        {
+            mobile = mobile.substring( 1 );
+        }
+        if ( mobile.startsWith( "1" ) )
+        {
+            mobile = mobile.substring( 1 );
+        }
+        if ( mobile.length() < 10 )
+        {
+            throw new RuntimeException( "Mobile number was less than 10 digits in length" );
+        }
+
+        // build WAP URL
+        StringBuffer buffer = new StringBuffer( wapUrl );
+        if ( ! wapUrl.endsWith("/") )
+        {
+            buffer.append( "/" );
+        }
+        buffer.append( username ).append( ".jar" );
+
+        // set the cellular carrier code
+        int carrierCode = getCarrierCode( carrier );
+
+        // setup HTTP client
+        HttpClient client = new HttpClient();
+        HttpMethod method = new PostMethod( smsTransportUrl );
+        NameValuePair[] params = new NameValuePair[] {
+                new NameValuePair( "Carrier", String.valueOf( carrierCode ) ),
+                new NameValuePair( "UID", smsUsername ),
+                new NameValuePair( "PWD", smsPassword ),
+                new NameValuePair( "Campaign", smsAccountName ),
+                new NameValuePair( "CellNumber", mobile ),
+                new NameValuePair( "msg", buffer.toString() )
+        };
+        method.setQueryString( params );
+        client.executeMethod( method );
+    }
+
+    private int getCarrierCode( String carrier )
+    {
+        int carrierCode = 31004;
+        if ( carrier.equalsIgnoreCase( "AT&T" ) )
+        {
+            carrierCode = 31001;
+        }
+        else if ( carrier.equalsIgnoreCase( "Cingular" ) )
+        {
+            carrierCode = 31002;
+        }
+        else if ( carrier.equalsIgnoreCase( "Verizon" ) )
+        {
+            carrierCode = 31003;
+        }
+        else if ( carrier.equalsIgnoreCase( "T-Mobile" ) )
+        {
+            carrierCode = 31004;
+        }
+        else if ( carrier.equalsIgnoreCase( "Spring" ) )
+        {
+            carrierCode = 31005;
+        }
+        else if ( carrier.equalsIgnoreCase( "Nextel" ) )
+        {
+            carrierCode = 310007;
+        }
+        return carrierCode;
+    }
+    public void setSmsTransportUrl( String smsTransportUrl )
+    {
+        this.smsTransportUrl = smsTransportUrl;
+    }
+
+    public void setSmsUsername( String smsUsername )
+    {
+        this.smsUsername = smsUsername;
+    }
+
+    public void setSmsPassword( String smsPassword )
+    {
+        this.smsPassword = smsPassword;
+    }
+
+    public void setSmsAccountName( String smsAccountName )
+    {
+        this.smsAccountName = smsAccountName;
+    }
+
+    public void setWapUrl(String wapUrl)
+    {
+        this.wapUrl = wapUrl;
+    }
+}

Added: directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/service/PolicyManager.java
URL: http://svn.apache.org/viewvc/directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/service/PolicyManager.java?view=auto&rev=486187
==============================================================================
--- directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/service/PolicyManager.java (added)
+++ directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/service/PolicyManager.java Tue Dec 12 07:23:31 2006
@@ -0,0 +1,38 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.safehaus.triplesec.demo.service;
+
+import org.safehaus.triplesec.guardian.ApplicationPolicy;
+import org.safehaus.triplesec.jaas.SafehausPrincipal;
+
+import javax.security.auth.login.LoginException;
+import java.util.Properties;
+
+public interface PolicyManager
+{
+    void setUrl( String url );
+    void setLdapProperties( Properties ldapProperties );
+    void setRealm( String realm );
+    ApplicationPolicy getAppPolicy();
+    String getRealm();
+    SafehausPrincipal getPrincipal( String userId,
+                                    String password,
+                                    String passcode ) throws LoginException;
+}

Added: directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/service/Registry.java
URL: http://svn.apache.org/viewvc/directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/service/Registry.java?view=auto&rev=486187
==============================================================================
--- directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/service/Registry.java (added)
+++ directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/service/Registry.java Tue Dec 12 07:23:31 2006
@@ -0,0 +1,90 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+/**
+ * Created by IntelliJ IDEA.
+ * User: tbennett
+ * Date: May 9, 2006
+ * Time: 12:02:48 AM
+ * To change this template use File | Settings | File Templates.
+ */
+package org.safehaus.triplesec.demo.service;
+
+/**
+ * A common place to get business delegates.
+ */
+public class Registry
+{
+    /** Holds the single instance of the registry */
+    private static Registry ourInstance = new Registry();
+
+    /** Management object for security */
+    private PolicyManager policyManager;
+
+    /** Management object for SMS service */
+    private SmsManager smsManager;
+
+    /**
+     * Returns the singleton instance of the Registry. The
+     * Registry must be initialized using setter methods before
+     * it is of any use. This is normally done using Spring's
+     * dependency injection.
+     */
+    public static Registry getInstance()
+    {
+        return ourInstance;
+    }
+
+    /**
+     * Private constructor to enforce singleton pattern.
+     */
+    private Registry()
+    {
+    }
+
+    public static PolicyManager policyManager()
+    {
+        return ourInstance.policyManager;
+    }
+
+    public static SmsManager smsManager()
+    {
+        return ourInstance.smsManager;
+    }
+    
+    public PolicyManager getPolicyManager()
+    {
+        return policyManager;
+    }
+
+    public void setPolicyManager( PolicyManager policyManager )
+    {
+        this.policyManager = policyManager;
+    }
+
+    public SmsManager getSmsManager()
+    {
+        return smsManager;
+    }
+
+    public void setSmsManager( SmsManager smsManager )
+    {
+        this.smsManager = smsManager;
+    }
+}

Added: directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/service/SmsManager.java
URL: http://svn.apache.org/viewvc/directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/service/SmsManager.java?view=auto&rev=486187
==============================================================================
--- directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/service/SmsManager.java (added)
+++ directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/service/SmsManager.java Tue Dec 12 07:23:31 2006
@@ -0,0 +1,36 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.safehaus.triplesec.demo.service;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: tbennett
+ * Date: May 13, 2006
+ * Time: 3:23:02 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public interface SmsManager {
+    void setSmsTransportUrl( String url );
+    void setSmsAccountName( String accountName );
+    void setSmsUsername( String username );
+    void setSmsPassword( String password );
+    void sendSmsMessage( String mobile, String carrier, String username )
+            throws Exception;
+}

Added: directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/view/AccountDataProvider.java
URL: http://svn.apache.org/viewvc/directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/view/AccountDataProvider.java?view=auto&rev=486187
==============================================================================
--- directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/view/AccountDataProvider.java (added)
+++ directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/view/AccountDataProvider.java Tue Dec 12 07:23:31 2006
@@ -0,0 +1,48 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.safehaus.triplesec.demo.view;
+
+import wicket.extensions.markup.html.repeater.util.SortableDataProvider;
+import org.safehaus.triplesec.demo.dao.AccountDao;
+import org.safehaus.triplesec.demo.dao.QueryParam;
+
+import java.util.Iterator;
+
+public abstract class AccountDataProvider extends SortableDataProvider
+{
+    protected AccountDataProvider()
+    {
+        setSort( "uid", true );
+    }
+
+    protected abstract AccountDao getAccountDao();
+
+    public final Iterator iterator( int first, int count )
+    {
+        QueryParam qp = new QueryParam( first, count,
+                getSort().getProperty(), getSort().isAscending() );
+        return getAccountDao().find( qp );
+    }
+
+    public final int size()
+    {
+        return getAccountDao().count();
+    }
+}

Added: directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/view/AccountDetachableModel.java
URL: http://svn.apache.org/viewvc/directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/view/AccountDetachableModel.java?view=auto&rev=486187
==============================================================================
--- directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/view/AccountDetachableModel.java (added)
+++ directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/view/AccountDetachableModel.java Tue Dec 12 07:23:31 2006
@@ -0,0 +1,70 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.safehaus.triplesec.demo.view;
+
+import wicket.model.AbstractDetachableModel;
+import wicket.model.IModel;
+import wicket.Component;
+import org.safehaus.triplesec.demo.model.Account;
+import org.safehaus.triplesec.demo.dao.AccountDao;
+
+/**
+ * Base class for contact detachable models. This class implements
+ * all necessary logic except retrieval of the dao object, this way
+ * we can isolate that logic.
+ */
+public abstract class AccountDetachableModel extends AbstractDetachableModel
+{
+    private String uid;
+    private transient Account account;
+
+    public AccountDetachableModel( Account account )
+    {
+        this.uid = account.getUid();
+        this.account = account;
+    }
+
+    public IModel getNestedModel()
+    {
+        return null;
+    }
+
+    protected final void onAttach()
+    {
+        account = getAccountDao().get( uid );
+    }
+
+    protected final void onDetach()
+    {
+        account = null;
+    }
+
+    protected Object onGetObject( Component component )
+    {
+        return account;
+    }
+
+    protected void onSetObject( Component component, Object object )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    protected abstract AccountDao getAccountDao();
+}

Added: directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/view/ChartResource.java
URL: http://svn.apache.org/viewvc/directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/view/ChartResource.java?view=auto&rev=486187
==============================================================================
--- directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/view/ChartResource.java (added)
+++ directory/trunks/triplesec/webapp-demo/src/main/java/org/safehaus/triplesec/demo/view/ChartResource.java Tue Dec 12 07:23:31 2006
@@ -0,0 +1,144 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.safehaus.triplesec.demo.view;
+
+import org.jCharts.chartData.ChartDataException;
+import org.jCharts.chartData.PieChartDataSet;
+import org.jCharts.nonAxisChart.PieChart2D;
+import org.jCharts.properties.ChartProperties;
+import org.jCharts.properties.LegendProperties;
+import org.jCharts.properties.PieChart2DProperties;
+import org.safehaus.triplesec.demo.model.Account;
+import wicket.markup.html.image.resource.BufferedDynamicImageResource;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsDevice;
+import java.awt.GraphicsEnvironment;
+import java.awt.HeadlessException;
+import java.awt.Image;
+import java.awt.Paint;
+import java.awt.Transparency;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import javax.swing.ImageIcon;
+
+
+public class ChartResource extends BufferedDynamicImageResource
+{
+    private static final long serialVersionUID = 7331088436339160727L;
+
+    public ChartResource( final Account account )
+    {
+        this.setFormat("PNG");
+        this.setImage( createChart( account ) );
+        this.setCacheable( false );
+    }
+
+    
+    private BufferedImage createChart( final Account account )
+    {
+        double[] data= { 
+            account.getBonds(), 
+            account.getForeign(), 
+            account.getTBills(), 
+            account.getTechStocks(),
+            account.getVolatileHighYield() 
+        };
+        String[] labels= { "Bonds", "Foriegn", "T-Bills", "Tech Stocks", "Volatile" };
+        Paint[] paints= { Color.magenta, Color.green, Color.blue, Color.red, Color.yellow };
+
+        PieChart2DProperties pieChart2DProperties= new PieChart2DProperties();
+        PieChartDataSet pieChartDataSet= null;
+        
+        try
+        {
+            pieChartDataSet = new PieChartDataSet( "Investments", data, labels, paints, pieChart2DProperties );
+        }
+        catch ( ChartDataException e )
+        {
+            e.printStackTrace();
+        }
+
+        PieChart2D pieChart2D = new PieChart2D( pieChartDataSet, new LegendProperties(), new ChartProperties(), 500, 300 );
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        
+        try
+        {
+            org.jCharts.encoders.PNGEncoder.encode( pieChart2D, out );
+        }
+        catch ( IOException e )
+        {
+            e.printStackTrace();
+        }
+ 
+        ImageIcon img = new ImageIcon( out.toByteArray() );
+        return toBufferedImage( img.getImage() );
+    }
+    
+    private BufferedImage toBufferedImage( Image image )
+    {
+        if ( image instanceof BufferedImage )
+        {
+            return ( BufferedImage ) image;
+        }
+
+        // This code ensures that all the pixels in the image are loaded
+        image = new ImageIcon( image ).getImage();
+
+        // Create a buffered image with a format that's compatible with the screen
+        BufferedImage bimage = null;
+        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
+        try
+        {
+            // Determine the type of transparency of the new buffered image
+            int transparency = Transparency.OPAQUE;
+
+            // Create the buffered image
+            GraphicsDevice gs = ge.getDefaultScreenDevice();
+            GraphicsConfiguration gc = gs.getDefaultConfiguration();
+            bimage = gc.createCompatibleImage( image.getWidth( null ), image.getHeight( null ), transparency );
+        }
+        catch ( HeadlessException e )
+        {
+            // The system does not have a screen
+            e.printStackTrace();
+        }
+
+        if ( bimage == null )
+        {
+            // Create a buffered image using the default color model
+            int type = BufferedImage.TYPE_INT_RGB;
+            bimage = new BufferedImage( image.getWidth( null ), image.getHeight( null ), type );
+        }
+
+        // Copy image to buffered image
+        Graphics g = bimage.createGraphics();
+
+        // Paint the image onto the buffered image
+        g.drawImage( image, 0, 0, null );
+        g.dispose();
+
+        return bimage;
+    }
+}