创建OSGi服务
编写了以下代码以存储需要签名的表单。 每个要签名的表单都与唯一的guid和客户id相关联。 因此,一个或多个表单可以与同一客户ID关联,但将为表单分配唯一的GUID。
接口
以下是使用的接口声明
package com.aem.forms.signmultipleforms;
import com.adobe.granite.workflow.WorkflowSession;
import com.adobe.granite.workflow.exec.WorkItem;
public interface SignMultipleForms
{
public void insertData(String []formNames,String formData,String serverURL,WorkItem workItem, WorkflowSession workflowSession);
public String getNextFormToSign(int customerID);
public void updateSignatureStatus(String formData,String guid);
public String getFormData(String guid);
}
插入数据
插入数据方法在数据源标识的数据库中插入一行。 数据库中的每一行都对应于一个表单,并由GUID和客户ID唯一标识。 表单数据和表单URL也存储在此行中。 状态列用于指示表单是否已填写和签名。 值为0表示表单尚未签名。
@Override
public void insertData(String[] formNames, String formData, String serverURL, WorkItem workItem, WorkflowSession workflowSession) {
String insertTableSQL = "INSERT INTO aemformstutorial.signingforms(formName,formData,guid,status,customerID) VALUES(?,?,?,?,?)";
Random r = new Random();
Connection con = getConnection();
PreparedStatement pstmt = null;
int customerIDGnerated = r.nextInt((1000 - 1) + 1) + 1;
log.debug("The number of forms to insert are " + formNames.length);
try {
for (int i = 0; i < formNames.length; i++) {
log.debug("Inserting form name " + formNames[i]);
UUID uuid = UUID.randomUUID();
String randomUUIDString = uuid.toString();
String formUrl = serverURL + "/content/dam/formsanddocuments/formsandsigndemo/" + formNames[i] + "/jcr:content?wcmmode=disabled&guid=" + randomUUIDString + "&customerID=" + customerIDGnerated;
pstmt = con.prepareStatement(insertTableSQL);
pstmt.setString(1, formUrl);
pstmt.setString(2, formData.replace("<guid>3938</guid>", "<guid>" + uuid + "</guid>"));
pstmt.setString(3, uuid.toString());
pstmt.setInt(4, 0);
pstmt.setInt(5, customerIDGnerated);
log.debug("customerIDGnerated the insert statment " + pstmt.execute());
if (i == 0) {
WorkflowData wfData = workItem.getWorkflowData();
wfData.getMetaDataMap().put("formURL", formUrl);
workflowSession.updateWorkflowData(workItem.getWorkflow(), wfData);
log.debug("$$$$ Done updating the map");
}
}
con.commit();
}
catch(Exception e) {
log.debug(e.getMessage());
}
finally {
if (pstmt != null) {
try {
pstmt.close();
} catch(SQLException e) {
log.debug(e.getMessage());
}
}
if (con != null) {
try {
con.close();
} catch(SQLException e) {
log.debug(e.getMessage());
}
}
}
}
获取表单数据
以下代码用于获取与给定GUID关联的自适应表单数据。 然后,使用表单数据预填充自适应表单。
@Override
public String getFormData(String guid) {
log.debug("### Getting form data asscoiated with guid " + guid);
Connection con = getConnection();
try {
Statement st = con.createStatement();
String query = "SELECT formData FROM aemformstutorial.signingforms where guid = '" + guid + "'" + "";
log.debug(" The query being consrtucted " + query);
ResultSet rs = st.executeQuery(query);
while (rs.next()) {
return rs.getString("formData");
}
} catch(SQLException e) {
// TODO Auto-generated catch block
log.debug(e.getMessage());
}
return null;
}
更新签名状态
成功完成签字仪式会触发与表单关联的AEM工作流。 工作流中的第一步是流程步骤,它会更新数据库中由guid和客户id标识的行的状态。 我们还将formdata中带符号的元素的值设置为Y,以指示表单已填写并已签名。 自适应表单中会填充此数据,并且会使用xml数据中带符号的数据元素的值来显示相应的消息。 从自定义流程步骤调用updateSignatureStatus代码。
public void updateSignatureStatus(String formData, String guid) {
String updateStatment = "update aemformstutorial.signingforms SET formData = ?, status = ? where guid = ?";
PreparedStatement updatePS = null;
Connection con = getConnection();
try {
updatePS = con.prepareStatement(updateStatment);
updatePS.setString(1, formData.replace("<signed>N</signed>", "<signed>Y</signed>"));
updatePS.setInt(2, 1);
updatePS.setString(3, guid);
log.debug("Updated the signature status " + String.valueOf(updatePS.execute()));
} catch(SQLException e) {
log.debug(e.getMessage());
}
finally {
try {
con.commit();
updatePS.close();
con.close();
} catch(SQLException e) {
log.debug(e.getMessage());
}
}
}
获取下一个要签名的表单
下面的代码用于获取下一个表单,用于对状态为0的给定customerID进行签名。 如果sql查询未返回任何行,我们将返回字符串 "AllDone",这表示对于给定的客户ID没有更多要签名的表单。
@Override
public String getNextFormToSign(int customerID) {
System.out.println("### inside my next form to sign " + customerID);
String selectStatement = "SELECT formName FROM aemformstutorial.signingforms where status = 0 and customerID=" + customerID;
Connection con = getConnection();
try
{
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(selectStatement);
while (rs.next()) {
log.debug("Got result set object");
return rs.getString("formName");
}
if (!rs.next()) {
return "AllDone";
}
} catch(SQLException e) {
log.debug(e.getMessage());
}
finally {
try {
con.close();
} catch(SQLException e) {
// TODO Auto-generated catch block
log.debug(e.getMessage());
}
}
return null;
}
资源
包含上述服务的OSGi捆绑包可以从此处下载
后续步骤
recommendation-more-help
8de24117-1378-413c-a581-01e660b7163e