/****************************************************************************** * Copyright (c) 2016 Oracle * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Konstantin Komissarchik - initial implementation and ongoing maintenance ******************************************************************************/ package org.eclipse.sapphire.services; import java.util.List; import org.eclipse.sapphire.Event; import org.eclipse.sapphire.Listener; import org.eclipse.sapphire.LocalizableText; import org.eclipse.sapphire.Property; import org.eclipse.sapphire.Text; import org.eclipse.sapphire.modeling.Path; import org.eclipse.sapphire.modeling.Status; import org.eclipse.sapphire.modeling.annotations.FileSystemResourceType; import org.eclipse.sapphire.modeling.annotations.MustExist; import org.eclipse.sapphire.modeling.annotations.ValidFileSystemResourceType; /** * @author <a href="mailto:konstantin.komissarchik@oracle.com">Konstantin Komissarchik</a> */ public abstract class PathValidationService extends ValidationService { @Text( "Folder \"{0}\" does not exist" ) protected static LocalizableText folderMustExist; @Text( "File \"{0}\" does not exist") protected static LocalizableText fileMustExist; @Text( "File or folder \"{0}\" does not exist" ) protected static LocalizableText resourceMustExistMessage; @Text( "Resource at location \"{0}\" is not a file" ) protected static LocalizableText pathIsNotFile; @Text( "Resource at location \"{0}\" is not a folder" ) protected static LocalizableText pathIsNotFolder; @Text( "File \"{0}\" has an invalid extension. Only \"{1}\" extension is allowed" ) protected static LocalizableText invalidFileExtensionOne; @Text( "File \"{0}\" has an invalid extension. Only extensions \"{1}\" and \"{2}\" are allowed" ) protected static LocalizableText invalidFileExtensionTwo; @Text( "File \"{0}\" has an invalid extension. Only extensions from \"{1}\" list are allowed" ) protected static LocalizableText invalidFileExtensionMultiple; static { LocalizableText.init( PathValidationService.class ); } protected boolean resourceMustExist; protected FileSystemResourceType validResourceType; private FileExtensionsService fileExtensionsService; @Override protected void initValidationService() { final Property property = context( Property.class ); this.resourceMustExist = property.definition().hasAnnotation( MustExist.class ); final ValidFileSystemResourceType validResourceTypeAnnotation = property.definition().getAnnotation( ValidFileSystemResourceType.class ); this.validResourceType = ( validResourceTypeAnnotation != null ? validResourceTypeAnnotation.value() : null ); this.fileExtensionsService = property.service( FileExtensionsService.class ); if( this.fileExtensionsService != null ) { this.fileExtensionsService.attach ( new Listener() { @Override public void handle( final Event event ) { refresh(); } } ); } } protected final Status validateExtensions( final Path path ) { if( this.fileExtensionsService != null ) { final String fileName = path.lastSegment(); if( fileName != null ) { final List<String> extensions = this.fileExtensionsService.extensions(); final int count = ( extensions == null ? 0 : extensions.size() ); if( count > 0 ) { final String trimmedFileName = fileName.trim(); final int lastdot = trimmedFileName.lastIndexOf( '.' ); final String extension; if( lastdot == -1 ) { extension = ""; } else { extension = trimmedFileName.substring( lastdot + 1 ); } boolean match = false; if( extension != null && extension.length() != 0 ) { for( String ext : extensions ) { if( extension.equalsIgnoreCase( ext ) ) { match = true; break; } } } if( ! match ) { final String message; if( count == 1 ) { message = invalidFileExtensionOne.format( trimmedFileName, extensions.get( 0 ) ); } else if( count == 2 ) { message = invalidFileExtensionTwo.format( trimmedFileName, extensions.get( 0 ), extensions.get( 1 ) ); } else { final StringBuilder buf = new StringBuilder(); for( String ext : extensions ) { if( buf.length() != 0 ) { buf.append( ", " ); } buf.append( ext ); } message = invalidFileExtensionMultiple.format( trimmedFileName, buf.toString() ); } return Status.createErrorStatus( message ); } } } } return Status.createOkStatus(); } }