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