// Path: src/main/java/com/rationaleemotions/internal/PageStore.java
// public class PageStore {
//     private static final Map<String, WebPage> pageStore = Maps.newConcurrentMap();
// 
//     /**
//      * @param page - A {@link WebPage} object that needs to be persisted into an internal data store.
//      */
//     public static void addPage(WebPage page) {
//         if (pageStore.containsKey(page.getName())) {
//             return;
//         }
//         pageStore.put(page.getName(), page);
//     }
// 
//     /**
//      * @param pageName - The name of a page that needs to be queried.
//      * @return - A {@link WebPage} object that matches the name which is being queried.
//      */
//     public static WebPage getPage(String pageName) {
//         return pageStore.get(pageName);
//     }
// }
// 
// Path: src/main/java/com/rationaleemotions/internal/parser/PageParser.java
// public final class PageParser {
// 
//   private PageParser() {
//     //defeat instantiation
//   }
// 
//   public static PageElement parsePage(String fileName) throws FileNotFoundException {
//     return new Gson().fromJson(new FileReader(fileName), PageElement.class);
//   }
// }
// 
// Path: src/main/java/com/rationaleemotions/internal/parser/pojos/Element.java
// public class Element {
//   private static final String ATTRIBUTE_IS_MISSING = " attribute is missing.";
// 
//   @SerializedName("name")
//   @Expose
//   private String name;
// 
//   @SerializedName("type")
//   @Expose
//   private String type;
// 
//   @SerializedName("locale")
//   @Expose
//   private List<Locale> locales = new LinkedList<>();
// 
//   @SerializedName("wait")
//   @Expose
//   private Wait wait;
// 
//   @SerializedName("list")
//   @Expose
//   private boolean isList = false;
// 
//   public String getName() {
//     return name;
//   }
// 
//   public void setName(String name) {
//     this.name = name;
//   }
// 
//   public WebElementType getType() {
//     return WebElementType.identifyType(type);
//   }
// 
//   public void setType(String type) {
//     this.type = type;
//   }
// 
//   public List<Locale> getLocales() {
//     return locales;
//   }
// 
//   public void setLocales(List<Locale> locales) {
//     this.locales = locales;
//   }
// 
//   public Wait getWait() {
//     if (JvmArgs.USE_DEFAULT_WAIT_STRATEGY.asBoolean() && wait == null) {
//       return Wait.defaultInstance();
//     }
//     return wait;
//   }
// 
//   public void setWait(Wait wait) {
//     this.wait = wait;
//   }
// 
//   public boolean isList() {
//     return isList;
//   }
// 
//   public void setList(boolean list) {
//     isList = list;
//   }
// 
//   public void validate() {
//     Preconditions.checkArgument(StringUtils.isNotBlank(name), "name" + ATTRIBUTE_IS_MISSING);
//     Preconditions.checkArgument(!locales.isEmpty(), "locale" + ATTRIBUTE_IS_MISSING);
//   }
// 
//   @Override
//   public String toString() {
//     return "Element{" +
//         "name='" + name + '\'' +
//         ", type='" + type + '\'' +
//         ", locales=" + locales +
//         ", wait=" + wait +
//         ", isList=" + isList +
//         '}';
//   }
// }
// 
// Path: src/main/java/com/rationaleemotions/internal/parser/pojos/PageElement.java
// public class PageElement {
// 
//   @SerializedName("name")
//   @Expose
//   private String name;
// 
//   @SerializedName("defaultLocale")
//   @Expose
//   private String defaultLocale;
// 
//   @SerializedName("elements")
//   @Expose
//   private List<Element> elements;
// 
//   public String getName() {
//     return name;
//   }
// 
//   public void setName(String name) {
//     this.name = name;
//   }
// 
//   public String getDefaultLocale() {
//     return defaultLocale;
//   }
// 
//   public void setDefaultLocale(String defaultLocale) {
//     this.defaultLocale = defaultLocale;
//   }
// 
//   public List<Element> getElements() {
//     return elements;
//   }
// 
//   public void setElements(List<Element> elements) {
//     this.elements = elements;
//   }
// }


import com.google.common.base.Preconditions;
import com.google.common.collect.Maps;
import com.rationaleemotions.internal.PageStore;
import com.rationaleemotions.internal.parser.PageParser;
import com.rationaleemotions.internal.parser.pojos.Element;
import com.rationaleemotions.internal.parser.pojos.PageElement;
import org.apache.commons.io.FilenameUtils;
import java.io.File;
import java.io.IOException;
import java.util.Map;
package com.rationaleemotions.pojos;



public final class WebPage {
    private String name;
    private String defaultLocale;
    private Map<String, JsonWebElement> elements = Maps.newConcurrentMap();

    private WebPage() {
        //Defeat instantiation.
    }

    public static WebPage getPage(String fileName) {
        File file = new File(fileName);
        Preconditions.checkArgument(file.exists(), "Cannot find file : " + file.getAbsolutePath());
        WebPage page = PageStore.getPage(FilenameUtils.getBaseName(fileName));
        if (page != null) {
            return page;
        }
        try {
            PageElement pageElement = PageParser.parsePage(fileName);
            page = new WebPage();
            page.name = pageElement.getName();
            page.defaultLocale = pageElement.getDefaultLocale();
            for (Element each : pageElement.getElements()) {
                JsonWebElement element = JsonWebElement.newElement(each, page.defaultLocale);
                page.elements.put(element.getName(), element);
            }
            PageStore.addPage(page);
        } catch (IOException e) {
            throw new WebPageParsingException(e);
        }
        return page;
    }

