package com.constellio.app.servlet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.constellio.data.utils.AccentApostropheCleaner;
import com.constellio.model.entities.schemas.MetadataSchemaType;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
import com.constellio.app.services.factories.ConstellioFactories;
import com.constellio.model.entities.Language;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataSchema;
import com.constellio.model.services.factories.ModelLayerFactory;
import static com.constellio.data.utils.AccentApostropheCleaner.cleanAll;
public class ConstellioGetSchemaMetadatasServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
executeRequest(request, response);
}
private ModelLayerFactory modelLayerFactory() {
ConstellioFactories constellioFactories = ConstellioFactories.getInstance();
return constellioFactories.getModelLayerFactory();
}
private Element buildElementFromSchema(MetadataSchema schema, String language) {
Element schemaElement = new Element("schema");
schemaElement.setAttribute("code", schema.getCode());
schemaElement.setAttribute("collection", schema.getCollection());
schemaElement.setAttribute("language", language);
schemaElement.setAttribute("search-field", "search_txt_" + language);
schemaElement.setAttribute("label", schema.getLabel(Language.withCode(language)));
for (Metadata metadata : schema.getMetadatas()) {
Element metadataElement = new Element("metadata");
schemaElement.addContent(metadataElement);
metadataElement.setAttribute("code", metadata.getLocalCode());
metadataElement.setAttribute("title", metadata.getLabel(Language.withCode(language)));
metadataElement.setAttribute("multivalue", "" + metadata.isMultivalue());
metadataElement.setAttribute("type", metadata.getType().name());
metadataElement.setAttribute("solr-field", metadata.getDataStoreCode());
metadataElement.setAttribute("label", metadata.getLabel(Language.withCode(language)));
if (metadata.isSearchable()) {
String solrAnalyzedField = metadata.getAnalyzedField(language).getDataStoreCode();
metadataElement.setAttribute("solr-analyzed-field", solrAnalyzedField);
}
}
return schemaElement;
}
private void executeRequest(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
String type = request.getParameter("type");
String label = request.getParameter("label");
String collection = request.getParameter("collection");
String schemaCode = request.getParameter("schema");
String language = modelLayerFactory().getCollectionsListManager().getCollectionLanguages(collection).get(0);
if(type == null) {
executeRequestWithSchemaCode(response, collection, schemaCode, language);
}
else {
executeRequestWithType(response, collection, type, label, language);
}
}
private void executeRequestWithSchemaCode(HttpServletResponse response, String collection, String schemaCode, String language)
throws IOException, ServletException {
MetadataSchema schema = modelLayerFactory().getMetadataSchemasManager().getSchemaTypes(collection).getSchema(schemaCode);
Document document = new Document().addContent(buildElementFromSchema(schema, language));
outputDocument(response, document);
}
private void executeRequestWithType(HttpServletResponse response, String collection, String type, String label, String language)
throws IOException, ServletException {
List<MetadataSchema> schemaList = new ArrayList<>();
Document document = new Document();
Element rootElement = new Element("collection");
rootElement.setAttribute("code", collection);
document.addContent(rootElement);
if(type.equals("ddv")) {
for(MetadataSchemaType schemaType: modelLayerFactory().getMetadataSchemasManager().getSchemaTypes(collection).getSchemaTypes()) {
if(schemaType.getCode().contains("ddv")) {
schemaList.addAll(schemaType.getAllSchemas());
}
}
}
else {
for(MetadataSchemaType schemaType: modelLayerFactory().getMetadataSchemasManager().getSchemaTypes(collection).getSchemaTypes()) {
if(cleanAll(schemaType.getCode()).equals(cleanAll(type))) {
schemaList.addAll(schemaType.getAllSchemas());
}
}
}
if(label == null) {
for(MetadataSchema schema: schemaList) {
rootElement.addContent(buildElementFromSchema(schema, language));
}
}
else {
for(MetadataSchema schema: schemaList) {
if(cleanAll(schema.getLabel(Language.withCode(language))).equals(cleanAll(label))) {
rootElement.addContent(buildElementFromSchema(schema, language));
break;
}
}
}
outputDocument(response, document);
}
private void outputDocument(HttpServletResponse response, Document document)
throws IOException, ServletException {
XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
outputter.getFormat().setEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
outputter.output(document, response.getWriter());
}
}