package org.plutext.client; import java.util.HashMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.docx4j.model.sdt.QueryString; import org.docx4j.wml.ObjectFactory; import org.docx4j.wml.SdtBlock; import org.docx4j.wml.SdtPr; import org.docx4j.wml.Tag; /** * Encapsulates an Sdt. * All ID, version set/get *must* be done through here. * (Reason being that Word arbitrarily resets * ID values, so we can't rely on that field, and * must instead store our ID in the tag field.) * * The equivalent class in plutext-server is called * Rib. * * NB: TransformMove and several other places * do SdtBlockML .getSdtProperties().getIdValue(). * * We'll also need to change that to extract the plutextId * from our tag. * */ public class SdtWrapper { private static Logger log = LoggerFactory.getLogger(SdtWrapper.class); public final static String PLUTEXT_ID ="p:id"; public final static String PLUTEXT_VERSION="p:v"; public SdtWrapper(SdtBlock sdt) { this.sdt = sdt; //plutextId = sdt.getSdtPr().getId().getVal().toString(); HashMap map = QueryString.parseQueryString( sdt.getSdtPr().getTag().getVal() ); plutextId = (String)map.get(PLUTEXT_ID); version = (String)map.get(PLUTEXT_VERSION); } // In TransformAbstract, this is convenient // (ie without an actual sdt) public SdtWrapper() { } // This is what we use to track the chunk // through Word editing sessions. private String plutextId; public String getPlutextId() { return plutextId; } // public void setId(Id plutextId) { // this.id = plutextId.getVal().toString(); // // // and set it in the underlying SDT! // sdt.getSdtPr().setId(plutextId); // } // public void setId(String plutextId) { // this.id = plutextId; // // if (sdt!=null) { // // and set it in the underlying SDT! // sdt.getSdtPr().getId().setVal(java.math.BigInteger.valueOf( Long.valueOf(plutextId) )); // } // } public void setVersionNumber(long versionNumber) { version = Long.toString(versionNumber); ObjectFactory factory = new ObjectFactory(); Tag tag = factory.createTag(); tag.setVal( generateTag(plutextId, version) ); log.debug("Setting tag: "+ tag.getVal() ); sdt.getSdtPr().setTag(tag); } private String version; public String getVersionNumber() { return version; } public Tag getTag() { return sdt.getSdtPr().getTag(); } private SdtBlock sdt; public SdtBlock getSdt() { return sdt; } // Extension function for XSLT, also used above public static String generateTag(String id, String version) { HashMap<String, String> map = new HashMap<String, String>(); map.put(PLUTEXT_ID, id); map.put(PLUTEXT_VERSION, version ); return QueryString.create(map); } public static String getPlutextId(String tag) { HashMap map = QueryString.parseQueryString( tag ); return (String)map.get(PLUTEXT_ID); } public static String getPlutextId(SdtPr sdtPr) { HashMap map = QueryString.parseQueryString( sdtPr.getTag().getVal() ); return (String)map.get(PLUTEXT_ID); } public static String getVersionNumber(SdtPr sdtPr) { HashMap map = QueryString.parseQueryString( sdtPr.getTag().getVal() ); return (String) map.get(PLUTEXT_VERSION); } public static String getVersionNumber(String tag) { HashMap map = QueryString.parseQueryString( tag ); return (String) map.get(PLUTEXT_VERSION); } }