Package: LocalCopyFileSystemProvider
LocalCopyFileSystemProvider
name | instruction | branch | complexity | line | method | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
LocalCopyFileSystemProvider() |
|
|
|
|
|
||||||||||||||||||||
copyFolder(ResourceFile, ResourceFile) |
|
|
|
|
|
||||||||||||||||||||
emptyFolder(ResourceFile) |
|
|
|
|
|
||||||||||||||||||||
generateLocalFileSystem() |
|
|
|
|
|
||||||||||||||||||||
getFileSystem() |
|
|
|
|
|
||||||||||||||||||||
initialize() |
|
|
|
|
|
||||||||||||||||||||
static {...} |
|
|
|
|
|
Coverage
1: /*
2: * *************************************************************************************************************************************************************
3: *
4: * NorthernWind - lightweight CMS
5: * http://tidalwave.it/projects/northernwind
6: *
7: * Copyright (C) 2011 - 2025 Tidalwave s.a.s. (http://tidalwave.it)
8: *
9: * *************************************************************************************************************************************************************
10: *
11: * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
12: * You may obtain a copy of the License at
13: *
14: * http://www.apache.org/licenses/LICENSE-2.0
15: *
16: * 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
17: * CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
18: *
19: * *************************************************************************************************************************************************************
20: *
21: * git clone https://bitbucket.org/tidalwave/northernwind-src
22: * git clone https://github.com/tidalwave-it/northernwind-src
23: *
24: * *************************************************************************************************************************************************************
25: */
26: package it.tidalwave.northernwind.frontend.filesystem.basic;
27:
28: import javax.annotation.Nonnull;
29: import javax.annotation.PostConstruct;
30: import javax.inject.Inject;
31: import javax.inject.Named;
32: import java.time.ZonedDateTime;
33: import java.io.File;
34: import java.io.IOException;
35: import it.tidalwave.messagebus.MessageBus;
36: import it.tidalwave.messagebus.MessageBus.Listener;
37: import it.tidalwave.northernwind.core.model.ResourceFile;
38: import it.tidalwave.northernwind.core.model.ResourceFileSystem;
39: import it.tidalwave.northernwind.core.model.ResourceFileSystemChangedEvent;
40: import it.tidalwave.northernwind.core.model.ResourceFileSystemProvider;
41: import lombok.Getter;
42: import lombok.Setter;
43: import lombok.ToString;
44: import lombok.extern.slf4j.Slf4j;
45:
46: /***************************************************************************************************************************************************************
47: *
48: * A provider for the {@link ResourceFileSystemProvider} that clones a source provider into a local
49: * {@code ResourceFileSystemProvider} for performance purposes...
50: *
51: * @author Fabrizio Giudici
52: *
53: **************************************************************************************************************************************************************/
54: @Slf4j @ToString(of = "rootPath")
55: public class LocalCopyFileSystemProvider implements ResourceFileSystemProvider
56: {
57: @Getter @Setter @Nonnull
58: private ResourceFileSystemProvider sourceProvider;
59:
60: @Getter @Setter @Nonnull
61: private String rootPath = "";
62:
63: private LocalFileSystemProvider targetProvider = new LocalFileSystemProvider();
64:
65: @Inject @Named("applicationMessageBus")
66: private MessageBus messageBus;
67:
68: /***********************************************************************************************************************************************************
69: *
70: **********************************************************************************************************************************************************/
71: private final Listener<ResourceFileSystemChangedEvent> sourceProviderChangeListener =
72: new Listener<>()
73: {
74: @Override
75: public void notify (@Nonnull final ResourceFileSystemChangedEvent event)
76: {
77: if (event.getFileSystemProvider() == sourceProvider)
78: {
79: try
80: {
81: log.info("Detected file change, regenerating local file system...");
82: generateLocalFileSystem();
83: messageBus.publish(new ResourceFileSystemChangedEvent(LocalCopyFileSystemProvider.this,
84: ZonedDateTime.now()));
85: }
86: catch (IOException e)
87: {
88: log.error("While resetting site: ", e);
89: }
90: }
91: }
92: };
93:
94: /***********************************************************************************************************************************************************
95: * {@inheritDoc}
96: **********************************************************************************************************************************************************/
97: @Override @Nonnull
98: public synchronized ResourceFileSystem getFileSystem()
99: throws IOException
100: {
101: return targetProvider.getFileSystem();
102: }
103:
104: /***********************************************************************************************************************************************************
105: *
106: **********************************************************************************************************************************************************/
107: @PostConstruct
108: /* package */ void initialize()
109: throws IOException
110: {
111: log.info("initialize()");
112: generateLocalFileSystem();
113: messageBus.subscribe(ResourceFileSystemChangedEvent.class, sourceProviderChangeListener);
114: }
115:
116: /***********************************************************************************************************************************************************
117: *
118: **********************************************************************************************************************************************************/
119: private void generateLocalFileSystem()
120: throws IOException
121: {
122: log.info("generateLocalFileSystem()");
123:
124:• if (!new File(rootPath).mkdirs()) // TODO: use NwFileSystem API
125: {
126: throw new IOException("Cannot create dirs for " + rootPath);
127: }
128:
129: // FIXME: shouldn't be needed, but otherwise after a second call to this method won't find files
130: targetProvider = new LocalFileSystemProvider();
131: targetProvider.setRootPath(rootPath);
132: final var targetRoot = targetProvider.getFileSystem().getRoot();
133: final var path = targetRoot.toFile().getAbsolutePath();
134: log.info(">>>> scratching {} ...", path);
135: emptyFolder(targetRoot);
136: log.info(">>>> copying files to {} ...", path);
137: copyFolder(sourceProvider.getFileSystem().getRoot(), targetRoot);
138: // targetProvider.getFileSystem().refresh(true);
139: }
140:
141: /***********************************************************************************************************************************************************
142: *
143: **********************************************************************************************************************************************************/
144: private static void emptyFolder (@Nonnull final ResourceFile folder)
145: throws IOException
146: {
147: log.trace("emptyFolder({}", folder);
148:
149:• for (final var child : folder.findChildren().results())
150: {
151: child.delete();
152: }
153: }
154:
155: /***********************************************************************************************************************************************************
156: *
157: **********************************************************************************************************************************************************/
158: private static void copyFolder (@Nonnull final ResourceFile sourceFolder, @Nonnull final ResourceFile targetFolder)
159: throws IOException
160: {
161: log.trace("copyFolder({}, {}", sourceFolder, targetFolder);
162:
163:• for (final var sourceChild : sourceFolder.findChildren().results())
164: {
165:• if (!sourceChild.isFolder())
166: {
167: log.trace(">>>> copying {} into {} ...", sourceChild, targetFolder);
168: sourceChild.copyTo(targetFolder);
169: }
170: }
171:
172:• for (final var sourceChild : sourceFolder.findChildren().results())
173: {
174:• if (sourceChild.isFolder())
175: {
176: copyFolder(sourceChild, targetFolder.createFolder(sourceChild.getName()));
177: }
178: }
179: }
180: }