de.zib.gndms.gndmc.dspace.SliceClient.java Source code

Java tutorial

Introduction

Here is the source code for de.zib.gndms.gndmc.dspace.SliceClient.java

Source

package de.zib.gndms.gndmc.dspace;

/*
 * Copyright 2008-2011 Zuse Institute Berlin (ZIB)
 *
 * Licensed 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.
 */

import de.zib.gndms.common.dspace.SliceConfiguration;
import de.zib.gndms.common.dspace.service.SliceInformation;
import de.zib.gndms.common.dspace.service.SliceServiceClient;
import de.zib.gndms.common.model.FileStats;
import de.zib.gndms.common.rest.Facets;
import de.zib.gndms.common.rest.GNDMSResponseHeader;
import de.zib.gndms.common.rest.Specifier;
import de.zib.gndms.common.rest.UriFactory;
import de.zib.gndms.gndmc.AbstractClient;
import de.zib.gndms.gndmc.utils.DefaultResponseExtractor;
import de.zib.gndms.gndmc.utils.EnhancedResponseExtractor;
import de.zib.gndms.gndmc.utils.HTTPGetter;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.OutputStream;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.util.List;

/**
 * The slice client implementing the slice service.
 * 
 * @author Ulrike Golas
 */
public class SliceClient extends AbstractClient implements SliceServiceClient {

    /**
     * The constructor.
     */
    public SliceClient() {
    }

    /**
    * The constructor.
    * 
    * @param serviceURL The base url of the target gndms.
    */
    public SliceClient(final String serviceURL) {
        this.setServiceURL(serviceURL);
    }

    @SuppressWarnings("unchecked")
    @Override
    public final ResponseEntity<Facets> listSliceFacets(final String subspace, final String sliceKind,
            final String slice, final String dn) {
        return (ResponseEntity<Facets>) (Object) unifiedGet(Facets.class, genSliceUrl(subspace, sliceKind, slice),
                dn);
    }

    @Override
    public ResponseEntity<Facets> listSliceFacets(final Specifier<Void> slice, final String dn) {
        return (ResponseEntity<Facets>) (Object) unifiedGet(Facets.class, slice.getUrl(), dn);
    }

    @Override
    public final ResponseEntity<Integer> setSliceConfiguration(final String subspace, final String sliceKind,
            final String slice, final SliceConfiguration config, final String dn) {
        return unifiedPut(Integer.class, config, makeConfigFacet(genSliceUrl(subspace, sliceKind, slice)), dn);
    }

    @Override
    public ResponseEntity<Integer> setSliceConfiguration(final Specifier<Void> slice,
            final SliceConfiguration config, final String dn) {

        return unifiedPut(Integer.class, config, makeConfigFacet(slice.getUrl()), dn);
    }

    @Override
    public ResponseEntity<SliceInformation> getSliceInformation(final String subspace, final String sliceKind,
            final String slice, final String dn) {
        return (ResponseEntity<SliceInformation>) (Object) unifiedGet(SliceInformation.class,
                makeConfigFacet(genSliceUrl(subspace, sliceKind, slice)), dn);
    }

    @Override
    public ResponseEntity<SliceInformation> getSliceInformation(final Specifier<Void> slice, final String dn) {
        return (ResponseEntity<SliceInformation>) (Object) unifiedGet(SliceInformation.class,
                makeConfigFacet(slice.getUrl()), dn);
    }

    @SuppressWarnings("unchecked")
    @Override
    public final ResponseEntity<Specifier<Void>> transformSlice(final String subspace, final String sliceKind,
            final String slice, final Specifier<Void> newSliceKind, final String dn) {
        return (ResponseEntity<Specifier<Void>>) (Object) unifiedPost(Specifier.class, newSliceKind,
                genSliceUrl(subspace, sliceKind, slice), dn);
    }

    @Override
    public ResponseEntity<Specifier<Void>> transformSlice(final Specifier<Void> slice,
            final Specifier<Void> newSliceKind, final String dn) {

        return (ResponseEntity<Specifier<Void>>) (Object) unifiedPost(Specifier.class, newSliceKind, slice.getUrl(),
                dn);
    }

    @SuppressWarnings("unchecked")
    @Override
    public final ResponseEntity<Specifier<Facets>> deleteSlice(final String subspace, final String sliceKind,
            final String slice, final String dn) {
        return (ResponseEntity<Specifier<Facets>>) (Object) unifiedDelete(Specifier.class,
                genSliceUrl(subspace, sliceKind, slice), dn);
    }

    @Override
    public ResponseEntity<Specifier<Facets>> deleteSlice(final Specifier<Void> slice, final String dn) {

        return (ResponseEntity<Specifier<Facets>>) (Object) unifiedDelete(Specifier.class, slice.getUrl(), dn);
    }

    @SuppressWarnings("unchecked")
    @Override
    public final ResponseEntity<List<FileStats>> listFiles(final String subspace, final String sliceKind,
            final String slice, final String dn) {

        return (ResponseEntity<List<FileStats>>) (Object) unifiedGet(List.class,
                makeFilesFacet(genSliceUrl(subspace, sliceKind, slice)), dn);
    }

