package org.gcube.data.access.storagehub; import jakarta.inject.Singleton; import javax.jcr.Repository; import javax.jcr.SimpleCredentials; import javax.naming.Context; import javax.naming.InitialContext; import org.apache.jackrabbit.api.JackrabbitRepository; import org.apache.jackrabbit.api.JackrabbitSession; import org.gcube.data.access.storagehub.services.RepositoryInitializer; import org.gcube.data.access.storagehub.services.admin.InitScript; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Singleton public class RepositoryInitializerImpl implements RepositoryInitializer{ private static Logger log = LoggerFactory.getLogger(RepositoryInitializerImpl.class); private static RepositoryInitializer instance = new RepositoryInitializerImpl(); public static RepositoryInitializer get(){ return instance; } private Repository repository; private boolean jackrabbitInitialized = false; @Override public Repository getRepository(){ return repository; } protected RepositoryInitializerImpl(){ try { InitialContext context = new InitialContext(); Context environment = (Context) context.lookup("java:comp/env"); repository = (Repository) environment.lookup("jcr/repository"); }catch (Throwable e) { log.error("error initializing repository", e); throw new RuntimeException("error initializing repository",e); } } public void shutdown() { ((JackrabbitRepository)repository).shutdown(); } @Override public synchronized void initContainerAtFirstStart(SimpleCredentials credentials) { try { log.info("credential are {} {}",credentials.getUserID(), new String(credentials.getPassword())); JackrabbitSession ses = (JackrabbitSession) repository.login(credentials); try { boolean notAlreadyDone = !jackrabbitInitialized && !ses.getRootNode().hasNode("Home"); if (notAlreadyDone) new InitScript().init(ses); else log.info("jackrabbit is already initialized"); }finally { ses.logout(); } } catch (Exception e) { log.warn("error initialising Jackrabbit",e); } jackrabbitInitialized = true; } }