访问IDL + Java中的变量和参数

时间:2012-11-04 15:03:19

标签: java variables arguments corba idl

我正在调查分布式系统,所以......我必须了解IDL的东西。 :d 我有这个要求:

在IDL中定义 - 作为结构的帐户 - 帐户作为一系列帐户 - 具有一些帐户操作的界面客户: payIn(amount,accountId), - 如果成功则返回true,否则返回false getAccounts(name), - 返回一系列帐户(属于该人) - 具有帐户操作的界面管理员: 创建一个新帐户 删除帐户

这是我的.idl文件:

module AccountNaming
{
    struct Account
    {
        long id;
        double balance;
        string name;    
    };

    typedef sequence<Account> accounts;

    interface Customer
    {
        boolean payIn(in double amount, in long accountId);
        accounts getAccounts(in string name);
        string helloCust();
    };
    interface Administrator
    {
        void createAcc();
        void deleteAcc();
        string helloAdmin();
    };
};

我为IDL生成了所有POA,Helper,Holder类。

在我的Java代码中,我有一个使用IDL代码的类:

import AccountNaming.*;
public class CustomerImpl extends CustomerPOA
{
   public String helloCust()
   {
      return "Hello, dear Customer! :) ";
   }

   @Override
   public boolean payIn(double amount, int accountId)
   {
      // how to get to the Customer's local variables ?
      super.Customer.setAmount... // or something like that, because this doesn't work... etc.
      return false;
   }

   @Override
   public Account[] getAccounts(String name)
   {
      // TODO Auto-generated method stub
      return null;
   }
}    

我知道.idl文件是正确的。 &#34; helloCust / admin&#34;方法工作。我的问题是如何访问客户/管理员的变量,以便我可以在 payIn,getAccounts 方法中将它们设置为参数......

2 个答案:

答案 0 :(得分:3)

您可以添加外观或工厂以允许您访问Customer/Administrator接口,因此在您的IDL中您还可以:

interface UserFactory 
{
   Customer getCustomer(String customerName);
   Administrator getAdministrator(String credentials); 
}

此界面的实现可让您查找数据库等中的任何详细信息。

使用此功能,您可能不需要name中的getAccounts()字段(除非用于过滤),您可以这样做:

Account[] accounts = getAccounts("not-needed-anymore");
for (Account account : accounts) {
   if (account.id == accountId) {
      account.balance += amount;
      break;
   }
}

这将更新您的Account数组信息,但您仍需要保留数据结构。

答案 1 :(得分:-1)

感谢Reimeus的快速回答,但我想到了一个更简单的解决方案:

public boolean payIn(double amount, int accountNumber)
    {
        boolean success = false;
        for(int i = 0; i < accountList.length; i++)
        {
            if(accountList[i].accountNumber == accountNumber)
            {
                accountList[i].balance += amount;
                success = true;
            }
        }
        return success;
    }

    @Override
    public account[] getAccounts(String name)
    {
        account[] accounts;
        int numberOfAccounts = 0;
        int count = 0;
        for(int i = 0; i < accountList.length; i++)
        {
           if(accountList[i] != null)
            if(accountList[i].name.equalsIgnoreCase(name))
            {
                numberOfAccounts++;
            }
        }
        if(numberOfAccounts != 0)
        {
            accounts = new account[numberOfAccounts];
            for(int i = 0; i < accountList.length; i++)
            {
                if(accountList[i].name.equalsIgnoreCase(name))
                {
                    accounts[count] = accountList[i];
                    count++;
                }
            }
            return accounts;
        }
        else
        {
            return null;
        }

    }