Ok, I see how I can do it using both.  All of the filter specific logic 
stays in the filter, and I basically moved the purging part into a class 
that extends ApiListingResource; I've included that code here below because 
I'm having an issue with it.

The problem is that I'm having a compiler issue on the highlighted portion. 
 I'm receiving this error:

*The method process(Application, ServletContext, ServletConfig, 
> HttpHeaders, UriInfo) from the type BaseApiListingResource is not visible*


I realize this might just be a Java question, rather than Swagger related, 
but I figured I'd post it here anyway.  The part I don't understand is why 
I can reference getListingJsonResponse from within getListing just fine 
when it has the exact same visibility as process.  I tried accessing process 
from 
within getListing as well, but I get the same error.  What am I missing 
here?

I'm soooo close...
 
import static org.apache.commons.collections.CollectionUtils.isEmpty;
import static org.apache.commons.collections.CollectionUtils.isNotEmpty;
import static org.apache.commons.lang3.StringUtils.isNotBlank;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.ws.rs.GET;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import io.swagger.annotations.ApiOperation;
import io.swagger.jaxrs.listing.ApiListingResource;
import io.swagger.models.Swagger;
import io.swagger.models.Tag;
import io.swagger.models.Operation;
import io.swagger.models.Path;
import io.swagger.util.Json;

@javax.ws.rs.Path("/internal/swagger/{type:json|yaml}")
public class SwaggerTagFilterResourceExample extends ApiListingResource {

private static final Logger logger = 
LoggerFactory.getLogger(SwaggerTagFilterResourceExample.class); 
 private static final String TAG_NAME_ADMIN1 = "Bob";
 private static final String TAG_NAME_ADMIN2 = "Carl";
 private static final String TAG_NAME_ADMIN3 = "Frank";
 private static final String TAG_NAME_ADMIN4 = "Steve";
 
 private static final Set<String> TAG_NAME_SET = new HashSet<String>(); 
 static {
 TAG_NAME_SET.add(TAG_NAME_ADMIN1);
 TAG_NAME_SET.add(TAG_NAME_ADMIN2);
 TAG_NAME_SET.add(TAG_NAME_ADMIN3);
 TAG_NAME_SET.add(TAG_NAME_ADMIN4);
 }
@Context
   ServletContext context;

   @GET
   @Produces({MediaType.APPLICATION_JSON, "application/yaml"})
   @ApiOperation(value = "The swagger definition in either JSON or YAML", 
    hidden = true)
   public Response getListing(@Context Application app, @Context 
ServletConfig servletConfig, @Context HttpHeaders headers,
           @Context UriInfo uriInfo, @PathParam("type") String type) {
    
       if (isNotBlank(type) && type.trim().equalsIgnoreCase("yaml")) {
        
        logger.debug("Creating Swagger YAML...");
        
           return getListingYamlResponse(app, context, servletConfig, 
headers, uriInfo);
           
       } else {
        
        logger.debug("Creating Swagger JSON...");
        
           return getListingJsonResponse(app, context, servletConfig, 
headers, uriInfo);
       }
   }
   
   protected Response getListingJsonResponse(
           Application app,
           ServletContext servletContext,
           ServletConfig servletConfig,
           HttpHeaders headers,
           UriInfo uriInfo) {
    
       Swagger swagger = process(app, servletContext, servletConfig, 
headers, uriInfo);

    MultivaluedMap<String, String> queryParamMultivaluedMap = 
uriInfo.getQueryParameters();
    List<Tag> tagList = swagger.getTags();
    Map<String, Path> pathMap = swagger.getPaths();
    List<Tag> newTagList = new ArrayList<Tag>();
    List<String> newStringTagList = new ArrayList<String>();
    
    for (MultivaluedMap.Entry<String, List<String>> entry : 
queryParamMultivaluedMap.entrySet()) {
    
    if (entry.getKey().equalsIgnoreCase("names") && 
isNotEmpty(entry.getValue())) {
    
// remove all name tags from the top level Swagger object that are not in 
the names query parameter list
    swagger.setTags(purgeUnrequestedNameTags(entry.getValue(), tagList));
    
    // remove all name tags from each Operation object that are not in the 
names query parameter list
    for (Path path : pathMap.values()) {
    
    List<Operation> operationList = path.getOperations();
    
    for (Operation operation : operationList) {
    
    newTagList = purgeUnrequestedNameTags(entry.getValue(), tagList);
    
    for (Tag tag : newTagList) {
    
    newStringTagList.add(tag.getName());
    }
    
    operation.setTags(newStringTagList);
    }
    }
    } 
    }
       
       if (swagger != null) {
           return 
Response.ok().entity(Json.mapper().writeValueAsString(swagger)).type(MediaType.APPLICATION_JSON_TYPE).build();
       } else {
           return Response.status(404).build();
       }
   }
    
/**
* Returns a purged list of name tags based upon the master set of name tags 
while
* leaving non-name tags untouched.
* 
* @param nameParamList
* @param tagValueList
* @return
*/
private List<Tag> purgeUnrequestedNameTags(List<String> nameParamList, 
List<Tag> tagValueList) {

List<Tag> cleanNameTagValueList = new ArrayList<Tag>();
try {
if (isEmpty(nameParamList)) {
cleanNameTagValueList = tagValueList;
} else { 
for (Tag tag : tagValueList) {
// keep the name if it was passed in as a parameter (in the nameParamList),
// but if it is a name tag and was NOT passed in then don't keep it; this 
also
// makes sure that any non-name tags are also kept
if (nameParamList.contains(tag.getName()) || 
!TAG_NAME_SET.contains(tag.getName())) {
cleanNameTagValueList.add(tag);
}
}
}
   } catch (Exception e) {
   logger.error("Var - cleanNameTagValueList: {}", cleanNameTagValueList);
   logger.error("Exception occurred while purging erroneous name tags: {}", 
e);
   logger.error("Continuing flow...");
   }
logger.debug("--Exiting--");
return cleanNameTagValueList;
}
}

Thanks!

On Wednesday, June 21, 2017 at 4:35:21 PM UTC-4, Ron wrote:
>
> Possibly both, it depends on your logic.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Swagger" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to swagger-swaggersocket+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to