hbase-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Federico Gaule (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (HBASE-8930) Filter evaluates KVs outside requested columns
Date Thu, 11 Jul 2013 21:35:49 GMT

     [ https://issues.apache.org/jira/browse/HBASE-8930?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Federico Gaule updated HBASE-8930:
----------------------------------

    Description: 
1- Fill row with some columns
2- Get row with some columns less than universe - Use filter to print kvs
3- Filter prints not requested columns

<code>

public class ExtraColumnTest {

    @Test
    public void testFilter() throws Exception {

        Configuration config = HBaseConfiguration.create();
        config.set("hbase.zookeeper.quorum", "fgaule-despegar");

        HTable hTable = new HTable(config, "availability");
        byte[] cf = new AvailabilityColumnFamilyConverter().objectToByteArray(new AvailabilityColumnFamily('H',
            AvailabilityColumnFamilyType.SEARCH));
        AvailabilityRowKey availabilityRowKey = AvailabilityRowKeyBuilder.create().setCityOID(6846).setContractOID(15642)
            .setHotelOID(351802).setRoomTypeOID(41048).build();
        byte[] row = new AvailabilityRowKeyByteConverter().objectToByteArray(availabilityRowKey);


        byte[] col1 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
558,
            AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS));
        byte[] col2 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
559,
            AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS));
        byte[] col3 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
560,
            AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS));
        byte[] col4 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
561,
            AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS));
        byte[] col5 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
562,
            AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS));
        byte[] col6 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
563,
            AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS));


        byte[] col1g = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
558,
            AvailabilityQualifierType.GUARANTEE_ALLOTMENT));
        byte[] col2g = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
559,
            AvailabilityQualifierType.GUARANTEE_ALLOTMENT));

        byte[] col1v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
558,
            AvailabilityQualifierType.VARIABLE_ALLOTMENT));
        byte[] col2v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
559,
            AvailabilityQualifierType.VARIABLE_ALLOTMENT));
        byte[] col3v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
560,
            AvailabilityQualifierType.VARIABLE_ALLOTMENT));
        byte[] col4v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
561,
            AvailabilityQualifierType.VARIABLE_ALLOTMENT));
        byte[] col5v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
562,
            AvailabilityQualifierType.VARIABLE_ALLOTMENT));
        byte[] col6v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
563,
            AvailabilityQualifierType.VARIABLE_ALLOTMENT));


        new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
558,
            AvailabilityQualifierType.MINIMUM_RELEASE_DAYS));

        Put put = new Put(row);
        put.add(cf, col1, Bytes.toBytes((short) 1));
        put.add(cf, col2, Bytes.toBytes((short) 1));
        put.add(cf, col3, Bytes.toBytes((short) 3));
        put.add(cf, col4, Bytes.toBytes((short) 3));
        put.add(cf, col5, Bytes.toBytes((short) 3));
        put.add(cf, col6, Bytes.toBytes((short) 3));
        hTable.put(put);

        put = new Put(row);
        put.add(cf, col1v, Bytes.toBytes((short) 10));
        put.add(cf, col2v, Bytes.toBytes((short) 10));
        put.add(cf, col3v, Bytes.toBytes((short) 10));
        put.add(cf, col4v, Bytes.toBytes((short) 10));
        put.add(cf, col5v, Bytes.toBytes((short) 10));
        put.add(cf, col6v, Bytes.toBytes((short) 10));

        hTable.put(put);

        hTable.flushCommits();

        Filter releaseDayAvailabilityFilter = new AllwaysNextColFilter();

        Get get = new Get(row);
        get.addColumn(cf, col1);
        get.addColumn(cf, col2);
        get.addColumn(cf, col1v);
        get.addColumn(cf, col2v);
        get.addColumn(cf, col1g);
        get.addColumn(cf, col2g);
        get.setFilter(releaseDayAvailabilityFilter);
        get.setMaxVersions(1);
        System.out.println(get);


        Scan scan = new Scan(get);

        ResultScanner scanner = hTable.getScanner(scan);
        Iterator<Result> iterator = scanner.iterator();

        System.out.println("SCAN");
        while (iterator.hasNext()) {
            Result next = iterator.next();
            for (KeyValue kv : next.list()) {
                System.out.println(new AvailabilityQualifierConverter().byteArrayToObject(kv.getQualifier()));
            }
        }
    }

}

</code>


