Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.file / org.gvsig.fmap.dal.file.dbf / src / main / java / org / gvsig / fmap / dal / store / dbf / DBFFilesystemServerProvider.java @ 40435

History | View | Annotate | Download (5.43 KB)

1
package org.gvsig.fmap.dal.store.dbf;
2

    
3
import java.io.File;
4
import java.io.IOException;
5

    
6
import org.gvsig.fmap.dal.DALLocator;
7
import org.gvsig.fmap.dal.DataManager;
8
import org.gvsig.fmap.dal.DataServerExplorer;
9
import org.gvsig.fmap.dal.DataStoreParameters;
10
import org.gvsig.fmap.dal.NewDataStoreParameters;
11
import org.gvsig.fmap.dal.exception.CreateException;
12
import org.gvsig.fmap.dal.exception.DataException;
13
import org.gvsig.fmap.dal.exception.FileNotFoundException;
14
import org.gvsig.fmap.dal.exception.InitializeException;
15
import org.gvsig.fmap.dal.exception.RemoveException;
16
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
17
import org.gvsig.fmap.dal.resource.ResourceAction;
18
import org.gvsig.fmap.dal.resource.exception.ResourceExecuteException;
19
import org.gvsig.fmap.dal.resource.file.FileResource;
20
import org.gvsig.fmap.dal.resource.spi.ResourceConsumer;
21
import org.gvsig.fmap.dal.resource.spi.ResourceProvider;
22
import org.gvsig.fmap.dal.serverexplorer.filesystem.AbsolutePathRequiredException;
23
import org.gvsig.fmap.dal.serverexplorer.filesystem.impl.AbstractFilesystemServerExplorerProvider;
24
import org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProvider;
25
import org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProviderServices;
26

    
27
public class DBFFilesystemServerProvider extends AbstractFilesystemServerExplorerProvider 
28
        implements FilesystemServerExplorerProvider, ResourceConsumer {
29

    
30
        protected FilesystemServerExplorerProviderServices serverExplorer;
31

    
32
        public String getDataStoreProviderName() {
33
                return DBFStoreProvider.NAME;
34
        }
35

    
36
        public int getMode() {
37
                return DataServerExplorer.MODE_FEATURE;
38
        }
39

    
40
        public boolean accept(File pathname) {
41
                return (pathname.getName().toLowerCase().endsWith(".dbf"));
42
        }
43

    
44
        public String getDescription() {
45
                return DBFStoreProvider.DESCRIPTION;
46
        }
47

    
48
        public DataStoreParameters getParameters(File file) throws DataException {
49
                DataManager manager = DALLocator.getDataManager();
50
                DBFStoreParameters params = (DBFStoreParameters) manager
51
                                .createStoreParameters(this.getDataStoreProviderName());
52
                params.setDBFFile(file.getPath());
53
                return params;
54
        }
55

    
56
        public boolean canCreate() {
57
                return true;
58
        }
59

    
60
        public boolean canCreate(NewDataStoreParameters parameters) {
61
                DBFNewStoreParameters params = (DBFNewStoreParameters) parameters;
62
                if (params.getDBFFile().getParentFile().canWrite()) {
63
                        return false;
64
                }
65
                if (params.getDBFFile().exists()) {
66
                        if (!params.getDBFFile().canWrite()) {
67
                                return false;
68
                        }
69
                }
70
                if (params.getDefaultFeatureType() == null) {
71
                        return false;
72
                }
73
                return true;
74
        }
75

    
76
        public void create(NewDataStoreParameters parameters, boolean overwrite)
77
                        throws CreateException {
78

    
79
                final DBFNewStoreParameters params = (DBFNewStoreParameters) parameters;
80
                File file = params.getDBFFile();
81
                
82
                if (!file.isAbsolute()) {
83
                        throw new AbsolutePathRequiredException(file.getPath());
84
                }
85

    
86

    
87
                if (file.exists()) {
88
                        if (overwrite) {
89
//                                if (!file.delete()) {
90
//                                        throw new CreateException(this.getDataStoreProviderName(),
91
//                                                        new IOException(
92
//                                                        "cannot delete file"));
93
//                                }
94
                        } else {
95
                                throw new CreateException(this.getDataStoreProviderName(),
96
                                                new IOException(
97
                                                "file already exist"));
98
                        }
99
                }
100

    
101
                final FileResource resource;
102
                try {
103

    
104
                        resource = (FileResource) this.serverExplorer
105
                                        .getServerExplorerProviderServices().createResource(
106
                                                        FileResource.NAME,
107
                                        new Object[] { file.getAbsolutePath() });
108
                } catch (InitializeException e1) {
109
                        throw new CreateException(params.getDBFFileName(), e1);
110
                }
111
                resource.addConsumer(this);
112

    
113
                try {
114
                        resource.execute(new ResourceAction() {
115
                                public Object run() throws Exception {
116
                                        DBFFeatureWriter writer =
117
                                                        new DBFFeatureWriter(getDataStoreProviderName());
118

    
119
                                        writer.begin(params, params.getDefaultFeatureType(), 0);
120
                                        writer.end();
121
                                        writer.dispose();
122
                                        resource.notifyChanges();
123
                                        return null;
124
                                }
125
                        });
126
                } catch (ResourceExecuteException e) {
127
                        throw new CreateException(this.getDataStoreProviderName(), e);
128
                } finally {
129
                        resource.removeConsumer(this);
130
                }
131

    
132

    
133
        }
134

    
135

    
136
        protected NewDataStoreParameters createInstanceNewDataStoreParameters() {
137
                return new DBFNewStoreParameters();
138
        }
139

    
140

    
141
        public NewDataStoreParameters getCreateParameters() {
142
                NewFeatureStoreParameters params = (NewFeatureStoreParameters) this
143
                                .createInstanceNewDataStoreParameters();
144
                params.setDefaultFeatureType(this.serverExplorer
145
                                .getServerExplorerProviderServices().createNewFeatureType());
146
                return params;
147
        }
148

    
149
        public void initialize(FilesystemServerExplorerProviderServices serverExplorer) {
150
                this.serverExplorer = serverExplorer;
151

    
152
        }
153

    
154
        public void remove(DataStoreParameters parameters) throws RemoveException {
155
                DBFStoreParameters params = (DBFStoreParameters) parameters;
156
                File file = params.getDBFFile();
157
                if (!file.exists()) {
158
                        throw new RemoveException(this.getDataStoreProviderName(),
159
                                        new FileNotFoundException(params.getDBFFile()));
160
                }
161
                if (!file.delete()) {
162
                        throw new RemoveException(this.getDataStoreProviderName(),
163
                                        new IOException()); // FIXME Exception
164
                }
165
        }
166

    
167
        public boolean closeResourceRequested(ResourceProvider resource) {
168
                // while it is using a resource anyone can't close it
169
                return !(this.equals(resource));
170
        }
171

    
172
        /*
173
         * (non-Javadoc)
174
         *
175
         * @see
176
         * org.gvsig.fmap.dal.resource.spi.ResourceConsumer#resourceChanged(org.
177
         * gvsig.fmap.dal.resource.spi.ResourceProvider)
178
         */
179
        public void resourceChanged(ResourceProvider resource) {
180
                // Do nothing
181
        }
182

    
183
}