/*
* Copyright 2012 Red Hat, Inc. and/or its affiliates.
*
* 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.
*/
package org.guvnor.common.services.backend.metadata;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.inject.Named;
import org.guvnor.common.services.backend.exceptions.ExceptionUtilities;
import org.guvnor.common.services.backend.metadata.attribute.DiscussionAttributes;
import org.guvnor.common.services.backend.metadata.attribute.DiscussionAttributesUtil;
import org.guvnor.common.services.backend.metadata.attribute.DiscussionView;
import org.guvnor.common.services.backend.metadata.attribute.GeneratedAttributesView;
import org.guvnor.common.services.backend.metadata.attribute.OtherMetaAttributes;
import org.guvnor.common.services.backend.metadata.attribute.OtherMetaAttributesUtil;
import org.guvnor.common.services.backend.metadata.attribute.OtherMetaView;
import org.guvnor.common.services.shared.metadata.model.DiscussionRecord;
import org.guvnor.common.services.shared.metadata.model.Metadata;
import org.jboss.errai.bus.server.annotations.Service;
import org.uberfire.backend.server.util.Paths;
import org.uberfire.backend.vfs.Path;
import org.uberfire.io.IOService;
import org.uberfire.io.attribute.DublinCoreAttributes;
import org.uberfire.io.attribute.DublinCoreAttributesUtil;
import org.uberfire.io.attribute.DublinCoreView;
import org.uberfire.java.nio.base.BasicFileAttributesUtil;
import org.uberfire.java.nio.base.version.VersionAttributeView;
import org.uberfire.java.nio.file.NoSuchFileException;
import org.uberfire.java.nio.file.attribute.FileTime;
import org.uberfire.rpc.SessionInfo;
import static java.util.Collections.*;
import static org.uberfire.commons.validation.PortablePreconditions.*;
@Service
@ApplicationScoped
public class MetadataServiceImpl
implements MetadataServerSideService {
private IOService ioService;
private IOService configIOService;
private SessionInfo sessionInfo;
public MetadataServiceImpl() {
}
@Inject
public MetadataServiceImpl( @Named("ioStrategy") IOService ioService,
@Named("configIO") IOService configIOService,
SessionInfo sessionInfo ) {
this.ioService = ioService;
this.configIOService = configIOService;
this.sessionInfo = sessionInfo;
}
@Override
public Metadata getMetadata( final Path pathToResource ) {
return getMetadata( Paths.convert( pathToResource ) );
}
@Override
public Metadata getMetadata( org.uberfire.java.nio.file.Path path ) {
try {
return new MetadataCreator( path,
configIOService,
sessionInfo,
ioService.getFileAttributeView( path, DublinCoreView.class ),
ioService.getFileAttributeView( path, DiscussionView.class ),
ioService.getFileAttributeView( path, OtherMetaView.class ),
ioService.getFileAttributeView( path, VersionAttributeView.class ),
ioService.getFileAttributeView( path, GeneratedAttributesView.class ) ).create();
} catch ( Exception e ) {
throw ExceptionUtilities.handleException( e );
}
}
@Override
public List<String> getTags( final Path resource ) {
checkNotNull( "resource",
resource );
return getTags( Paths.convert( resource ) );
}
@Override
public List<String> getTags( final org.uberfire.java.nio.file.Path resource ) {
checkNotNull( "resource",
resource );
final OtherMetaView otherMetaView = ioService.getFileAttributeView( resource,
OtherMetaView.class );
if ( otherMetaView != null ) {
return otherMetaView.readAttributes().tags();
} else {
return Collections.emptyList();
}
}
@Override
public Map<String, Object> configAttrs( final Map<String, Object> _attrs,
final Metadata metadata ) {
try {
checkNotNull( "_attrs", _attrs );
checkNotNull( "metadata", metadata );
Map<String, Object> attrs = BasicFileAttributesUtil.cleanup( _attrs );
attrs = DublinCoreAttributesUtil.cleanup( attrs );
attrs = DiscussionAttributesUtil.cleanup( attrs );
attrs = OtherMetaAttributesUtil.cleanup( attrs );
attrs.putAll( DiscussionAttributesUtil.toMap(
new DiscussionAttributes() {
@Override
public List<DiscussionRecord> discussion() {
return metadata.getDiscussion();
}
@Override
public FileTime lastModifiedTime() {
return null;
}
@Override
public FileTime lastAccessTime() {
return null;
}
@Override
public FileTime creationTime() {
return null;
}
@Override
public boolean isRegularFile() {
return false;
}
@Override
public boolean isDirectory() {
return false;
}
@Override
public boolean isSymbolicLink() {
return false;
}
@Override
public boolean isOther() {
return false;
}
@Override
public long size() {
return 0;
}
@Override
public Object fileKey() {
return null;
}
}, "*" ) );
attrs.putAll( OtherMetaAttributesUtil.toMap(
new OtherMetaAttributes() {
@Override
public List<String> tags() {
return metadata.getTags();
}
@Override
public FileTime lastModifiedTime() {
return null;
}
@Override
public FileTime lastAccessTime() {
return null;
}
@Override
public FileTime creationTime() {
return null;
}
@Override
public boolean isRegularFile() {
return false;
}
@Override
public boolean isDirectory() {
return false;
}
@Override
public boolean isSymbolicLink() {
return false;
}
@Override
public boolean isOther() {
return false;
}
@Override
public long size() {
return 0;
}
@Override
public Object fileKey() {
return null;
}
}, "*" ) );
attrs.putAll( DublinCoreAttributesUtil.toMap(
new DublinCoreAttributes() {
@Override
public List<String> titles() {
return emptyList();
}
@Override
public List<String> creators() {
return emptyList();
}
@Override
public List<String> subjects() {
return new ArrayList<String>( 1 ) {{
add( metadata.getSubject() );
}};
}
@Override
public List<String> descriptions() {
return new ArrayList<String>( 1 ) {{
add( metadata.getDescription() );
}};
}
@Override
public List<String> publishers() {
return emptyList();
}
@Override
public List<String> contributors() {
return emptyList();
}
@Override
public List<String> types() {
return new ArrayList<String>( 1 ) {{
add( metadata.getType() );
}};
}
@Override
public List<String> formats() {
return emptyList();
}
@Override
public List<String> identifiers() {
return emptyList();
}
@Override
public List<String> sources() {
return new ArrayList<String>( 1 ) {{
add( metadata.getExternalSource() );
}};
}
@Override
public List<String> languages() {
return emptyList();
}
@Override
public List<String> relations() {
return new ArrayList<String>( 1 ) {{
add( metadata.getExternalRelation() );
}};
}
@Override
public List<String> coverages() {
return emptyList();
}
@Override
public List<String> rights() {
return emptyList();
}
@Override
public FileTime lastModifiedTime() {
return null;
}
@Override
public FileTime lastAccessTime() {
return null;
}
@Override
public FileTime creationTime() {
return null;
}
@Override
public boolean isRegularFile() {
return false;
}
@Override
public boolean isDirectory() {
return false;
}
@Override
public boolean isSymbolicLink() {
return false;
}
@Override
public boolean isOther() {
return false;
}
@Override
public long size() {
return 0;
}
@Override
public Object fileKey() {
return null;
}
}, "*" ) );
attrs.put( GeneratedAttributesView.GENERATED_ATTRIBUTE_NAME, metadata.isGenerated() );
return attrs;
} catch ( Exception e ) {
throw ExceptionUtilities.handleException( e );
}
}
@Override
public Map<String, Object> setUpAttributes( final Path path,
final Metadata metadata ) {
try {
Map<String, Object> attributes;
try {
attributes = ioService.readAttributes( Paths.convert( path ) );
} catch ( final NoSuchFileException ex ) {
attributes = new HashMap<String, Object>();
}
if ( metadata != null ) {
attributes = configAttrs( attributes, metadata );
}
return BasicFileAttributesUtil.cleanup( attributes );
} catch ( Exception e ) {
throw ExceptionUtilities.handleException( e );
}
}
}