<sysout.filter>
\x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x02.\x01/1373577819267/Put/vlen=2/ts=2
AvailabilityQualifier{date=558, type=MINIMUM_RESERVATION_DAYS}
\x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x02.\x02/1373577819272/Put/vlen=2/ts=3
AvailabilityQualifier{date=558, type=VARIABLE_ALLOTMENT}
\x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x02/\x01/1373577819267/Put/vlen=2/ts=2
AvailabilityQualifier{date=559, type=MINIMUM_RESERVATION_DAYS}
\x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x02/\x02/1373577819272/Put/vlen=2/ts=3
AvailabilityQualifier{date=559, type=VARIABLE_ALLOTMENT}
 
*\x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x020\x01/1373577819267/Put/vlen=2/ts=2*
*AvailabilityQualifier{date=560, type=MINIMUM_RESERVATION_DAYS}* 
</sysout.filter>

<sysout.test>
{"timeRange":[0,9223372036854775807],"totalColumns":6,"cacheBlocks":true,"families":{"H0":["\\x02.\\x01","\\x02.\\x02","\\x02.\\x06","\\x02/\\x01"]},"maxVersions":1,"filter":"AllwaysNextColFilter","row":"\\x00\\x00\\x1A\\xBE\\x00\\x05^:\\x00\\x00\\xA0X\\x00\\x00=\\x1A"}
SCAN
AvailabilityQualifier{date=558, type=MINIMUM_RESERVATION_DAYS}
AvailabilityQualifier{date=558, type=VARIABLE_ALLOTMENT}
AvailabilityQualifier{date=559, type=MINIMUM_RESERVATION_DAYS}
AvailabilityQualifier{date=559, type=VARIABLE_ALLOTMENT}
</sysout.test>

  was:
1- Fill row with some columns
2- Get row with some columns less than universe - Use filter to print kvs
3- Filter prints not requested columns

<code>

public class ExtraColumnTest {

    @Test
    public void testFilter() throws Exception {

        Configuration config = HBaseConfiguration.create();
        config.set("hbase.zookeeper.quorum", "fgaule-despegar");

        HTable hTable = new HTable(config, "availability");
        byte[] cf = new AvailabilityColumnFamilyConverter().objectToByteArray(new AvailabilityColumnFamily('H',
            AvailabilityColumnFamilyType.SEARCH));
        AvailabilityRowKey availabilityRowKey = AvailabilityRowKeyBuilder.create().setCityOID(6846).setContractOID(15642)
            .setHotelOID(351802).setRoomTypeOID(41048).build();
        byte[] row = new AvailabilityRowKeyByteConverter().objectToByteArray(availabilityRowKey);


        byte[] col1 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
558,
            AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS));
        byte[] col2 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
559,
            AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS));
        byte[] col3 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
560,
            AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS));
        byte[] col4 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
561,
            AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS));
        byte[] col5 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
562,
            AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS));
        byte[] col6 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
563,
            AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS));


        byte[] col1g = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
558,
            AvailabilityQualifierType.GUARANTEE_ALLOTMENT));
        byte[] col2g = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
559,
            AvailabilityQualifierType.GUARANTEE_ALLOTMENT));

        byte[] col1v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
558,
            AvailabilityQualifierType.VARIABLE_ALLOTMENT));
        byte[] col2v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
559,
            AvailabilityQualifierType.VARIABLE_ALLOTMENT));
        byte[] col3v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
560,
            AvailabilityQualifierType.VARIABLE_ALLOTMENT));
        byte[] col4v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
561,
            AvailabilityQualifierType.VARIABLE_ALLOTMENT));
        byte[] col5v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
562,
            AvailabilityQualifierType.VARIABLE_ALLOTMENT));
        byte[] col6v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
563,
            AvailabilityQualifierType.VARIABLE_ALLOTMENT));


        new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
558,
            AvailabilityQualifierType.MINIMUM_RELEASE_DAYS));

        Put put = new Put(row);
        put.add(cf, col1, Bytes.toBytes((short) 1));
        put.add(cf, col2, Bytes.toBytes((short) 1));
        put.add(cf, col3, Bytes.toBytes((short) 3));
        put.add(cf, col4, Bytes.toBytes((short) 3));
        put.add(cf, col5, Bytes.toBytes((short) 3));
        put.add(cf, col6, Bytes.toBytes((short) 3));
        hTable.put(put);

        put = new Put(row);
        put.add(cf, col1v, Bytes.toBytes((short) 10));
        put.add(cf, col2v, Bytes.toBytes((short) 10));
        put.add(cf, col3v, Bytes.toBytes((short) 10));
        put.add(cf, col4v, Bytes.toBytes((short) 10));
        put.add(cf, col5v, Bytes.toBytes((short) 10));
        put.add(cf, col6v, Bytes.toBytes((short) 10));

        hTable.put(put);

        hTable.flushCommits();

        Filter releaseDayAvailabilityFilter = new AllwaysNextColFilter();

        Get get = new Get(row);
        get.addColumn(cf, col1);
        get.addColumn(cf, col2);
        get.addColumn(cf, col1v);
        get.addColumn(cf, col2v);
        get.addColumn(cf, col1g);
        get.addColumn(cf, col2g);
        get.setFilter(releaseDayAvailabilityFilter);
        get.setMaxVersions(1);
        System.out.println(get);


        Scan scan = new Scan(get);

        ResultScanner scanner = hTable.getScanner(scan);
        Iterator<Result> iterator = scanner.iterator();

        System.out.println("SCAN");
        while (iterator.hasNext()) {
            Result next = iterator.next();
            for (KeyValue kv : next.list()) {
                System.out.println(new AvailabilityQualifierConverter().byteArrayToObject(kv.getQualifier()));
            }
        }
    }

}

