/*
*
*
* Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version
* 2 only, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License version 2 for more details (a copy is
* included at /legal/license.txt).
*
* You should have received a copy of the GNU General Public License
* version 2 along with this work; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
* Clara, CA 95054 or visit www.sun.com if you need additional
* information or have any questions.
*/
package com.sun.j2me.payment;
/**
* A transaction holds the state and information about payment. It's state
* is updated by the associated transaction processor.
* <p>
* There are the following predefined states:
* <ul>
* <li><code>ENTERED</code> - the payment has been initiated by the
* application
* </li>
* <li><code>UPDATE</code> - the transaction should be updated from the
* update URL
* </li>
* <li><code>ASSIGNED</code> - the transaction has been assigned to the
* payment adapter instance associated with the user selected
* provider
* </li>
* <li><code>SUCCESSFUL</code> - the payment has been successfully finished
* </li>
* <li><code>FAILED</code> - the payment failed because of errors
* </li>
* <li><code>REJECTED</code> - the payment has been rejected by the user
* </li>
* <li><code>DISCARDED</code> - the transaction should be silently
* discarded by the payment module
* </li>
* </ul>
* <p>
* The <code>Transaction</code> class can be extended by some adapter specific
* subclass, which can hold more information about payment and can define some
* adapter specific states. For this purpose, there is a special constructor
* which initiates the transaction from the information provided by the
* transaction given as a parameter. There is also defined the
* <code>ADAPTER_SPECIFIC</code> constant, which should be used to number
* adapter specific states (<code>ADAPTER_SPECIFIC</code>,
* <code>ADAPTER_SPECIFIC + 1</code>, <code>ADAPTER_SPECIFIC + 2</code>...).
*
* @version 1.7
*/
public class Transaction {
/** A predefined transaction state. */
public static final int ENTERED = 0;
/** A predefined transaction state. */
public static final int UPDATE = 1;
/** A predefined transaction state. */
public static final int ASSIGNED = 2;
/** A predefined transaction state. */
public static final int SUCCESSFUL = 3;
/** A predefined transaction state. */
public static final int FAILED = 4;
/** A predefined transaction state. */
public static final int REJECTED = 5;
/** A predefined transaction state. */
public static final int DISCARDED = 6;
/** The starting value of adapter specific states. */
protected static final int ADAPTER_SPECIFIC = 0x100;
private int transactionID;
private int featureID;
private String featureTitle;
private String featureDescription;
private byte[] payload;
private TransactionModuleImpl transactionModule;
private String providerName;
private String currency;
private double price;
private String specificPriceInfo;
private int state;
private boolean waiting;
private boolean needsUI;
private TransactionProcessor processor;
/**
* Creates a new instance of <code>Transaction</code>.
*
* @param processor the initial transaction processor responsible for
* processing of this transaction
* @param module the transaction module associated with the transaction
* @param featureID the identifier of the feature to be paid for
* @param featureTitle the title of the feature
* @param featureDescription the description of the feature
* @param payload the payload to be transfered as a part of the payment or
* <code>null</code> if no such payload required
*/
Transaction(TransactionProcessor processor,
TransactionModuleImpl module,
int featureID,
String featureTitle,
String featureDescription,
byte[] payload) {
this.transactionModule = module;
this.featureID = featureID;
this.featureTitle = featureTitle;
this.featureDescription = featureDescription;
this.payload = payload;
this.processor = processor;
this.needsUI = true;
}
/**
* Creates a new instance of <code>Transaction</code> with the fields
* initialized from the given original transaction.
*
* @param templ the original transaction
*/
public Transaction(Transaction templ) {
transactionID = templ.transactionID;
featureID = templ.featureID;
featureTitle = templ.featureTitle;
featureDescription = templ.featureDescription;
payload = templ.payload;
transactionModule = templ.transactionModule;
providerName = templ.providerName;
currency = templ.currency;
price = templ.price;
specificPriceInfo = templ.specificPriceInfo;
state = templ.state;
waiting = templ.waiting;
needsUI = templ.needsUI;
processor = templ.processor;
}
/**
* Returns the title of the feature, which is paid for by this transaction.
*
* @return the title of the feature
*/
public final String getFeatureTitle() {
return featureTitle;
}
/**
* Returns the description of the feature, which is paid for by this
* transaction.
*
* @return the description of the feature
*/
public final String getFeatureDescription() {
return featureDescription;
}
/**
* Returns the payload which is a part of the payment or <code>null</code>
* if it's undefined.
*
* @return the payload or <code>null</code>
*/
public final byte[] getPayload() {
return payload;
}
/**
* Returns the payload which is a part of the payment or <code>null</code>
* if it's undefined.
*
* @return the payload or <code>null</code>
*/
public final String getProviderName() {
return providerName;
}
/**
* Returns the currency of the payment.
*
* @return the currency of the payment
*/
public final String getCurrency() {
return currency;
}
/**
* Returns the price of the feature, which is paid.
*
* @return the price of the feature
*/
public final double getPrice() {
return price;
}
/**
* Returns the provider specific price information associated with
* the paid feature.
*
* @return the provider specific price information
*/
public final String getSpecificPriceInfo() {
return specificPriceInfo;
}
/**
* Sets the transaction processor of the transaction.
*
* @param processor the new transaction processor
*/
public void setTransactionProcessor(TransactionProcessor processor) {
this.processor = processor;
}
/**
* Puts the transaction into or resumes it from the waiting. A transaction
* which is waiting is not processed by the transaction processing thread
* of the payment module (its state doesn't change). A transaction can wait
* for some user response or the end of some adapter specific thread.
*
* @param value if <code>true</code> the transaction is entering the
* waiting, if <code>false</code> the transaction is ending its waiting
*/
public final void setWaiting(boolean value) {
// should be synchronized?
if (waiting == value) {
return;
}
if (waiting) {
waiting = false;
// notify the payment module
PaymentModule.getInstance().continueProcessing();
return;
}
waiting = true;
}
/**
* Indicates if the transaction is waiting for some event.
*
* @return <code>true</code> if the transaction is waiting
*/
public final boolean isWaiting() {
return waiting;
}
/**
* Sets the value which indicates if the transaction needs or will need
* some user response to be finished. Setting this value to
* <code>true</code> can block this or other transactions that also need
* user response from processing (only one such transaction can be
* processed at a time). Initialy this value is set to <code>true</code>
* and is an adapter responsibility to set it to <code>false</code> at the
* right time.
*
* @param value <code>true</code> if the transaction needs or will need
* an user response to be finished
*/
public final void setNeedsUI(boolean value) {
needsUI = value;
}
/**
* Indicates if the transaction needs or will need an user response to be
* finished.
*
* @return <code>true</code> if the transaction needs an user response
*/
public final boolean needsUI() {
return needsUI;
}
/**
* Sets the state of the transaction to the new value.
*
* @param newState the new state
* @see #getState
*/
public final void setState(int newState) {
state = newState;
}
/**
* Returns the current state of the transaction.
*
* @return the current state
* @see #setState
*/
public final int getState() {
return state;
}
/**
* Returns the transaction ID value.
*
* @return the transaction ID
*/
public final int getTransactionID() {
return transactionID;
}
/**
* Returns the id of the paid feature.
*
* @return the feature id
*/
public final int getFeatureID() {
return featureID;
}
/**
* Returns the associated transaction module.
*
* @return the transaction module
*/
public final TransactionModuleImpl getTransactionModule() {
return transactionModule;
}
/**
* Processes the transaction. Delegates the call to the associated
* transaction processor.
*
* @return the fully or partially processed transaction.
*/
final Transaction process() {
return processor.process(this);
}
/**
* Sets the transaction ID for the transaction.
*
* @param value the new transaction ID value
*/
final void setTransactionID(int value) {
transactionID = value;
}
/**
* Sets the name of the selected provider.
*
* @param value the new provider name
*/
final void setProviderName(String value) {
providerName = value;
}
/**
* Sets the currency of the payment.
*
* @param value the currency
*/
final void setCurrency(String value) {
currency = value;
}
/**
* Sets the price of the paid feature.
*
* @param value the price
*/
final void setPrice(double value) {
price = value;
}
/**
* Sets the provider specific price information.
*
* @param value the provider specific price information
*/
final void setSpecificPriceInfo(String value) {
specificPriceInfo = value;
}
}
|