Example #1
0
class HotterDeployer(object):
    def __init__(self, workspace_directory, tomcat_directory, hotterdeploy_dir,
                 liferay_context, do_polling, statics_directory):
        self.do_polling = do_polling
        self.workspace_directory = workspace_directory
        self.tomcat_directory = tomcat_directory
        self.liferay_context = liferay_context
        self.statics_directory = statics_directory
        self.portlets = {}
        self.themes = {}
        self.deploys = {}

        if hotterdeploy_dir == '':
            self.hotterdeploy_dir = os.path.abspath(
                os.path.join(tomcat_directory, '..', 'hotterdeploy'))
        else:
            self.hotterdeploy_dir = os.path.abspath(
                os.path.join(hotterdeploy_dir, 'hotterdeploy'))

        self.tomcat_temp_dir = os.path.join(tomcat_directory, 'temp')
        self.tomcat_webapps_dir = os.path.join(tomcat_directory, 'webapps')
        self.liferay_dir = os.path.join(self.tomcat_webapps_dir,
                                        self.liferay_context)

        if do_polling:
            self.observer = PollingObserverVFS(default_stat, listdir)
        else:
            self.observer = Observer()

        # Create our hotterdeploy directory and watch it for wars
        if not os.path.exists(self.hotterdeploy_dir):
            os.mkdir(self.hotterdeploy_dir)
        self.observer.schedule(OnDeployHandler(hotterDeployer=self),
                               self.hotterdeploy_dir,
                               recursive=False)

        # Scan tomcat temp directory for deployed portlets
        self._scan_temp()
        self.observer.schedule(OnTempDeployHandler(hotterDeployer=self),
                               self.tomcat_temp_dir,
                               recursive=False)

        # Scan tomcat webapps directory for deployed portlets
        self._scan_webapps()
        self.observer.schedule(OnWebappsDeployHandler(hotterDeployer=self),
                               self.tomcat_webapps_dir,
                               recursive=False)

        # Scan the working directory for portlets
        LOG.debug('Scanning workspace for portlets...')
        self._scan_wd(workspace_directory)
        LOG.debug('Done.')

        # path = os.path.join(self.workspace_directory, 'liferay-portal', 'credoc-newsletter-portlet')
        path = self.workspace_directory

        # IN_CREATE | IN_DELETE | IN_CLOSE_WRITE && src/main/webapp/WEB-INF
        w = self.observer.schedule(WorkSpaceHandler(hotterDeployer=self),
                                   path,
                                   recursive=True)
        # IN_CLOSE_WRITE && src/main/webapp
        self.observer.add_handler_for_watch(
            OnFileChangedHandler(hotterDeployer=self), w)
        # self.observer.schedule(OnFileChangedHandler(hotterDeployer=self), self.workspace_directory, recursive=True)
        # IN_CLOSE_WRITE && target/classes
        self.observer.add_handler_for_watch(
            OnClassChangedHandler(hotterDeployer=self), w)
        # self.observer.schedule(OnClassChangedHandler(hotterDeployer=self), self.workspace_directory, recursive=True)

        self.livereload_server = Server()

    def start(self):
        import time
        start_time = time.time()
        LOG.debug('Starting observer...')
        self.observer.start()
        LOG.debug('Starting observer took {0} seconds'.format(time.time() -
                                                              start_time))

        from livereload import LiveReloadInfoHandler
        LiveReloadInfoHandler.hotterDeployer = weakref.proxy(self)

        LOG.info(
            'Using {0}'.format('polling' if self.do_polling else 'FS events'))
        LOG.info('Serving livereload on http://{host}:{port}/info'.format(
            **vars(self.livereload_server)))

        try:
            self.livereload_server.serve()
        except KeyboardInterrupt:
            self.observer.stop()
            self.livereload_server.stop()
        self.observer.join()

    def __del__(self):
        if os.path.exists(self.hotterdeploy_dir):
            os.rmdir(self.hotterdeploy_dir)

    def _scan_wd(self, directory):
        self.portlets.update(
            scan_working_directory_for_portlet_contexts(directory))

    def _update_deploys(self):
        deploys = {}
        if hasattr(self, '_temp_deploys'):
            for name, path in self._temp_deploys.items():
                deploys[name] = path

        if hasattr(self, '_webapp_deploys'):
            for name, path in self._webapp_deploys.items():
                if name not in deploys:
                    deploys[name] = path

        self.deploys = deploys

    def _scan_temp(self):
        path = os.path.join(self.tomcat_directory, 'temp')
        self._temp_deploys = scan_tomcat_temporary_directory(path)
        self._update_deploys()

    def _scan_webapps(self):
        path = os.path.join(self.tomcat_directory, 'webapps')
        self._webapp_deploys = scan_tomcat_webapps_directory(path)
        self._update_deploys()

    def find_latest_temp_dir(self, portlet_name):
        '''
        Find the latest temp deploy directory for a given portlet:
        e.g. 21-my-portlet-name
        '''
        latest_subdir = self.deploys.get(portlet_name, None)
        return latest_subdir

    def trigger_browser_reload(self, path=None):
        LOG.debug('reloading browser')
        self.livereload_server.reload(path)
