/* * 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.drools.compiler.compiler.io.memory; import org.drools.compiler.compiler.io.File; import org.drools.compiler.compiler.io.Folder; import org.drools.compiler.compiler.io.Path; import org.drools.compiler.compiler.io.Resource; import org.drools.compiler.kie.builder.impl.KieFileSystemImpl; import org.drools.core.util.StringUtils; import java.io.Serializable; import java.util.Collection; public class MemoryFolder implements Folder, Serializable { private MemoryFileSystem mfs; private String path; private MemoryPath mPath; private MemoryFolder pFolder; public MemoryFolder(MemoryFileSystem mfs, String path) { this.mfs = mfs; this.path = path; } public String getName() { int lastSlash = path.lastIndexOf( '/' ); if ( lastSlash >= 0 ) { return path.substring( lastSlash+1 ); } else { return path; } } public Path getPath() { if ( mPath == null ) { mPath = new MemoryPath( path ); } return mPath; } public File getFile(String name) { if ( !StringUtils.isEmpty( path )) { return mfs.getFile( path + "/" + name ); } else { return mfs.getFile( name ); } } public Folder getFolder(String name) { if ( !StringUtils.isEmpty( path )) { return mfs.getFolder( path + "/" + name ); } else { return mfs.getFolder( name ); } } public Folder getParent() { if ( pFolder == null ) { String p = trimLeadingAndTrailing( path ); if ( p.indexOf( '/' ) == -1 ) { pFolder = new MemoryFolder( mfs, "" ); } else { String[] elements = p.split( "/" ); String newPath = ""; boolean first = true; for ( int i = 0; i < elements.length - 1; i++ ) { if ( !StringUtils.isEmpty( elements[i] ) ) { if ( !first ) { newPath = newPath + "/"; } newPath = newPath + elements[i]; first = false; } } pFolder = new MemoryFolder( mfs, newPath ); } } return pFolder; } public static String trimLeadingAndTrailing(String p) { if (p.isEmpty()) { return p; } while ( p.charAt( 0 ) == '/') { p = p.substring( 1 ); } while ( p.charAt( p.length() -1 ) == '/') { p = p.substring( 0, p.length() -1 ); } return p; } public Collection<? extends Resource> getMembers() { return mfs.getMembers( this ); } public boolean exists() { return mfs.existsFolder( path ); } public boolean create() { path = trimLeadingAndTrailing( path ); mfs.createFolder( this ); return true; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((path == null) ? 0 : path.hashCode()); return result; } @Override public boolean equals(Object obj) { if ( this == obj ) return true; if ( obj == null ) return false; if ( getClass() != obj.getClass() ) return false; MemoryFolder other = (MemoryFolder) obj; if ( path == null ) { if ( other.path != null ) return false; } else if ( !path.equals( other.path ) ) return false; return true; } @Override public String toString() { return "MemoryFolder [path=" + path + "]"; } }