</code>


<sysout.filter>
bq. \x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x02.\x01/1373577819267/Put/vlen=2/ts=2
bq. AvailabilityQualifier{date=558, type=MINIMUM_RESERVATION_DAYS}
bq. \x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x02.\x02/1373577819272/Put/vlen=2/ts=3
bq. AvailabilityQualifier{date=558, type=VARIABLE_ALLOTMENT}
bq. \x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x02/\x01/1373577819267/Put/vlen=2/ts=2
bq. AvailabilityQualifier{date=559, type=MINIMUM_RESERVATION_DAYS}
bq. \x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x02/\x02/1373577819272/Put/vlen=2/ts=3
bq. AvailabilityQualifier{date=559, type=VARIABLE_ALLOTMENT}
bq. 
bq. *\x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x020\x01/1373577819267/Put/vlen=2/ts=2*
bq. *AvailabilityQualifier{date=560, type=MINIMUM_RESERVATION_DAYS}*
</sysout.filter>


<sysout.test>
{"timeRange":[0,9223372036854775807],"totalColumns":6,"cacheBlocks":true,"families":{"H0":["\\x02.\\x01","\\x02.\\x02","\\x02.\\x06","\\x02/\\x01"]},"maxVersions":1,"filter":"AllwaysNextColFilter","row":"\\x00\\x00\\x1A\\xBE\\x00\\x05^:\\x00\\x00\\xA0X\\x00\\x00=\\x1A"}
SCAN
AvailabilityQualifier{date=558, type=MINIMUM_RESERVATION_DAYS}
AvailabilityQualifier{date=558, type=VARIABLE_ALLOTMENT}
AvailabilityQualifier{date=559, type=MINIMUM_RESERVATION_DAYS}
AvailabilityQualifier{date=559, type=VARIABLE_ALLOTMENT}
</sysout.test>

    
> Filter evaluates KVs outside requested columns
> ----------------------------------------------
>
>                 Key: HBASE-8930
>                 URL: https://issues.apache.org/jira/browse/HBASE-8930
>             Project: HBase
>          Issue Type: Bug
>          Components: Filters
>    Affects Versions: 0.94.7
>            Reporter: Federico Gaule
>            Priority: Critical
>
> 1- Fill row with some columns
> 2- Get row with some columns less than universe - Use filter to print kvs
> 3- Filter prints not requested columns
> <code>
> public class ExtraColumnTest {
>     @Test
>     public void testFilter() throws Exception {
>         Configuration config = HBaseConfiguration.create();
>         config.set("hbase.zookeeper.quorum", "fgaule-despegar");
>         HTable hTable = new HTable(config, "availability");
>         byte[] cf = new AvailabilityColumnFamilyConverter().objectToByteArray(new AvailabilityColumnFamily('H',
>             AvailabilityColumnFamilyType.SEARCH));
>         AvailabilityRowKey availabilityRowKey = AvailabilityRowKeyBuilder.create().setCityOID(6846).setContractOID(15642)
>             .setHotelOID(351802).setRoomTypeOID(41048).build();
>         byte[] row = new AvailabilityRowKeyByteConverter().objectToByteArray(availabilityRowKey);
>         byte[] col1 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
558,
>             AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS));
>         byte[] col2 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
559,
>             AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS));
>         byte[] col3 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
560,
>             AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS));
>         byte[] col4 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
561,
>             AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS));
>         byte[] col5 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
562,
>             AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS));
>         byte[] col6 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
563,
>             AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS));
>         byte[] col1g = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
558,
>             AvailabilityQualifierType.GUARANTEE_ALLOTMENT));
>         byte[] col2g = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
559,
>             AvailabilityQualifierType.GUARANTEE_ALLOTMENT));
>         byte[] col1v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
558,
>             AvailabilityQualifierType.VARIABLE_ALLOTMENT));
>         byte[] col2v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
559,
>             AvailabilityQualifierType.VARIABLE_ALLOTMENT));
>         byte[] col3v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
560,
>             AvailabilityQualifierType.VARIABLE_ALLOTMENT));
>         byte[] col4v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
561,
>             AvailabilityQualifierType.VARIABLE_ALLOTMENT));
>         byte[] col5v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
562,
>             AvailabilityQualifierType.VARIABLE_ALLOTMENT));
>         byte[] col6v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
563,
>             AvailabilityQualifierType.VARIABLE_ALLOTMENT));
>         new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short)
558,
>             AvailabilityQualifierType.MINIMUM_RELEASE_DAYS));
>         Put put = new Put(row);
>         put.add(cf, col1, Bytes.toBytes((short) 1));
>         put.add(cf, col2, Bytes.toBytes((short) 1));
>         put.add(cf, col3, Bytes.toBytes((short) 3));
>         put.add(cf, col4, Bytes.toBytes((short) 3));
>         put.add(cf, col5, Bytes.toBytes((short) 3));
>         put.add(cf, col6, Bytes.toBytes((short) 3));
>         hTable.put(put);
>         put = new Put(row);
>         put.add(cf, col1v, Bytes.toBytes((short) 10));
>         put.add(cf, col2v, Bytes.toBytes((short) 10));
>         put.add(cf, col3v, Bytes.toBytes((short) 10));
>         put.add(cf, col4v, Bytes.toBytes((short) 10));
>         put.add(cf, col5v, Bytes.toBytes((short) 10));
>         put.add(cf, col6v, Bytes.toBytes((short) 10));
>         hTable.put(put);
>         hTable.flushCommits();
>         Filter releaseDayAvailabilityFilter = new AllwaysNextColFilter();
>         Get get = new Get(row);
>         get.addColumn(cf, col1);
>         get.addColumn(cf, col2);
>         get.addColumn(cf, col1v);
>         get.addColumn(cf, col2v);
>         get.addColumn(cf, col1g);
>         get.addColumn(cf, col2g);
>         get.setFilter(releaseDayAvailabilityFilter);
>         get.setMaxVersions(1);
>         System.out.println(get);
>         Scan scan = new Scan(get);
>         ResultScanner scanner = hTable.getScanner(scan);
>         Iterator<Result> iterator = scanner.iterator();
>         System.out.println("SCAN");
>         while (iterator.hasNext()) {
>             Result next = iterator.next();
>             for (KeyValue kv : next.list()) {
>                 System.out.println(new AvailabilityQualifierConverter().byteArrayToObject(kv.getQualifier()));
>             }
>         }
>     }
> }
> </code>
> <sysout.filter>
> \x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x02.\x01/1373577819267/Put/vlen=2/ts=2
> AvailabilityQualifier{date=558, type=MINIMUM_RESERVATION_DAYS}
> \x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x02.\x02/1373577819272/Put/vlen=2/ts=3
> AvailabilityQualifier{date=558, type=VARIABLE_ALLOTMENT}
> \x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x02/\x01/1373577819267/Put/vlen=2/ts=2
> AvailabilityQualifier{date=559, type=MINIMUM_RESERVATION_DAYS}
> \x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x02/\x02/1373577819272/Put/vlen=2/ts=3
> AvailabilityQualifier{date=559, type=VARIABLE_ALLOTMENT}
>  
> *\x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x020\x01/1373577819267/Put/vlen=2/ts=2*
> *AvailabilityQualifier{date=560, type=MINIMUM_RESERVATION_DAYS}* 
> </sysout.filter>
> <sysout.test>
> {"timeRange":[0,9223372036854775807],"totalColumns":6,"cacheBlocks":true,"families":{"H0":["\\x02.\\x01","\\x02.\\x02","\\x02.\\x06","\\x02/\\x01"]},"maxVersions":1,"filter":"AllwaysNextColFilter","row":"\\x00\\x00\\x1A\\xBE\\x00\\x05^:\\x00\\x00\\xA0X\\x00\\x00=\\x1A"}
> SCAN
> AvailabilityQualifier{date=558, type=MINIMUM_RESERVATION_DAYS}
> AvailabilityQualifier{date=558, type=VARIABLE_ALLOTMENT}
> AvailabilityQualifier{date=559, type=MINIMUM_RESERVATION_DAYS}
> AvailabilityQualifier{date=559, type=VARIABLE_ALLOTMENT}
> </sysout.test>

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Mime
View raw message