/* * Copyright 2015 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. * * 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.structure.backend; import java.util.ArrayList; import java.util.Comparator; import java.util.Date; import java.util.List; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import javax.inject.Named; import org.guvnor.structure.repositories.Repository; import org.guvnor.structure.repositories.RepositoryService; import org.jboss.errai.bus.server.annotations.Service; import org.ocpsoft.prettytime.PrettyTime; import org.uberfire.backend.server.util.Paths; import org.uberfire.io.IOService; import org.uberfire.java.nio.base.version.VersionAttributeView; import org.uberfire.java.nio.file.DirectoryStream; import org.uberfire.java.nio.file.Files; import org.uberfire.java.nio.file.Path; import org.guvnor.structure.navigator.DataContent; import org.guvnor.structure.navigator.FileNavigatorService; import org.guvnor.structure.navigator.NavigatorContent; import static java.util.Collections.*; @Service @ApplicationScoped public class FileNavigatorServiceImpl implements FileNavigatorService { @Inject @Named("ioStrategy") private IOService ioService; @Inject private RepositoryService repositoryService; private final PrettyTime p = new PrettyTime(); @Override public NavigatorContent listContent( final org.uberfire.backend.vfs.Path _path ) { final ArrayList<DataContent> result = new ArrayList<DataContent>(); final ArrayList<org.uberfire.backend.vfs.Path> breadcrumbs = new ArrayList<org.uberfire.backend.vfs.Path>(); Path path = Paths.convert( _path ); final DirectoryStream<Path> stream = ioService.newDirectoryStream( path ); for ( final Path activePath : stream ) { final VersionAttributeView versionAttributeView = ioService.getFileAttributeView( activePath, VersionAttributeView.class ); int index = versionAttributeView.readAttributes().history().records().size() - 1; final String authorEmail = versionAttributeView.readAttributes().history().records().get( index ).email(); final String author = versionAttributeView.readAttributes().history().records().get( index ).author(); final String comment = versionAttributeView.readAttributes().history().records().get( index ).comment(); final String time = p.format( new Date( Files.getLastModifiedTime( activePath ).toMillis() ) ); result.add( new DataContent( Files.isDirectory( activePath ), comment, author, authorEmail, time, Paths.convert( activePath ) ) ); } sort( result, new Comparator<DataContent>() { @Override public int compare( final DataContent dataContent, final DataContent dataContent2 ) { int fileCompare = dataContent.getPath().getFileName().toLowerCase().compareTo( dataContent2.getPath().getFileName().toLowerCase() ); if ( dataContent.isDirectory() && dataContent2.isDirectory() ) { return fileCompare; } if ( dataContent.isDirectory() ) { return -1; } if ( dataContent2.isDirectory() ) { return 1; } return fileCompare; } } ); if ( !path.equals( path.getRoot() ) ) { while ( !path.getParent().equals( path.getRoot() ) ) { path = path.getParent(); breadcrumbs.add( Paths.convert( path ) ); } reverse( breadcrumbs ); } final org.uberfire.backend.vfs.Path root = Paths.convert( path.getRoot() ); return new NavigatorContent( repositoryService.getRepository( root ).getAlias(), root, breadcrumbs, result ); } @Override public List<Repository> listRepositories() { return new ArrayList<Repository>( repositoryService.getRepositories() ); } }