/**
 * Copyright (C) 2012 ArtiVisi Intermedia <info@artivisi.com>
 *
 * Licensed 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.
 */
package com.artivisi.iso8583;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;

public class Message {
    private static final Logger LOGGER = LoggerFactory.getLogger(Message.class);
    private String mti;
    private BigInteger primaryBitmap;
    private BigInteger secondaryBitmap;
    private Map<Integer, String> dataElementContent = new HashMap<Integer, String>();

    public void calculateBitmap(){
        LOGGER.debug("Number of active Data Element [{}]", dataElementContent.size());
        BigInteger bitmap = BigInteger.ZERO.setBit(128);
        for(Integer de : dataElementContent.keySet()){
            LOGGER.debug("Set active flag for Data Element [{}]", de);
            if(de > 64){
                bitmap = bitmap.setBit(128 - 1);
            }
            bitmap = bitmap.setBit(128 - de);
        }
        LOGGER.debug("Final bitmap bin : [{}]", bitmap.toString(2).substring(1));
        LOGGER.debug("Final bitmap hex : [{}]", bitmap.toString(16).substring(1));
        setPrimaryBitmapStream(StringUtils.rightPad(bitmap.toString(16).substring(1,16), 16, "0"));
        if(bitmap.testBit(128 - 1)) {
            setSecondaryBitmapStream(StringUtils.rightPad(bitmap.toString(16).substring(17), 16, "0"));
        }
    }

    public Boolean isDataElementPresent(int bit){
        if(bit < 1) {
            return false;
        }

        if(bit < 65) {
            return primaryBitmap.testBit(64 - bit);
        }

        if(secondaryBitmap == null) {
            return false;
        }

        return secondaryBitmap.testBit(128 - bit);
    }

    public String getPrimaryBitmapStream(){
        if(primaryBitmap == null){
            return null;
        }
        return StringUtils.leftPad(primaryBitmap.toString(16).toUpperCase(), 16, "0");
    }

    public String getSecondaryBitmapStream(){
        if(secondaryBitmap == null || BigInteger.ZERO.equals(secondaryBitmap)){
            return "";
        }
        return StringUtils.leftPad(secondaryBitmap.toString(16).toUpperCase(), 16, "0");
    }

    public void setPrimaryBitmapStream(String bitmap){
        this.primaryBitmap = new BigInteger(bitmap, 16);
    }

    public void setSecondaryBitmapStream(String bitmap){
        this.secondaryBitmap = new BigInteger(bitmap, 16);
    }

    public String getMti() {
        return mti;
    }

    public void setMti(String mti) {
        this.mti = mti;
    }

    public BigInteger getPrimaryBitmap() {
        return primaryBitmap;
    }

    public void setPrimaryBitmap(BigInteger primaryBitmap) {
        this.primaryBitmap = primaryBitmap;
    }

    public BigInteger getSecondaryBitmap() {
        return secondaryBitmap;
    }

    public void setSecondaryBitmap(BigInteger secondaryBitmap) {
        this.secondaryBitmap = secondaryBitmap;
    }

    public Map<Integer, String> getDataElementContent() {
        return dataElementContent;
    }

    public void setDataElementContent(Map<Integer, String> dataElementContent) {
        this.dataElementContent = dataElementContent;
    }
}

@@ -1129,16 +1129,258 @@
 ng%3E();%0A%0A
+    public Message createCopy()%7B%0A        Message hasil = new Message();%0A        hasil.setMti(this.mti);%0A        hasil.getDataElementContent().putAll(this.getDataElementContent());%0A        hasil.calculateBitmap();%0A        return hasil;%0A    %7D%0A%0A
     publ

add fitur create copy