class HotterDeployer(object):
    def __init__(
            self,
            workspace_directory,
            tomcat_directory,
            hotterdeploy_dir,
            liferay_context,
            do_polling,
            statics_directory
            ):
        self.do_polling = do_polling
        self.workspace_directory = workspace_directory
        self.tomcat_directory = tomcat_directory
        self.liferay_context = liferay_context
        self.statics_directory = statics_directory
        self.portlets = {}
        self.themes = {}
        self.deploys = {}

        if hotterdeploy_dir == '':
            self.hotterdeploy_dir = os.path.abspath(os.path.join(tomcat_directory, '..', 'hotterdeploy'))
        else:
            self.hotterdeploy_dir = os.path.abspath(os.path.join(hotterdeploy_dir, 'hotterdeploy'))

        self.tomcat_temp_dir = os.path.join(tomcat_directory, 'temp')
        self.tomcat_webapps_dir = os.path.join(tomcat_directory, 'webapps')
        self.liferay_dir = os.path.join(self.tomcat_webapps_dir, self.liferay_context)

        if do_polling:
            self.observer = PollingObserverVFS(default_stat, listdir)
        else:
            self.observer = Observer()

        # Create our hotterdeploy directory and watch it for wars
        if not os.path.exists(self.hotterdeploy_dir):
            os.mkdir(self.hotterdeploy_dir)
        self.observer.schedule(OnDeployHandler(hotterDeployer=self), self.hotterdeploy_dir, recursive=False)

        # Scan tomcat temp directory for deployed portlets
        self._scan_temp()
        self.observer.schedule(OnTempDeployHandler(hotterDeployer=self), self.tomcat_temp_dir, recursive=False)

        # Scan tomcat webapps directory for deployed portlets
        self._scan_webapps()
        self.observer.schedule(OnWebappsDeployHandler(hotterDeployer=self), self.tomcat_webapps_dir, recursive=False)

        # Scan the working directory for portlets
        LOG.debug('Scanning workspace for portlets...')
        self._scan_wd(workspace_directory)
        LOG.debug('Done.')

        # path = os.path.join(self.workspace_directory, 'liferay-portal', 'credoc-newsletter-portlet')
        path = self.workspace_directory

        # IN_CREATE | IN_DELETE | IN_CLOSE_WRITE && src/main/webapp/WEB-INF
        w = self.observer.schedule(WorkSpaceHandler(hotterDeployer=self), path, recursive=True)
        # IN_CLOSE_WRITE && src/main/webapp
        self.observer.add_handler_for_watch(OnFileChangedHandler(hotterDeployer=self), w)
        # self.observer.schedule(OnFileChangedHandler(hotterDeployer=self), self.workspace_directory, recursive=True)
        # IN_CLOSE_WRITE && target/classes
        self.observer.add_handler_for_watch(OnClassChangedHandler(hotterDeployer=self), w)
        # self.observer.schedule(OnClassChangedHandler(hotterDeployer=self), self.workspace_directory, recursive=True)

        self.livereload_server = Server()

    def start(self):
        import time
        start_time = time.time()
        LOG.debug('Starting observer...')
        self.observer.start()
        LOG.debug('Starting observer took {0} seconds'.format(time.time() - start_time))

        from livereload import LiveReloadInfoHandler
        LiveReloadInfoHandler.hotterDeployer = weakref.proxy(self)

        LOG.info('Using {0}'.format('polling' if self.do_polling else 'FS events'))
        LOG.info('Serving livereload on http://{host}:{port}/info'.format(**vars(self.livereload_server)))

        try:
            self.livereload_server.serve()
        except KeyboardInterrupt:
            self.observer.stop()
            self.livereload_server.stop()
        self.observer.join()

    def __del__(self):
        if os.path.exists(self.hotterdeploy_dir):
            os.rmdir(self.hotterdeploy_dir)

    def _scan_wd(self, directory):
        self.portlets.update(scan_working_directory_for_portlet_contexts(directory))

    def _update_deploys(self):
        deploys = {}
        if hasattr(self, '_temp_deploys'):
            for name, path in self._temp_deploys.items():
                deploys[name] = path

        if hasattr(self, '_webapp_deploys'):
            for name, path in self._webapp_deploys.items():
                if name not in deploys:
                    deploys[name] = path

        self.deploys = deploys

    def _scan_temp(self):
        path = os.path.join(self.tomcat_directory, 'temp')
        self._temp_deploys = scan_tomcat_temporary_directory(path)
        self._update_deploys()

    def _scan_webapps(self):
        path = os.path.join(self.tomcat_directory, 'webapps')
        self._webapp_deploys = scan_tomcat_webapps_directory(path)
        self._update_deploys()

    def find_latest_temp_dir(self, portlet_name):
        '''
        Find the latest temp deploy directory for a given portlet:
        e.g. 21-my-portlet-name
        '''
        latest_subdir = self.deploys.get(portlet_name, None)
        return latest_subdir

    def trigger_browser_reload(self, path=None):
        LOG.debug('reloading browser')
        self.livereload_server.reload(path)