CatalogService.java [src/csip] Revision: 3af6c48ce47c53e489a005b55aebf48251e622b9  Date: Tue Apr 25 21:50:59 MDT 2017
/*
 * $Id$
 *
 * This file is part of the Cloud Services Integration Platform (CSIP),
 * a Model-as-a-Service framework, API and application suite.
 *
 * 2012-2017, Olaf David and others, OMSLab, Colorado State University.
 *
 * OMSLab licenses this file to you under the MIT license.
 * See the LICENSE file in the project root for more information.
 */
package csip;

import csip.utils.JSONUtils;
import csip.utils.Services;
import csip.utils.SimpleCache;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;

import javax.ws.rs.*;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;

/**
 * Catalog service
 *
 * @author wlloyd,od
 */
@Path("")
public class CatalogService {

    static final Logger LOG = Logger.getLogger(CatalogService.class.getName());
    static SimpleCache<Registry, String> cat = new SimpleCache<>();


    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getTextCatalog(@Context HttpServletRequest httpReq) {
        return getJSONCatalog(httpReq);
    }


    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public String getJSONCatalog(@Context HttpServletRequest httpReq) {
        LOG.log(Level.INFO, "HTTP/GET {0}", httpReq.getRequestURL().toString());

        return cat.get(Config.getRegistry(), (Registry r) -> {
            JSONArray o = new JSONArray();
            try {
                String host = Services.toPublicURL(httpReq.getRequestURL().toString()).toString();
                if (!host.endsWith("/")) {
                    host += "/";
                }
                for (Class<?> c : r.getServices()) {
                    JSONObject m = new JSONObject();
                    String url = host + Utils.getServicePath(c);
                    String state = Utils.getServiceState(c);
                    if (state != null) {
                        state = "  (" + state + ")";
                    } else {
                        state = "";
                    }
                    m.put(ModelDataService.KEY_NAME, (Utils.getServiceName(c) != null ? Utils.getServiceName(c) : "") + state);
                    m.put(ModelDataService.KEY_DESC, Utils.getServiceDescription(c) != null ? Utils.getServiceDescription(c) : "");
                    m.put(ModelDataService.KEY_URL, url);
                    o.put(m);
                }
                return o.toString(2).replace("\\/", "/");
            } catch (JSONException ex) {
                o.put(JSONUtils.error(ex.getMessage()));
                LOG.log(Level.SEVERE, null, ex);
            }
            return o.toString().replace("\\/", "/");
        });
    }
}