package org.onehippo.forge.konakart.common.jcr; import com.google.common.collect.Maps; import org.onehippo.forge.konakart.common.KKCndConstants; import org.onehippo.forge.konakart.common.engine.*; import org.onehippo.forge.utilities.commons.NodeUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.jcr.*; import java.util.Map; public class HippoModuleConfig { public static final Logger log = LoggerFactory.getLogger(HippoModuleConfig.class); public static final String SYNC_CONFIG_NODE_PATH = "/hippo:configuration/hippo:frontend/cms/cms-services/KonakartSynchronizationService"; public static final String DEFAULT_PRODUCT_FOLDER_PROPERTY = "default.product.folder"; public static final String DEFAULT_PRODUCT_FACTORY_CLASS_NAME_PROPERTY = "default.product.factory.class"; public static final String DEFAULT_SYNC_CRON_EXPRESSION_PROPERTY = "default.sync.cronexpression"; public static final String DEFAULT_SYNC_JOB_CLASS_PROPERTY = "default.sync.job.class"; public static final String STORES_PROPERTY = "stores"; public static final String DEVELOPMENT_MODE = "developper.mode"; public static final String KONAKART_KONAKART_PATH = "/konakart:konakart"; public static final String KONAKART_STORES_PATH = KONAKART_KONAKART_PATH + "/konakart:stores"; public static final String KONAKART_PRODUCT_TYPE_NAMESPACES_PATH = KONAKART_KONAKART_PATH + "/konakart:producttypenamespaces"; public static final String STORE_CONTENT_ROOT_PROPERTY = "konakart:contentroot"; public static final String STORE_GALLERY_ROOT_PROPERTY = "konakart:galleryroot"; public static final String STORE_STORE_ID_PROPERTY = "konakart:storeid"; public static final String STORE_CATALOG_ID_PROPERTY = "konakart:catalogid"; public static final String STORE_LOCALE = "konakart:locale"; public static final String STORE_IMAGE_BASE_PATH_PROPERTY = "konakart:externalImageBasePath"; public static final String STORE_SECURITY_CUSTOMER_GROUPS_PROPERTY = "konakart:securitycustomergroups"; public static final String SYNC_NODE_PATH = "konakart:sync"; public static final String SYNC_PRODUCT_FOLDER_PROPERTY = "konakart:productfolder"; public static final String SYNC_JOB_CLASS = "konakart:jobclass"; public static final String SYNC_CRON_EXPRESSION = "konakart:synchronizationcronexpression"; public static final String SYNC_LAST_UPDATED_TIME_KONAKART_TO_REPOSITORY = "konakart:lastupdatedtimekonakarttorepository"; public static final String SYNC_LAST_UPDATED_TIME_REPOSITORY_TO_KONNAKART = "konakart:lastupdatedtimerepositorytokonnakart"; public static final String KONAKART_CHECKOUT_PATH = KONAKART_KONAKART_PATH + "/konakart:checkout"; public static final String KONAKART_PROCESSOR = "konakart:processor"; public static final String KONAKART_ACTIVITIES = "konakart:activities"; public static final String KONAKART_ACTIVITY_CLASS = "konakart:class"; public static final String KONAKART_ACTIVITY_ACCEPT_EMPTY_STATE = "konakart:acceptEmptyState"; public static final String KONAKART_ACTIVITY_ACCEPT_STATE = "konakart:acceptState"; public static final String KONAKART_ACTIVITY_NEXT_NON_LOGGED_STATE = "konakart:nextNonLoggedState"; public static final String KONAKART_ACTIVITY_NEXT_LOGGED_STATE = "konakart:nextLoggedState"; public static final String KONAKART_ACTIVITY_TEMPLATE_RENDER_PATH = "konakart:templateRenderpath"; private static HippoModuleConfig config = new HippoModuleConfig(); private KKAdminEngineConfig adminEngineConfig = new KKAdminEngineConfig(); private KKClientEngineConfig clientEngineConfig = new KKClientEngineConfig(); /** * Mapping between a contentRoot and a storeConfig */ private Map<String, KKStoreConfig> storesConfig = Maps.newHashMap(); /** * Contains the checkout process. */ private KKCheckoutConfig checkoutConfig = new KKCheckoutConfig(); /** * @return the config class */ public static HippoModuleConfig getConfig() { return config; } public Map<String, KKStoreConfig> getStoresConfig() { return storesConfig; } public KKStoreConfig getStoreConfigByName(Session session, String storeName) throws RepositoryException { KKStoreConfig kkStoreConfig = new KKStoreConfig(); loadStoreConfigByName(session, storeName, kkStoreConfig); return kkStoreConfig; } /** * @return the admin engine config. */ public KKAdminEngineConfig getAdminEngineConfig(Session session) { adminEngineConfig.loadAdminEngineConfiguration(session); return adminEngineConfig; } /** * @return the client engine config. */ public KKClientEngineConfig getClientEngineConfig(Session session) { clientEngineConfig.loadClientEngineConfiguration(session); return clientEngineConfig; } /** * @return the engine config. */ public KKClientEngineConfig getClientEngineConfig() { return clientEngineConfig; } /** * @return the checkout process config */ public KKCheckoutConfig getCheckoutConfig() { return checkoutConfig; } /** * @param session a JCR session */ public static void load(Session session) { if (session == null) { log.error("Failed to load the Konakart config. JCR Session is null"); throw new RuntimeException("Failed to load the Konakart config. JCR Session is null"); } // load configuration config.loadProductTypeNamespaces(session); config.loadStoresConfiguration(session); } /** * Initialize the mapping between a Konakart product id and the Hippo document namespace * * @param session the Jcr session */ private void loadProductTypeNamespaces(Session session) { try { Node node = session.getNode(KONAKART_PRODUCT_TYPE_NAMESPACES_PATH); KKCndConstants.PRODUCT_TYPE[] product_types = KKCndConstants.PRODUCT_TYPE.values(); for (KKCndConstants.PRODUCT_TYPE product_type : product_types) { if (node.hasProperty(product_type.getNamespace())) { clientEngineConfig.addProductNodeTypeMapping(product_type.getNamespace(), node.getProperty(product_type.getNamespace()).getString()); } } } catch (RepositoryException e) { log.error("Failed to load Product Type Namespaces mapping: " + e.toString()); } } private void loadStoresConfiguration(Session session) { try { Node syncConfigNode = session.getNode(SYNC_CONFIG_NODE_PATH); if (syncConfigNode.hasProperty(STORES_PROPERTY)) { Property storesProperty = syncConfigNode.getProperty(STORES_PROPERTY); Value[] storesName = storesProperty.getValues(); for (Value storeName : storesName) { KKStoreConfig kkStoreConfig = new KKStoreConfig(); kkStoreConfig.setJobClass(NodeUtils.getString(syncConfigNode, DEFAULT_SYNC_JOB_CLASS_PROPERTY)); kkStoreConfig.setCronExpression(NodeUtils.getString(syncConfigNode, DEFAULT_SYNC_CRON_EXPRESSION_PROPERTY)); kkStoreConfig.setProductFolder(NodeUtils.getString(syncConfigNode, DEFAULT_PRODUCT_FOLDER_PROPERTY)); kkStoreConfig.setProductFactoryClassName(NodeUtils.getString(syncConfigNode, DEFAULT_PRODUCT_FACTORY_CLASS_NAME_PROPERTY)); kkStoreConfig.setDevelopmentMode(NodeUtils.getBoolean(syncConfigNode, DEVELOPMENT_MODE, false)); loadStoreConfigByName(session, storeName.getString(), kkStoreConfig); } } } catch (RepositoryException e) { log.error("Failed to load Hippo Module configuration: " + e.toString()); } } private void loadStoreConfigByName(Session session, String storeName, KKStoreConfig kkStoreConfig) throws RepositoryException { Node rootNode = session.getNode(KONAKART_STORES_PATH); // Set the default configurations. if (rootNode.hasNode(storeName)) { Node storeNode = rootNode.getNode(storeName); kkStoreConfig.setNodePath(storeNode.getPath()); kkStoreConfig.setContentRoot(NodeUtils.getString(storeNode, STORE_CONTENT_ROOT_PROPERTY)); kkStoreConfig.setGalleryRoot(NodeUtils.getString(storeNode, STORE_GALLERY_ROOT_PROPERTY)); kkStoreConfig.setStoreId(NodeUtils.getString(storeNode, STORE_STORE_ID_PROPERTY)); kkStoreConfig.setCatalogId(NodeUtils.getString(storeNode, STORE_CATALOG_ID_PROPERTY)); kkStoreConfig.setLocale(NodeUtils.getString(storeNode, STORE_LOCALE)); kkStoreConfig.setImageBasePath(NodeUtils.getString(storeNode, STORE_IMAGE_BASE_PATH_PROPERTY)); kkStoreConfig.setSecurityCustomerGroups(NodeUtils.getStrings(storeNode, STORE_SECURITY_CUSTOMER_GROUPS_PROPERTY)); if (storeNode.hasNode(SYNC_NODE_PATH)) { Node syncNode = storeNode.getNode(SYNC_NODE_PATH); kkStoreConfig.setJobClass(NodeUtils.getString(syncNode, SYNC_JOB_CLASS, kkStoreConfig.getJobClass())); kkStoreConfig.setCronExpression(NodeUtils.getString(syncNode, SYNC_CRON_EXPRESSION, kkStoreConfig.getCronExpression())); kkStoreConfig.setProductFolder(NodeUtils.getString(syncNode, SYNC_PRODUCT_FOLDER_PROPERTY, kkStoreConfig.getProductFolder())); kkStoreConfig.setLastUpdatedTimeKonakartToRepository(NodeUtils.getDate(syncNode, SYNC_LAST_UPDATED_TIME_KONAKART_TO_REPOSITORY)); kkStoreConfig.setLastUpdatedTimeRepositoryToKonakart(NodeUtils.getDate(syncNode, SYNC_LAST_UPDATED_TIME_REPOSITORY_TO_KONNAKART)); } kkStoreConfig.setInitialized(true); storesConfig.put(storeName, kkStoreConfig); } else { log.warn("Failed to find a valid node for the store named " + storeName + ". " + "Please create the node " + KONAKART_STORES_PATH + "/" + storeName); } } /** * Load the list of activity * * @param session the JCR session */ public void preLoadActivityList(Session session) throws RepositoryException { Node rootNode = session.getNode(KONAKART_CHECKOUT_PATH); checkoutConfig.getActivityConfigList().clear(); if (rootNode.hasProperty(KONAKART_PROCESSOR)) { checkoutConfig.setProcessorClass(rootNode.getProperty(KONAKART_PROCESSOR).getString()); } if (rootNode.hasProperty(KONAKART_ACTIVITIES)) { Value[] activities = rootNode.getProperty(KONAKART_ACTIVITIES).getValues(); for (Value activity : activities) { String activityName = activity.getString(); if (rootNode.hasNode(activityName)) { Node activityNode = rootNode.getNode(activityName); KKActivityConfig activityConfig = new KKActivityConfig(); activityConfig.setName(activityName); activityConfig.setAcceptEmptyState(NodeUtils.getBoolean(activityNode, KONAKART_ACTIVITY_ACCEPT_EMPTY_STATE)); activityConfig.setAcceptState(NodeUtils.getString(activityNode, KONAKART_ACTIVITY_ACCEPT_STATE)); activityConfig.setActivityClass(NodeUtils.getString(activityNode, KONAKART_ACTIVITY_CLASS)); activityConfig.setNextLoggedState(NodeUtils.getString(activityNode, KONAKART_ACTIVITY_NEXT_LOGGED_STATE)); activityConfig.setNextNonLoggedState(NodeUtils.getString(activityNode, KONAKART_ACTIVITY_NEXT_NON_LOGGED_STATE)); activityConfig.setTemplateRenderpath(NodeUtils.getString(activityNode, KONAKART_ACTIVITY_TEMPLATE_RENDER_PATH)); checkoutConfig.addActivityConfigList(activityConfig); } else { log.error("The activity <" + activityName + "> has been added into the list of konakart:activities " + "but no konakart:activity node has been found. Please check the node " + KONAKART_CHECKOUT_PATH); } } } else { log.warn("Failed to find at least one activity node. Please check the node " + KONAKART_CHECKOUT_PATH); } } }