package org.onehippo.forge.konakart.common.engine; import com.konakartadmin.app.AdminEngineConfig; import com.konakartadmin.app.KKAdminException; import com.konakartadmin.appif.KKAdminIf; import com.konakartadmin.bl.AdminMgrFactory; import com.konakartadmin.ws.KKAdminEngineMgr; import org.onehippo.forge.konakart.common.jcr.HippoModuleConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.jcr.Session; public class KKAdminEngine { public static final Logger log = LoggerFactory.getLogger(KKAdminEngine.class); private static final String KONAKART_PROPERTIES = "konakart.properties"; /** * engClassName - Name of the engine to use */ private static final String ENG_CLASS_NAME = "com.konakartadmin.bl.KKAdmin"; public static final ThreadLocal<KKAdminEngine> adminEngineThreadLocal = new ThreadLocal<KKAdminEngine>(); private KKAdminEngineConfig adminEngineConfig; private KKAdminIf kkAdminEng; private boolean isEnterprise; private String session; protected KKAdminEngine() { } /** * @return true if we are in Enterprise Mode */ public boolean isEnterprise() { try { return kkAdminEng.getEngConf().getEngineId().equals("E"); } catch (KKAdminException e) { return false; } } /** * @return true if we are in multistore Mode */ public boolean isMultiStore() { return adminEngineConfig.getEngineMode() > 0; } /** * @return an helper class used to access to the administration functions */ @Nonnull public AdminMgrFactory getFactory() { return new AdminMgrFactory(getEngine()); } /** * @return true if the KKAdminEngine has been initialized, false otherwise. */ public static boolean isInitialized() { KKAdminEngine kkAdminEngine = adminEngineThreadLocal.get(); return kkAdminEngine != null; } /** * @return an helper class used to access to the administration functions */ @Nonnull public static KKAdminEngine getInstance() { KKAdminEngine kkAdminEngine = adminEngineThreadLocal.get(); if (kkAdminEngine == null) { throw new IllegalArgumentException("KKAdminEngine should not be null. This engine has not been initialized."); } return adminEngineThreadLocal.get(); } /** * @return the Konakart Admin client */ @Nullable public KKAdminIf getEngine() { boolean reconnect; try { int sessionId = kkAdminEng.checkSession(session); reconnect = sessionId == -1; } catch (KKAdminException e) { reconnect = true; } if (reconnect) { if (adminEngineConfig != null) { // Login try { login(); } catch (KKAdminException e) { log.error("Failed to check the state of the Konakart admin connection", e); throw new IllegalStateException("Failed to check the state of the Konakart admin connection.", e); } } else { log.error("Failed to log-in using the admin client."); throw new IllegalStateException("Failed to log-in using the admin client."); } } return kkAdminEng; } /** * @return the session */ public String getSession() { return session; } /** * Configure the Engine Config * * @param session the Jcr Session */ public static void init(@Nonnull Session session) { KKAdminEngine kkAdminEngine = adminEngineThreadLocal.get(); if (kkAdminEngine == null) { kkAdminEngine = new KKAdminEngine(); kkAdminEngine.internalInit(session); adminEngineThreadLocal.set(kkAdminEngine); } } /** * Initialize internal init. * * @param session the JCR Session */ private void internalInit(@Nonnull Session session) { // Retrieve the global admin engine. adminEngineConfig = HippoModuleConfig.getConfig().getAdminEngineConfig(session); // Initialize the admin engine init(); adminEngineThreadLocal.set(this); } /** * Configure the Engine Config */ private void init() { KKAdminEngineMgr kkAdminEngMgr = new KKAdminEngineMgr(); AdminEngineConfig adEngConf = new AdminEngineConfig(); adEngConf.setMode(adminEngineConfig.getEngineMode()); // adEngConf.setStoreId(adminEngineConfig.getStoreId()); // adEngConf.setCustomersShared(adminEngineConfig.isCustomersShared()); adEngConf.setProductsShared(adminEngineConfig.isProductsShared()); adEngConf.setCategoriesShared(adminEngineConfig.isCategoriesShared()); adEngConf.setPropertiesFileName(KONAKART_PROPERTIES); /* * This creates a KonaKart Admin Engine by name using the constructor that requires an * AdminEngineConfig object. This is the recommended approach. */ try { kkAdminEng = kkAdminEngMgr.getKKAdminByName(ENG_CLASS_NAME, adEngConf); } catch (Exception e) { throw new RuntimeException("Failed to initialize the Konakart Admin Engine", e); } } /** * Create a connection using the admin client * * @throws KKAdminException if the login failed. */ protected void login() throws KKAdminException { // login session = kkAdminEng.login(adminEngineConfig.getUsername(), adminEngineConfig.getPassword()); } }