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
package org.litesoft.filesinksource;

import org.litesoft.util.*;

import java.io.*;

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;
        }

        public String put( InputStream pInputStream ) throws IOException
        {
            final File zFile = getAvailableName( pInputStream ); // Will close pInputStream if problem
            Utils.copy( pInputStream, new OutputStreamFactory() // closes pInputStream 
            {
                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;
        }

        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;
        }

        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 = Utils.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
2 GeorgeS picture GeorgeS Sun 07 Feb, 2010 12:50:58 +0000