/*******************************************************************************
* Open Behavioral Health Information Technology Architecture (OBHITA.org)
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the <organization> nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
******************************************************************************/
package gov.samhsa.acs.contexthandler;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.herasaf.xacml.core.SyntaxException;
import org.herasaf.xacml.core.context.RequestMarshaller;
import org.herasaf.xacml.core.context.impl.RequestType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* The Class RequestGenerator.
*/
public class RequestGenerator {
private static final Logger LOGGER = LoggerFactory.getLogger(RequestGenerator.class);
/**
* Generate request.
*
* @param recepientSubjectNPI the recepient subject npi
* @param intermediarySubjectNPI the intermediary subject npi
* @param purposeOfUse the purpose of use
* @param patientId the patient id
* @return the request type
*/
public RequestType generateRequest(String recepientSubjectNPI, String intermediarySubjectNPI, String purposeOfUse, String patientId){
RequestType requestType=null;
String request=generateRequestString (recepientSubjectNPI, intermediarySubjectNPI, purposeOfUse, patientId);
InputStream is =new ByteArrayInputStream(request.getBytes());
try {
// Need call SimplePDPFactory.getSimplePDP() to use RequestMarshaller from herasaf
requestType=unmarshalRequest(is);
} catch (SyntaxException e) {
LOGGER.debug(e.toString(),e);
}
return requestType;
}
RequestType unmarshalRequest(InputStream inputStream) throws SyntaxException{
return RequestMarshaller.unmarshal(inputStream);
}
public String generateRequestString(String recepientSubjectNPI, String intermediarySubjectNPI, String purposeOfUse, String patientId){
String date = getDate();
StringBuilder requestStringBuilder = new StringBuilder();
requestStringBuilder.append("<Request xmlns=\"urn:oasis:names:tc:xacml:2.0:context:schema:os\" ");
requestStringBuilder.append("xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"> <Subject> ");
requestStringBuilder.append("<Attribute AttributeId=\"urn:oasis:names:tc:xacml:1.0:subject-category:recipient-subject\" ");
requestStringBuilder.append("DataType=\"http://www.w3.org/2001/XMLSchema#string\"> ");
requestStringBuilder.append("<AttributeValue>");
requestStringBuilder.append(recepientSubjectNPI);
requestStringBuilder.append("</AttributeValue> </Attribute> ");
requestStringBuilder.append("<Attribute AttributeId=\"urn:oasis:names:tc:xacml:1.0:subject-category:intermediary-subject\" ");
requestStringBuilder.append("DataType=\"http://www.w3.org/2001/XMLSchema#string\"> <AttributeValue>");
requestStringBuilder.append(intermediarySubjectNPI);
requestStringBuilder.append("</AttributeValue> ");
requestStringBuilder.append("</Attribute> <Attribute AttributeId=\"gov.samhsa.consent2share.purpose-of-use-code\" ");
requestStringBuilder.append("DataType=\"http://www.w3.org/2001/XMLSchema#string\"> <AttributeValue>");
requestStringBuilder.append(purposeOfUse);
requestStringBuilder.append("</AttributeValue> ");
requestStringBuilder.append("</Attribute> </Subject> <Resource> ");
requestStringBuilder.append("<Attribute AttributeId=\"urn:oasis:names:tc:xacml:1.0:resource:resource-id\" ");
requestStringBuilder.append("DataType=\"http://www.w3.org/2001/XMLSchema#string\"> ");
requestStringBuilder.append("<AttributeValue>");
requestStringBuilder.append(patientId);
requestStringBuilder.append("</AttributeValue> </Attribute> </Resource> ");
requestStringBuilder.append("<Action> <Attribute AttributeId=\"urn:oasis:names:tc:xacml:1.0:action:action-id\" ");
requestStringBuilder.append("DataType=\"http://www.w3.org/2001/XMLSchema#string\"> <AttributeValue>write</AttributeValue> ");
requestStringBuilder.append("</Attribute> </Action> <Environment> ");
requestStringBuilder.append("<Attribute AttributeId=\"urn:oasis:names:tc:xacml:1.0:environment:current-dateTime\" ");
requestStringBuilder.append("DataType=\"http://www.w3.org/2001/XMLSchema#dateTime\"> ");
requestStringBuilder.append("<AttributeValue>");
requestStringBuilder.append(date);
requestStringBuilder.append("</AttributeValue> </Attribute> </Environment> </Request>");
return requestStringBuilder.toString();
}
/**
* Gets the current date.
*
* @return the date
*/
public String getDate()
{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
return sdf.format(new Date());
}
}