/* * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * WSO2 Inc. licenses this file to you 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.wso2.carbon.governance.rest.api.internal; import com.google.gson.stream.JsonReader; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.governance.api.common.dataobjects.GovernanceArtifact; import org.wso2.carbon.governance.api.exception.GovernanceException; import org.wso2.carbon.governance.api.generic.GenericArtifactManager; import org.wso2.carbon.governance.api.generic.dataobjects.GenericArtifact; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response; import javax.ws.rs.ext.MessageBodyReader; import javax.xml.namespace.QName; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.lang.annotation.Annotation; import java.lang.reflect.Type; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; public class GenericArtifactMessageBodyReader extends JSONMessageBodyReader implements MessageBodyReader<GovernanceArtifact> { private final Log log = LogFactory.getLog(GenericArtifactMessageBodyReader.class); private static final String OVERVIEW_PREFIX = "overview_"; private static final String UNBOUNDED_SUFFIX = "unbounded"; private static final String RXT_SEPARATOR = "_"; private static final String ATTR_NAME = "name"; private static final String ATTR_TYPE = "type"; private static final String UTF_8 = "UTF-8"; @Override public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { if (GenericArtifact.class.getName().equals(type.getName()) || GovernanceArtifact.class.getName(). equals(type.getName())) { if (MediaType.APPLICATION_JSON_TYPE.equals(mediaType) || MediaType.APPLICATION_XML_TYPE.equals(mediaType)) { return true; } } return false; } @Override public GovernanceArtifact readFrom(Class<GovernanceArtifact> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream) throws IOException, WebApplicationException { JsonReader reader = new JsonReader(new InputStreamReader(entityStream, UTF_8)); Map<String, Object> map = new HashMap<>(); reader.setLenient(true); handleJSON(reader, map); try { return createGenericArtifact(map); } catch (GovernanceException e) { log.error(e); throw new WebApplicationException(Response.Status.BAD_REQUEST); } } private GovernanceArtifact createGenericArtifact(Map<String, Object> map) throws GovernanceException { String name = (String) map.get(ATTR_NAME); String type = (String) map.get(ATTR_TYPE); if (name != null && !name.isEmpty() && type != null && !type.isEmpty()) { GovernanceArtifact artifact = GenericArtifactManager.newDetachedGovernanceArtifact(new QName(name), type); for (Map.Entry<String, Object> entry : map.entrySet()) { String key = entry.getKey(); if (key.endsWith(UNBOUNDED_SUFFIX)) { key = key.substring(0, key.indexOf(UNBOUNDED_SUFFIX)); } if (!key.contains(RXT_SEPARATOR)) { key = OVERVIEW_PREFIX.concat(key); } /* * Fix for REGISTRY-3613 * Enabling multiple values with the same key to be added as attributes in order to save * unbounded elements such as endpoints. */ Object value = entry.getValue(); if (value instanceof String) { artifact.addAttribute(key, String.valueOf(value)); } else if (value instanceof Map) { //if value is a json array with multiple values Map<?,?> arrayMap = (Map) value; for (Map.Entry arrayEntry : arrayMap.entrySet()) { String tempKey = key.concat((String) arrayEntry.getKey()); List arrayValues = (List) arrayEntry.getValue(); for (Object val : arrayValues) { artifact.addAttribute(tempKey, String.valueOf(val)); } } } } return artifact; } throw new GovernanceException("Can't create GenericArtifact from source"); } }