Credit to where credit is due - it was all Jean-Cédric Desrochers's
work. I merely mavenized it.

Kalle


On Tue, Feb 2, 2010 at 7:48 AM, Les Hazlewood <[email protected]> wrote:
> Very cool Kalle - thanks for contributing this!
>
> On Tue, Feb 2, 2010 at 7:53 AM,  <[email protected]> wrote:
>> Author: kaosko
>> Date: Tue Feb  2 12:53:45 2010
>> New Revision: 905614
>>
>> URL: http://svn.apache.org/viewvc?rev=905614&view=rev
>> Log:
>> Add contributed aspectj sample (from SHIRO-129) after Mavenizing it and 
>> minor clean-up
>>
>> Added:
>>    incubator/shiro/trunk/samples/aspectj/   (with props)
>>    incubator/shiro/trunk/samples/aspectj/pom.xml
>>    incubator/shiro/trunk/samples/aspectj/src/
>>    incubator/shiro/trunk/samples/aspectj/src/main/
>>    incubator/shiro/trunk/samples/aspectj/src/main/java/
>>    incubator/shiro/trunk/samples/aspectj/src/main/java/org/
>>    incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/
>>    incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/
>>    
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/
>>    
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/
>>    
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/Account.java
>>    
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/AccountNotFoundException.java
>>    
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/AccountTransaction.java
>>    
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/BankServerRunner.java
>>    
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/BankService.java
>>    
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/BankServiceException.java
>>    
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/InactiveAccountException.java
>>    
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/NotEnoughFundsException.java
>>    
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/SecureBankService.java
>>    incubator/shiro/trunk/samples/aspectj/src/test/
>>    incubator/shiro/trunk/samples/aspectj/src/test/java/
>>    incubator/shiro/trunk/samples/aspectj/src/test/java/org/
>>    incubator/shiro/trunk/samples/aspectj/src/test/java/org/apache/
>>    incubator/shiro/trunk/samples/aspectj/src/test/java/org/apache/shiro/
>>    
>> incubator/shiro/trunk/samples/aspectj/src/test/java/org/apache/shiro/sample/
>>    
>> incubator/shiro/trunk/samples/aspectj/src/test/java/org/apache/shiro/sample/bank/
>>    
>> incubator/shiro/trunk/samples/aspectj/src/test/java/org/apache/shiro/sample/bank/SecureBankServiceTest.java
>>    incubator/shiro/trunk/samples/aspectj/src/test/resources/
>>    incubator/shiro/trunk/samples/aspectj/src/test/resources/META-INF/
>>    incubator/shiro/trunk/samples/aspectj/src/test/resources/META-INF/aop.xml
>>    incubator/shiro/trunk/samples/aspectj/src/test/resources/log4j.properties
>>    
>> incubator/shiro/trunk/samples/aspectj/src/test/resources/shiroBankServiceTest.ini
>>
>> Propchange: incubator/shiro/trunk/samples/aspectj/
>> ------------------------------------------------------------------------------
>> --- svn:ignore (added)
>> +++ svn:ignore Tue Feb  2 12:53:45 2010
>> @@ -0,0 +1,3 @@
>> +.classpath
>> +.project
>> +.settings
>>
>> Added: incubator/shiro/trunk/samples/aspectj/pom.xml
>> URL: 
>> http://svn.apache.org/viewvc/incubator/shiro/trunk/samples/aspectj/pom.xml?rev=905614&view=auto
>> ==============================================================================
>> --- incubator/shiro/trunk/samples/aspectj/pom.xml (added)
>> +++ incubator/shiro/trunk/samples/aspectj/pom.xml Tue Feb  2 12:53:45 2010
>> @@ -0,0 +1,86 @@
>> +<?xml version="1.0" encoding="UTF-8"?>
>> +<!--
>> +       ~ 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.
>> +       -->
>> +<!--suppress osmorcNonOsgiMavenDependency -->
>> +<project xmlns="http://maven.apache.org/POM/4.0.0"; 
>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>> +       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
>> http://maven.apache.org/maven-v4_0_0.xsd";>
>> +
>> +       <parent>
>> +               <groupId>org.apache.shiro.samples</groupId>
>> +               <artifactId>shiro-samples</artifactId>
>> +               <version>1.0-incubating-SNAPSHOT</version>
>> +       </parent>
>> +
>> +       <modelVersion>4.0.0</modelVersion>
>> +       <artifactId>samples-aspectj</artifactId>
>> +       <name>Apache Shiro :: Samples :: AspectJ</name>
>> +
>> +       <build>
>> +               <plugins>
>> +                       <plugin>
>> +                               <groupId>org.codehaus.mojo</groupId>
>> +                               <artifactId>aspectj-maven-plugin</artifactId>
>> +                               <version>1.3</version>
>> +                               <configuration>
>> +                                       <source>1.5</source>
>> +                                       <target>1.5</target>
>> +                                       <showWeaveInfo>true</showWeaveInfo>
>> +                                       <aspectLibraries>
>> +                                               <aspectLibrary>
>> +                                                       
>> <groupId>org.apache.shiro</groupId>
>> +                                                       
>> <artifactId>shiro-aspectj</artifactId>
>> +                                               </aspectLibrary>
>> +                                       </aspectLibraries>
>> +                               </configuration>
>> +                               <executions>
>> +                                       <execution>
>> +                                               <id>aspectj-compile</id>
>> +                                               <goals>
>> +                                                       
>> <goal>test-compile</goal>
>> +                                               </goals>
>> +                                       </execution>
>> +                               </executions>
>> +                       </plugin>
>> +               </plugins>
>> +       </build>
>> +
>> +       <dependencies>
>> +               <dependency>
>> +                       <groupId>org.apache.shiro</groupId>
>> +                       <artifactId>shiro-aspectj</artifactId>
>> +               </dependency>
>> +               <dependency>
>> +                       <groupId>commons-lang</groupId>
>> +                       <artifactId>commons-lang</artifactId>
>> +                       <version>2.4</version>
>> +               </dependency>
>> +               <dependency>
>> +                       <groupId>log4j</groupId>
>> +                       <artifactId>log4j</artifactId>
>> +                       <version>1.2.15</version>
>> +                       <scope>compile</scope>
>> +               </dependency>
>> +               <dependency>
>> +                       <groupId>org.slf4j</groupId>
>> +                       <artifactId>slf4j-log4j12</artifactId>
>> +                       <version>1.5.8</version>
>> +               </dependency>
>> +       </dependencies>
>> +
>> +</project>
>>
>> Added: 
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/Account.java
>> URL: 
>> http://svn.apache.org/viewvc/incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/Account.java?rev=905614&view=auto
>> ==============================================================================
>> --- 
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/Account.java
>>  (added)
>> +++ 
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/Account.java
>>  Tue Feb  2 12:53:45 2010
>> @@ -0,0 +1,169 @@
>> +package org.apache.shiro.sample.bank;
>> +
>> +
>> +import java.sql.Timestamp;
>> +import java.util.ArrayList;
>> +import java.util.Date;
>> +import java.util.List;
>> +
>> +import org.apache.commons.lang.builder.ToStringBuilder;
>> +import org.apache.commons.lang.builder.ToStringStyle;
>> +import org.apache.shiro.sample.bank.AccountTransaction.TransactionType;
>> +
>> +
>> +public class Account {
>> +
>> +  private static long _SEQUENCE;
>> +
>> +  private long _id;
>> +
>> +  private String _ownerName;
>> +
>> +  private boolean _isActive;
>> +
>> +  private double _balance;
>> +
>> +  private List<AccountTransaction> _transactions;
>> +
>> +  private String _createdBy;
>> +
>> +  private Date _creationDate;
>> +
>> +  public Account(String anOwnerName) {
>> +    _id = ++_SEQUENCE;
>> +    _ownerName = anOwnerName;
>> +    _isActive = true;
>> +    _balance = 0.0d;
>> +    _transactions = new ArrayList<AccountTransaction>();
>> +    _createdBy = "unknown";
>> +    _creationDate = new Date();
>> +  }
>> +
>> +  /**
>> +   * Returns the id attribute.
>> +   *
>> +   * @return The id value.
>> +   */
>> +  public long getId() {
>> +    return _id;
>> +  }
>> +
>> +  /**
>> +   * Returns the ownerName attribute.
>> +   *
>> +   * @return The ownerName value.
>> +   */
>> +  public String getOwnerName() {
>> +    return _ownerName;
>> +  }
>> +
>> +  /**
>> +   * Returns the isActive attribute.
>> +   *
>> +   * @return The isActive value.
>> +   */
>> +  public boolean isActive() {
>> +    return _isActive;
>> +  }
>> +
>> +  /**
>> +   * Changes the value of the attributes isActive.
>> +   *
>> +   * @param aIsActive The new value of the isActive attribute.
>> +   */
>> +  public void setActive(boolean aIsActive) {
>> +    _isActive = aIsActive;
>> +  }
>> +
>> +  /**
>> +   * Changes the value of the attributes ownerName.
>> +   *
>> +   * @param aOwnerName The new value of the ownerName attribute.
>> +   */
>> +  public void setOwnerName(String aOwnerName) {
>> +    _ownerName = aOwnerName;
>> +  }
>> +
>> +  /**
>> +   * Returns the balance attribute.
>> +   *
>> +   * @return The balance value.
>> +   */
>> +  public double getBalance() {
>> +    return _balance;
>> +  }
>> +
>> +  /**
>> +   * Returns the transactions attribute.
>> +   *
>> +   * @return The transactions value.
>> +   */
>> +  public List<AccountTransaction> getTransactions() {
>> +    return _transactions;
>> +  }
>> +
>> +  protected void applyTransaction(AccountTransaction aTransaction) throws 
>> NotEnoughFundsException, InactiveAccountException {
>> +    if (!_isActive) {
>> +      throw new InactiveAccountException("Unable to apply " + 
>> aTransaction.getType() + " of amount " + aTransaction.getAmount() + " to 
>> account " + _id);
>> +    }
>> +
>> +    synchronized (_transactions) {
>> +      if (TransactionType.DEPOSIT == aTransaction.getType()) {
>> +        _transactions.add(aTransaction);
>> +        _balance += aTransaction.getAmount();
>> +
>> +      } else if (TransactionType.WITHDRAWAL == aTransaction.getType()) {
>> +        if (_balance < aTransaction.getAmount()) {
>> +          throw new NotEnoughFundsException("Unable to withdraw " + 
>> aTransaction.getAmount() + "$ from account " + _id + " - current balance is 
>> " + _balance);
>> +        }
>> +        _transactions.add(aTransaction);
>> +        _balance -= aTransaction.getAmount();
>> +
>> +      } else {
>> +        throw new IllegalArgumentException("The transaction passed in has 
>> an invalid type: " + aTransaction.getType());
>> +      }
>> +    }
>> +  }
>> +
>> +  /**
>> +   * Changes the value of the attributes createdBy.
>> +   *
>> +   * @param aCreatedBy The new value of the createdBy attribute.
>> +   */
>> +  protected void setCreatedBy(String aCreatedBy) {
>> +    _createdBy = aCreatedBy;
>> +  }
>> +
>> +  /**
>> +   * Returns the createdBy attribute.
>> +   *
>> +   * @return The createdBy value.
>> +   */
>> +  public String getCreatedBy() {
>> +    return _createdBy;
>> +  }
>> +
>> +  /**
>> +   * Returns the creationDate attribute.
>> +   *
>> +   * @return The creationDate value.
>> +   */
>> +  public Date getCreationDate() {
>> +    return _creationDate;
>> +  }
>> +
>> +  /* (non-Javadoc)
>> +   * @see java.lang.Object#toString()
>> +   */
>> +  public String toString() {
>> +    return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).
>> +            append("id", _id).
>> +            append("ownerName", _ownerName).
>> +            append("isActive", _isActive).
>> +            append("balance", _balance).
>> +            append("tx.count", _transactions.size()).
>> +            append("createdBy", _createdBy).
>> +            append("creationDate", new Timestamp(_creationDate.getTime())).
>> +            toString();
>> +  }
>> +}
>>
>> Added: 
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/AccountNotFoundException.java
>> URL: 
>> http://svn.apache.org/viewvc/incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/AccountNotFoundException.java?rev=905614&view=auto
>> ==============================================================================
>> --- 
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/AccountNotFoundException.java
>>  (added)
>> +++ 
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/AccountNotFoundException.java
>>  Tue Feb  2 12:53:45 2010
>> @@ -0,0 +1,10 @@
>> +package org.apache.shiro.sample.bank;
>> +
>> +
>> +public class AccountNotFoundException extends BankServiceException {
>> +
>> +  public AccountNotFoundException(String aMessage) {
>> +    super(aMessage);
>> +  }
>> +
>> +}
>>
>> Added: 
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/AccountTransaction.java
>> URL: 
>> http://svn.apache.org/viewvc/incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/AccountTransaction.java?rev=905614&view=auto
>> ==============================================================================
>> --- 
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/AccountTransaction.java
>>  (added)
>> +++ 
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/AccountTransaction.java
>>  Tue Feb  2 12:53:45 2010
>> @@ -0,0 +1,126 @@
>> +package org.apache.shiro.sample.bank;
>> +
>> +
>> +import java.sql.Timestamp;
>> +import java.util.Date;
>> +
>> +import org.apache.commons.lang.builder.ToStringBuilder;
>> +import org.apache.commons.lang.builder.ToStringStyle;
>> +
>> +public class AccountTransaction {
>> +
>> +  private static long _SEQUENCE;
>> +
>> +  public enum TransactionType {
>> +    DEPOSIT,
>> +    WITHDRAWAL;
>> +  }
>> +
>> +  private long _id;
>> +
>> +  private TransactionType _type;
>> +
>> +  private long _accountId;
>> +
>> +  private double _amount;
>> +
>> +  private String _createdBy;
>> +  private Date _creationDate;
>> +
>> +  public static AccountTransaction createDepositTx(long anAccountId, double 
>> anAmount) {
>> +    AccountTransaction tx = new AccountTransaction(TransactionType.DEPOSIT, 
>> anAccountId, anAmount);
>> +    return tx;
>> +  }
>> +
>> +  public static AccountTransaction createWithdrawalTx(long anAccountId, 
>> double anAmount) {
>> +    AccountTransaction tx = new 
>> AccountTransaction(TransactionType.WITHDRAWAL, anAccountId, anAmount);
>> +    return tx;
>> +  }
>> +
>> +  private AccountTransaction(TransactionType aType, long anAccountId, 
>> double anAmount) {
>> +    _id = ++_SEQUENCE;
>> +    _type = aType;
>> +    _accountId = anAccountId;
>> +    _amount = anAmount;
>> +    _createdBy = "unknown";
>> +    _creationDate = new Date();
>> +  }
>> +
>> +  /**
>> +   * Returns the id attribute.
>> +   *
>> +   * @return The id value.
>> +   */
>> +  public long getId() {
>> +    return _id;
>> +  }
>> +
>> +  /**
>> +   * Returns the type attribute.
>> +   *
>> +   * @return The type value.
>> +   */
>> +  public TransactionType getType() {
>> +    return _type;
>> +  }
>> +
>> +  /**
>> +   * Returns the accountId attribute.
>> +   *
>> +   * @return The accountId value.
>> +   */
>> +  public long getAccountId() {
>> +    return _accountId;
>> +  }
>> +
>> +  /**
>> +   * Returns the amount attribute.
>> +   *
>> +   * @return The amount value.
>> +   */
>> +  public double getAmount() {
>> +    return _amount;
>> +  }
>> +
>> +  /**
>> +   * Changes the value of the attributes createdBy.
>> +   *
>> +   * @param aCreatedBy The new value of the createdBy attribute.
>> +   */
>> +  protected void setCreatedBy(String aCreatedBy) {
>> +    _createdBy = aCreatedBy;
>> +  }
>> +
>> +  /**
>> +   * Returns the createdBy attribute.
>> +   *
>> +   * @return The createdBy value.
>> +   */
>> +  public String getCreatedBy() {
>> +    return _createdBy;
>> +  }
>> +
>> +  /**
>> +   * Returns the creationDate attribute.
>> +   *
>> +   * @return The creationDate value.
>> +   */
>> +  public Date getCreationDate() {
>> +    return _creationDate;
>> +  }
>> +
>> +  /* (non-Javadoc)
>> +   * @see java.lang.Object#toString()
>> +   */
>> +  public String toString() {
>> +    return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).
>> +            append("id", _id).
>> +            append("type", _type).
>> +            append("accountId", _accountId).
>> +            append("amount", _amount).
>> +            append("createdBy", _createdBy).
>> +            append("creationDate", new Timestamp(_creationDate.getTime())).
>> +            toString();
>> +  }
>> +
>> +}
>>
>> Added: 
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/BankServerRunner.java
>> URL: 
>> http://svn.apache.org/viewvc/incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/BankServerRunner.java?rev=905614&view=auto
>> ==============================================================================
>> --- 
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/BankServerRunner.java
>>  (added)
>> +++ 
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/BankServerRunner.java
>>  Tue Feb  2 12:53:45 2010
>> @@ -0,0 +1,41 @@
>> +package org.apache.shiro.sample.bank;
>> +
>> +
>> +public class BankServerRunner {
>> +
>> +  private SecureBankService _bankService;
>> +
>> +  public synchronized void start() throws Exception {
>> +    if (_bankService == null) {
>> +      _bankService = new SecureBankService();
>> +      _bankService.start();
>> +    }
>> +  }
>> +
>> +  public synchronized void stop() {
>> +    if (_bankService != null) {
>> +      try {
>> +        _bankService.dispose();
>> +      } finally {
>> +        _bankService = null;
>> +      }
>> +    }
>> +  }
>> +
>> +  public BankService getBankService() {
>> +    return _bankService;
>> +  }
>> +
>> +  public static void main(String[] args) {
>> +    try {
>> +      BankServerRunner server = new BankServerRunner();
>> +      server.start();
>> +
>> +      server.stop();
>> +
>> +    } catch (Exception e) {
>> +      e.printStackTrace();
>> +    }
>> +
>> +  }
>> +}
>>
>> Added: 
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/BankService.java
>> URL: 
>> http://svn.apache.org/viewvc/incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/BankService.java?rev=905614&view=auto
>> ==============================================================================
>> --- 
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/BankService.java
>>  (added)
>> +++ 
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/BankService.java
>>  Tue Feb  2 12:53:45 2010
>> @@ -0,0 +1,62 @@
>> +package org.apache.shiro.sample.bank;
>> +
>> +
>> +import java.util.Date;
>> +
>> +public interface BankService {
>> +
>> +  public long[] searchAccountIdsByOwner(String anOwnerName);
>> +
>> +  public long createNewAccount(String anOwnerName);
>> +
>> +  public double getBalanceOf(long anAccountId) throws 
>> AccountNotFoundException;
>> +
>> +  public String getOwnerOf(long anAccountId) throws 
>> AccountNotFoundException;
>> +
>> +  public double depositInto(long anAccountId, double anAmount) throws 
>> AccountNotFoundException, InactiveAccountException;
>> +
>> +  public double withdrawFrom(long anAccountId, double anAmount) throws 
>> AccountNotFoundException, NotEnoughFundsException, InactiveAccountException;
>> +
>> +  public TxLog[] getTxHistoryFor(long anAccountId) throws 
>> AccountNotFoundException;
>> +
>> +  public double closeAccount(long anAccountId) throws 
>> AccountNotFoundException, InactiveAccountException;
>> +
>> +  public boolean isAccountActive(long anAccountId) throws 
>> AccountNotFoundException;
>> +
>> +  public static class TxLog {
>> +    private Date _creationDate;
>> +    private double _amount;
>> +    private String _madeBy;
>> +    public TxLog(Date aCreationDate, double aAmount, String aMadeBy) {
>> +      super();
>> +      _creationDate = aCreationDate;
>> +      _amount = aAmount;
>> +      _madeBy = aMadeBy;
>> +    }
>> +    /**
>> +     * Returns the creationDate attribute.
>> +     *
>> +     * @return The creationDate value.
>> +     */
>> +    public Date getCreationDate() {
>> +      return _creationDate;
>> +    }
>> +    /**
>> +     * Returns the amount attribute.
>> +     *
>> +     * @return The amount value.
>> +     */
>> +    public double getAmount() {
>> +      return _amount;
>> +    }
>> +    /**
>> +     * Returns the madeBy attribute.
>> +     *
>> +     * @return The madeBy value.
>> +     */
>> +    public String getMadeBy() {
>> +      return _madeBy;
>> +    }
>> +  }
>> +
>> +}
>>
>> Added: 
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/BankServiceException.java
>> URL: 
>> http://svn.apache.org/viewvc/incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/BankServiceException.java?rev=905614&view=auto
>> ==============================================================================
>> --- 
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/BankServiceException.java
>>  (added)
>> +++ 
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/BankServiceException.java
>>  Tue Feb  2 12:53:45 2010
>> @@ -0,0 +1,14 @@
>> +package org.apache.shiro.sample.bank;
>> +
>> +
>> +public class BankServiceException extends Exception {
>> +
>> +  public BankServiceException(String aMessage) {
>> +    super(aMessage);
>> +  }
>> +
>> +  public BankServiceException(String aMessage, Throwable aCause) {
>> +    super(aMessage, aCause);
>> +  }
>> +
>> +}
>>
>> Added: 
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/InactiveAccountException.java
>> URL: 
>> http://svn.apache.org/viewvc/incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/InactiveAccountException.java?rev=905614&view=auto
>> ==============================================================================
>> --- 
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/InactiveAccountException.java
>>  (added)
>> +++ 
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/InactiveAccountException.java
>>  Tue Feb  2 12:53:45 2010
>> @@ -0,0 +1,10 @@
>> +package org.apache.shiro.sample.bank;
>> +
>> +
>> +public class InactiveAccountException extends BankServiceException {
>> +
>> +  public InactiveAccountException(String aMessage) {
>> +    super(aMessage);
>> +  }
>> +
>> +}
>>
>> Added: 
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/NotEnoughFundsException.java
>> URL: 
>> http://svn.apache.org/viewvc/incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/NotEnoughFundsException.java?rev=905614&view=auto
>> ==============================================================================
>> --- 
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/NotEnoughFundsException.java
>>  (added)
>> +++ 
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/NotEnoughFundsException.java
>>  Tue Feb  2 12:53:45 2010
>> @@ -0,0 +1,10 @@
>> +package org.apache.shiro.sample.bank;
>> +
>> +
>> +public class NotEnoughFundsException extends BankServiceException {
>> +
>> +  public NotEnoughFundsException(String aMessage) {
>> +    super(aMessage);
>> +  }
>> +
>> +}
>>
>> Added: 
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/SecureBankService.java
>> URL: 
>> http://svn.apache.org/viewvc/incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/SecureBankService.java?rev=905614&view=auto
>> ==============================================================================
>> --- 
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/SecureBankService.java
>>  (added)
>> +++ 
>> incubator/shiro/trunk/samples/aspectj/src/main/java/org/apache/shiro/sample/bank/SecureBankService.java
>>  Tue Feb  2 12:53:45 2010
>> @@ -0,0 +1,279 @@
>> +package org.apache.shiro.sample.bank;
>> +
>> +
>> +import java.util.ArrayList;
>> +import java.util.HashMap;
>> +import java.util.List;
>> +import java.util.Map;
>> +
>> +import org.apache.log4j.Logger;
>> +import org.apache.shiro.SecurityUtils;
>> +import org.apache.shiro.authz.annotation.RequiresPermissions;
>> +
>> +import org.apache.shiro.sample.bank.AccountTransaction.TransactionType;
>> +import org.apache.shiro.subject.Subject;
>> +
>> +public class SecureBankService implements BankService {
>> +
>> +  private Logger _logger;
>> +  private boolean _isRunning;
>> +  private List<Account> _accounts;
>> +  private Map<Long,Account> _accountsById;
>> +
>> +  /**
>> +   * Creates a new {...@link SecureBankService} instance.
>> +   */
>> +  public SecureBankService() {
>> +    _logger = Logger.getLogger(SecureBankService.class);
>> +    _accounts = new ArrayList<Account>();
>> +    _accountsById = new HashMap<Long, Account>();
>> +  }
>> +
>> +  /**
>> +   * Starts this service
>> +   */
>> +  public void start() throws Exception {
>> +    _isRunning = true;
>> +    _logger.info("Bank service started");
>> +  }
>> +
>> +  /**
>> +   * Stop this service
>> +   */
>> +  public void dispose() {
>> +    _logger.info("Stopping bank service...");
>> +    _isRunning = false;
>> +
>> +    synchronized (_accounts) {
>> +      _accountsById.clear();
>> +      _accounts.clear();
>> +    }
>> +
>> +    _logger.info("Bank service stopped");
>> +  }
>> +
>> +  /**
>> +   * Internal utility method that validate the internal state of this 
>> service.
>> +   */
>> +  protected void assertServiceState() {
>> +    if (!_isRunning) {
>> +      throw new IllegalStateException("This bank service is not running");
>> +    }
>> +  }
>> +
>> +  public int getAccountCount() {
>> +    return _accounts.size();
>> +  }
>> +
>> +  /* (non-Javadoc)
>> +   * @see 
>> com.connectif.trilogy.root.security.BankService#createNewAccount(java.lang.String)
>> +   */
>> + �...@requirespermissions("bank:createAccount")
>> +  public long createNewAccount(String anOwnerName) {
>> +    assertServiceState();
>> +    _logger.info("Creating new account for " + anOwnerName);
>> +
>> +    synchronized (_accounts) {
>> +      Account account = new Account(anOwnerName);
>> +      account.setCreatedBy(getCurrentUsername());
>> +      _accounts.add(account);
>> +      _accountsById.put(account.getId(), account);
>> +
>> +      _logger.debug("Created new account: " + account);
>> +      return account.getId();
>> +    }
>> +  }
>> +
>> +  /* (non-Javadoc)
>> +   * @see 
>> com.connectif.trilogy.root.security.BankService#searchAccountIdsByOwner(java.lang.String)
>> +   */
>> +  public long[] searchAccountIdsByOwner(String anOwnerName) {
>> +    assertServiceState();
>> +    _logger.info("Searching existing accounts for " + anOwnerName);
>> +
>> +    ArrayList<Account> matchAccounts = new ArrayList<Account>();
>> +    synchronized (_accounts) {
>> +      for (Account a: _accounts) {
>> +        if 
>> (a.getOwnerName().toLowerCase().contains(anOwnerName.toLowerCase())) {
>> +          matchAccounts.add(a);
>> +        }
>> +      }
>> +    }
>> +
>> +    long[] accountIds = new long[matchAccounts.size()];
>> +    int index = 0;
>> +    for(Account a: matchAccounts) {
>> +      accountIds[index++] = a.getId();
>> +    }
>> +
>> +    _logger.debug("Found " + accountIds.length + " account(s) matching the 
>> name " + anOwnerName);
>> +    return accountIds;
>> +  }
>> +
>> +  /* (non-Javadoc)
>> +   * @see com.connectif.trilogy.root.security.BankService#getOwnerOf(long)
>> +   */
>> + �...@requirespermissions("bank:readAccount")
>> +  public String getOwnerOf(long anAccountId) throws 
>> AccountNotFoundException {
>> +    assertServiceState();
>> +    _logger.info("Getting owner of account " + anAccountId);
>> +
>> +    Account a = safellyRetrieveAccountForId(anAccountId);
>> +    return a.getOwnerName();
>> +  }
>> +
>> +  /* (non-Javadoc)
>> +   * @see com.connectif.trilogy.root.security.BankService#getBalanceOf(long)
>> +   */
>> + �...@requirespermissions("bank:readAccount")
>> +  public double getBalanceOf(long anAccountId) throws 
>> AccountNotFoundException {
>> +    assertServiceState();
>> +    _logger.info("Getting balance of account " + anAccountId);
>> +
>> +    Account a = safellyRetrieveAccountForId(anAccountId);
>> +    return a.getBalance();
>> +  }
>> +
>> +  /* (non-Javadoc)
>> +   * @see com.connectif.trilogy.root.security.BankService#depositInto(long, 
>> double)
>> +   */
>> + �...@requirespermissions("bank:operateAccount")
>> +  public double depositInto(long anAccountId, double anAmount) throws 
>> AccountNotFoundException, InactiveAccountException {
>> +    assertServiceState();
>> +    _logger.info("Making deposit of " + anAmount + " into account " + 
>> anAccountId);
>> +
>> +    try {
>> +      Account a = safellyRetrieveAccountForId(anAccountId);
>> +      AccountTransaction tx = 
>> AccountTransaction.createDepositTx(anAccountId, anAmount);
>> +      tx.setCreatedBy(getCurrentUsername());
>> +      _logger.debug("Created a new transaction " + tx);
>> +
>> +      a.applyTransaction(tx);
>> +      _logger.debug("New balance of account " + a.getId() + " after deposit 
>> is " + a.getBalance());
>> +
>> +      return a.getBalance();
>> +
>> +    } catch (NotEnoughFundsException nefe) {
>> +      throw new IllegalStateException("Should never happen", nefe);
>> +    }
>> +  }
>> +
>> +  /* (non-Javadoc)
>> +   * @see 
>> com.connectif.trilogy.root.security.BankService#withdrawFrom(long, double)
>> +   */
>> + �...@requirespermissions("bank:operateAccount")
>> +  public double withdrawFrom(long anAccountId, double anAmount) throws 
>> AccountNotFoundException, NotEnoughFundsException, InactiveAccountException {
>> +    assertServiceState();
>> +    _logger.info("Making withdrawal of " + anAmount + " from account " + 
>> anAccountId);
>> +
>> +    Account a = safellyRetrieveAccountForId(anAccountId);
>> +    AccountTransaction tx = 
>> AccountTransaction.createWithdrawalTx(anAccountId, anAmount);
>> +    tx.setCreatedBy(getCurrentUsername());
>> +    _logger.debug("Created a new transaction " + tx);
>> +
>> +    a.applyTransaction(tx);
>> +    _logger.debug("New balance of account " + a.getId() + " after 
>> withdrawal is " + a.getBalance());
>> +
>> +    return a.getBalance();
>> +  }
>> +
>> +  /* (non-Javadoc)
>> +   * @see 
>> com.connectif.trilogy.root.security.BankService#getTxHistoryFor(long)
>> +   */
>> + �...@requirespermissions("bank:readAccount")
>> +  public TxLog[] getTxHistoryFor(long anAccountId) throws 
>> AccountNotFoundException {
>> +    assertServiceState();
>> +    _logger.info("Getting transactions of account " + anAccountId);
>> +
>> +    Account a = safellyRetrieveAccountForId(anAccountId);
>> +
>> +    TxLog[] txs = new TxLog[a.getTransactions().size()];
>> +    int index = 0;
>> +    for (AccountTransaction tx: a.getTransactions()) {
>> +      _logger.debug("Retrieved transaction " + tx);
>> +
>> +      if (TransactionType.DEPOSIT == tx.getType()) {
>> +        txs[index++] = new TxLog(tx.getCreationDate(), tx.getAmount(), 
>> tx.getCreatedBy());
>> +      } else {
>> +        txs[index++] = new TxLog(tx.getCreationDate(), -1.0d * 
>> tx.getAmount(), tx.getCreatedBy());
>> +      }
>> +    }
>> +
>> +    return txs;
>> +  }
>> +
>> +  /* (non-Javadoc)
>> +   * @see com.connectif.trilogy.root.security.BankService#closeAccount(long)
>> +   */
>> + �...@requirespermissions("bank:closeAccount")
>> +  public double closeAccount(long anAccountId) throws 
>> AccountNotFoundException, InactiveAccountException {
>> +    assertServiceState();
>> +    _logger.info("Closing account " + anAccountId);
>> +
>> +    Account a = safellyRetrieveAccountForId(anAccountId);
>> +    if (!a.isActive()) {
>> +      throw new InactiveAccountException("The account " + anAccountId + " 
>> is already closed");
>> +    }
>> +
>> +    try {
>> +      AccountTransaction tx = 
>> AccountTransaction.createWithdrawalTx(a.getId(), a.getBalance());
>> +      tx.setCreatedBy(getCurrentUsername());
>> +      _logger.debug("Created a new transaction " + tx);
>> +      a.applyTransaction(tx);
>> +      a.setActive(false);
>> +
>> +      _logger.debug("Account " + a.getId() + " is now closed and an amount 
>> of " + tx.getAmount() + " is given to the owner");
>> +      return tx.getAmount();
>> +
>> +    } catch (NotEnoughFundsException nefe) {
>> +      throw new IllegalStateException("Should never happen", nefe);
>> +    }
>> +  }
>> +
>> +  /* (non-Javadoc)
>> +   * @see 
>> com.connectif.trilogy.root.security.BankService#isAccountActive(long)
>> +   */
>> + �...@requirespermissions("bank:readAccount")
>> +  public boolean isAccountActive(long anAccountId) throws 
>> AccountNotFoundException {
>> +    assertServiceState();
>> +    _logger.info("Getting active status of account " + anAccountId);
>> +
>> +    Account a = safellyRetrieveAccountForId(anAccountId);
>> +    return a.isActive();
>> +  }
>> +
>> +
>> +  /**
>> +   * Internal method that safelly (concurrency-wise) retrieves an account 
>> from the id passed in.
>> +   *
>> +   * @param anAccountId The identifier of the account to retrieve.
>> +   * @return The account instance retrieved.
>> +   * @throws AccountNotFoundException If no account is found for the 
>> provided identifier.
>> +   */
>> +  protected Account safellyRetrieveAccountForId(long anAccountId) throws 
>> AccountNotFoundException {
>> +    Account account = null;
>> +    synchronized (_accounts) {
>> +      account = _accountsById.get(anAccountId);
>> +    }
>> +
>> +    if (account == null) {
>> +      throw new AccountNotFoundException("No account found for the id " + 
>> anAccountId);
>> +    }
>> +
>> +    _logger.info("Retrieved account " + account);
>> +    return account;
>> +  }
>> +
>> +  /**
>> +   * Internal utility method to retrieve the username of the current 
>> authenticated user.
>> +   *
>> +   * @return The name.
>> +   */
>> +  protected String getCurrentUsername() {
>> +    Subject subject = SecurityUtils.getSubject();
>> +    if (subject == null || subject.getPrincipal() == null || 
>> !subject.isAuthenticated()) {
>> +      throw new IllegalStateException("Unable to retrieve the current 
>> authenticated subject");
>> +    }
>> +    return SecurityUtils.getSubject().getPrincipal().toString();
>> +  }
>> +}
>>
>> Added: 
>> incubator/shiro/trunk/samples/aspectj/src/test/java/org/apache/shiro/sample/bank/SecureBankServiceTest.java
>> URL: 
>> http://svn.apache.org/viewvc/incubator/shiro/trunk/samples/aspectj/src/test/java/org/apache/shiro/sample/bank/SecureBankServiceTest.java?rev=905614&view=auto
>> ==============================================================================
>> --- 
>> incubator/shiro/trunk/samples/aspectj/src/test/java/org/apache/shiro/sample/bank/SecureBankServiceTest.java
>>  (added)
>> +++ 
>> incubator/shiro/trunk/samples/aspectj/src/test/java/org/apache/shiro/sample/bank/SecureBankServiceTest.java
>>  Tue Feb  2 12:53:45 2010
>> @@ -0,0 +1,227 @@
>> +package org.apache.shiro.sample.bank;
>> +
>> +
>> +import junit.framework.Assert;
>> +
>> +import org.apache.log4j.BasicConfigurator;
>> +import org.apache.log4j.Logger;
>> +import org.apache.shiro.SecurityUtils;
>> +import org.apache.shiro.authc.UsernamePasswordToken;
>> +import org.apache.shiro.config.IniSecurityManagerFactory;
>> +import org.apache.shiro.mgt.SecurityManager;
>> +import org.apache.shiro.subject.Subject;
>> +import org.apache.shiro.util.Factory;
>> +import org.junit.After;
>> +import org.junit.AfterClass;
>> +import org.junit.Before;
>> +import org.junit.BeforeClass;
>> +import org.junit.Test;
>> +
>> +public class SecureBankServiceTest {
>> +
>> +  private static Logger logger;
>> +  private static SecureBankService service;
>> +  private static int testCounter;
>> +
>> + �...@beforeclass
>> +  public static void setUpClass() throws Exception {
>> +    BasicConfigurator.resetConfiguration();
>> +    BasicConfigurator.configure();
>> +    logger = Logger.getLogger(SecureBankServiceTest.class.getSimpleName());
>> +
>> +    Factory<SecurityManager> factory = new 
>> IniSecurityManagerFactory("classpath:shiroBankServiceTest.ini");
>> +    SecurityManager securityManager = factory.getInstance();
>> +    SecurityUtils.setSecurityManager(securityManager);
>> +
>> +    service = new SecureBankService();
>> +    service.start();
>> +  }
>> +
>> + �...@afterclass
>> +  public static void tearDownClass() {
>> +    if (service != null) {
>> +      service.dispose();
>> +    }
>> +  }
>> +
>> +  private Subject _subject;
>> +
>> + �...@before
>> +  public void setUp() throws Exception {
>> +    logger.info("\n\n#########################\n### STARTING TEST CASE " + 
>> (++testCounter) + "\n");
>> +    Thread.sleep(50);
>> +  }
>> +
>> + �...@after
>> +  public void tearDown() {
>> +    if (_subject != null) {
>> +      _subject.logout();
>> +    }
>> +  }
>> +
>> +  protected void logoutCurrentSubject() {
>> +    if (_subject != null) {
>> +      _subject.logout();
>> +    }
>> +  }
>> +
>> +  protected void loginAsUser() {
>> +    if (_subject == null) {
>> +      _subject = SecurityUtils.getSubject();
>> +    }
>> +
>> +    // use dan to run as a normal user (which cannot close an account)
>> +    _subject.login(new UsernamePasswordToken("dan", "123"));
>> +  }
>> +
>> +  protected void loginAsSuperviser() {
>> +    if (_subject == null) {
>> +      _subject = SecurityUtils.getSubject();
>> +    }
>> +
>> +    // use sally to run as a superviser (which cannot operate an account)
>> +    _subject.login(new UsernamePasswordToken("sally", "1234"));
>> +  }
>> +
>> + �...@test
>> +  public void testCreateAccount() throws Exception {
>> +    loginAsUser();
>> +    createAndValidateAccountFor("Bob Smith");
>> +  }
>> +
>> + �...@test
>> +  public void testDepositInto_singleTx() throws Exception {
>> +    loginAsUser();
>> +    long accountId = createAndValidateAccountFor("Joe Smith");
>> +    makeDepositAndValidateAccount(accountId, 250.00d, "Joe Smith");
>> +  }
>> +
>> + �...@test
>> +  public void testDepositInto_multiTxs() throws Exception {
>> +    loginAsUser();
>> +    long accountId = createAndValidateAccountFor("Everett Smith");
>> +    makeDepositAndValidateAccount(accountId, 50.00d, "Everett Smith");
>> +    makeDepositAndValidateAccount(accountId, 300.00d, "Everett Smith");
>> +    makeDepositAndValidateAccount(accountId, 85.00d, "Everett Smith");
>> +    assertAccount("Everett Smith", true, 435.00d, 3, accountId);
>> +  }
>> +
>> + �...@test(expected=NotEnoughFundsException.class)
>> +  public void testWithdrawFrom_emptyAccount() throws Exception {
>> +    loginAsUser();
>> +    long accountId = createAndValidateAccountFor("Wally Smith");
>> +    service.withdrawFrom(accountId, 100.00d);
>> +  }
>> +
>> + �...@test(expected=NotEnoughFundsException.class)
>> +  public void testWithdrawFrom_notEnoughFunds() throws Exception {
>> +    loginAsUser();
>> +    long accountId = createAndValidateAccountFor("Frank Smith");
>> +    makeDepositAndValidateAccount(accountId, 50.00d, "Frank Smith");
>> +    service.withdrawFrom(accountId, 100.00d);
>> +  }
>> +
>> + �...@test
>> +  public void testWithdrawFrom_singleTx() throws Exception {
>> +    loginAsUser();
>> +    long accountId = createAndValidateAccountFor("Al Smith");
>> +    makeDepositAndValidateAccount(accountId, 500.00d, "Al Smith");
>> +    makeWithdrawalAndValidateAccount(accountId, 100.00d, "Al Smith");
>> +    assertAccount("Al Smith", true, 400.00d, 2, accountId);
>> +  }
>> +
>> + �...@test
>> +  public void testWithdrawFrom_manyTxs() throws Exception {
>> +    loginAsUser();
>> +    long accountId = createAndValidateAccountFor("Zoe Smith");
>> +    makeDepositAndValidateAccount(accountId, 500.00d, "Zoe Smith");
>> +    makeWithdrawalAndValidateAccount(accountId, 100.00d, "Zoe Smith");
>> +    makeWithdrawalAndValidateAccount(accountId, 75.00d, "Zoe Smith");
>> +    makeWithdrawalAndValidateAccount(accountId, 125.00d, "Zoe Smith");
>> +    assertAccount("Zoe Smith", true, 200.00d, 4, accountId);
>> +  }
>> +
>> + �...@test
>> +  public void testWithdrawFrom_upToZero() throws Exception {
>> +    loginAsUser();
>> +    long accountId = createAndValidateAccountFor("Zoe Smith");
>> +    makeDepositAndValidateAccount(accountId, 500.00d, "Zoe Smith");
>> +    makeWithdrawalAndValidateAccount(accountId, 500.00d, "Zoe Smith");
>> +    assertAccount("Zoe Smith", true, 0.00d, 2, accountId);
>> +  }
>> +
>> + �...@test
>> +  public void testCloseAccount_zeroBalance() throws Exception {
>> +    loginAsUser();
>> +    long accountId = createAndValidateAccountFor("Chris Smith");
>> +
>> +    logoutCurrentSubject();
>> +    loginAsSuperviser();
>> +    double closingBalance = service.closeAccount(accountId);
>> +    Assert.assertEquals(0.00d, closingBalance);
>> +    assertAccount("Chris Smith", false, 0.00d, 1, accountId);
>> +  }
>> +
>> + �...@test
>> +  public void testCloseAccount_withBalance() throws Exception {
>> +    loginAsUser();
>> +    long accountId = createAndValidateAccountFor("Gerry Smith");
>> +    makeDepositAndValidateAccount(accountId, 385.00d, "Gerry Smith");
>> +
>> +    logoutCurrentSubject();
>> +    loginAsSuperviser();
>> +    double closingBalance = service.closeAccount(accountId);
>> +    Assert.assertEquals(385.00d, closingBalance);
>> +    assertAccount("Gerry Smith", false, 0.00d, 2, accountId);
>> +  }
>> +
>> + �...@test(expected=InactiveAccountException.class)
>> +  public void testCloseAccount_alreadyClosed() throws Exception {
>> +    loginAsUser();
>> +    long accountId = createAndValidateAccountFor("Chris Smith");
>> +
>> +    logoutCurrentSubject();
>> +    loginAsSuperviser();
>> +    double closingBalance = service.closeAccount(accountId);
>> +    Assert.assertEquals(0.00d, closingBalance);
>> +    assertAccount("Chris Smith", false, 0.00d, 1, accountId);
>> +    service.closeAccount(accountId);
>> +  }
>> +
>> +
>> +
>> +
>> +  protected long createAndValidateAccountFor(String anOwner) throws 
>> Exception {
>> +    long createdId = service.createNewAccount(anOwner);
>> +    assertAccount(anOwner, true, 0.0d, 0, createdId);
>> +    return createdId;
>> +  }
>> +
>> +  protected double makeDepositAndValidateAccount(long anAccountId, double 
>> anAmount, String eOwnerName) throws Exception {
>> +    double previousBalance = service.getBalanceOf(anAccountId);
>> +    int previousTxCount = service.getTxHistoryFor(anAccountId).length;
>> +    double newBalance = service.depositInto(anAccountId, anAmount);
>> +    Assert.assertEquals(previousBalance+anAmount, newBalance);
>> +    assertAccount(eOwnerName, true, newBalance, 1+previousTxCount, 
>> anAccountId);
>> +    return newBalance;
>> +  }
>> +
>> +  protected double makeWithdrawalAndValidateAccount(long anAccountId, 
>> double anAmount, String eOwnerName) throws Exception {
>> +    double previousBalance = service.getBalanceOf(anAccountId);
>> +    int previousTxCount = service.getTxHistoryFor(anAccountId).length;
>> +    double newBalance = service.withdrawFrom(anAccountId, anAmount);
>> +    Assert.assertEquals(previousBalance-anAmount, newBalance);
>> +    assertAccount(eOwnerName, true, newBalance, 1+previousTxCount, 
>> anAccountId);
>> +    return newBalance;
>> +  }
>> +
>> +
>> +
>> +
>> +  public static void assertAccount(String eOwnerName, boolean eIsActive, 
>> double eBalance, int eTxLogCount, long actualAccountId) throws Exception {
>> +   Assert.assertEquals(eOwnerName, service.getOwnerOf(actualAccountId));
>> +   Assert.assertEquals(eIsActive, service.isAccountActive(actualAccountId));
>> +   Assert.assertEquals(eBalance, service.getBalanceOf(actualAccountId));
>> +   Assert.assertEquals(eTxLogCount, 
>> service.getTxHistoryFor(actualAccountId).length);
>> +  }
>> +}
>>
>> Added: 
>> incubator/shiro/trunk/samples/aspectj/src/test/resources/META-INF/aop.xml
>> URL: 
>> http://svn.apache.org/viewvc/incubator/shiro/trunk/samples/aspectj/src/test/resources/META-INF/aop.xml?rev=905614&view=auto
>> ==============================================================================
>> --- 
>> incubator/shiro/trunk/samples/aspectj/src/test/resources/META-INF/aop.xml 
>> (added)
>> +++ 
>> incubator/shiro/trunk/samples/aspectj/src/test/resources/META-INF/aop.xml 
>> Tue Feb  2 12:53:45 2010
>> @@ -0,0 +1,14 @@
>> +<aspectj>
>> +
>> +    <aspects>
>> +        <!-- declare shiro aspects to the weaver -->
>> +        <aspect 
>> name="org.apache.shiro.aspectj.ShiroAnnotationAuthorizingAspect"/>
>> +    </aspects>
>> +
>> +    <weaver options="-verbose -showWeaveInfo">
>> +        <!-- Weave types that are within the org.apache.shiro.sample package
>> +             and all sub-packages. This limits the scope of the weaver and
>> +             reduces the overhead -->
>> +        <include within="org.apache.shiro.sample..*"/>
>> +    </weaver>
>> +</aspectj>
>>
>> Added: 
>> incubator/shiro/trunk/samples/aspectj/src/test/resources/log4j.properties
>> URL: 
>> http://svn.apache.org/viewvc/incubator/shiro/trunk/samples/aspectj/src/test/resources/log4j.properties?rev=905614&view=auto
>> ==============================================================================
>> --- 
>> incubator/shiro/trunk/samples/aspectj/src/test/resources/log4j.properties 
>> (added)
>> +++ 
>> incubator/shiro/trunk/samples/aspectj/src/test/resources/log4j.properties 
>> Tue Feb  2 12:53:45 2010
>> @@ -0,0 +1,10 @@
>> +log4j.rootCategory=info, A1
>> +
>> +# A1 is set to be a ConsoleAppender.
>> +log4j.appender.A1=org.apache.log4j.ConsoleAppender
>> +
>> +# A1 uses PatternLayout.
>> +log4j.appender.A1.layout=org.apache.log4j.PatternLayout
>> +log4j.appender.A1.layout.ConversionPattern=[%p] %c{2} %m%n
>> +
>> +log4j.category.org.apache.shiro.aspectj=TRACE
>> \ No newline at end of file
>>
>> Added: 
>> incubator/shiro/trunk/samples/aspectj/src/test/resources/shiroBankServiceTest.ini
>> URL: 
>> http://svn.apache.org/viewvc/incubator/shiro/trunk/samples/aspectj/src/test/resources/shiroBankServiceTest.ini?rev=905614&view=auto
>> ==============================================================================
>> --- 
>> incubator/shiro/trunk/samples/aspectj/src/test/resources/shiroBankServiceTest.ini
>>  (added)
>> +++ 
>> incubator/shiro/trunk/samples/aspectj/src/test/resources/shiroBankServiceTest.ini
>>  Tue Feb  2 12:53:45 2010
>> @@ -0,0 +1,42 @@
>> +#
>> +# 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.
>> +#
>> +
>> +
>> +# 
>> -----------------------------------------------------------------------------
>> +# Users and their assigned roles
>> +#
>> +# Each line conforms to the format defined in the
>> +# org.apache.shiro.realm.text.TextConfigurationRealm#setUserDefinitions 
>> JavaDoc
>> +# 
>> -----------------------------------------------------------------------------
>> +[users]
>> +root = secret, admin
>> +sally = 1234, superviser
>> +dan = 123, user
>> +
>> +
>> +# 
>> -----------------------------------------------------------------------------
>> +# Roles with assigned permissions
>> +#
>> +# Each line conforms to the format defined in the
>> +# org.apache.shiro.realm.text.TextConfigurationRealm#setRoleDefinitions 
>> JavaDoc
>> +# 
>> -----------------------------------------------------------------------------
>> +[roles]
>> +admin = bank:*
>> +superviser = bank:readAccount, bank:createAccount, bank:closeAccount
>> +user = bank:readAccount, bank:operateAccount, bank:createAccount
>>
>>
>>
>

Reply via email to