public class GetStartedStartup implements IStartup {

  private static final Logger logger = Logger.getLogger(GetStartedStartup.class);

  @Override
  public void earlyStartup() {

    Display.getDefault()
        .asyncExec(
            new Runnable() {
              @Override
              public void run() {
                if (CommonParameters.get("git") != null) {
                  // starting for git import - skip get started
                  return;
                }
                // enable/disable get started wizard
                if (WorkspaceLocator.getWorkspace().getRoot().getProjects().length == 0) {
                  GetStartedProjectHandler projectHandler = new GetStartedProjectHandler();
                  try {
                    projectHandler.execute(null);
                  } catch (ExecutionException e) {
                    logger.error(e.getMessage());
                  }
                }
              }
            });
  }
}
public class CustomResourceChangeListener implements IResourceChangeListener {

  private static final Logger logger =
      Logger.getLogger(CustomResourceChangeListener.class.getName());

  private StructuredViewer viewer;
  private ICustomResourceChangeListenerCallback callbackObject;

  public CustomResourceChangeListener(
      StructuredViewer viewer, ICustomResourceChangeListenerCallback callbackObject) {
    super();
    this.viewer = viewer;
    this.callbackObject = callbackObject;
  }

  @Override
  public void resourceChanged(IResourceChangeEvent event) {
    final Display display = Display.getCurrent();
    UISession uiSession = RWT.getUISession(display);
    uiSession.exec(
        new Runnable() {
          @Override
          public void run() {
            if (!viewer.getControl().isDisposed()) {
              try {
                callbackObject.callback();
              } catch (Exception e) {
                logger.error(e.getMessage());
              }
            }
          }
        });
  }
}
public class MessageListenerEventProcessor implements IListenerEventProcessor {

  private static final String PARAM_CLIENT = "client";
  private static final String PARAM_TOPIC = "topic";
  private static final String PARAM_MESSAGE = "message";

  private static final Logger logger = Logger.getLogger(MessageListenerEventProcessor.class);

  private String client;
  private String topic;
  private Listener listener;

  private MessageHub messageHub;

  public MessageListenerEventProcessor() {
    this.messageHub = new MessageHub(DataSourceFacade.getInstance().getDataSource(null), null);
  }

  @Override
  public void start(Listener listener) {
    this.listener = listener;
    this.client = listener.getParams().get(PARAM_CLIENT);
    this.topic = listener.getParams().get(PARAM_TOPIC);

    try {
      messageHub.subscribe(client, topic);
      MessageListenerManager.getInstance().registerProcessor(this);
    } catch (EMessagingException e) {
      logger.error(e.getMessage(), e);
    }
  }

  @Override
  public void stop() {
    try {
      messageHub.unsubscribe(client, topic);
      MessageListenerManager.getInstance().unregisterProcessor(this);
    } catch (EMessagingException e) {
      logger.error(e.getMessage(), e);
    }
  }

  public void processMessages() throws EMessagingException {
    for (MessageDefinition messageDefinition : messageHub.receive(client)) {
      Map<Object, Object> executionContext = new HashMap<Object, Object>();
      executionContext.put(PARAM_MESSAGE, messageDefinition);
      ListenerProcessor.executeByEngineType(listener.getModule(), executionContext, listener);
    }
  }
}
public class LogProgressMonitor implements IProgressMonitor {

  private static final Logger logger = Logger.getLogger(LogProgressMonitor.class);

  boolean cancelled;

  @Override
  public void beginTask(String name, int totalWork) {
    logger.info(String.format("beginTask: %s, %d ", name, totalWork));
  }

  @Override
  public void done() {
    logger.info("done.");
  }

  @Override
  public void internalWorked(double work) {
    logger.info(String.format("internalWorked: %d ", work));
  }

  @Override
  public boolean isCanceled() {
    return this.cancelled;
  }

  @Override
  public void setCanceled(boolean value) {
    this.cancelled = value;
  }

  @Override
  public void setTaskName(String name) {
    // TODO Auto-generated method stub

  }

  @Override
  public void subTask(String name) {
    logger.info(String.format("subTask: %s ", name));
  }

  @Override
  public void worked(int work) {
    logger.info(String.format("worked: %d ", work));
  }
}
/** Action that will trigger opening of Table Definition editor. */
public class DeleteTableAction extends Action {

  private static final String DROP_TABLE = "DROP TABLE "; // $NON-NLS-1$

  private static final String DATABASE_VIEW = Messages.DeleteTableAction_DATABASE_VIEW;

  private static final String FAILED_TO_DELETE_TABLE_S =
      Messages.DeleteTableAction_FAILED_TO_DELETE_TABLE_S;

  private static final Logger logger = Logger.getLogger(DeleteTableAction.class);

  private static final String
      WARNING_THIS_ACTION_WILL_DELETE_THE_TABLE_AND_ALL_OF_ITS_CONTENT_CONTINUE =
          Messages
              .DeleteTableAction_WARNING_THIS_ACTION_WILL_DELETE_THE_TABLE_AND_ALL_OF_ITS_CONTENT_CONTINUE;

  private static final String WILL_DELETE_THE_TABLE_AND_ITS_CONTENT =
      Messages.DeleteTableAction_WILL_DELETE_THE_TABLE_AND_ITS_CONTENT;

  private static final String DELETE_TABLE = Messages.DeleteTableAction_DELETE_TABLE;

  private static final long serialVersionUID = 3872859942737870851L;

  private TreeViewer viewer;

  public DeleteTableAction(TreeViewer viewer) {
    this.viewer = viewer;
    setText(DELETE_TABLE);
    setToolTipText(WILL_DELETE_THE_TABLE_AND_ITS_CONTENT);
  }

  @SuppressWarnings("rawtypes")
  public void run() {
    IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
    TreeParent parent = null;

    for (Iterator nextSelection = selection.iterator(); nextSelection.hasNext(); ) {
      Object obj = nextSelection.next();
      if (TreeObject.class.isInstance(obj)) {
        if (((TreeObject) obj).getTableDefinition() != null) {
          TableDefinition tableDefinition = ((TreeObject) obj).getTableDefinition();

          boolean confirm =
              MessageDialog.openConfirm(
                  viewer.getControl().getShell(),
                  DELETE_TABLE,
                  String.format(
                      WARNING_THIS_ACTION_WILL_DELETE_THE_TABLE_AND_ALL_OF_ITS_CONTENT_CONTINUE,
                      tableDefinition.getTableName()));
          if (!confirm) {
            continue;
          }
          parent = ((TreeObject) obj).getParent();
          IDatabaseConnectionFactory connectionFactory = parent.getConnectionFactory();
          try {
            deleteTable(tableDefinition, connectionFactory);
          } catch (SQLException e) {
            showMessage(String.format(FAILED_TO_DELETE_TABLE_S, tableDefinition.getTableName()));
            logger.error(e.getMessage(), e);
          }
        }
      }
    }
    if (parent != null) {
      RefreshViewAction refresh = new RefreshViewAction(viewer, parent.getChildren()[0]);
      refresh.run();
    }
  }

  protected void showMessage(String message) {
    MessageDialog.openError(viewer.getControl().getShell(), DATABASE_VIEW, message);
  }

  private void deleteTable(
      TableDefinition tableDefinition, IDatabaseConnectionFactory connectionFactory)
      throws SQLException {
    Connection connection = connectionFactory.getDatabaseConnection();
    try {
      Statement createStatement = connection.createStatement();
      String name = tableDefinition.getFqn();
      createStatement.execute(DROP_TABLE + name);
    } finally {
      if (connection != null) {
        connection.close();
      }
    }
  }
}
Beispiel #6
0
@SuppressWarnings("unused")
public class EditorWidget extends AbstractTextEditorWidget {

  private static final long serialVersionUID = -8881201238299386468L;

  private static final Logger logger = Logger.getLogger(EditorWidget.class);
  private static final String SCRIPT_EVALUATION_FAILED =
      Messages.EditorWidget_SCRIPT_EVALUATION_FAILED;
  private static final int EVALUATE_ATTEMPTS = 15;
  private static final String EDITOR_URL = "/orion/editor.html"; // $NON-NLS-1$
  private Browser browser;
  private String text;
  private IEditorWidgetListener listener;
  private String mode;
  private boolean loaded;

  private boolean disabledForReadOnly;

  private boolean readOnly;

  private boolean breakpointsEnabled;

  private int row;

  private static Map<String, String> ORION_MODES = new HashMap<String, String>();

  static {
    ORION_MODES.put("javascript", "application/javascript");
    ORION_MODES.put("html", "text/html");
    ORION_MODES.put("css", "text/css");
    ORION_MODES.put("json", "application/json");
    ORION_MODES.put("menu", "application/json");
    ORION_MODES.put("java", "text/x-java-source");
    ORION_MODES.put("xml", "application/xml");
    ORION_MODES.put("yaml", "text/x-yaml");
  }

  public EditorWidget(final Composite parent) {
    this(parent, false);
  }

  @SuppressWarnings("serial")
  public EditorWidget(final Composite parent, final boolean javaScriptEditor) {
    super(parent, SWT.NONE);
    super.setLayout(new FillLayout());

    browser = new Browser(this, SWT.NONE);
    browser.setUrl(CommonParameters.getContextPath() + EDITOR_URL);
    browser.addProgressListener(
        new ProgressListener() {

          @Override
          public void completed(final ProgressEvent event) {
            loaded = true;
            updateWidgetContents();
            if (javaScriptEditor && DebugModelFacade.getDebugModel() != null) {
              final DebugSessionModel session = DebugModelFacade.getDebugModel().getActiveSession();

              if (session != null && session.getCurrentLineBreak() != null) {
                final String filePath = session.getCurrentLineBreak().getBreakpoint().getFullPath();
                final String path =
                    CommonUtils.formatToRuntimePath(
                        ICommonConstants.ARTIFACT_TYPE.SCRIPTING_SERVICES, filePath);
                final int[] breakpoints =
                    DebugModelFacade.getDebugModel().getBreakpointsMetadata().getBreakpoints(path);

                loadBreakpoints(breakpoints);
              }
            }
          }

          @Override
          public void changed(final ProgressEvent event) {
            //
          }
        });

    // DO NOT REMOVE THIS
    new BrowserFunction(browser, "saveCalled") { // $NON-NLS-1$
      @Override
      public Object function(final Object[] arguments) {
        if (listener != null) {
          listener.save();
        }
        return null;
      }
    };

    // DO NOT REMOVE THIS
    new BrowserFunction(browser, "dirtyChanged") { // $NON-NLS-1$
      @Override
      public Object function(final Object[] arguments) {
        if (listener != null) {
          listener.dirtyStateChanged((Boolean) arguments[0]);
        }
        return null;
      }
    };

    // DO NOT REMOVE THIS
    new BrowserFunction(browser, "setBreakpoint") { // $NON-NLS-1$
      @Override
      public Object function(final Object[] arguments) {
        if ((listener != null) && (arguments[0] != null) && (arguments[0] instanceof Number)) {
          listener.setBreakpoint(((Number) arguments[0]).intValue());
        }
        return null;
      }
    };

    // DO NOT REMOVE THIS
    new BrowserFunction(browser, "clearBreakpoint") { // $NON-NLS-1$
      @Override
      public Object function(final Object[] arguments) {
        if ((listener != null) && (arguments[0] != null) && (arguments[0] instanceof Number)) {
          listener.clearBreakpoint(((Number) arguments[0]).intValue());
        }
        return null;
      }
    };
  }

