/*
 * JBoss, Home of Professional Open Source.
 * Copyright 2015, Red Hat, Inc., and individual contributors
 * as indicated by the @author tags. See the copyright.txt file in the
 * distribution for a full listing of individual contributors.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */

package org.jboss.as.clustering.infinispan.subsystem;

import static org.jboss.as.clustering.infinispan.subsystem.FileStoreResourceDefinition.Attribute.RELATIVE_PATH;
import static org.jboss.as.clustering.infinispan.subsystem.FileStoreResourceDefinition.Attribute.RELATIVE_TO;

import java.io.File;

import org.infinispan.configuration.cache.SingleFileStoreConfiguration;
import org.infinispan.configuration.cache.SingleFileStoreConfigurationBuilder;
import org.jboss.as.clustering.controller.CommonRequirement;
import org.jboss.as.controller.OperationContext;
import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.PathAddress;
import org.jboss.as.controller.services.path.PathManager;
import org.jboss.dmr.ModelNode;
import org.jboss.msc.service.ServiceBuilder;
import org.wildfly.clustering.service.ServiceConfigurator;
import org.wildfly.clustering.service.ServiceSupplierDependency;
import org.wildfly.clustering.service.SupplierDependency;

/**
 * @author Paul Ferraro
 */
public class FileStoreServiceConfigurator extends StoreServiceConfigurator<SingleFileStoreConfiguration, SingleFileStoreConfigurationBuilder> {

    private final String containerName;

    private volatile SupplierDependency<PathManager> pathManager;
    private volatile String relativePath;
    private volatile String relativeTo;

    FileStoreServiceConfigurator(PathAddress address) {
        super(address, SingleFileStoreConfigurationBuilder.class);
        this.containerName = address.getParent().getParent().getLastElement().getValue();
    }

    @Override
    public <T> ServiceBuilder<T> register(ServiceBuilder<T> builder) {
        return super.register(this.pathManager.register(builder));
    }

    @Override
    public ServiceConfigurator configure(OperationContext context, ModelNode model) throws OperationFailedException {
        this.pathManager = new ServiceSupplierDependency<>(CommonRequirement.PATH_MANAGER.getServiceName(context));
        this.relativePath = RELATIVE_PATH.resolveModelAttribute(context, model).asString(InfinispanExtension.SUBSYSTEM_NAME + File.separatorChar + this.containerName);
        this.relativeTo = RELATIVE_TO.resolveModelAttribute(context, model).asString();
        return super.configure(context, model);
    }

    @Override
    public void accept(SingleFileStoreConfigurationBuilder builder) {
        builder.segmented(false)
                .location(this.pathManager.get().resolveRelativePathEntry(this.relativePath, this.relativeTo))
                ;
    }
}

@@ -1331,32 +1331,49 @@
  org.infinispan.
+persistence.sifs.
 configuration.ca
@@ -1366,36 +1366,33 @@
 nfiguration.
-cache.Single
+SoftIndex
 FileStoreCon
@@ -1425,16 +1425,33 @@
 inispan.
+persistence.sifs.
 configur
@@ -1460,20 +1460,17 @@
 ion.
-cache.Single
+SoftIndex
 File
@@ -1761,24 +1761,70 @@
 athManager;%0A
+import org.jboss.as.server.ServerEnvironment;%0A
 import org.j
@@ -1880,32 +1880,62 @@
 ServiceBuilder;%0A
+import org.jgroups.util.UUID;%0A
 import org.wildf
@@ -2209,21 +2209,24 @@
 urator%3CS
-ingle
+oftIndex
 FileStor
@@ -2242,21 +2242,24 @@
 ation, S
-ingle
+oftIndex
 FileStor
@@ -2472,16 +2472,65 @@
 ativeTo;
+%0A    private volatile String serverTempDirectory;
 %0A%0A    Fi
@@ -2603,21 +2603,24 @@
 dress, S
-ingle
+oftIndex
 FileStor
@@ -3405,24 +3405,148 @@
 asString();%0A
+        this.serverTempDirectory = context.resolveExpressions(new ModelNode(ServerEnvironment.SERVER_TEMP_DIR)).asString();%0A
         retu
@@ -3630,13 +3630,16 @@
 pt(S
-ingle
+oftIndex
 File
@@ -3705,12 +3705,11 @@
 ted(
-fals
+tru
 e)%0A 
@@ -3724,17 +3724,21 @@
        .
-l
+dataL
 ocation(
@@ -3822,16 +3822,311 @@
 iveTo))%0A
+                // Store index in server temp directory with unique path - to ensure index is rebuilt across restarts%0A                .indexLocation(this.pathManager.get().resolveRelativePathEntry(this.relativePath + File.separatorChar + UUID.randomUUID().toString(), this.serverTempDirectory))%0A
         

Replace deprecated SingleFileStore with SIFS.