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; } }