Subversion Repository Public Repository

litesoft

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
// This Source Code is in the Public Domain per: http://unlicense.org
package org.litesoft.filesinksource;

import java.io.*;

import org.litesoft.commonfoundation.typeutils.*;
import org.litesoft.util.*;

public class FileSystemFileSinkAndSourceFactory extends FileSinkAndSourceFactory
{
    public static final String HANDLE_PREFIX = "F@";

    private String mDirectoryPath;

    public FileSystemFileSinkAndSourceFactory( String pDirectoryPath )
    {
        mDirectoryPath = pDirectoryPath.replace( '\\', '/' );
    }

    @Override
    protected FileSink LLcreateFileSink( String pName )
            throws IOException
    {
        return new OurFileSink( mDirectoryPath, pName );
    }

    @Override
    public FileSource createFileSource( String pOpaqueHandle )
            throws IOException
    {
        return new OurFileSource( mDirectoryPath, pOpaqueHandle );
    }

    private static class OurFileSink extends AbstractFileSink
    {
        private String mDirectoryPath;

        private OurFileSink( String pDirectoryPath, String pDesiredFileName )
        {
            super( pDesiredFileName );
            mDirectoryPath = pDirectoryPath;
        }

        @Override
        public String put( InputStream pInputStream )
                throws IOException
        {
            final File zFile = getAvailableName( pInputStream ); // Will close pInputStream if problem
            Utils.copy( pInputStream, new OutputStreamFactory() // closes pInputStream
            {
                @Override
                public OutputStream createOutputStream()
                        throws IOException
                {
                    return new FileOutputStream( zFile );
                }
            } );
            return new OpaqueHandle( mDirectoryPath, zFile.getName(), mDesiredFileName ).toString();
        }

        /**
         * Note: Closes pInputStream if Exception
         */
        private File getAvailableName( InputStream pInputStream )
                throws IOException
        {
            try
            {
                File zFile = getAvailableName( "" );
                for ( int i = 2; zFile == null; i++ )
                {
                    zFile = getAvailableName( "-" + i );
                }
                return zFile;
            }
            catch ( IOException e )
            {
                Utils.dispose( pInputStream );
                throw e;
            }
            catch ( RuntimeException e )
            {
                Utils.dispose( pInputStream );
                throw e;
            }
        }

        private File getAvailableName( String pSuffix )
                throws IOException
        {
            File zFile = new File( mDirectoryPath, mDesiredFileName + pSuffix );
            return zFile.createNewFile() ? zFile : null;
        }
    }

    private static class OurFileSource extends AbstractFileSource
    {
        private String mDirectoryPath;

        private OurFileSource( String pDirectoryPath, String pOpaqueHandle )
        {
            super( pOpaqueHandle );
            mDirectoryPath = pDirectoryPath;
        }

        @Override
        public FileSourceInfo get()
                throws IOException
        {
            OpaqueHandle zHandle = OpaqueHandle.parse( mOpaqueHandle );
            if ( (zHandle != null) && mDirectoryPath.equals( zHandle.getDirectoryPath() ) )
            {
                File zFile = new File( mDirectoryPath, zHandle.getLocalName() );
                if ( zFile.isFile() )
                {
                    return new OurFileSourceInfo( zFile, zHandle.getDesiredFileName() );
                }
                throw new FileNotFoundException( mOpaqueHandle + ": " + zFile );
            }
            throw new IllegalArgumentException( "OpaqueHandle? '" + mOpaqueHandle + "'" );
        }
    }

    private static class OurFileSourceInfo extends AbstractFileSourceInfo
    {
        private File mFile;

        private OurFileSourceInfo( File pFile, String pDesiredFileName )
        {
            super( pDesiredFileName );
            mFile = pFile;
        }

        @Override
        public long getSize()
        {
            return mFile.length();
        }

        @Override
        public InputStream getInputStream()
                throws IOException
        {
            return new FileInputStream( mFile );
        }
    }

    private static class OpaqueHandle extends AbstractOpaqueHandle
    {
        public static OpaqueHandle parse( String pOpaqueHandleToString )
        {
            String[] zParts = parse( HANDLE_PREFIX, pOpaqueHandleToString );
            return (zParts != null) ? parseOpaquePart( zParts[0], zParts[1] ) : null;
        }

        private static OpaqueHandle parseOpaquePart( String pOpaquePart, String pDesiredFileName )
        {
            int slashAt = pOpaquePart.lastIndexOf( '/' );
            if ( slashAt != -1 )
            {
                String zDirectoryPath = pOpaquePart.substring( 0, slashAt ).trim();
                String zLocalName = Strings.noEmpty( pOpaquePart.substring( slashAt + 1 ) );
                if ( zLocalName != null )
                {
                    return new OpaqueHandle( zDirectoryPath, zLocalName, pDesiredFileName );
                }
            }
            return null;
        }

        @Override
        public String toString()
        {
            return toString( HANDLE_PREFIX, mDirectoryPath + "/" + mLocalName );
        }

        private String mDirectoryPath, mLocalName;

        public OpaqueHandle( String pDirectoryPath, String pLocalName, String pDesiredFileName )
        {
            super( pDesiredFileName );
            mDirectoryPath = pDirectoryPath;
            mLocalName = pLocalName;
        }

        public String getDirectoryPath()
        {
            return mDirectoryPath;
        }

        public String getLocalName()
        {
            return mLocalName;
        }
    }
}

Commits for litesoft/trunk/Java/core/Server/src/org/litesoft/filesinksource/FileSystemFileSinkAndSourceFactory.java

Diff revisions: vs.
Revision Author Commited Message
947 Diff Diff GeorgeS picture GeorgeS Fri 06 Jun, 2014 23:36:56 +0000

Correct Spelling of package!

939 Diff Diff GeorgeS picture GeorgeS Mon 02 Jun, 2014 21:30:31 +0000

Extracting commonfoundation

801 Diff Diff GeorgeS picture GeorgeS Wed 15 Aug, 2012 03:59:02 +0000
151 Diff Diff GeorgeS picture GeorgeS Thu 17 Mar, 2011 04:16:22 +0000
49 Diff Diff GeorgeS picture GeorgeS Mon 12 Apr, 2010 02:59:10 +0000

License Text

24 Diff Diff GeorgeS picture GeorgeS Wed 24 Feb, 2010 01:51:38 +0000
2 GeorgeS picture GeorgeS Sun 07 Feb, 2010 12:50:58 +0000