    public String getName() {
// Path: src/main/java/com/rationaleemotions/internal/PageStore.java
// public class PageStore {
//     private static final Map<String, WebPage> pageStore = Maps.newConcurrentMap();
// 
//     /**
//      * @param page - A {@link WebPage} object that needs to be persisted into an internal data store.
//      */
//     public static void addPage(WebPage page) {
//         if (pageStore.containsKey(page.getName())) {
//             return;
//         }
//         pageStore.put(page.getName(), page);
//     }
// 
//     /**
//      * @param pageName - The name of a page that needs to be queried.
//      * @return - A {@link WebPage} object that matches the name which is being queried.
//      */
//     public static WebPage getPage(String pageName) {
//         return pageStore.get(pageName);
//     }
// }
// 
// Path: src/main/java/com/rationaleemotions/internal/parser/PageParser.java
// public final class PageParser {
// 
//   private PageParser() {
//     //defeat instantiation
//   }
// 
//   public static PageElement parsePage(String fileName) throws FileNotFoundException {
//     return new Gson().fromJson(new FileReader(fileName), PageElement.class);
//   }
// }
// 
// Path: src/main/java/com/rationaleemotions/internal/parser/pojos/Element.java
// public class Element {
//   private static final String ATTRIBUTE_IS_MISSING = " attribute is missing.";
// 
//   @SerializedName("name")
//   @Expose
//   private String name;
// 
//   @SerializedName("type")
//   @Expose
//   private String type;
// 
//   @SerializedName("locale")
//   @Expose
//   private List<Locale> locales = new LinkedList<>();
// 
//   @SerializedName("wait")
//   @Expose
//   private Wait wait;
// 
//   @SerializedName("list")
//   @Expose
//   private boolean isList = false;
// 
//   public String getName() {
//     return name;
//   }
// 
//   public void setName(String name) {
//     this.name = name;
//   }
// 
//   public WebElementType getType() {
//     return WebElementType.identifyType(type);
//   }
// 
//   public void setType(String type) {
//     this.type = type;
//   }
// 
//   public List<Locale> getLocales() {
//     return locales;
//   }
// 
//   public void setLocales(List<Locale> locales) {
//     this.locales = locales;
//   }
// 
//   public Wait getWait() {
//     if (JvmArgs.USE_DEFAULT_WAIT_STRATEGY.asBoolean() && wait == null) {
//       return Wait.defaultInstance();
//     }
//     return wait;
//   }
// 
//   public void setWait(Wait wait) {
//     this.wait = wait;
//   }
// 
//   public boolean isList() {
//     return isList;
//   }
// 
//   public void setList(boolean list) {
//     isList = list;
//   }
// 
//   public void validate() {
//     Preconditions.checkArgument(StringUtils.isNotBlank(name), "name" + ATTRIBUTE_IS_MISSING);
//     Preconditions.checkArgument(!locales.isEmpty(), "locale" + ATTRIBUTE_IS_MISSING);
//   }
// 
//   @Override
//   public String toString() {
//     return "Element{" +
//         "name='" + name + '\'' +
//         ", type='" + type + '\'' +
//         ", locales=" + locales +
//         ", wait=" + wait +
//         ", isList=" + isList +
//         '}';
//   }
// }
// 
// Path: src/main/java/com/rationaleemotions/internal/parser/pojos/PageElement.java
// public class PageElement {
// 
//   @SerializedName("name")
//   @Expose
//   private String name;
// 
//   @SerializedName("defaultLocale")
//   @Expose
//   private String defaultLocale;
// 
//   @SerializedName("elements")
//   @Expose
//   private List<Element> elements;
// 
//   public String getName() {
//     return name;
//   }
// 
//   public void setName(String name) {
//     this.name = name;
//   }
// 
//   public String getDefaultLocale() {
//     return defaultLocale;
//   }
// 
//   public void setDefaultLocale(String defaultLocale) {
//     this.defaultLocale = defaultLocale;
//   }
// 
//   public List<Element> getElements() {
//     return elements;
//   }
// 
//   public void setElements(List<Element> elements) {
//     this.elements = elements;
//   }
// }


// Path: src/main/java/com/rationaleemotions/pojos/WebPage.java
import com.google.common.base.Preconditions;
import com.google.common.collect.Maps;
import com.rationaleemotions.internal.PageStore;
import com.rationaleemotions.internal.parser.PageParser;
import com.rationaleemotions.internal.parser.pojos.Element;
import com.rationaleemotions.internal.parser.pojos.PageElement;
import org.apache.commons.io.FilenameUtils;
import java.io.File;
import java.io.IOException;
import java.util.Map;

package com.rationaleemotions.pojos;



public final class WebPage {
    private String name;
    private String defaultLocale;
    private Map<String, JsonWebElement> elements = Maps.newConcurrentMap();

    private WebPage() {
        //Defeat instantiation.
    }

    public static WebPage getPage(String fileName) {
        File file = new File(fileName);
        Preconditions.checkArgument(file.exists(), "Cannot find file : " + file.getAbsolutePath());
        WebPage page = PageStore.getPage(FilenameUtils.getBaseName(fileName));
        if (page != null) {
            return page;
        }
        try {
            PageElement pageElement = PageParser.parsePage(fileName);
            page = new WebPage();
            page.name = pageElement.getName();
            page.defaultLocale = pageElement.getDefaultLocale();
            for (Element each : pageElement.getElements()) {
                JsonWebElement element = JsonWebElement.newElement(each, page.defaultLocale);
                page.elements.put(element.getName(), element);
            }
            PageStore.addPage(page);
        } catch (IOException e) {
            throw new WebPageParsingException(e);
        }
        return page;
    }

    public String getName() {
        return name;