  public void setListener(final IEditorWidgetListener listener) {
    this.listener = listener;
  }

  @Override
  public void setText(
      final String text,
      final EditorMode mode,
      final boolean readOnly,
      final boolean breakpointsEnabled,
      final int row) {
    this.text = text;
    this.mode = mode.getName();

    String orionMode = ORION_MODES.get(this.mode);
    if (orionMode != null) {
      this.mode = orionMode;
    }
    this.readOnly = readOnly;
    this.breakpointsEnabled = breakpointsEnabled;
    this.row = row;
    if (loaded) {
      updateWidgetContents();
    }
  }

  @Override
  public String getText() {
    return (String) browser.evaluate("return getText();"); // $NON-NLS-1$
  }

  public void setDirty(final boolean dirty) {
    execute("setDirty", dirty); // $NON-NLS-1$
  }

  public void setDebugRow(final int row) {
    execute("setDebugRow", row); // $NON-NLS-1$
  }

  public void loadBreakpoints(final int[] breakpoints) {
    for (final int breakpoint : breakpoints) {
      execute("loadBreakpoint", breakpoint); // $NON-NLS-1$
    }
  }

  private void updateWidgetContents() {
    evaluate("setText", text, mode, readOnly, breakpointsEnabled, row); // $NON-NLS-1$
  }

  public void setMode(final String mode) {
    evaluate("setMode", mode); // $NON-NLS-1$
  }

  public void setReadOnly(final boolean readOnly) {
    if (disabledForReadOnly) {
      execute("setReadOnly", false); // $NON-NLS-1$
      return;
    }
    execute("setReadOnly", readOnly); // $NON-NLS-1$
  }

  public void setBreakpointsEnabled(final boolean status) {
    evaluate("setBreakpointsEnabled", status); // $NON-NLS-1$
  }

  private void execute(final String function, final Object... arguments) {
    browser.execute(buildFunctionCall(function, arguments));
  }

  private Object evaluate(final String function, final Object... arguments) {
    final String script = buildFunctionCall(function, arguments);
    for (int i = 0; i < EVALUATE_ATTEMPTS; i++) {
      try {
        return browser.evaluate(script);
      } catch (final Exception ex) {
        logger.debug(ex.getMessage(), ex);
      }
    }

    throw new IllegalStateException(SCRIPT_EVALUATION_FAILED + script);
  }

  private String buildFunctionCall(final String function, final Object... arguments) {
    final StringBuilder call = new StringBuilder();
    call.append(function).append('(');
    if (arguments != null) {
      for (final Object argument : arguments) {
        String strArg = null;
        if (argument instanceof String) {
          strArg = prepareStringArgument((String) argument);
        } else {
          strArg = String.valueOf(argument);
        }
        call.append(strArg).append(","); // $NON-NLS-1$
      }
      if (arguments.length > 0) {
        call.deleteCharAt(call.length() - 1);
      }
    }
    call.append(')');

    return call.toString();
  }

  private String prepareStringArgument(final String argument) {
    return "'" + StringEscapeUtils.escapeJavaScript(argument) + "'"; // $NON-NLS-1$ //$NON-NLS-2$
  }
}
/** Database Viewer represents the structure of the tenant specific schema */
public class DatabaseViewer extends ViewPart
    implements IDatabaseConnectionFactory, ISelectionChangedListener {

  private static final Logger logger = Logger.getLogger(DatabaseViewer.class);

  private static final String SELECTED_DATASOURCE_NAME = "SELECTED_DATASOURCE_NAME";

  static final String DEFAULT_DATASOURCE_NAME = "Default";

  private static final String DATABASE_VIEW = Messages.DatabaseViewer_DATABASE_VIEW;

  /** The ID of the view as specified by the extension. */
  public static final String ID =
      "org.eclipse.dirigible.ide.db.viewer.views.DatabaseViewer"; //$NON-NLS-1$

  protected TreeViewer viewer;

  @SuppressWarnings("unused")
  private DrillDownAdapter drillDownAdapter;

  protected Action viewTableContentAction;
  private Action deleteAction;
  private Action exportDataAction;
  private Action doubleClickAction;
  private boolean isOperator;

  private ShowTableDefinitionAction showTableDefinitionAction;

  protected RefreshViewAction refreshViewAction;

  class NameSorter extends ViewerSorter {
    private static final long serialVersionUID = -7067479902071396325L;
  }

  /** The constructor. */
  public DatabaseViewer() {
    isOperator = CommonIDEParameters.isUserInRole(IRoles.ROLE_OPERATOR);
  }

  /** This is a callback that will allow us to create the viewer and initialize it. */
  @Override
  @SuppressWarnings("unused")
  public void createPartControl(Composite parent) {

    parent.setLayout(new GridLayout());
    DatabaseViewerToolBar databaseViewerToolBar = new DatabaseViewerToolBar();
    databaseViewerToolBar.addSelectionChangedListener(this);
    databaseViewerToolBar.createToolBar(parent, getSite().getShell());

    PatternFilter filter = new PatternFilter();
    FilteredTree tree =
        new FilteredTree(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL, filter, true);
    viewer = tree.getViewer();
    DrillDownAdapter drillDownAdapter = new DrillDownAdapter(viewer);
    viewer.setContentProvider(initContentProvider());
    viewer.setLabelProvider(new DatabaseViewLabelProvider(this));
    viewer.setSorter(new NameSorter());
    viewer.setInput(getViewSite());

    // Create the help context id for the viewer's control
    // PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(),
    // "org.eclipse.dirigible.ide.db.viewer.views.DatabaseViewer");

    makeActions();
    hookContextMenu();
    hookDoubleClickAction();
    contributeToActionBars();
  }

  protected IContentProvider initContentProvider() {
    return new DatabaseViewContentProvider(this);
  }

  protected IFilter getSchemaFilter(Connection connection) throws SQLException {
    return null;
  }

  private void hookContextMenu() {
    MenuManager menuMgr = new MenuManager("#PopupMenu"); // $NON-NLS-1$
    menuMgr.setRemoveAllWhenShown(true);
    menuMgr.addMenuListener(
        new IMenuListener() {
          private static final long serialVersionUID = -4330735691305481160L;

          @Override
          public void menuAboutToShow(IMenuManager manager) {
            DatabaseViewer.this.fillContextMenu(manager);
          }
        });
    Menu menu = menuMgr.createContextMenu(viewer.getControl());
    viewer.getControl().setMenu(menu);
    getSite().registerContextMenu(menuMgr, viewer);
  }

  private void contributeToActionBars() {
    IActionBars bars = getViewSite().getActionBars();
    fillLocalPullDown(bars.getMenuManager());
    fillLocalToolBar(bars.getToolBarManager());
  }

  private void fillLocalPullDown(IMenuManager manager) {
    manager.add(showTableDefinitionAction);
    manager.add(viewTableContentAction);
    manager.add(exportDataAction);
    manager.add(new Separator());
    if (isOperator) {
      manager.add(deleteAction);
    }
    manager.add(new Separator());
    manager.add(refreshViewAction);
  }

  private void fillContextMenu(IMenuManager manager) {
    ISelection selection = viewer.getSelection();
    Object obj = ((IStructuredSelection) selection).getFirstElement();
    if (!TreeParent.class.isInstance(obj)) {
      if (TreeObject.class.isInstance(obj)) {
        TreeObject tObject = (TreeObject) obj;
        List<Capability> capabilities = tObject.getTableDefinition().getCapabilities();
        if ((capabilities != null) && !capabilities.isEmpty()) {
          if (capabilities.contains(Capability.ShowTableDefinition)) {
            manager.add(showTableDefinitionAction);
          }
          if (capabilities.contains(Capability.ViewTableContent)) {
            manager.add(viewTableContentAction);
          }
          if (capabilities.contains(Capability.ExportData)) {
            manager.add(exportDataAction);
          }
          if (!manager.isEmpty()) {
            manager.add(new Separator());
          }
          if (isOperator && capabilities.contains(Capability.Delete)) {
            manager.add(deleteAction);
          }
          if (!manager.isEmpty()) {
            manager.add(new Separator());
          }
        }
      }
    }
    manager.add(refreshViewAction);
    // Other plug-ins can contribute there actions here
    manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
  }

  private void fillLocalToolBar(IToolBarManager manager) {
    manager.add(showTableDefinitionAction);
    manager.add(viewTableContentAction);
    manager.add(exportDataAction);
    manager.add(new Separator());
    if (isOperator) {
      manager.add(deleteAction);
    }
    manager.add(new Separator());
    manager.add(refreshViewAction);
  }

  private void makeActions() {
    createRefreshAction();
    createExportDataAction();
    createViewTableContentAction();
    createShowTableDefinitionAction();
    if (isOperator) {
      deleteAction = new DeleteTableAction(viewer);
    }
    doubleClickAction = new ShowTableDefinitionAction(viewer);
  }

  protected void createRefreshAction() {
    refreshViewAction = new RefreshViewAction(viewer);
  }

  protected void createViewTableContentAction() {
    viewTableContentAction =
        new ViewTableContentAction(
            viewer, "org.eclipse.dirigible.ide.db.viewer.views.SQLConsole"); // $NON-NLS-1$
  }

  protected void createShowTableDefinitionAction() {
    showTableDefinitionAction = new ShowTableDefinitionAction(viewer);
  }

  protected void createExportDataAction() {
    exportDataAction = new ExportDataAction(viewer);
  }

  private void hookDoubleClickAction() {
    viewer.addDoubleClickListener(
        new IDoubleClickListener() {
          @Override
          public void doubleClick(DoubleClickEvent event) {
            doubleClickAction.run();
          }
        });
  }

  protected void showMessage(String message) {
    MessageDialog.openInformation(viewer.getControl().getShell(), DATABASE_VIEW, message);
  }

  /** Passing the focus request to the viewer's control. */
  @Override
  public void setFocus() {
    viewer.getControl().setFocus();
  }

  @Override
  public Connection getDatabaseConnection() throws SQLException {
    return getConnectionFromSelectedDatasource();
  }

  public static String getSelectedDatasourceName() throws SQLException {
    return CommonIDEParameters.get(SELECTED_DATASOURCE_NAME);
  }

  /**
   * Create connection from the data-source selected at this view
   *
   * @return
   * @throws SQLException
   */
  public static Connection getConnectionFromSelectedDatasource() throws SQLException {
    String datasourceName = CommonIDEParameters.get(SELECTED_DATASOURCE_NAME);
    DataSource dataSource = null;
    if ((datasourceName == null) || datasourceName.equals(DEFAULT_DATASOURCE_NAME)) {
      logger.debug("No selected datasource found. Make use of the default one");
      dataSource = DataSourceFacade.getInstance().getDataSource(CommonIDEParameters.getRequest());
      if (dataSource != null) {
        Connection connection = dataSource.getConnection();
        return connection;
      }
      logger.error("Trying to use the default datasource, but it is null");
    } else {
      logger.debug(String.format("Selected datasource found %s", datasourceName));
      dataSource =
          DataSourceFacade.getInstance()
              .getNamedDataSource(CommonIDEParameters.getRequest(), datasourceName);
      if (dataSource != null) {
        Connection connection = dataSource.getConnection();
        return connection;
      }
      logger.error(
          String.format(
              "Selected datasource found %s, but the datasource itself is null", datasourceName));
    }
    return null;
  }

  boolean showSchemes() {
    return false;
  }

  @Override
  public void selectionChanged(SelectionChangedEvent event) {
    if (event.getSource() instanceof DatabaseViewerToolBar) {
      String datasourceName =
          (String) ((IStructuredSelection) event.getSelection()).getFirstElement();
      CommonIDEParameters.set(SELECTED_DATASOURCE_NAME, datasourceName);
      viewer.setContentProvider(initContentProvider());
      viewer.refresh();
    }
  }
}
public class ToolBarMenuViewProvider {

