/* * 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. * You may obtain a copy of the License at * * 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.uberfire.backend.server; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import javax.inject.Named; import com.thoughtworks.xstream.XStream; import org.jboss.errai.bus.server.annotations.Service; import org.uberfire.commons.cluster.ClusterServiceFactory; import org.uberfire.io.IOService; import org.uberfire.java.nio.IOException; import org.uberfire.java.nio.file.FileVisitResult; import org.uberfire.java.nio.file.NoSuchFileException; import org.uberfire.java.nio.file.Path; import org.uberfire.java.nio.file.SimpleFileVisitor; import org.uberfire.java.nio.file.StandardDeleteOption; import org.uberfire.java.nio.file.attribute.BasicFileAttributes; import org.uberfire.workbench.model.PerspectiveDefinition; import org.uberfire.workbench.model.SplashScreenFilter; import org.uberfire.workbench.services.WorkbenchServices; import static org.uberfire.commons.validation.PortablePreconditions.checkNotNull; import static org.uberfire.java.nio.file.Files.walkFileTree; @Service @ApplicationScoped public class WorkbenchServicesImpl implements WorkbenchServices { public static final String PERSPECTIVE_EXTENSION = ".perspective"; private final XStream xs = new XStream(); @Inject @Named("configIO") private IOService ioService; @Inject private UserServicesImpl userServices; @Inject @Named("clusterServiceFactory") private ClusterServiceFactory clusterServiceFactory; @Override public void save(final String perspectiveId, final PerspectiveDefinition perspective) { final String xml = xs.toXML(perspective); final Path perspectivePath = userServices.buildPath("perspectives", perspectiveId + PERSPECTIVE_EXTENSION); try { ioService.startBatch(perspectivePath.getFileSystem()); ioService.write(perspectivePath, xml); } finally { ioService.endBatch(); } } @Override public void save(SplashScreenFilter splashFilter) { final String xml = xs.toXML(splashFilter); final Path splashFilterPath = userServices.buildPath("splash", splashFilter.getName() + ".filter"); try { ioService.startBatch(splashFilterPath.getFileSystem()); ioService.write(splashFilterPath, xml); } finally { ioService.endBatch(); } } @Override public PerspectiveDefinition loadPerspective(final String perspectiveName) { final Path perspectivePath = userServices.buildPath("perspectives", perspectiveName + PERSPECTIVE_EXTENSION); if (ioService.exists(perspectivePath)) { final String xml = ioService.readAllString(perspectivePath); return (PerspectiveDefinition) xs.fromXML(xml); } return null; } @Override public Set<PerspectiveDefinition> loadPerspectives() { final Set<PerspectiveDefinition> result = new HashSet<PerspectiveDefinition>(); final Path perspectivesPath = userServices.buildPath("perspectives"); if (ioService.exists(perspectivesPath)) { walkFileTree(perspectivesPath, new SimpleFileVisitor<Path>() { public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs) throws IOException { try { checkNotNull("file", file); checkNotNull("attrs", attrs); String fileName = file.getFileName().toString(); if (fileName.endsWith(PERSPECTIVE_EXTENSION) && attrs.isRegularFile()) { String perspectiveName = fileName.substring(0, fileName.indexOf(PERSPECTIVE_EXTENSION)); PerspectiveDefinition def = loadPerspective(perspectiveName); if (def != null) { result.add(def); } } } catch (final Exception ex) { return FileVisitResult.TERMINATE; } return FileVisitResult.CONTINUE; } }); } return result; } @Override public void removePerspectiveState(final String perspectiveId) { final Path perspectivePath = userServices.buildPath("perspectives", perspectiveId + ".perspective"); if (ioService.exists(perspectivePath)) { ioService.delete(perspectivePath); } } @Override public void removePerspectiveStates() { final Path perspectivesPath = userServices.buildPath("perspectives"); if (ioService.exists(perspectivesPath)) { try { ioService.startBatch(perspectivesPath.getFileSystem()); ioService.delete(perspectivesPath, StandardDeleteOption.NON_EMPTY_DIRECTORIES); } finally { ioService.endBatch(); } } } @Override public SplashScreenFilter loadSplashScreenFilter(String filterName) { final Path splashFilterPath = userServices.buildPath("splash", filterName + ".filter"); if (ioService.exists(splashFilterPath)) { final String xml = ioService.readAllString(splashFilterPath); return (SplashScreenFilter) xs.fromXML(xml); } return null; } @Override public Map<String, String> loadDefaultEditorsMap() { final Map<String, String> map = new HashMap<String, String>(); try { final Path path = getPathToDefaultEditors(); if (ioService.exists(path)) { for (String line : ioService.readAllLines(path)) { if (!line.trim().startsWith("#")) { String[] split = line.split("="); map.put(split[0], split[1]); } } } return map; } catch (final NoSuchFileException e) { e.printStackTrace(); return map; } } @Override public void saveDefaultEditors(final Map<String, String> properties) { final StringBuilder text = new StringBuilder(); for (String key : properties.keySet()) { text.append(String.format("%s=%s", key, properties.get(key))); } final Path path = getPathToDefaultEditors(); try { ioService.startBatch(path.getFileSystem()); ioService.write(path, text.toString()); } finally { ioService.endBatch(); } } @Override public boolean isWorkbenchOnCluster() { return clusterServiceFactory != null; } private Path getPathToDefaultEditors() { return userServices.buildPath("defaultEditors", null); } }