/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU General Public License, version 2 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/gpl-2.0.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*
* Copyright 2006 - 2016 Pentaho Corporation. All rights reserved.
*/
package org.pentaho.platform.repository2.unified.webservices;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import org.pentaho.platform.api.repository2.unified.IRepositoryVersionManager;
import org.pentaho.platform.api.repository2.unified.RepositoryFile;
import org.pentaho.platform.api.repository2.unified.RepositoryFileSid;
import org.pentaho.platform.api.repository2.unified.RepositoryFileTree;
import org.pentaho.platform.api.repository2.unified.RepositoryRequest;
import org.pentaho.platform.repository2.unified.jcr.JcrRepositoryFileUtils;
/**
* Converts {@code RepositoryFile} into JAXB-safe object and vice-versa.
*
* @author mlowery
*/
public class RepositoryFileAdapter extends XmlAdapter<RepositoryFileDto, RepositoryFile> {
private static DefaultUnifiedRepositoryWebService repoWs;
private Set<String> membersSet;
private boolean exclude;
private boolean includeAcls;
public RepositoryFileAdapter() {
this.exclude = false;
this.includeAcls = false;
this.membersSet = null;
}
public RepositoryFileAdapter( RepositoryRequest repositoryRequest ) {
if ( repositoryRequest.getExcludeMemberSet() != null && !repositoryRequest.getExcludeMemberSet().isEmpty() ) {
this.exclude = true;
this.membersSet = repositoryRequest.getExcludeMemberSet();
} else {
this.exclude = false;
this.membersSet = repositoryRequest.getIncludeMemberSet();
}
this.includeAcls = repositoryRequest.isIncludeAcls();
}
@Override
public RepositoryFileDto marshal( final RepositoryFile v ) {
return toFileDto( v, membersSet, exclude, includeAcls );
}
public RepositoryFileDto marshal( final RepositoryFileTree repositoryFileTree ) {
return toFileDto( repositoryFileTree, membersSet, exclude, includeAcls );
}
private static boolean include( String key, Set<String> set, boolean exclude ) {
return !exclude && ( set == null || set.contains( key ) ) || ( exclude && !set.contains( key ) );
}
public static RepositoryFileDto toFileDto( final RepositoryFileTree repositoryFileTree, Set<String> memberSet,
boolean exclude, boolean includeAcls ) {
RepositoryFileDto repositoryFileDto = toFileDto( repositoryFileTree.getFile(), memberSet, exclude, includeAcls );
return repositoryFileDto;
}
public static RepositoryFileDto toFileDto( final RepositoryFile v, Set<String> memberSet, boolean exclude ) {
return toFileDto( v, memberSet, exclude, false );
}
public static RepositoryFileDto toFileDto( final RepositoryFile v, Set<String> memberSet, boolean exclude,
boolean includeAcls ) {
if ( v == null ) {
return null;
}
RepositoryFileDto f = new RepositoryFileDto();
if ( include( "name", memberSet, exclude ) ) {
f.name = v.getName();
}
if ( include( "path", memberSet, exclude ) ) {
f.path = v.getPath();
}
if ( include( "hidden", memberSet, exclude ) ) {
f.hidden = v.isHidden();
}
if ( include( "aclNode", memberSet, exclude ) ) {
f.aclNode = v.isAclNode();
}
if ( include( "createDate", memberSet, exclude ) ) {
f.createdDate = v.getCreatedDate();
}
if ( include( "creatorId", memberSet, exclude ) ) {
f.creatorId = v.getCreatorId();
}
if ( include( "fileSize", memberSet, exclude ) ) {
f.fileSize = v.getFileSize();
}
if ( include( "description", memberSet, exclude ) ) {
f.description = v.getDescription();
}
if ( include( "folder", memberSet, exclude ) ) {
f.folder = v.isFolder();
}
//The include check is intentionally omitted on the Id field because
//it must be present or the tree rest service call will error
if ( v.getId() != null ) {
f.id = v.getId().toString();
}
if ( include( "lastModifiedDate", memberSet, exclude ) ) {
f.lastModifiedDate = v.getLastModifiedDate();
}
if ( include( "locale", memberSet, exclude ) ) {
f.locale = v.getLocale();
}
if ( include( "originalParentFolderPath", memberSet, exclude ) ) {
f.originalParentFolderPath = v.getOriginalParentFolderPath();
}
if ( include( "deletedDate", memberSet, exclude ) ) {
f.deletedDate = v.getDeletedDate();
}
if ( include( "lockDate", memberSet, exclude ) ) {
f.lockDate = v.getLockDate();
}
if ( include( "locked", memberSet, exclude ) ) {
f.locked = v.isLocked();
}
if ( include( "lockMessage", memberSet, exclude ) ) {
f.lockMessage = v.getLockMessage();
}
if ( include( "lockOwner", memberSet, exclude ) ) {
f.lockOwner = v.getLockOwner();
}
if ( include( "title", memberSet, exclude ) ) {
f.title = v.getTitle();
}
if ( include( "versioned", memberSet, exclude ) ) {
f.versioned = v.isVersioned();
}
if ( include( "versionId", memberSet, exclude ) ) {
if ( v.getVersionId() != null ) {
f.versionId = v.getVersionId().toString();
}
}
if ( includeAcls ) {
if ( v.getId() != null ) {
try {
f.repositoryFileAclDto = getRepoWs().getAcl( v.getId().toString() );
if ( f.repositoryFileAclDto.isEntriesInheriting() ) {
List<RepositoryFileAclAceDto> aces = getRepoWs().getEffectiveAces( v.getId().toString() );
f.repositoryFileAclDto.setAces( aces, f.repositoryFileAclDto.isEntriesInheriting() );
}
} catch ( Exception e ) {
e.printStackTrace();
}
}
if ( include( "owner", memberSet, exclude ) ) {
Serializable id = v.getId();
if ( id != null ) {
RepositoryFileAclDto acl = getRepoWs().getAcl( "" + id );
if ( acl != null ) {
f.owner = acl.getOwner();
}
}
}
}
if ( include( "locales", memberSet, exclude ) ) {
if ( v.getLocalePropertiesMap() != null ) {
f.localePropertiesMapEntries = new ArrayList<LocaleMapDto>();
for ( Map.Entry<String, Properties> entry : v.getLocalePropertiesMap().entrySet() ) {
LocaleMapDto localeMapDto = new LocaleMapDto();
List<StringKeyStringValueDto> valuesDto = new ArrayList<StringKeyStringValueDto>();
Properties properties = entry.getValue();
if ( properties != null ) {
for ( String propertyName : properties.stringPropertyNames() ) {
valuesDto.add( new StringKeyStringValueDto( propertyName, properties.getProperty( propertyName ) ) );
}
}
localeMapDto.setLocale( entry.getKey() );
localeMapDto.setProperties( valuesDto );
f.localePropertiesMapEntries.add( localeMapDto );
}
}
}
IRepositoryVersionManager repositoryVersionManager;
try {
repositoryVersionManager = JcrRepositoryFileUtils.getRepositoryVersionManager();
// Not found, must be in Spoon
if ( repositoryVersionManager == null ) {
return f;
}
} catch ( NoClassDefFoundError ex ) {
//If this class is not available then we are running this method from Spoon
//and do not need to populate the versioning flags. They are populated to
//support tree and child calls.
return f;
}
if ( include( "versioningEnabled", memberSet, exclude ) ) {
f.setVersioningEnabled( repositoryVersionManager.isVersioningEnabled( v.getPath() ) );
}
if ( include( "versionCommentEnabled", memberSet, exclude ) ) {
f.setVersionCommentEnabled( repositoryVersionManager.isVersionCommentEnabled( v.getPath() ) );
}
return f;
}
@Override
public RepositoryFile unmarshal( final RepositoryFileDto v ) {
return toFile( v );
}
public static RepositoryFile toFile( final RepositoryFileDto v ) {
if ( v == null ) {
return null;
}
RepositoryFile.Builder builder = null;
if ( v.id != null ) {
builder = new RepositoryFile.Builder( v.id, v.name );
} else {
builder = new RepositoryFile.Builder( v.name );
}
if ( v.ownerType != -1 ) {
new RepositoryFileSid( v.owner, RepositoryFileSid.Type.values()[ v.ownerType ] );
}
if ( v.localePropertiesMapEntries != null ) {
for ( LocaleMapDto localeMapDto : v.localePropertiesMapEntries ) {
String locale = localeMapDto.getLocale();
Properties localeProperties = new Properties();
if ( localeMapDto.getProperties() != null ) {
for ( StringKeyStringValueDto keyValueDto : localeMapDto.getProperties() ) {
localeProperties.put( keyValueDto.getKey(), keyValueDto.getValue() );
}
}
builder.localeProperties( locale, localeProperties );
}
}
return builder.path( v.path ).createdDate( v.createdDate ).creatorId( v.creatorId ).description( v.description )
.folder( v.folder ).fileSize( v.fileSize ).lastModificationDate( v.lastModifiedDate ).locale( v.locale )
.lockDate( v.lockDate ).locked( v.locked ).lockMessage( v.lockMessage ).lockOwner( v.lockOwner )
.title( v.title ).versioned( v.versioned ).versionId( v.versionId ).originalParentFolderPath(
v.originalParentFolderPath ).deletedDate( v.deletedDate ).hidden( v.hidden ).schedulable( !v
.isNotSchedulable() ).aclNode( v.aclNode ).build();
}
private static DefaultUnifiedRepositoryWebService getRepoWs() {
if ( repoWs == null ) {
repoWs = new DefaultUnifiedRepositoryWebService();
}
return repoWs;
}
}