package org.exoplatform.platform.common.account.setup.web; import org.exoplatform.commons.info.MissingProductInformationException; import org.exoplatform.commons.info.ProductInformations; import org.exoplatform.container.PortalContainer; import org.exoplatform.platform.common.rest.PlatformInformationRESTService; import org.exoplatform.platform.common.software.register.Utils; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.lang.reflect.Method; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.Properties; /** * @author <a href="fbradai@exoplatform.com">Fbradai</a> */ public class PingBackServlet extends HttpServlet { private static final Log LOG = ExoLogger.getExoLogger(PingBackServlet.class); private static String pingBackUrl; private static final long serialVersionUID = 6467955354840693802L; private static boolean loopfuseFormDisplayed = false; public static final String LOOP_FUSE_FORM_DISPLAYED = "formDisplayed"; public static final String COMMUNITY_EDITION = "community"; private static String edition = ""; @Override public void init(ServletConfig servletConfig) throws ServletException{ this.pingBackUrl = servletConfig.getInitParameter("pingBackUrl"); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if (isConnectedToInternet()) { loopfuseFormDisplayed = true; try { writePingBackFormDisplayed( loopfuseFormDisplayed); } catch (MissingProductInformationException e) { LOG.error("Product Information not found ",e.getLocalizedMessage()); } } } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public static boolean isConnectedToInternet() { String pingServerURL = pingBackUrl.substring(0, pingBackUrl.indexOf("/", "http://url".length())); try { URL url = new URL(pingServerURL); HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); urlConn.connect(); return (HttpURLConnection.HTTP_NOT_FOUND != urlConn.getResponseCode()); } catch (MalformedURLException e) { LOG.error("LeadCapture : Error creating HTTP connection to the server : " + pingServerURL); } catch (IOException e) { LOG.error("LeadCapture : Error creating HTTP connection to the server : " + pingServerURL); } return false; } public static void writeToFile(String key, String value, String fileLocation) { if (fileLocation == null || fileLocation.isEmpty()) { throw new IllegalArgumentException("Illegal empty file Location parameter."); } InputStream inputStream = null; OutputStream outputStream = null; try { Properties properties = new Properties(); File file = new File(fileLocation); if (file.exists()) { inputStream = new FileInputStream(fileLocation); properties.loadFromXML(inputStream); inputStream.close(); } else { verifyAndCreateParentFolder(fileLocation); } properties.put(key, value); outputStream = new FileOutputStream(fileLocation); properties.storeToXML(outputStream, ""); outputStream.close(); } catch (Exception exception) { if (outputStream != null) { try { outputStream.close(); } catch (IOException ioException) { LOG.error("Error during close outputStream ", ioException); } } if (inputStream != null) { try { inputStream.close(); } catch (IOException ioException) { LOG.error("Error during close inputStream ", ioException); } } } } private static void verifyAndCreateParentFolder(String fileLocation) { String parentFolderPath = fileLocation.replace("\\", "/"); int parentFolderPathEndIndex = fileLocation.lastIndexOf("/"); if (parentFolderPathEndIndex >= 0) { parentFolderPath = fileLocation.substring(0, parentFolderPathEndIndex); } if (!new File(parentFolderPath).exists()) { new File(parentFolderPath).mkdirs(); } } public static void writePingBackFormDisplayed(boolean loopfuseFormDisplayed) throws MissingProductInformationException { PingBackServlet.loopfuseFormDisplayed = loopfuseFormDisplayed; writeToFile(LOOP_FUSE_FORM_DISPLAYED, Boolean.toString(loopfuseFormDisplayed), getPingBackFileLocation() ); } public static String getPingBackFileLocation() throws MissingProductInformationException { ProductInformations productInformations = (ProductInformations) PortalContainer.getInstance().getComponentInstanceOfType(ProductInformations.class); edition = getPlatformEdition(productInformations); if ((edition!=null)&&(edition.equals(PlatformInformationRESTService.COMMUNITY_EDITION))) { return Utils.HOME_CONFIG_LOCATION+"/"+PlatformInformationRESTService.COMMUNITY_EDITION+".xml"; } return Utils.HOME_CONFIG_FILE_LOCATION; } public static String getPingBackUrl() { //--- load ProductInformations service ProductInformations productInformations = (ProductInformations) PortalContainer.getInstance().getComponentInstanceOfType(ProductInformations.class); //--- Check the platform edition from systemfile then from jcr edition = getPlatformEdition(productInformations); //--- If true then we are in the case of Enteprise license before first start boolean enterpriseCheck = false; //--- Use ping back url corresponding to the current version of the server if (edition.equalsIgnoreCase(COMMUNITY_EDITION)) { //--- Concat the suffix "-ent" return pingBackUrl; } else { try { String loopfuseFormDisplayedString = readFromFile(LOOP_FUSE_FORM_DISPLAYED, getPingBackFileLocation()); enterpriseCheck = Boolean.parseBoolean(loopfuseFormDisplayedString); } catch (Exception MissingProductInformationException) { LOG.error("Platform version detection : Error loading the version from FileSystem, the default value will be used"); } if (enterpriseCheck) { return pingBackUrl = pingBackUrl.concat("-ent"); } else { return pingBackUrl = pingBackUrl.concat("-ex"); } } } public static boolean isLandingPageDisplayed() throws MissingProductInformationException { String loopfuseFormDisplayedString = readFromFile(LOOP_FUSE_FORM_DISPLAYED, getPingBackFileLocation()); if (loopfuseFormDisplayedString != null && !loopfuseFormDisplayedString.isEmpty()) { //--- load ProductInformations service ProductInformations productInformations = (ProductInformations) PortalContainer.getInstance().getComponentInstanceOfType(ProductInformations.class); loopfuseFormDisplayed = Boolean.parseBoolean(loopfuseFormDisplayedString); if (getPlatformEdition(productInformations).equals(ProductInformations.ENTERPRISE_EDITION)) { if (loopfuseFormDisplayed) { return false; } } } return loopfuseFormDisplayed; } public static String readFromFile(String key, String fileLocation) throws MissingProductInformationException { if (fileLocation != null && !fileLocation.isEmpty() && !new File(fileLocation).exists()) { writePingBackFormDisplayed(false); return "false"; } try { Properties properties = new Properties(); InputStream inputStream = new FileInputStream(fileLocation); properties.loadFromXML(inputStream); inputStream.close(); return (String) properties.get(key); } catch (Exception exception) { throw new RuntimeException(exception); } } private static String getPlatformEdition(ProductInformations platformInformations) { try { Class<?> c = Class.forName("org.exoplatform.platform.edition.PlatformEdition"); Method getEditionMethod = c.getMethod("getEdition"); String platformEdition = (String) getEditionMethod.invoke(null); if((platformEdition!=null)&&(platformEdition.equals("enterprise"))) { if((platformInformations.getEdition()!=null)&&(!platformInformations.getEdition().equals(""))) platformEdition = platformInformations.getEdition(); } return platformEdition; } catch (Exception e) { LOG.error("An error occurred while getting the platform edition information.", e); } return null; } }