/* * 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. * 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.Date; import java.util.List; 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.OtherMetaView; import org.guvnor.common.services.shared.metadata.model.DiscussionRecord; import org.guvnor.common.services.shared.metadata.model.Metadata; import org.uberfire.backend.server.util.Paths; import org.uberfire.backend.vfs.PathFactory; import org.uberfire.backend.vfs.impl.LockInfo; import org.uberfire.ext.editor.commons.version.impl.PortableVersionRecord; import org.uberfire.io.IOService; import org.uberfire.io.attribute.DublinCoreView; import org.uberfire.java.nio.base.version.VersionAttributeView; import org.uberfire.java.nio.base.version.VersionAttributes; import org.uberfire.java.nio.base.version.VersionHistory; import org.uberfire.java.nio.base.version.VersionRecord; import org.uberfire.java.nio.file.NoSuchFileException; import org.uberfire.java.nio.file.Path; import org.uberfire.rpc.SessionInfo; import static org.uberfire.commons.validation.PortablePreconditions.*; public class MetadataCreator { private final Path path; private final DublinCoreView dublinCoreView; private final DiscussionView discussView; private final OtherMetaView otherMetaView; private final VersionAttributeView versionAttributeView; private final GeneratedAttributesView generatedAttributesView; private final IOService configIOService; private final SessionInfo sessionInfo; public MetadataCreator( Path path, IOService configIOService, SessionInfo sessionInfo, DublinCoreView dublinCoreView, DiscussionView discussionView, OtherMetaView otherMetaView, VersionAttributeView versionAttributeView, GeneratedAttributesView generatedAttributesView ) { this.path = checkNotNull( "path", path ); this.configIOService = checkNotNull( "configIOService", configIOService ); this.sessionInfo = checkNotNull( "sessionInfo", sessionInfo ); this.dublinCoreView = checkNotNull( "dublinCoreView", dublinCoreView ); this.discussView = checkNotNull( "discussionView", discussionView ); this.otherMetaView = checkNotNull( "otherMetaView", otherMetaView ); this.versionAttributeView = checkNotNull( "versionAttributeView", versionAttributeView ); this.generatedAttributesView = checkNotNull( "generatedAttributesView", generatedAttributesView ); } public Metadata create() { return MetadataBuilder.newMetadata() .withPath( Paths.convert( path ) ) .withRealPath( Paths.convert( path.toRealPath() ) ) .withCheckinComment( getCheckinComment() ) .withLastContributor( getLastContributor() ) .withCreator( getCreator() ) .withLastModified( getLastModified() ) .withDateCreated( getDateCreated() ) .withSubject( getSubject() ) .withType( getType() ) .withExternalRelation( getExternalRelation() ) .withExternalSource( getExternalSource() ) .withDescription( getDescription() ) .withTags( getTags() ) .withDiscussion( getDiscussion() ) .withLockInfo( retrieveLockInfo( Paths.convert( path ) ) ) .withVersion( getVersion() ) .withGenerated( getGenerated() ) .build(); } private ArrayList<VersionRecord> getVersion() { return new ArrayList<VersionRecord>( versionAttributeView.readAttributes().history().records().size() ) {{ for ( final VersionRecord record : versionAttributeView.readAttributes().history().records() ) { add( new PortableVersionRecord( record.id(), record.author(), record.email(), record.comment(), record.date(), record.uri() ) ); } }}; } private boolean getGenerated() { return generatedAttributesView.readAttributes().isGenerated(); } private List<DiscussionRecord> getDiscussion() { return discussView.readAttributes().discussion(); } private List<String> getTags() { return otherMetaView.readAttributes().tags(); } private String getDescription() { return dublinCoreView.readAttributes().descriptions().size() > 0 ? dublinCoreView.readAttributes().descriptions().get( 0 ) : null; } private String getExternalSource() { return dublinCoreView.readAttributes().sources().size() > 0 ? dublinCoreView.readAttributes().sources().get( 0 ) : null; } private String getExternalRelation() { return dublinCoreView.readAttributes().relations().size() > 0 ? dublinCoreView.readAttributes().relations().get( 0 ) : null; } private String getType() { return dublinCoreView.readAttributes().types().size() > 0 ? dublinCoreView.readAttributes().types().get( 0 ) : null; } private String getSubject() { return dublinCoreView.readAttributes().subjects().size() > 0 ? dublinCoreView.readAttributes().subjects().get( 0 ) : null; } private Date getDateCreated() { return new Date( versionAttributeView.readAttributes().creationTime().toMillis() ); } private Date getLastModified() { return new Date( versionAttributeView.readAttributes().lastModifiedTime().toMillis() ); } private String getCreator() { if ( versionAttributeView.readAttributes().history().records().size() > 0 ) { return versionAttributeView.readAttributes().history().records().get( 0 ).author(); } else { return null; } } private String getLastContributor() { if ( versionAttributeView.readAttributes().history().records().size() > 0 ) { return versionAttributeView.readAttributes().history().records().get( versionAttributeView.readAttributes().history().records().size() - 1 ).author(); } else { return null; } } private String getCheckinComment() { VersionAttributes versionAttributes = versionAttributeView.readAttributes(); VersionHistory history = versionAttributes.history(); List<VersionRecord> records = history.records(); if ( records.size() > 0 ) { return versionAttributeView.readAttributes().history().records().get( versionAttributeView.readAttributes().history().records().size() - 1 ).comment(); } else { return null; } } private LockInfo retrieveLockInfo( org.uberfire.backend.vfs.Path path ) { final org.uberfire.java.nio.file.Path lockPath = Paths.convert( PathFactory.newLock( path ) ); try { //See https://issues.jboss.org/browse/GUVNOR-2399. We simply try to read the lock file returning a default. final String lockedBy = configIOService.readAllString( lockPath ); return new LockInfo( true, lockedBy, path ); } catch ( NoSuchFileException nsfe ) { return new LockInfo( false, "", path ); } } }