  private static final Logger logger = Logger.getLogger(ToolBarMenuViewProvider.class);

  private static final String EMPTY = ""; // $NON-NLS-1$
  private static final String SAVE = Messages.WorkspaceExplorerView_SAVE;
  private static final String SAVE_ALL = Messages.WorkspaceExplorerView_SAVE_ALL;
  private static final String NEW = Messages.WorkspaceExplorerView_NEW;

  private static final String PUBLISH_TOOL_TIP_TEXT = Messages.WorkspaceExplorerView_PUBLISH;
  private static final String ACTIVATE_TOOL_TIP_TEXT = Messages.WorkspaceExplorerView_ACTIVATE;

  private static final String PUBLISH_FAILED = Messages.WorkspaceExplorerView_PUBLISH_FAILED;
  private static final String ACTIVATION_FAILED = Messages.WorkspaceExplorerView_ACTIVATION_FAILED;

  private static final Image SAVE_ICON =
      ImageUtils.createImage(
          ImageUtils.getIconURL(
              "org.eclipse.dirigible.ide.workspace.ui",
              "/resources/icons/",
              "save.png")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  private static final Image SAVE_ALL_ICON =
      ImageUtils.createImage(
          ImageUtils.getIconURL(
              "org.eclipse.dirigible.ide.workspace.ui",
              "/resources/icons/",
              "save_all.png")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$

  private static final Image PUBLISH_ICON =
      ImageUtils.createImage(
          ImageUtils.getIconURL(
              "org.eclipse.dirigible.ide.publish.ui",
              "/resources/icons/",
              "publish.png")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  private static final Image ACTIVATE_ICON =
      ImageUtils.createImage(
          ImageUtils.getIconURL(
              "org.eclipse.dirigible.ide.publish.ui",
              "/resources/icons/",
              "activate.png")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$

  public static void createToolBarMenu(Composite parent, Shell shell) {
    if (CommonIDEParameters.isRAP()) {
      int style = SWT.FLAT | SWT.WRAP | SWT.RIGHT | SWT.BORDER | SWT.SHADOW_OUT;

      final ToolBar toolBar = new ToolBar(parent, style);

      if (CommonIDEParameters.isSandboxEnabled()) {
        createActivateToolItem(toolBar, shell);
        createSeparator(toolBar);
      }

      createPublishToolItem(toolBar, shell);

      createSeparator(toolBar);

      createSaveToolItem(toolBar);

      createSeparator(toolBar);

      createSaveAllToolItem(toolBar);

      createSeparator(toolBar);

      createNewToolItem(parent, toolBar);
    }
  }

  private static ToolItem createSeparator(final ToolBar toolBar) {
    return new ToolItem(toolBar, SWT.SEPARATOR);
  }

  private static ToolItem createActivateToolItem(final ToolBar toolBar, final Shell shell) {
    ToolItem toolItem = createToolItem(toolBar, EMPTY, ACTIVATE_TOOL_TIP_TEXT, ACTIVATE_ICON);
    toolItem.addSelectionListener(
        new SelectionListener() {
          private static final long serialVersionUID = 2364528684607846153L;

          @Override
          public void widgetSelected(SelectionEvent e) {
            StatusLineManagerUtil.getDefaultStatusLineManager().removeAll();
            try {
              activate();
            } catch (Exception ex) {
              logger.error(ex.getMessage(), ex);
              StatusLineManagerUtil.setErrorMessage(ex.getMessage());
              MessageDialog.openError(shell, PUBLISH_FAILED, ex.getMessage());
            }

            WebViewerView.refreshWebViewerViewIfVisible();
          }

          @Override
          public void widgetDefaultSelected(SelectionEvent e) {
            //
          }
        });
    return toolItem;
  }

  private static ToolItem createPublishToolItem(final ToolBar toolBar, final Shell shell) {
    ToolItem toolItem = createToolItem(toolBar, EMPTY, PUBLISH_TOOL_TIP_TEXT, PUBLISH_ICON);
    toolItem.addSelectionListener(
        new SelectionListener() {
          private static final long serialVersionUID = 3334607710375924130L;

          @Override
          public void widgetSelected(SelectionEvent e) {
            StatusLineManagerUtil.getDefaultStatusLineManager().removeAll();
            try {
              publish();
            } catch (Exception ex) {
              logger.error(ex.getMessage(), ex);
              StatusLineManagerUtil.setErrorMessage(ex.getMessage());
              MessageDialog.openError(shell, ACTIVATION_FAILED, ex.getMessage());
            }

            WebViewerView.refreshWebViewerViewIfVisible();
          }

          @Override
          public void widgetDefaultSelected(SelectionEvent e) {
            //
          }
        });
    return toolItem;
  }

  private static ToolItem createNewToolItem(Composite parent, final ToolBar toolBar) {
    final Menu menu = NewMenuItemViewProvider.createMenu(parent);

    final ToolItem toolItem = createToolItem(toolBar, NEW, NEW, null, SWT.DROP_DOWN);
    toolItem.addSelectionListener(
        new SelectionListener() {
          private static final long serialVersionUID = -2281618627759204367L;

          @Override
          public void widgetSelected(SelectionEvent e) {
            if (e.detail == SWT.ARROW) {
              Rectangle rect = toolItem.getBounds();
              Point pt = new Point(rect.x, rect.y + rect.height);
              pt = toolBar.toDisplay(pt);
              menu.setLocation(pt.x, pt.y);
              menu.setVisible(true);
            }
          }

          @Override
          public void widgetDefaultSelected(SelectionEvent e) {
            //

          }
        });

    return toolItem;
  }

  private static ToolItem createSaveToolItem(final ToolBar toolBar) {
    ToolItem toolItem = createToolItem(toolBar, EMPTY, SAVE, SAVE_ICON);
    toolItem.addSelectionListener(
        new SelectionListener() {
          private static final long serialVersionUID = -8381124396267155406L;

          @Override
          public void widgetSelected(SelectionEvent e) {
            IWorkbench workbench = PlatformUI.getWorkbench();
            IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
            IPageListener saveAction = (IPageListener) ActionFactory.SAVE.create(window);
            saveAction.pageActivated(window.getActivePage());
            ((IWorkbenchAction) saveAction).run();
          }

          @Override
          public void widgetDefaultSelected(SelectionEvent e) {
            //
          }
        });
    return toolItem;
  }

  private static ToolItem createSaveAllToolItem(final ToolBar toolBar) {
    ToolItem toolItem = createToolItem(toolBar, EMPTY, SAVE_ALL, SAVE_ALL_ICON);
    toolItem.addSelectionListener(
        new SelectionListener() {
          private static final long serialVersionUID = 6845514748708051108L;

          @Override
          public void widgetSelected(SelectionEvent e) {
            IWorkbench workbench = PlatformUI.getWorkbench();
            IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
            ActionFactory.SAVE_ALL.create(window).run();
          }

          @Override
          public void widgetDefaultSelected(SelectionEvent e) {
            //
          }
        });
    return toolItem;
  }

  private static ToolItem createToolItem(
      ToolBar toolBar, String text, String toolTipText, Image image) {
    return createToolItem(toolBar, text, toolTipText, image, SWT.PUSH);
  }

  private static ToolItem createToolItem(
      ToolBar toolBar, String text, String toolTipText, Image image, int style) {
    ToolItem toolItem = new ToolItem(toolBar, style);
    toolItem.setText(text);
    toolItem.setToolTipText(toolTipText);
    toolItem.setImage(image);
    return toolItem;
  }

  private static void publish() throws PublishException {
    for (IProject project : PublishManager.getProjects(getSelection())) {
      PublishManager.publishProject(project);
    }
  }

  private static void activate() throws PublishException {
    for (IProject project : PublishManager.getProjects(getSelection())) {
      PublishManager.activateProject(project);
    }
  }

  private static ISelection getSelection() {
    IWorkbench workbench = PlatformUI.getWorkbench();
    IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow();
    ISelectionService selectionService = workbenchWindow.getSelectionService();
    ISelection selection = selectionService.getSelection();
    return selection;
  }
}
public class JavascriptServiceTemplateModel extends GenerationModel {

  private static final String ERROR_ON_LOADING_TABLE_COLUMNS_FROM_DATABASE_FOR_GENERATION =
      Messages
          .JavascriptServiceTemplateModel_ERROR_ON_LOADING_TABLE_COLUMNS_FROM_DATABASE_FOR_GENERATION;

  private static final String TARGET_LOCATION_IS_NOT_ALLOWED =
      Messages.JavascriptServiceTemplateModel_TARGET_LOCATION_IS_NOT_ALLOWED;

  private static final Logger logger = Logger.getLogger(JavascriptServiceTemplateModel.class);

  private String tableName;

  private String tableType;

  private TableColumn[] tableColumns;

  private boolean columnsInit = false;

  public String getTableName() {
    return tableName;
  }

  public void setTableName(String tableName) {
    this.tableName = tableName;
  }

  public String getTableType() {
    return tableType;
  }

  public void setTableType(String tableType) {
    this.tableType = tableType;
  }

  public TableColumn[] getTableColumns() {
    if (!columnsInit) {
      createTableColumns();
    }
    return tableColumns; // NOPMD
  }

  public void setTableColumns(TableColumn[] tableColumns) {
    this.tableColumns = tableColumns;
    columnsInit = true;
  }

  @Override
  public IValidationStatus validate() {
    IValidationStatus locationStatus = validateLocation();
    if (locationStatus.hasErrors()) {
      return locationStatus;
    }
    IValidationStatus templateStatus = validateTemplate();
    if (locationStatus.hasErrors()) {
      return locationStatus;
    }
    // if (!validateTableName()) {
    // return false;
    // }
    return ValidationStatus.getValidationStatus(locationStatus, templateStatus);
  }

  public IValidationStatus validateLocation() {
    IValidationStatus status;
    try {
      status = validateLocationGeneric();
      if (status.hasErrors()) {
        return status;
      }
      IPath location = new Path(getTargetLocation()).append(getFileName());
      // TODO - more precise test for the location ../WebContent/...
      if (location.toString().indexOf(ICommonConstants.ARTIFACT_TYPE.SCRIPTING_SERVICES) == -1) {
        return ValidationStatus.createError(TARGET_LOCATION_IS_NOT_ALLOWED);
      }
    } catch (Exception e) {
      // temp workaround due to another bug - context menu is not context
      // aware => target location and name are null (in the first page of
      // the wizard)
      return ValidationStatus.createError(""); // $NON-NLS-1$
    }
    return status;
  }

  public boolean validateTableName() {
    return tableName != null;
  }

  private void createTableColumns() {

    if (getTableName() == null) {
      return;
    }

    try {

      Connection connection = null;
      try {
        connection =
            DataSourceFacade.getInstance()
                .getDataSource(CommonParameters.getRequest())
                .getConnection();

        List<TableColumn> availableTableColumns = new ArrayList<TableColumn>();

        ResultSet primaryKeys = DBUtils.getPrimaryKeys(connection, getTableName());
        while (primaryKeys.next()) {
          String columnName = primaryKeys.getString("COLUMN_NAME"); // $NON-NLS-1$
          TableColumn tableColumn = new TableColumn(columnName, 0, true, true);
          availableTableColumns.add(tableColumn);
        }

        ResultSet columns = DBUtils.getColumns(connection, getTableName());
        while (columns.next()) {
          // columns
          String columnName = columns.getString("COLUMN_NAME"); // $NON-NLS-1$
          int columnType = columns.getInt("DATA_TYPE"); // $NON-NLS-1$

          TableColumn tableColumn = new TableColumn(columnName, columnType, false, true);
          if (!exists(availableTableColumns, tableColumn)) {
            availableTableColumns.add(tableColumn);
          }
        }

        setTableColumns(availableTableColumns.toArray(new TableColumn[] {}));
      } finally {
        if (connection != null) {
          connection.close();
        }
      }
    } catch (Exception e) {
      logger.error(ERROR_ON_LOADING_TABLE_COLUMNS_FROM_DATABASE_FOR_GENERATION, e);
    }
  }

  private boolean exists(List<TableColumn> availableTableColumns, TableColumn tableColumn) {
    if (getTableName() == null) {
      return false;
    }
    for (TableColumn tableColumn2 : availableTableColumns) {
      TableColumn tableColumnX = tableColumn2;
      if (tableColumnX.getName().equals(tableColumn.getName())) {
        tableColumnX.setType(tableColumn.getType());
        return true;
      }
    }
    return false;
  }
}
public class DefaultContentProvider implements IContentProvider, IExecutableExtension {

  private static final String CANNOT_SAVE_FILE_CONTENTS =
      Messages.DefaultContentProvider_CANNOT_SAVE_FILE_CONTENTS;
  private static final String CANNOT_READ_FILE_CONTENTS =
      Messages.DefaultContentProvider_CANNOT_READ_FILE_CONTENTS;
  private static final String WE_SHOULD_NEVER_GET_HERE =
      Messages.DefaultContentProvider_WE_SHOULD_NEVER_GET_HERE;
  private static final Logger LOGGER = Logger.getLogger(DefaultContentProvider.class);

  @Override
  public String getContent(IEditorInput input) throws ContentProviderException {
    if (input instanceof IFileEditorInput) {
      IFileEditorInput fileInput = (IFileEditorInput) input;
      return readFile(fileInput.getFile());
    }
    if (input instanceof ContentEditorInput) {
      ContentEditorInput contentInput = (ContentEditorInput) input;
      return new String(contentInput.getContent());
    }
    throw new IllegalStateException(WE_SHOULD_NEVER_GET_HERE);
  }

  @Override
  public void save(IProgressMonitor monitor, IEditorInput input, String content, boolean overwrite)
      throws ContentProviderException {
    if (input instanceof IFileEditorInput) {
      IFileEditorInput fileInput = (IFileEditorInput) input;
      writeFile(fileInput.getFile(), content.getBytes());
      //			activateIfNeeded();
    }
  }

  //	private void activateIfNeeded() {
  //		ResourcesPlugin.getWorkspace().notifyAll();
  //	}

  protected static final String readFile(IFile file) throws ContentProviderException {
    try {
      BufferedReader in = null;
      if (file.getClass()
          .getCanonicalName()
          .equals("org.eclipse.dirigible.ide.workspace.impl.File")) {
        in = new BufferedReader(new InputStreamReader(file.getContents()));
      } else {
        IResource resource = getFromRepository(file);
        in =
            new BufferedReader(
                new InputStreamReader(new ByteArrayInputStream(resource.getContent())));
      }
      StringBuilder builder = new StringBuilder();
      String line = null;
      while ((line = in.readLine()) != null) {
        builder.append(line);
        builder.append("\n"); // $NON-NLS-1$
      }
      return builder.toString();
    } catch (Exception ex) {
      LOGGER.error(CANNOT_READ_FILE_CONTENTS, ex);
      throw new ContentProviderException(CANNOT_READ_FILE_CONTENTS, ex);
    }
  }

  private static IResource getFromRepository(IFile file) {
    IRepository repository = RepositoryFacade.getInstance().getRepository();

    String resourcePath =
        IRepositoryPaths.DB_DIRIGIBLE_USERS
            + CommonIDEParameters.getUserName()
            + IRepositoryPaths.SEPARATOR
            + IRepositoryPaths.WORKSPACE_FOLDER_NAME
            + file.getFullPath();
    IResource resource = repository.getResource(resourcePath);
    return resource;
  }

  protected static final void writeFile(IFile file, byte[] content)
      throws ContentProviderException {
    try {
      if (file.getClass()
          .getCanonicalName()
          .equals("org.eclipse.dirigible.ide.workspace.impl.File")) {
        file.setContents(new ByteArrayInputStream(content), false, false, null);
      } else {
        IResource resource = getFromRepository(file);
        resource.setContent(content);
      }
    } catch (CoreException ex) {
      LOGGER.error(CANNOT_SAVE_FILE_CONTENTS, ex);
      throw new ContentProviderException(CANNOT_SAVE_FILE_CONTENTS, ex);
    } catch (IOException e) {
      LOGGER.error(CANNOT_SAVE_FILE_CONTENTS, e);
      throw new ContentProviderException(CANNOT_SAVE_FILE_CONTENTS, e);
    }
  }

  @Override
  public void setInitializationData(IConfigurationElement config, String propertyName, Object data)
      throws CoreException {
    //
  }
}
/** Exports the current content of the Registry */
public class ContentExporterServlet extends ContentBaseServlet {

  private static final long serialVersionUID = 5798183051027211544L;

  private static final Logger logger = Logger.getLogger(ContentExporterServlet.class);

  private static final String GUID = "guid"; // $NON-NLS-1$
  private static final String DEFAULT_PATH_FOR_EXPORT = IRepositoryPaths.REGISTRY_DEPLOY_PATH;
  private static final String EMPTY = ""; // $NON-NLS-1$
  private static final String DATE_FORMAT = "yyyyMMdd-HHmmss"; // $NON-NLS-1$

  static final String UNKNOWN_HOST = "unknown_host";

  static final String UNDERSCORE = "_"; // $NON-NLS-1$

  protected String getExportFilePrefix() {
    StringBuilder buff = new StringBuilder();
    buff.append(IRepositoryPaths.REGISTRY).append(UNDERSCORE);
    try {
      buff.append(java.net.InetAddress.getLocalHost().getHostName());
    } catch (UnknownHostException e) {
      logger.error(e.getMessage(), e);
      buff.append(UNKNOWN_HOST);
    }
    return buff.toString();
  }

  /** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */
  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    doGet(request, response);
  }

  /** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */
  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    if (!PermissionsUtils.isUserInRole(request, IRoles.ROLE_OPERATOR)) {
      String err = String.format(PermissionsUtils.PERMISSION_ERR, "Export");
      logger.debug(err);
      throw new ServletException(err);
    }

    // put guid in the session
    request.getSession().setAttribute(GUID, createGUID()); // $NON-NLS-1$

    byte[] zippedContent = getContentFromRepository(request);

    sendZip(request, response, zippedContent);
  }

  /**
   * Return the constructed zip in servlet response
   *
   * @param response
   * @param tmpFile
   * @param request
   */
  private void sendZip(HttpServletRequest request, HttpServletResponse response, byte[] content) {
    String fileName = null;

    fileName = defaultFileName(request) + ".zip";

    response.setContentType("application/zip"); // $NON-NLS-1$
    response.setHeader(
        "Content-Disposition",
        "attachment;filename=\"" //$NON-NLS-1$ //$NON-NLS-2$
            + fileName
            + "\""); //$NON-NLS-1$
    try {
      BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
      ByteArrayInputStream fis = new ByteArrayInputStream(content);
      int len;
      byte[] buf = new byte[1024];
      while ((len = fis.read(buf)) > 0) {
        bos.write(buf, 0, len);
      }
      bos.close();
      fis.close();
    } catch (IOException e) {
      logger.error(e.getMessage(), e);
    }
  }

  private String defaultFileName(HttpServletRequest request) {
    String fileName;
    String guid = EMPTY.equals(getGUID(request)) ? EMPTY : getGUID(request);
    fileName = getExportFilePrefix() + UNDERSCORE + guid;
    return fileName;
  }

  /**
   * Extract the Dirigible project as a zip from the repository.
   *
   * @param request
   * @return
   */
  private byte[] getContentFromRepository(HttpServletRequest request) {
    byte[] zippedContent = null;
    try {
      IRepository repository = getRepository(request);
      zippedContent = repository.exportZip(getDefaultPathForExport(), true);
    } catch (IOException e) {
      logger.error(e.getMessage(), e);
    }
    return zippedContent;
  }

  protected String getDefaultPathForExport() {
    return DEFAULT_PATH_FOR_EXPORT;
  }

  /**
   * Create guid. Currently timestamp.
   *
   * @return
   */
  private String createGUID() {
    // SimpleDateFormat sdfDate = new
    // SimpleDateFormat("yyyy.MM.dd.HH.mm.ss.SSS");
    SimpleDateFormat sdfDate = new SimpleDateFormat(DATE_FORMAT);
    Date now = new Date();
    String strDate = sdfDate.format(now);
    return strDate;
  }

  private String getGUID(HttpServletRequest request) {
    return (String) request.getSession().getAttribute(GUID);
  }
}
public class JGitConnector {

  private static final String INVALID_USERNAME_AND_PASSWORD =
      Messages.JGitConnector_INVALID_USERNAME_AND_PASSWORD;

  public static final String TEMP_DIRECTORY_PREFIX = "org.eclipse.dirigible.jgit."; // $NON-NLS-1$

  private static final String REFS_HEADS_MASTER = "refs/heads/master"; // $NON-NLS-1$
  private static final String MERGE = "merge"; // $NON-NLS-1$
  private static final String MASTER = "master"; // $NON-NLS-1$
  private static final String BRANCH = "branch"; // $NON-NLS-1$
  public static final String ADD_ALL_FILE_PATTERN = "."; // $NON-NLS-1$

  private static final Logger logger = Logger.getLogger(JGitConnector.class);

  static {
    try {
      // ProxyUtils.setProxySettings();
      deleteTempDirectories();
    } catch (IOException e) {
      logger.error(e.getMessage(), e);
    }
  }

  private static void deleteTempDirectories() throws IOException {
    File file = GitFileUtils.createTempDirectory("DeleteDirectory");
    File tempDirectory = file.getParentFile();
    for (File temp : tempDirectory.listFiles()) {
      if (temp.isDirectory() && temp.getName().startsWith(TEMP_DIRECTORY_PREFIX)) {
        GitFileUtils.deleteDirectory(temp);
      }
    }
    GitFileUtils.deleteDirectory(file);
  }

  /**
   * Gets org.eclipse.jgit.lib.Repository object for existing Git Repository.
   *
   * @param repositoryPath the path to an existing Git Repository
   * @return {@link org.eclipse.jgit.lib.Repository} object
   * @throws IOException
   */
  public static Repository getRepository(String repositoryPath) throws IOException {
    RepositoryBuilder repositoryBuilder = new RepositoryBuilder();
    repositoryBuilder.findGitDir(new File(repositoryPath));
    Repository repository = repositoryBuilder.build();
    repository.getConfig().setString(BRANCH, MASTER, MERGE, REFS_HEADS_MASTER);
    return repository;
  }

  /**
   * Clones git remote repository to the file system.
   *
   * @param gitDirectory where the remote repository will be cloned
   * @param repositoryURI repository's URI example: https://qwerty.com/xyz/abc.git
   * @throws InvalidRemoteException
   * @throws TransportException
   * @throws GitAPIException
   */
  public static void cloneRepository(File gitDirectory, String repositoryURI)
      throws InvalidRemoteException, TransportException, GitAPIException {
    cloneRepository(gitDirectory, repositoryURI, null, null);
  }

  /**
   * Clones secured git remote repository to the file system.
   *
   * @param gitDirectory where the remote repository will be cloned
   * @param repositoryURI repository's URI example: https://qwerty.com/xyz/abc.git
   * @param username the username used for authentication
   * @param password the password used for authentication
   * @throws InvalidRemoteException
   * @throws TransportException
   * @throws GitAPIException
   */
  public static void cloneRepository(
      File gitDirectory, String repositoryURI, String username, String password)
      throws InvalidRemoteException, TransportException, GitAPIException {
    try {
      CloneCommand cloneCommand = Git.cloneRepository();
      cloneCommand.setURI(repositoryURI);
      if (!StringUtils.isEmptyOrNull(username) && !StringUtils.isEmptyOrNull(password)) {
        cloneCommand.setCredentialsProvider(
            new UsernamePasswordCredentialsProvider(username, password));
      }
      cloneCommand.setRemote(Constants.DEFAULT_REMOTE_NAME);
      cloneCommand.setDirectory(gitDirectory);
      cloneCommand.call();
    } catch (NullPointerException e) {
      throw new TransportException(INVALID_USERNAME_AND_PASSWORD);
    }
  }

  private final Git git;
  private Repository repository;

  public JGitConnector(Repository repository) throws IOException {
    this.repository = repository;
    this.git = new Git(repository);
  }

  /**
   * Adds content from file(s) to the staging index
   *
   * @param filePattern File to add content from. Example: "." includes all files. If "dir/subdir/"
   *     is directory then "dir/subdir" all files from the directory recursively
   * @throws IOException
   * @throws NoFilepatternException
   * @throws GitAPIException
   */
  public void add(String filePattern) throws IOException, NoFilepatternException, GitAPIException {
    AddCommand addCommand = git.add();
    addCommand.addFilepattern(filePattern);
    addCommand.call();
  }

  /**
   * Adds changes to the staging index. Then makes commit.
   *
   * @param message the commit message
   * @param name the name of the committer used for the commit
   * @param email the email of the committer used for the commit
   * @param all if set to true, command will automatically stages files that have been modified and
   *     deleted, but new files not known by the repository are not affected. This corresponds to
   *     the parameter -a on the command line.
   * @throws NoHeadException
   * @throws NoMessageException
   * @throws UnmergedPathsException
   * @throws ConcurrentRefUpdateException
   * @throws WrongRepositoryStateException
   * @throws GitAPIException
   * @throws IOException
   */
  public void commit(String message, String name, String email, boolean all)
      throws NoHeadException, NoMessageException, UnmergedPathsException,
          ConcurrentRefUpdateException, WrongRepositoryStateException, GitAPIException,
          IOException {
    CommitCommand commitCommand = git.commit();
    commitCommand.setMessage(message);
    commitCommand.setCommitter(name, email);
    commitCommand.setAuthor(name, email);
    commitCommand.setAll(all);
    commitCommand.call();
  }

  /**
   * Creates new branch from a particular start point
   *
   * @param name the branch name
   * @param startPoint valid tree-ish object example: "5c15e8", "master", "HEAD",
   *     "21d5a96070353d01c0f30bc0559ab4de4f5e3ca0"
   * @throws RefAlreadyExistsException
   * @throws RefNotFoundException
   * @throws InvalidRefNameException
   * @throws GitAPIException
   */
  public void createBranch(String name, String startPoint)
      throws RefAlreadyExistsException, RefNotFoundException, InvalidRefNameException,
          GitAPIException {
    repository.getConfig().setString(BRANCH, name, MERGE, REFS_HEADS_MASTER);
    CreateBranchCommand createBranchCommand = git.branchCreate();
    createBranchCommand.setName(name);
    createBranchCommand.setStartPoint(startPoint);
    createBranchCommand.setUpstreamMode(SetupUpstreamMode.SET_UPSTREAM);
    createBranchCommand.call();
  }

  /**
   * Checkout to a valid tree-ish object example: "5c15e8", "master", "HEAD",
   * "21d5a96070353d01c0f30bc0559ab4de4f5e3ca0"
   *
   * @param name the tree-ish object
   * @return {@link org.eclipse.jgit.lib.Ref} object
   * @throws RefAlreadyExistsException
   * @throws RefNotFoundException
   * @throws InvalidRefNameException
   * @throws CheckoutConflictException
   * @throws GitAPIException
   */
  public Ref checkout(String name)
      throws RefAlreadyExistsException, RefNotFoundException, InvalidRefNameException,
          CheckoutConflictException, GitAPIException {
    CheckoutCommand checkoutCommand = git.checkout();
    checkoutCommand.setName(name);
    return checkoutCommand.call();
  }

  /**
   * Hard reset the repository. Makes the working directory and staging index content to exactly
   * match the Git repository.
   *
   * @throws CheckoutConflictException
   * @throws GitAPIException
   */
  public void hardReset() throws CheckoutConflictException, GitAPIException {
    ResetCommand resetCommand = git.reset();
    resetCommand.setMode(ResetType.HARD);
    resetCommand.call();
  }

  /**
   * Fetches from a remote repository and tries to merge into the current branch.
   *
   * @throws WrongRepositoryStateException
   * @throws InvalidConfigurationException
   * @throws DetachedHeadException
   * @throws InvalidRemoteException
   * @throws CanceledException
   * @throws RefNotFoundException
   * @throws NoHeadException
   * @throws TransportException
   * @throws GitAPIException
   */
  public void pull()
      throws WrongRepositoryStateException, InvalidConfigurationException, DetachedHeadException,
          InvalidRemoteException, CanceledException, RefNotFoundException, NoHeadException,
          TransportException, GitAPIException {
    PullCommand pullCommand = git.pull();
    pullCommand.call();
  }

  /**
   * Pushes the committed changes to the remote repository.
   *
   * @param username for the remote repository
   * @param password for the remote repository
   * @throws InvalidRemoteException
   * @throws TransportException
   * @throws GitAPIException
   */
  public void push(String username, String password)
      throws InvalidRemoteException, TransportException, GitAPIException {
    PushCommand pushCommand = git.push();
    pushCommand.setCredentialsProvider(new UsernamePasswordCredentialsProvider(username, password));
    pushCommand.call();
  }

  /**
   * Tries to rebase the selected branch on top of the current one.
   *
   * @param name the branch to rebase
   * @throws NoHeadException
   * @throws WrongRepositoryStateException
   * @throws GitAPIException
   */
  public void rebase(String name)
      throws NoHeadException, WrongRepositoryStateException, GitAPIException {
    RebaseCommand rebaseCommand = git.rebase();
    rebaseCommand.setOperation(Operation.BEGIN);
    rebaseCommand.setUpstream(name);
    rebaseCommand.call();
  }

  /**
   * Get the current status of the Git repository.
   *
   * @return {@link org.eclipse.jgit.api.Status} object
   * @throws NoWorkTreeException
   * @throws GitAPIException
   */
  public Status status() throws NoWorkTreeException, GitAPIException {
    return git.status().call();
  }

  /**
   * Returns the SHA of the last commit on the specified branch.
   *
   * @param branch the name of the specified branch
   * @return SHA example: "21d5a96070353d01c0f30bc0559ab4de4f5e3ca0"
   * @throws RefAlreadyExistsException
   * @throws RefNotFoundException
   * @throws InvalidRefNameException
   * @throws CheckoutConflictException
   * @throws GitAPIException
   */
  public String getLastSHAForBranch(String branch)
      throws RefAlreadyExistsException, RefNotFoundException, InvalidRefNameException,
          CheckoutConflictException, GitAPIException {
    return checkout(branch).getLeaf().getObjectId().getName();
  }
}
public class DatabaseUpdater extends AbstractDataUpdater {

  private static final String DASH = " - "; // $NON-NLS-1$
  private static final String AUTOMATIC_DROP_COLUMN_NOT_SUPPORTED =
      Messages.getString("DatabaseUpdater.AUTOMATIC_DROP_COLUMN_NOT_SUPPORTED"); // $NON-NLS-1$
  private static final String AS = " AS "; // $NON-NLS-1$
  private static final String CREATE_VIEW = "CREATE VIEW "; // $NON-NLS-1$
  private static final String DROP_VIEW = "DROP VIEW "; // $NON-NLS-1$
  private static final String QUERY = "query"; // $NON-NLS-1$
  private static final String CANNOT_BE_CHANGED_TO =
      Messages.getString("DatabaseUpdater.CANNOT_BE_CHANGED_TO"); // $NON-NLS-1$
  private static final String TYPE2 = Messages.getString("DatabaseUpdater.TYPE2"); // $NON-NLS-1$
  private static final String ADDING_PRIMARY_KEY_COLUMN =
      Messages.getString("DatabaseUpdater.ADDING_PRIMARY_KEY_COLUMN"); // $NON-NLS-1$
  private static final String ADDING_NOT_NULL_COLUMN =
      Messages.getString("DatabaseUpdater.ADDING_NOT_NULL_COLUMN"); // $NON-NLS-1$
  private static final String AND_COLUMN =
      Messages.getString("DatabaseUpdater.AND_COLUMN"); // $NON-NLS-1$
  private static final String INCOMPATIBLE_CHANGE_OF_TABLE =
      Messages.getString("DatabaseUpdater.INCOMPATIBLE_CHANGE_OF_TABLE"); // $NON-NLS-1$
  private static final String ADD = "ADD "; // $NON-NLS-1$
  private static final String ALTER_TABLE = "ALTER TABLE "; // $NON-NLS-1$
  private static final String COLUMN_DEFAULT_VALUE = "defaultValue"; // $NON-NLS-1$
  private static final String COLUMN_PRIMARY_KEY = "primaryKey"; // $NON-NLS-1$
  private static final String COLUMN_NOT_NULL = "notNull"; // $NON-NLS-1$
  private static final String COLUMN_LENGTH = "length"; // $NON-NLS-1$
  private static final String COLUMN_TYPE = "type"; // $NON-NLS-1$
  private static final String COLUMN_NAME = "name"; // $NON-NLS-1$
  private static final String COLUMNS = "columns"; // $NON-NLS-1$
  private static final String CREATE_TABLE = "CREATE TABLE "; // $NON-NLS-1$
  private static final String VIEW_NAME = "viewName"; // $NON-NLS-1$
  private static final String VIEW = "VIEW"; // $NON-NLS-1$
  private static final String TABLE = "TABLE"; // $NON-NLS-1$
  private static final String TABLE_NAME = "tableName"; // $NON-NLS-1$
  private static final String DEFAULT = "DEFAULT "; // $NON-NLS-1$
  private static final String PRIMARY_KEY = "PRIMARY KEY "; // $NON-NLS-1$
  private static final String NOT_NULL = "NOT NULL "; // $NON-NLS-1$

  private static final Logger logger = Logger.getLogger(DatabaseUpdater.class);

  public static final String EXTENSION_TABLE = ".table"; // $NON-NLS-1$
  public static final String EXTENSION_VIEW = ".view"; // $NON-NLS-1$
  public static final String REGISTRY_DATA_STRUCTURES_DEFAULT =
      ICommonConstants.DATA_CONTENT_REGISTRY_PUBLISH_LOCATION;

  private IRepository repository;
  private DataSource dataSource;
  private String location;
  private DBUtils dbUtils;

  public DatabaseUpdater(IRepository repository, DataSource dataSource, String location) {
    this.repository = repository;
    this.dataSource = dataSource;
    this.location = location;
    this.dbUtils = new DBUtils(dataSource);
  }

  @Override
  public void executeUpdate(List<String> knownFiles, List<String> errors) throws Exception {
    if (knownFiles.size() == 0) {
      return;
    }

    try {
      Connection connection = dataSource.getConnection();
      DatabaseMetaData databaseMetaData = getMetaData(connection);
      String productName = connection.getMetaData().getDatabaseProductName();
      IDialectSpecifier dialectSpecifier = DBUtils.getDialectSpecifier(productName);

      try {
        for (Iterator<String> iterator = knownFiles.iterator(); iterator.hasNext(); ) {
          String dsDefinition = iterator.next();
          try {
            if (dsDefinition.endsWith(EXTENSION_TABLE)) {
              executeTableUpdate(connection, databaseMetaData, dialectSpecifier, dsDefinition);
            } else if (dsDefinition.endsWith(EXTENSION_VIEW)) {
              executeViewUpdate(connection, databaseMetaData, dialectSpecifier, dsDefinition);
            }
          } catch (Exception e) {
            logger.error(e.getMessage(), e);
            errors.add(e.getMessage());
          }
        }
      } finally {
        if (connection != null) {
          connection.close();
        }
      }
    } catch (SQLException e) {
      logger.error(e.getMessage(), e);
    }
  }

  @Override
  public void executeUpdate(
      List<String> knownFiles, HttpServletRequest request, List<String> errors) throws Exception {
    executeUpdate(knownFiles, errors);
  }

  private void executeTableUpdate(
      Connection connection,
      DatabaseMetaData databaseMetaData,
      IDialectSpecifier dialectSpecifier,
      String dsDefinition)
      throws SQLException, IOException {
    JsonObject dsDefinitionObject = parseTable(dsDefinition);
    String tableName = dsDefinitionObject.get(TABLE_NAME).getAsString();
    tableName = tableName.toUpperCase();
    ResultSet rs = null;
    try {
      rs = databaseMetaData.getTables(null, null, tableName, new String[] {TABLE, VIEW});
      if (rs.next()) {
        // String retrievedTableName = rs.getString(3);
        executeTableUpdate(connection, dialectSpecifier, dsDefinitionObject);
      } else {
        executeTableCreate(connection, dialectSpecifier, dsDefinitionObject);
      }
    } finally {
      if (rs != null) {
        rs.close();
      }
    }
  }

  private DatabaseMetaData getMetaData(Connection connection) throws SQLException {
    // get the database metadata
    DatabaseMetaData databaseMetaData = connection.getMetaData();
    return databaseMetaData;
  }

  private void executeViewUpdate(
      Connection connection,
      DatabaseMetaData databaseMetaData,
      IDialectSpecifier dialectSpecifier,
      String dsDefinition)
      throws SQLException, IOException {
    JsonObject dsDefinitionObject = parseView(dsDefinition);
    String viewName = dsDefinitionObject.get(VIEW_NAME).getAsString();
    viewName = viewName.toUpperCase();
    executeViewCreateOrReplace(connection, dsDefinitionObject);
  }

  private void executeTableCreate(
      Connection connection, IDialectSpecifier dialectSpecifier, JsonObject dsDefinitionObject)
      throws SQLException {
    StringBuilder sql = new StringBuilder();
    String tableName = dsDefinitionObject.get(TABLE_NAME).getAsString();

    sql.append(CREATE_TABLE + tableName + " ("); // $NON-NLS-1$

    JsonArray columns = dsDefinitionObject.get(COLUMNS).getAsJsonArray();
    int i = 0;
    for (JsonElement jsonElement : columns) {
      if (jsonElement instanceof JsonObject) {
        if (i > 0 && i < columns.size()) {
          sql.append(", "); // $NON-NLS-1$
        }
        JsonObject jsonObject = (JsonObject) jsonElement;
        String name = jsonObject.get(COLUMN_NAME).getAsString();
        String type =
            dbUtils.specifyDataType(connection, jsonObject.get(COLUMN_TYPE).getAsString());
        String length = jsonObject.get(COLUMN_LENGTH).getAsString();
        boolean notNull = jsonObject.get(COLUMN_NOT_NULL).getAsBoolean();
        boolean primaryKey = jsonObject.get(COLUMN_PRIMARY_KEY).getAsBoolean();
        String defaultValue = jsonObject.get(COLUMN_DEFAULT_VALUE).getAsString();

        sql.append(name + " " + type); // $NON-NLS-1$
        if (DBSupportedTypesMap.VARCHAR.equals(type) || DBSupportedTypesMap.CHAR.equals(type)) {
          sql.append("(" + length + ") "); // $NON-NLS-1$ //$NON-NLS-2$
        } else {
          sql.append(" "); // $NON-NLS-1$
        }
        if (notNull) {
          sql.append(NOT_NULL);
        }
        if (primaryKey) {
          sql.append(PRIMARY_KEY);
        }
        if (defaultValue != null && !"".equals(defaultValue)) { // $NON-NLS-1$
          sql.append(DEFAULT + defaultValue + " "); // $NON-NLS-1$
        }
      }
      i++;
    }

    sql.append(")"); // $NON-NLS-1$
    String sqlExpression = sql.toString();
    try {
      logger.info(sqlExpression);
      executeUpdateSQL(connection, sqlExpression);
    } catch (SQLException e) {
      logger.error(sqlExpression);
      throw new SQLException(sqlExpression, e);
    }
  }

  private void executeUpdateSQL(Connection connection, String sql) throws SQLException {
    PreparedStatement preparedStatement = connection.prepareStatement(sql);
    preparedStatement.executeUpdate();
  }

  private void executeTableUpdate(
      Connection connection, IDialectSpecifier dialectSpecifier, JsonObject dsDefinitionObject)
      throws SQLException {
    StringBuilder sql = new StringBuilder();
    String tableName = dsDefinitionObject.get(TABLE_NAME).getAsString().toUpperCase();

    Map<String, String> columnDefinitions = new HashMap<String, String>();
    ResultSet rsColumns =
        connection.getMetaData().getColumns(null, null, tableName, "%"); // $NON-NLS-1$
    while (rsColumns.next()) {
      String typeName = DBSupportedTypesMap.getTypeName(rsColumns.getInt(5));
      columnDefinitions.put(rsColumns.getString(4).toUpperCase(), typeName);
    }

    sql.append(ALTER_TABLE + tableName + " "); // $NON-NLS-1$

    JsonArray columns = dsDefinitionObject.get(COLUMNS).getAsJsonArray();
    int i = 0;
    StringBuffer addSql = new StringBuffer();
    addSql.append(dialectSpecifier.getAlterAddOpen());

    for (JsonElement jsonElement : columns) {

      if (jsonElement instanceof JsonObject) {
        JsonObject jsonObject = (JsonObject) jsonElement;
        String name = jsonObject.get(COLUMN_NAME).getAsString().toUpperCase();
        String type =
            dbUtils.specifyDataType(
                connection, jsonObject.get(COLUMN_TYPE).getAsString().toUpperCase());
        String length = jsonObject.get(COLUMN_LENGTH).getAsString();
        boolean notNull = jsonObject.get(COLUMN_NOT_NULL).getAsBoolean();
        boolean primaryKey = jsonObject.get(COLUMN_PRIMARY_KEY).getAsBoolean();
        String defaultValue = jsonObject.get(COLUMN_DEFAULT_VALUE).getAsString();

        if (!columnDefinitions.containsKey(name)) {
          if (i > 0) {
            addSql.append(", "); // $NON-NLS-1$
          }
          addSql.append(name + " " + type); // $NON-NLS-1$
          if (DBSupportedTypesMap.VARCHAR.equals(type) || DBSupportedTypesMap.CHAR.equals(type)) {
            addSql.append("(" + length + ") "); // $NON-NLS-1$ //$NON-NLS-2$
          } else {
            addSql.append(" "); // $NON-NLS-1$
          }
          if (notNull) {
            // sql.append("NOT NULL ");
            throw new SQLException(
                INCOMPATIBLE_CHANGE_OF_TABLE
                    + tableName
                    + AND_COLUMN
                    + name
                    + ADDING_NOT_NULL_COLUMN);
          }
          if (primaryKey) {
            // sql.append("PRIMARY KEY ");
            throw new SQLException(
                INCOMPATIBLE_CHANGE_OF_TABLE
                    + tableName
                    + AND_COLUMN
                    + name
                    + ADDING_PRIMARY_KEY_COLUMN);
          }
          if (defaultValue != null && !"".equals(defaultValue)) { // $NON-NLS-1$
            sql.append(DEFAULT + defaultValue + " "); // $NON-NLS-1$
          }
          i++;
        } else if (!columnDefinitions.get(name).equals(type)) {
          throw new SQLException(
              INCOMPATIBLE_CHANGE_OF_TABLE
                  + tableName
                  + AND_COLUMN
                  + name
                  + TYPE2
                  + columnDefinitions.get(name)
                  + CANNOT_BE_CHANGED_TO
                  + type);
        }
      }
    }

    // TODO Derby does not support multiple ADD in a single statement!

    if (i > 0) {
      addSql.append(dialectSpecifier.getAlterAddClose());
      sql.append(addSql.toString());
    }

    if (columnDefinitions.size() > columns.size()) {
      throw new SQLException(
          INCOMPATIBLE_CHANGE_OF_TABLE + tableName + DASH + AUTOMATIC_DROP_COLUMN_NOT_SUPPORTED);
    }

    if (i > 0) {
      String sqlExpression = sql.toString();
      try {
        logger.info(sqlExpression);
        executeUpdateSQL(connection, sqlExpression);
      } catch (SQLException e) {
        logger.error(sqlExpression);
        throw new SQLException(sqlExpression, e);
      }
    }
  }

  private JsonObject parseTable(String dsDefinition) throws IOException {
    // {
    // "tableName":"table_name",
    // "columns":
    // [
    // {
    // "name":"id",
    // "type":"INTEGER",
    // "length":"0",
    // "notNull":"true",
    // "primaryKey":"true"
    // },
    // {
    // "name":"text",
    // "type":"VARCHAR",
    // "length":"32",
    // "notNull":"false",
    // "primaryKey":"false"
    // },
    // ]
    // }
    IRepository repository = this.repository;
    //		# 177
    //		IResource resource = repository.getResource(this.location + dsDefinition);
    IResource resource = repository.getResource(dsDefinition);

    String content = new String(resource.getContent());
    JsonParser parser = new JsonParser();
    JsonObject dsDefinitionObject = (JsonObject) parser.parse(content);

    // TODO validate the parsed content has the right structure

    return dsDefinitionObject;
  }

  private void executeViewCreateOrReplace(Connection connection, JsonObject dsDefinitionObject)
      throws SQLException {
    StringBuilder sql = new StringBuilder();
    String viewName = dsDefinitionObject.get(VIEW_NAME).getAsString().toUpperCase();
    String query = dsDefinitionObject.get(QUERY).getAsString();

    String sqlExpression = null;
    ResultSet rs =
        connection.getMetaData().getTables(null, null, viewName, new String[] {TABLE, VIEW});
    if (rs.next()) {
      sql.append(DROP_VIEW + viewName);
      sqlExpression = sql.toString();
      try {
        logger.info(sqlExpression);
        executeUpdateSQL(connection, sqlExpression);
      } catch (SQLException e) {
        logger.error(sqlExpression);
        logger.error(e.getMessage(), e);
      }
    }

    sql = new StringBuilder();
    sql.append(CREATE_VIEW + viewName + AS + query);

    sqlExpression = sql.toString();
    try {
      logger.info(sqlExpression);
      executeUpdateSQL(connection, sqlExpression);
    } catch (SQLException e) {
      logger.error(sqlExpression);
      throw new SQLException(sqlExpression, e);
    }
  }

  private JsonObject parseView(String dsDefinition) throws IOException {
    // {
    // "viewName":"view_name",
    // "query":"SELECT * FROM table_name"
    // }
    IRepository repository = this.repository;
    IResource resource = repository.getResource(this.location + dsDefinition);
    String content = new String(resource.getContent());
    JsonParser parser = new JsonParser();
    JsonObject dsDefinitionObject = (JsonObject) parser.parse(content);

    // TODO validate the parsed content has the right structure

    return dsDefinitionObject;
  }

  @Override
  public void enumerateKnownFiles(ICollection collection, List<String> dsDefinitions)
      throws IOException {
    if (collection.exists()) {
      List<IResource> resources = collection.getResources();
      for (Iterator<IResource> iterator = resources.iterator(); iterator.hasNext(); ) {
        IResource resource = iterator.next();
        if (resource != null && resource.getName() != null) {
          if (resource.getName().endsWith(EXTENSION_TABLE)
              || resource.getName().endsWith(EXTENSION_VIEW)) {
            //						# 177
            //						String fullPath = collection.getPath().substring(
            //								this.location.length())
            //								+ IRepository.SEPARATOR + resource.getName();
            String fullPath = resource.getPath();
            dsDefinitions.add(fullPath);
          }
        }
      }

      List<ICollection> collections = collection.getCollections();
      for (Iterator<ICollection> iterator = collections.iterator(); iterator.hasNext(); ) {
        ICollection subCollection = iterator.next();
        enumerateKnownFiles(subCollection, dsDefinitions);
      }
    }
  }

  @Override
  public IRepository getRepository() {
    return this.repository;
  }

  @Override
  public String getLocation() {
    return this.location;
  }
}
public abstract class GenerationModel {

  private static final String EMPTY_STRING = ""; // $NON-NLS-1$

  private static final String COULD_NOT_OPEN_INPUT_STREAM_FOR =
      Messages.GenerationModel_COULD_NOT_OPEN_INPUT_STREAM_FOR;

  private static final String TEMPLATE_LOCATION_IS_EMPTY =
      Messages.GenerationModel_TEMPLATE_LOCATION_IS_EMPTY;

  private static final String RESOURCE_ALREADY_EXISTS_IN_THE_WORKSPACE =
      Messages.GenerationModel_RESOURCE_ALREADY_EXISTS_IN_THE_WORKSPACE;

  private static final String NAME_IS_NOT_VALID_FOR_A_RESOURCE_OF_THE_GIVEN_TYPE_S =
      Messages.GenerationModel_NAME_IS_NOT_VALID_FOR_A_RESOURCE_OF_THE_GIVEN_TYPE_S;

  private static final String PATH_IS_NOT_VALID_FOR_A_RESOURCE_OF_THE_GIVEN_TYPE_S =
      Messages.GenerationModel_PATH_IS_NOT_VALID_FOR_A_RESOURCE_OF_THE_GIVEN_TYPE_S;

  private static final Logger logger = Logger.getLogger(GenerationModel.class);

  private IResource sourceResource;

  // private String targetLocation;

  private String targetContainer;

  private String packageName;

  private String fileName;

  private TemplateType template;

  private Class<?> templateClassLoader;

  public IResource getSourceResource() {
    return sourceResource;
  }

  public void setSourceResource(IResource sourceResource) {
    this.sourceResource = sourceResource;
  }

  public String getTargetLocation() {
    // return targetLocation;
    if (this.targetContainer == null) {
      return null;
    }
    if (getPackageName() == null) {
      return this.targetContainer;
    }
    return this.targetContainer + IRepository.SEPARATOR + getPackageName();
  }

  // public void setTargetLocation(String targetLocation) {
  // this.targetLocation = targetLocation;
  // }

  public String getTargetContainer() {
    return targetContainer;
  }

  public void setTargetContainer(String targetContainer) {
    this.targetContainer = targetContainer;
  }

  public String getPackageName() {
    return this.packageName;
  }

  public void setPackageName(String packageName) {
    if ((this.packageName != null)
        && (this.packageName.length() > 1)
        && this.packageName.startsWith(IRepository.SEPARATOR)) {
      this.packageName = this.packageName.substring(1);
    }
    this.packageName = packageName;
  }

  public String getFileName() {
    return fileName;
  }

  public void setFileName(String fileName) {
    this.fileName = fileName;
  }

  public String getTemplateLocation() {
    if (template != null) {
      return template.getLocation();
    }
    return null;
  }

  public String[] getTemplateNames() {
    if (template != null) {
      return template.getSourceNames();
    }
    return null;
  }

  public String[] getTemplateLocations() {
    if (template != null) {
      return template.getSourceLocations();
    }
    return null;
  }

  public boolean[] getTemplateGenerates() {
    if (template != null) {
      return template.getSourceGenerates();
    }
    return null;
  }

  public String[] getTemplateRenamings() {
    if (template != null) {
      return template.getSourceRenamings();
    }
    return null;
  }

  public String getTemplateExtension() {
    if (template != null) {
      return template.getExtension();
    }
    return null;
  }

  public TemplateType getTemplate() {
    return template;
  }

  public void setTemplate(TemplateType template) {
    this.template = template;
  }

  public IValidationStatus validateLocationGeneric() {
    IWorkspace workspace = WorkspaceLocator.getWorkspace();
    return validateLocationGeneric(workspace);
  }

  public IValidationStatus validateLocationGeneric(IWorkspace workspace) {

    IStatus folderLocationValidation =
        workspace.validatePath(getTargetLocation(), IResource.FOLDER);
    IStatus projectLocationValidation =
        workspace.validatePath(getTargetLocation(), IResource.PROJECT);
    if (!folderLocationValidation.isOK() && !projectLocationValidation.isOK()) {
      return ValidationStatus.createError(PATH_IS_NOT_VALID_FOR_A_RESOURCE_OF_THE_GIVEN_TYPE_S);
    }

    if (getTargetLocation().contains(ICommonConstants.ARTIFACT_TYPE.SCRIPTING_SERVICES)) {

      if (isValidScriptingServiceFileName(getFileName())) {
        IWorkspaceRoot root = workspace.getRoot();
        if (isResourceExist(root)) {
          IResource res = extractResource(root);
          return ValidationStatus.createError(
              String.format(
                  RESOURCE_ALREADY_EXISTS_IN_THE_WORKSPACE, res.getFullPath().toString()));
        }
        return ValidationStatus.createOk();
      }
      return ValidationStatus.createError(NAME_IS_NOT_VALID_FOR_A_RESOURCE_OF_THE_GIVEN_TYPE_S);
    }

    IStatus nameValidation = workspace.validateName(getFileName(), IResource.FILE);
    if (!nameValidation.isOK()) {
      return ValidationStatus.createError(NAME_IS_NOT_VALID_FOR_A_RESOURCE_OF_THE_GIVEN_TYPE_S);
    }
    IWorkspaceRoot root = workspace.getRoot();
    if (isResourceExist(root)) {
      IPath location = new Path(getTargetLocation()).append(getFileName());
      return ValidationStatus.createError(
          String.format(RESOURCE_ALREADY_EXISTS_IN_THE_WORKSPACE, location.toString()));
    }
    return ValidationStatus.createOk();
  }

  public IValidationStatus validateTemplate() {
    if ((getTemplateLocation() == null) || EMPTY_STRING.equals(getTemplateLocation())) {
      return ValidationStatus.createError(TEMPLATE_LOCATION_IS_EMPTY);
    }
    InputStream in;
    try {
      in = getInputStreamByTemplateLocation(getTemplateLocation());
    } catch (IOException e) {
      logger.error(e.getMessage(), e);
      return ValidationStatus.createError(e.getMessage());
    }

    if (in == null) {
      logger.error(String.format(COULD_NOT_OPEN_INPUT_STREAM_FOR, getTemplateLocation()));
      return ValidationStatus.createError(
          String.format(COULD_NOT_OPEN_INPUT_STREAM_FOR, getTemplateLocation()));
    }
    return ValidationStatus.createOk();
  }

  public static InputStream getInputStreamByTemplateLocation(String location) throws IOException {
    InputStream in = null;
    IRepository repository = RepositoryFacade.getInstance().getRepository();
    org.eclipse.dirigible.repository.api.IResource resource = repository.getResource(location);
    if (resource != null) {
      in = new ByteArrayInputStream(resource.getContent());
    }

    return in;
  }

  protected abstract IValidationStatus validate();

  public String getFileNameNoExtension() {
    return CommonUtils.getFileNameNoExtension(fileName);
  }

  public String getProjectName() {
    StringBuilder result = new StringBuilder();
    if (getTargetContainer() == null) {
      return null;
    }
    IPath location = new Path(getTargetContainer());
    // if (location.segmentCount() > 2) {
    // for (int i = 0; i < location.segmentCount(); i++) {
    // if (i == 1) {
    // continue;
    // }
    // result.append(location.segment(i) + ICommonConstants.SEPARATOR);
    // }
    // result.delete(result.length() - ICommonConstants.SEPARATOR.length(), result.length());
    // } else {
    result.append(location.segment(0));
    // }
    return result.toString();
  }

  public Class<?> getTemplateClassLoader() {
    return templateClassLoader;
  }

  public void setTemplateClassLoader(Class<?> templateClassLoader) {
    this.templateClassLoader = templateClassLoader;
  }

  private boolean isValidScriptingServiceFileName(String fileName) {

    String scriptingServicefileRegExPattern =
        "([a-zA-Z_0-9]+)+([\\.]){0,1}(([a-zA-Z0-9]*)*)"; //$NON-NLS-1$
    if (Pattern.matches(scriptingServicefileRegExPattern, fileName)) {
      return true;
    }
    return false;
  }

  private boolean isResourceExist(IWorkspaceRoot root) {
    IResource resource = extractResource(root);
    if (resource != null) {
      return true;
    }
    return false;
  }

  private IResource extractResource(IWorkspaceRoot root) {
    IPath location = new Path(getTargetLocation()).append(getFileName());
    IResource resource = root.findMember(location.toString());
    return resource;
  }
}
/** DataSource Facade utility class for IDE */
public class DataSourceFacade {

  private static final String EMPTY = "";

  private static final String EMBEDDED_DATA_SOURCE_IS_USED =
      Messages.DataSourceFacade_EMBEDDED_DATA_SOURCE_IS_USED;

  private static final String LOCAL_DB_ACTION = "create"; // $NON-NLS-1$
  private static final String LOCAL_DB_NAME = "derby"; // $NON-NLS-1$

  private static final String DATASOURCE_DEFAULT = "DEFAULT_DATASOURCE"; // $NON-NLS-1$

  public static final Logger logger = Logger.getLogger(DataSourceFacade.class.getCanonicalName());

  private static DataSource localDataSource;

  private static DataSourceFacade instance;

  private WrappedDataSource dataSource;

  public static DataSourceFacade getInstance() {
    if (instance == null) {
      instance = new DataSourceFacade();
    }
    return instance;
  }

  public DataSource getDataSource() {
    if (dataSource == null) {
      dataSource = getFromSession();
      if (dataSource == null) {
        dataSource = createLocal();
      }
      populateMetaData(dataSource);
    }
    return dataSource;
  }

  private WrappedDataSource getFromSession() {
    DataSource dataSource = null;
    dataSource = (DataSource) CommonParameters.getObject(DATASOURCE_DEFAULT);
    if (dataSource != null) {
      WrappedDataSource wrappedDataSource = new WrappedDataSource(dataSource);
      return wrappedDataSource;
    }
    return null;
  }

  private WrappedDataSource createLocal() {
    localDataSource = (DataSource) System.getProperties().get(LOCAL_DB_NAME);
    if (localDataSource == null) {
      localDataSource = new EmbeddedDataSource();
      ((EmbeddedDataSource) localDataSource).setDatabaseName(LOCAL_DB_NAME);
      ((EmbeddedDataSource) localDataSource).setCreateDatabase(LOCAL_DB_ACTION);
      System.getProperties().put(LOCAL_DB_NAME, localDataSource);
    }
    logger.warn(EMBEDDED_DATA_SOURCE_IS_USED);
    WrappedDataSource wrappedDataSource = new WrappedDataSource(localDataSource);
    return wrappedDataSource;
  }

  private void populateMetaData(DataSource dataSource) {
    Connection connection = null;
    try {
      try {
        connection = dataSource.getConnection();
        DatabaseMetaData metaData = connection.getMetaData();
        CommonParameters.set(
            CommonParameters.DATABASE_PRODUCT_NAME, metaData.getDatabaseProductName());
        CommonParameters.set(
            CommonParameters.DATABASE_PRODUCT_VERSION, metaData.getDatabaseProductVersion());
        CommonParameters.set(
            CommonParameters.DATABASE_MINOR_VERSION, metaData.getDatabaseMinorVersion() + EMPTY);
        CommonParameters.set(
            CommonParameters.DATABASE_MAJOR_VERSION, metaData.getDatabaseMajorVersion() + EMPTY);
        CommonParameters.set(CommonParameters.DATABASE_DRIVER_NAME, metaData.getDriverName());
        CommonParameters.set(
            CommonParameters.DATABASE_DRIVER_MINOR_VERSION,
            metaData.getDriverMinorVersion() + EMPTY);
        CommonParameters.set(
            CommonParameters.DATABASE_DRIVER_MAJOR_VERSION,
            metaData.getDriverMajorVersion() + EMPTY);
        CommonParameters.set(
            CommonParameters.DATABASE_CONNECTION_CLASS_NAME,
            connection.getClass().getCanonicalName());
      } finally {
        if (connection != null) {
          connection.close();
        }
      }
    } catch (SQLException e) {
      logger.error(e.getMessage(), e);
    }
  }
}
Beispiel #16
0
public class JavaServlet extends AbstractScriptingServlet {

  private static final long serialVersionUID = -2029496922201773270L;

  private static final Logger logger = Logger.getLogger(JavaServlet.class);

  private File libDirectory;

  private static String classpath;

  @Override
  public void init() throws ServletException {
    super.init();

    String eclipseLauncherProperty = System.getProperty("osgi.syspath");
    logger.debug("osgi.syspath: " + eclipseLauncherProperty);
    if (eclipseLauncherProperty == null) {
      eclipseLauncherProperty = System.getProperty("user.dir");
      logger.debug("user.dir: " + eclipseLauncherProperty);
    }
    eclipseLauncherProperty = eclipseLauncherProperty.replace("/./", "/");
    libDirectory = new File(eclipseLauncherProperty);
    if (libDirectory.exists()
        && (libDirectory.getParentFile() != null)
        && libDirectory.getParentFile().exists()) {
      libDirectory = libDirectory.getParentFile();
    }
    try {
      getClasspath();
    } catch (IOException e) {
      throw new ServletException(e);
    }
  }

  @Override
  protected void doExecution(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    String module = request.getPathInfo();

    JavaExecutor executor = createExecutor(request);
    Map<Object, Object> executionContext = new HashMap<Object, Object>();
    try {
      Object result = executor.executeServiceModule(request, response, module, executionContext);
      if (result != null) {
        logger.error(result.toString());
        response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, result.toString());
      }
    } catch (FileNotFoundException e) {
      logger.error(e.getMessage(), e);
      response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
    }
  }

  private String getClasspath() throws IOException {

    synchronized (JavaServlet.class) {
      if (classpath == null) {
        if (this.libDirectory != null) {
          classpath = ClassFileManager.getJars(this.libDirectory);
        } else {
          try {
            classpath =
                ClassFileManager.getJars(new File(Platform.getInstallLocation().getURL().toURI()));
          } catch (URISyntaxException e) {
            throw new IOException(e);
          }
        }
      }
    }
    return classpath;
  }

  public JavaExecutor createExecutor(HttpServletRequest request) throws IOException {
    JavaExecutor executor =
        new JavaExecutor(
            getRepository(request),
            getClasspath(),
            getScriptingRegistryPath(request),
            REGISTRY_SCRIPTING_DEPLOY_PATH);
    return executor;
  }
}
public class MobileExecutor extends AbstractScriptExecutor {

