/*******************************************************************************
* Copyright 2013 Open mHealth
*
* 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 org.openmhealth.reference.request;
import java.util.Map;
import name.jenkins.paul.john.concordia.Concordia;
import org.openmhealth.reference.data.Registry;
import org.openmhealth.reference.domain.Schema;
import org.openmhealth.reference.exception.NoSuchSchemaException;
import org.openmhealth.reference.exception.OmhException;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* <p>
* Retrieves schemas based on the given parameters. This is analogous to the
* registry.
* </p>
*
* @author John Jenkins
*/
public class SchemaRequest extends Request<Concordia> {
/**
* The specific schema ID being requested.
*/
private final String schemaId;
/**
* The specific schema version being requested.
*/
private final long schemaVersion;
/**
* Creates a new request for a schema.
*
* @param schemaId
* The ID for the schema that is desired.
*
* @param schemaVersion
* The version of the schema that is desired.
*/
public SchemaRequest(
final String schemaId,
final long schemaVersion)
throws OmhException {
// Validate the schema ID.
if(schemaId == null) {
throw new OmhException("The schema ID is missing.");
}
else {
this.schemaId = schemaId;
}
// Store the schema version.
this.schemaVersion = schemaVersion;
}
/*
* (non-Javadoc)
* @see org.openmhealth.reference.request.Request#service()
*/
@Override
public void service() throws OmhException {
// First, short-circuit if this request has already been serviced.
if(isServiced()) {
return;
}
else {
setServiced();
}
// Get the schema.
Schema schema =
Registry.getInstance().getSchema(schemaId, schemaVersion);
// Make sure the schema exists.
if(schema == null) {
throw
new NoSuchSchemaException(
"The schema with id '" +
schemaId +
"' and version '" +
schemaVersion +
"' does not exist.");
}
// Convert the result to a map.
ObjectMapper mapper = new ObjectMapper();
// We need to suppress Java's type erasure. :(
@SuppressWarnings("unchecked")
Map<String, Object> metaData =
mapper.convertValue(schema, Map.class);
// Remove the schema from the meta-data.
metaData.remove(Schema.JSON_KEY_SCHEMA);
// Save the meta-data.
setMetaData(metaData);
// Set the schema itself as the data.
setData(schema.getSchema());
}
}