/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.api.core.rest; import com.google.common.base.Function; import com.google.common.collect.FluentIterable; import org.eclipse.che.api.core.ServerException; import org.eclipse.che.api.core.rest.annotations.OPTIONS; import org.eclipse.che.api.core.rest.shared.dto.ApiInfo; import org.eclipse.che.commons.annotation.Nullable; import org.eclipse.che.dto.server.DtoFactory; import org.everrest.core.ObjectFactory; import org.everrest.core.ResourceBinder; import org.everrest.core.resource.ResourceDescriptor; import org.everrest.services.RestServicesList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.inject.Singleton; import javax.servlet.ServletContext; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import java.io.File; import java.net.URL; import java.util.jar.Attributes; import java.util.jar.JarFile; import java.util.jar.Manifest; import static java.util.Objects.requireNonNull; /** * @author andrew00x */ @Path("/") @Singleton public class ApiInfoService { private static final Logger LOG = LoggerFactory.getLogger(ApiInfoService.class); private volatile ApiInfo apiInfo; @OPTIONS public ApiInfo info() throws ServerException { ApiInfo myApiInfo = apiInfo; if (myApiInfo == null) { apiInfo = myApiInfo = readApiInfo(); } return myApiInfo; } private ApiInfo readApiInfo() throws ServerException { try { URL url = ApiInfoService.class.getProtectionDomain().getCodeSource().getLocation(); try (JarFile jar = new JarFile(new File(url.toURI()))) { final Manifest manifest = requireNonNull(jar.getManifest(), "Manifest must not be null"); final Attributes mainAttributes = manifest.getMainAttributes(); final DtoFactory dtoFactory = DtoFactory.getInstance(); return dtoFactory.createDto(ApiInfo.class) .withSpecificationVendor(mainAttributes.getValue("Specification-Vendor")) .withImplementationVendor(mainAttributes.getValue("Implementation-Vendor")) .withSpecificationTitle("Codenvy REST API") .withSpecificationVersion(mainAttributes.getValue("Specification-Version")) .withImplementationVersion(mainAttributes.getValue("Implementation-Version")) .withScmRevision(mainAttributes.getValue("SCM-Revision")); } } catch (Exception e) { LOG.error(e.getMessage(), e); throw new ServerException("Unable read info about API. Contact support for assistance."); } } @GET @Produces({MediaType.APPLICATION_JSON}) public RestServicesList.RootResourcesList listJSON(@Context ServletContext context) { ResourceBinder binder = (ResourceBinder)context.getAttribute(ResourceBinder.class.getName()); return new RestServicesList.RootResourcesList(FluentIterable.from(binder.getResources()).transform( new Function<ObjectFactory<ResourceDescriptor>, RestServicesList.RootResource>() { @Nullable @Override public RestServicesList.RootResource apply(ObjectFactory<ResourceDescriptor> input) { ResourceDescriptor descriptor = input.getObjectModel(); return new RestServicesList.RootResource(descriptor.getObjectClass().getName(), // descriptor.getPathValue().getPath(), // descriptor.getUriPattern().getRegex()); } }).toList()); } }