  private static final Logger logger = Logger.getLogger(MobileExecutor.class);

  private IRepository repository;
  private String[] rootPaths;

  public MobileExecutor(IRepository repository, String... rootPaths) {
    super();
    logger.debug("entering: constructor()");
    this.repository = repository;
    this.rootPaths = rootPaths;
    if ((this.rootPaths == null) || (this.rootPaths.length == 0)) {
      this.rootPaths = new String[] {null, null};
    }
    logger.debug("exiting: constructor()");
  }

  @Override
  public Object executeServiceModule(
      HttpServletRequest request,
      HttpServletResponse response,
      Object input,
      String module,
      Map<Object, Object> executionContext)
      throws IOException {

    logger.debug("entering: executeServiceModule()"); // $NON-NLS-1$
    logger.debug("module=" + module); // $NON-NLS-1$

    if (module == null) {
      throw new IOException("Mobile module cannot be null");
    }

    Module mobileModule = retrieveModule(this.repository, module, null, this.rootPaths);
    byte[] result = mobileModule.getContent();

    result = preprocessContent(result, getResource(repository, mobileModule.getPath()));

    response.getWriter().print(new String(result));
    response.getWriter().flush();
    logger.debug("exiting: executeServiceModule()");
    return result;
  }

  protected byte[] preprocessContent(byte[] rawContent, IEntity entity) throws IOException {
    return rawContent;
  }

  protected byte[] buildResourceData(
      final IEntity entity, final HttpServletRequest request, final HttpServletResponse response)
      throws IOException {
    byte[] data = new byte[] {};
    data = readResourceData((IResource) entity);
    return data;
  }

  protected byte[] readResourceData(IResource resource) throws IOException {
    return resource.getContent();
  }

  protected void beforeExecution(
      HttpServletRequest request, HttpServletResponse response, String module, Context context) {}

  @Override
  protected void registerDefaultVariable(Object scope, String name, Object value) {
    //
  }

  @Override
  protected String getModuleType(String path) {
    return ICommonConstants.ARTIFACT_TYPE.MOBILE_APPLICATIONS;
  }
}