    public static Long getSliceDiskUsage(ResponseEntity<List<FileStats>> responseEntity) {
        if (responseEntity.getHeaders().containsKey("DiskUsage"))
            return Long.parseLong(responseEntity.getHeaders().get("DiskUsage").get(0));
        else
            throw new IllegalArgumentException(
                    "Response entity has no valid disk usage information. Check response entity first!");
    }

    @Override
    public ResponseEntity<List<FileStats>> listFiles(final Specifier<Void> slice, final String dn) {

        return (ResponseEntity<List<FileStats>>) (Object) unifiedGet(List.class, makeFilesFacet(slice.getUrl()),
                dn);
    }

    @Override
    public final ResponseEntity<Integer> deleteFiles(final String subspace, final String sliceKind,
            final String slice, final String dn) {
        return unifiedDelete(makeFilesFacet(genSliceUrl(subspace, sliceKind, slice)), dn);
    }

    @Override
    public ResponseEntity<Integer> deleteFiles(final Specifier<Void> slice, final String dn) {
        return unifiedDelete(makeFilesFacet(slice.getUrl()), dn);
    }

    @Override
    public final ResponseEntity<String> getGridFtpUrl(final String subspace, final String sliceKind,
            final String slice, final String dn) {

        return unifiedGet(String.class, makeGsiFtpFacet(genSliceUrl(subspace, sliceKind, slice)), dn);
    }

    @Override
    public final ResponseEntity<String> getRelativeDirectoryPath(final String subspace, final String sliceKind,
            final String slice, final String dn) {

        return unifiedGet(String.class, makeRelativeDirectoryFacet(genSliceUrl(subspace, sliceKind, slice)), dn);
    }

    @Override
    public ResponseEntity<String> getGridFtpUrl(final Specifier<Void> slice, final String dn) {

        return unifiedGet(String.class, makeGsiFtpFacet(slice.getUrl()), dn);
    }

    @Override
    public final ResponseEntity<Integer> listFileContent(final String subspace, final String sliceKind,
            final String slice, final String fileName, final List<String> attrs, final String dn,
            final OutputStream out) throws NoSuchAlgorithmException, KeyManagementException, IOException {
        Specifier<Void> specifier = UriFactory.createSliceSpecifier(getServiceURL(), subspace, sliceKind, slice);
        return listFileContent(specifier, fileName, attrs, dn, out);
    }

    @Override
    public ResponseEntity<Integer> listFileContent(final Specifier<Void> slice, final String fileName,
            final List<String> attrs, final String dn, final OutputStream out)
            throws NoSuchAlgorithmException, KeyManagementException, IOException {

        HTTPGetter httpGetter = new HTTPGetter();
        GNDMSResponseHeader headers = new GNDMSResponseHeader();

        if (dn != null)
            headers.setDN(dn);

        EnhancedResponseExtractor responseExtractor = new DefaultResponseExtractor() {
            @Override
            public void extractData(String url, ClientHttpResponse response) throws IOException {
                super.extractData(url, response);
                FileCopyUtils.copy(getBody(), out);
            }
        };
        httpGetter.setExtractor(200, responseExtractor);

        httpGetter.get(makeFileNameFacet(slice.getUrl(), fileName), headers);

        return new ResponseEntity<Integer>(0, responseExtractor.getHeaders(),
                HttpStatus.valueOf(responseExtractor.getStatusCode()));
    }

    @Override
    public final ResponseEntity<Integer> setFileContent(final String subspace, final String sliceKind,
            final String slice, final String fileName, final MultipartFile file, final String dn) {

        return postFile(Integer.class, file.getName(), file.getOriginalFilename(),
                makeFileNameFacet(genSliceUrl(subspace, sliceKind, slice), fileName), dn);
    }

    @Override
    public ResponseEntity<Integer> setFileContent(final Specifier<Void> slice, final String fileName,
            final MultipartFile file, final String dn) {
        return unifiedPut(Integer.class, file, makeFileNameFacet(slice.getUrl(), fileName), dn);
    }

    @Override
    public final ResponseEntity<Integer> deleteFile(final String subspace, final String sliceKind,
            final String slice, final String fileName, final String dn) {

        return unifiedDelete(makeFileNameFacet(genSliceUrl(subspace, sliceKind, slice), fileName), dn);
    }

    @Override
    public ResponseEntity<Integer> deleteFile(final Specifier<Void> slice, final String fileName, final String dn) {

        return unifiedDelete(makeFileNameFacet(slice.getUrl(), fileName), dn);
    }

    protected String genSliceUrl(final String subspace, final String sliceKind, final String slice) {

        return new StringBuilder().append(getServiceURL()).append("/dspace/_").append(subspace).append("/_")
                .append(sliceKind).append("/_").append(slice).toString();
    }

    private String makeFilesFacet(final String uri) {

        return uri + "/files";
    }

    private String makeConfigFacet(final String uri) {
        return uri + "/config";
    }

    private String makeGsiFtpFacet(final String uri) {

        return uri + "/gsiftp";
    }

    private String makeRelativeDirectoryFacet(final String uri) {

        return uri + "/directory";
    }

    private String makeFileNameFacet(final String uri, final String fileName) {

        return uri + "/_" + fileName;
    }
}