Java Native Interface(2)

プロパティの取得までは比較的簡単だったので、欲張ってデータを取ってきて保存するところまで作っちゃいました。

WmiCall.java

package wmi;

public class WmiCall {

    static {
        System.loadLibrary("jniwmi");
        classinit();
    }

    public WmiCall() {
    }

    private static native void classinit();
    public static native boolean init();
    public static native void term();

    public static native WmiResult access(String query, boolean withValue);
    public static native WmiResult link(String query, boolean withValue);
}

WmiResult.java

package wmi;

import java.util.Vector;

public class WmiResult {
    private String[]    properties;
    private Vector[]    result;

    public WmiResult() {
    }
    
    public int getItems() {
        return properties.length;
    }
    
    public String[] getProperties() {
        return properties;
    }
    
    public String getProperty(int col) {
        return properties[col];
    }
    
    public int getRows() {
        return result.length;
    }
    
    public Vector[] getResults() {
        return result;
    }
    
    public Vector getResultRow(int row) {
        return result[row];
    }
    
    public Object getValue(int row, int col) {
        return result[row].get(col);
    }
    
    public Object getValue(int row, String col) {
        for (int i = 0; i < properties.length; i++) {
            if (col.equalsIgnoreCase(properties[i])) {
                return result[row].get(i);
            }
        }
        return null;
    }
    
    public String print() {
        StringBuffer image = new StringBuffer();
        for (int j = 0; j < result.length; j++) {
            for (int i = 0; i < properties.length; i++) {
                image.append(""+j+"-"+i+" = "+properties[i]+" : "+result[j].get(i)+"\n");
            }
        }
        return image.toString();
    }
}

それからテストプログラムとして、
WmiCallTest.java

package wmi.test;

import wmi.WmiCall;
import wmi.WmiResult;

public class WmiCallTest {
    public WmiCallTest() {
        WmiCall wmi = new WmiCall();
        wmi.init();
        WmiResult op_sys = wmi.access("SELECT * FROM Win32_OperatingSystem", true);
        System.out.println(op_sys.print());

        String drive = (String)op_sys.getValue(0, "SystemDrive");
        WmiResult disk_part = wmi.access("SELECT * FROM Win32_DiskPartition", true);
        for (int row = 0; row < disk_part.getRows(); row++) {
            String part = (String)disk_part.getValue(row, "DeviceID");
            String link_stmt = String.format("Win32_LogicalDiskToPartition.Antecedent=\"Win32_DiskPartition.DeviceID=\\\"%s\\\"\",Dependent=\"Win32_LogicalDisk.DeviceID=\\\"%s\\\"\"", part, drive);
            WmiResult log_disk = wmi.link(link_stmt, true);
            if (log_disk.getItems() > 0) {
                System.out.println(log_disk.print());
                break;
            }
        }
        wmi.term();
    }
    
    public static void main(String[] argv) {
        new WmiCallTest();
    }
}

getValueの部分でStringにキャストしてますが、今の時点では配列とかの取得までは行き着いていないのと、今後のデータ取得でIntegerとかLongも出てくる可能性があるので、戻りデータをObjectにしてます。