Package de.scoopgmbh.copper.monitoring.client.context

Source Code of de.scoopgmbh.copper.monitoring.client.context.ApplicationContext

/*
* Copyright 2002-2013 SCOOP Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.scoopgmbh.copper.monitoring.client.context;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.rmi.RemoteException;
import java.util.ResourceBundle;
import java.util.prefs.Preferences;

import javafx.application.Platform;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;

import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.shiro.spring.remoting.SecureRemoteInvocationFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor;
import org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean;
import org.springframework.remoting.support.DefaultRemoteInvocationFactory;
import org.springframework.remoting.support.RemoteInvocationFactory;
import org.springframework.util.StringUtils;

import de.scoopgmbh.copper.monitoring.client.adapter.GuiCopperDataProvider;
import de.scoopgmbh.copper.monitoring.client.form.BorderPaneShowFormStrategie;
import de.scoopgmbh.copper.monitoring.client.form.Form;
import de.scoopgmbh.copper.monitoring.client.form.FxmlForm;
import de.scoopgmbh.copper.monitoring.client.form.issuereporting.IssueReporter;
import de.scoopgmbh.copper.monitoring.client.form.issuereporting.MessageAndLogIssueReporter;
import de.scoopgmbh.copper.monitoring.client.ui.login.LoginController;
import de.scoopgmbh.copper.monitoring.client.ui.settings.AuditralColorMapping;
import de.scoopgmbh.copper.monitoring.client.ui.settings.SettingsModel;
import de.scoopgmbh.copper.monitoring.client.util.ComponentUtil;
import de.scoopgmbh.copper.monitoring.client.util.MessageProvider;
import de.scoopgmbh.copper.monitoring.core.CopperMonitoringService;
import de.scoopgmbh.copper.monitoring.core.LoginService;

public class ApplicationContext {
 
  Logger logger = LoggerFactory.getLogger(ApplicationContext.class);

  private static final String SETTINGS_KEY = "settings";
  protected BorderPane mainPane;
  protected StackPane mainStackPane;
  protected MessageProvider messageProvider;
  protected SettingsModel settingsModelSingleton;
 
  protected SimpleStringProperty serverAdress= new SimpleStringProperty();
  public SimpleStringProperty serverAdressProperty() {
    return serverAdress;
  }
 
  public ApplicationContext() {
    mainStackPane = new StackPane();
    mainPane = new BorderPane();
    mainPane.setId("background");//important for css
    mainStackPane.getChildren().add(mainPane);
    messageProvider = new MessageProvider(ResourceBundle.getBundle("de.scoopgmbh.copper.gui.message"));
   
    final Preferences prefs = Preferences.userRoot().node("de.scoopgmbh.coppermonitor");
   
    SettingsModel defaultSettings = new SettingsModel();
    AuditralColorMapping newItem = new AuditralColorMapping();
    newItem.color.setValue(Color.rgb(255, 128, 128));
    newItem.loglevelRegEx.setValue("1");
    defaultSettings.auditralColorMappings.add(newItem);
    byte[] defaultModelbytes;
    ByteArrayOutputStream os=null;
    try{
        os=new ByteArrayOutputStream();
      ObjectOutputStream o = new ObjectOutputStream(os);
      o.writeObject(defaultSettings);
      defaultModelbytes = os.toByteArray();
    } catch (IOException e) {
      throw new RuntimeException(e);
    } finally {
      if (os!=null){
        try {
          os.close();
        } catch (IOException e) {
          throw new RuntimeException(e);
        }
      }
    }
   
    settingsModelSingleton=defaultSettings;
    ByteArrayInputStream is=null;
    try{
      is = new ByteArrayInputStream(prefs.getByteArray(SETTINGS_KEY, defaultModelbytes));
      ObjectInputStream o = new ObjectInputStream(is);
      Object object= o.readObject();
      if (object instanceof SettingsModel){
        settingsModelSingleton = (SettingsModel)object;
      }
    } catch (Exception e) {
      logger.error("",e);
      getIssueReporterSingleton().reportWarning("Can't load settings from (Preferences: "+prefs+") use defaults instead",e);
    } finally {
      if (is!=null){
        try {
          is.close();
        } catch (IOException e) {
          throw new RuntimeException(e);
        }
      }
    }

      Runtime.getRuntime().addShutdownHook(
        new Thread(
          new Runnable() {
            @Override
          public void run() {
              ByteArrayOutputStream os=null;
              try{
                os = new ByteArrayOutputStream();
                ObjectOutputStream o = new ObjectOutputStream(os);
                o.writeObject(settingsModelSingleton);
                prefs.putByteArray(SETTINGS_KEY, os.toByteArray());
              } catch (IOException e) {
                throw new RuntimeException(e);
              } finally {
                if (os!=null){
                  try {
                  os.close();
                } catch (IOException e) {
                  throw new RuntimeException(e);
                }
                }
              }
            } 
          }
        )
      );
  }
 
  protected GuiCopperDataProvider guiCopperDataProvider;
  public void setGuiCopperDataProvider(CopperMonitoringService copperDataProvider, String serverAdress, String sessionId){
    this.serverAdress.set(serverAdress);
    this.guiCopperDataProvider = new GuiCopperDataProvider(copperDataProvider);
    getFormContextSingleton().setupGUIStructure();
  }
 
  public void setHttpGuiCopperDataProvider(final String serverAdressParam, final String user, final String password){
    ComponentUtil.executeWithProgressDialogInBackground(new Runnable() {
      @Override
      public void run() {
        try {
          connect(serverAdressParam,user,password);
        } catch (final Exception e){
          logger.error("",e);
          getIssueReporterSingleton().reportError("Can't Connect: \n"+e.getMessage(),e);
        }
      }
    }, mainStackPane, "connecting");
  }
   

  protected void connect(final String serverAdressParam, final String user, final String password) {
    boolean secureConnect = StringUtils.hasText(user) && StringUtils.hasText(password);
    String serverAdress = serverAdressParam;
    if (!serverAdress.endsWith("/")) {
      serverAdress = serverAdress + "/";
    }

    final LoginService loginService;
    final CommonsHttpInvokerRequestExecutor httpInvokerRequestExecutor = new CommonsHttpInvokerRequestExecutor();
    DefaultHttpMethodRetryHandler retryHandler = new DefaultHttpMethodRetryHandler(10, false);
    httpInvokerRequestExecutor.getHttpClient().getParams().setParameter(HttpMethodParams.RETRY_HANDLER, retryHandler);
    httpInvokerRequestExecutor.getHttpClient().getParams().setSoTimeout(1000*60*5);
    {
      HttpInvokerProxyFactoryBean httpInvokerProxyFactoryBean = new HttpInvokerProxyFactoryBean();
      httpInvokerProxyFactoryBean.setServiceUrl(serverAdress + "copperMonitoringService");
      httpInvokerProxyFactoryBean.setServiceInterface(LoginService.class);
      httpInvokerProxyFactoryBean.setServiceUrl(serverAdress + "loginService");
      httpInvokerProxyFactoryBean.afterPropertiesSet();
      httpInvokerProxyFactoryBean.setHttpInvokerRequestExecutor(httpInvokerRequestExecutor);
      loginService = (LoginService) httpInvokerProxyFactoryBean.getObject();
    }

    final String sessionId;
    if(secureConnect) {
      try {
        sessionId = loginService.doLogin(user, password);
      } catch (RemoteException e) {
        throw new RuntimeException(e);
      }
    } else {
      sessionId = "";
    }

    if (sessionId == null) {
      getIssueReporterSingleton().reportWarning("Invalid user/password", null, new Runnable() {
        @Override
        public void run() {
          createLoginForm().show();
        }
      });
    } else {
      HttpInvokerProxyFactoryBean httpInvokerProxyFactoryBean = new HttpInvokerProxyFactoryBean();
      httpInvokerProxyFactoryBean.setServiceUrl(serverAdress + "copperMonitoringService");
      httpInvokerProxyFactoryBean.setServiceInterface(CopperMonitoringService.class);
      RemoteInvocationFactory remoteInvocationFactory = secureConnect ?
          new SecureRemoteInvocationFactory(sessionId) : new DefaultRemoteInvocationFactory();
      httpInvokerProxyFactoryBean.setRemoteInvocationFactory(remoteInvocationFactory);
      httpInvokerProxyFactoryBean.setHttpInvokerRequestExecutor(httpInvokerRequestExecutor);
      httpInvokerProxyFactoryBean.afterPropertiesSet();
      final CopperMonitoringService copperMonitoringService = (CopperMonitoringService) httpInvokerProxyFactoryBean.getObject();

      final String serverAdressFinal = serverAdress;
      Platform.runLater(new Runnable() {
        @Override
        public void run() {
          setGuiCopperDataProvider(copperMonitoringService, serverAdressFinal, sessionId);
        }
      });
    }
  }
 
  protected FormContext formContext;
  public FormContext getFormContextSingleton(){
    if (guiCopperDataProvider==null){
      throw new IllegalStateException("guiCopperDataProvider must be initialized");
    }
    if (formContext==null){
      formContext = new FormContext(mainPane,guiCopperDataProvider,messageProvider,settingsModelSingleton,getIssueReporterSingleton());
    }
    return formContext;
  }

 
  private IssueReporter issueReporter;
  private IssueReporter getIssueReporterSingleton() {
    if (issueReporter==null){
      issueReporter = createIssueReporter();
    }
    return issueReporter;
  }
  /**template method to create custom {@link IssueReporter}
   */
  protected IssueReporter createIssueReporter(){
    return new MessageAndLogIssueReporter(mainStackPane);
  }
 
 
  public void resetFormContext() {
    formContext = null;
  }
 
  protected FxmlForm<LoginController> loginForm;

  public Form<LoginController> createLoginForm(){
    if (loginForm==null){
      loginForm = new FxmlForm<LoginController>("login.title", new LoginController(this,settingsModelSingleton), messageProvider,  new BorderPaneShowFormStrategie(mainPane));
    }
    return loginForm;
  }

  public Pane getMainPane() {
    return mainStackPane;
  }

}
TOP

Related Classes of de.scoopgmbh.copper.monitoring.client.context.ApplicationContext

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.