Skip to content

Commit

Permalink
Merge branch 'release/7.3.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
rmknopf committed Nov 7, 2016
2 parents 9469eb1 + 4b7be80 commit f747b83
Show file tree
Hide file tree
Showing 365 changed files with 21,636 additions and 11,488 deletions.
104 changes: 104 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
RapidMiner Studio Core
=============================

Easy-to-use visual environment for predictive analytics. No programming required. RapidMiner is easily the most powerful and intuitive graphical user interface for the design of analysis processes. Forget sifting through code! You can also choose to run in batch mode. Whatever you prefer, RapidMiner has it all.

This project contains the open source core of [RapidMiner Studio](https://rapidminer.com/studio).

## Getting Started

* [Install](https://rapidminer.com/studio) RapidMiner Studio
* Have a look at our [Getting Started](http://docs.rapidminer.com/studio/getting-started/) Videos
* You miss something? There might be an [Extension](https://marketplace.rapidminer.com) for it
* Have questions? Check out our official [community](https://community.rapidminer.com) and [documentation](https://docs.rapidminer.com)

## RapidMiner Studio Core as Dependency

Using Gradle:
```gradle
apply plugin: 'java'
repositories {
maven { url 'https://maven.rapidminer.com/content/groups/public/' }
}
dependencies {
compile group: 'com.rapidminer.studio', name: 'rapidminer-studio-core', version: '+'
}
```
Using Maven:
```xml
<project>
...
<repositories>
<repository>
<id>rapidminer</id>
<url>https://maven.rapidminer.com/content/groups/public/</url>
</repository>
</repositories>
...
<dependency>
<groupId>com.rapidminer.studio</groupId>
<artifactId>rapidminer-studio-core</artifactId>
<version>LATEST</version>
</dependency>
...
</project>
```

## Build RapidMiner Studio Core from Source
1. Clone rapidminer-studio using [git](https://git-scm.com/) into a folder named `rapidminer-studio-core`
2. Execute `gradlew jar`
3. The jar file is located in __build/libs__

Please have in mind that the jar file still require all dependencies listed in the [build.gradle](build.gradle) file.

## Import RapidMiner Studio Core into your IDE
1. Your IDE has to support Gradle projects.
1. Install [Gradle 2.3+](https://gradle.org/gradle-download/)
2. Install and configure a Gradle plugin for your IDE
2. Import rapidminer-studio-core as a Gradle project

### Start the RapidMiner Studio Core GUI

To start the graphical user interface of RapidMiner Studio Core create a new `GuiLauncher.java` file in __src/main/java__ and run it with your IDE. If you want to use the generated jar, add the jar and all dependencies to the Java class path `java -cp "all;required;jars" GuiLauncher`. You can list the runtime dependencies by executing `gradlew dependencies --configuration runtime`.

```java
import com.rapidminer.gui.RapidMinerGUI;

class GuiLauncher {
public static void main(String args[]) throws Exception {
System.setProperty(PlatformUtilities.PROPERTY_RAPIDMINER_HOME, Paths.get("").toAbsolutePath().toString());
RapidMinerGUI.registerStartupListener(new ToolbarGUIStartupListener());
RapidMinerGUI.main(args);
}
}
```

### Run RapidMiner Studio Core in CLI mode

**Prerequisite**: Start the RapidMiner Studio GUI at least once and accept the EULA.

To run RapidMiner Studio in command line mode create a new `CliLauncher.java` file in __src/main/java__ with the following content:

```java
import com.rapidminer.RapidMiner;

class CliLauncher {
public static void main(String args[]) throws Exception {
System.setProperty(PlatformUtilities.PROPERTY_RAPIDMINER_HOME, Paths.get("").toAbsolutePath().toString());
RapidMiner.setExecutionMode(RapidMiner.ExecutionMode.COMMAND_LINE);
RapidMiner.init();
}
}
```

## Diving in

* Create your own [Extension](http://docs.rapidminer.com/developers/creating-your-own-extension/)
* [Integrate](http://community.rapidminer.com/t5/Become-a-RapidMiner-Developer/Frequently-Asked-Questions-Development/m-p/19782) RapidMiner Studio Core into your project
* And much more at our [Developer Board](http://community.rapidminer.com/t5/Become-a-RapidMiner-Developer/bd-p/BARDDBoard)

## License

See the [LICENSE](LICENSE) file.
5 changes: 3 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,10 @@ buildscript {
dependencies {
classpath 'com.rapidminer.gradle:java-basics:0.4.0'
classpath 'com.rapidminer.gradle:java-publishing:0.2.0'
classpath 'com.rapidminer.gradle:java-signing:0.1.0'
}
}

apply plugin: 'com.rapidminer.java-basics'
apply plugin: 'com.rapidminer.java-signing'
apply plugin: 'com.rapidminer.java-publishing.agpl-v3'

repositories {
Expand All @@ -30,6 +28,9 @@ dependencies {

// RapidMiner API
compile 'com.rapidminer:rapidminer-api:0.2.0'

// Alphanumeric sorting
compile 'com.rapidminer.external:alphanumeric-sorting:1.0'

// VLDocking as docking framework (https://code.google.com/p/vldocking/)
compile 'com.rapidminer.external:vldocking:1.1.1'
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
version=7.2.3
version=7.3.0
group=com.rapidminer.studio
40 changes: 25 additions & 15 deletions src/main/java/com/rapidminer/Process.java
Original file line number Diff line number Diff line change
Expand Up @@ -168,16 +168,15 @@ public class Process extends AbstractObservable<Process> implements Cloneable {
private final List<UnknownParameterInformation> unknownParameterInformation = new LinkedList<>();

/** The listeners for breakpoints. */
private final List<BreakpointListener> breakpointListeners = new LinkedList<>();
private final List<BreakpointListener> breakpointListeners = Collections.synchronizedList(new LinkedList<>());

/** The list of filters called between each operator */
private final List<ProcessFlowFilter> processFlowFilters = Collections
.synchronizedList(new LinkedList<ProcessFlowFilter>());
private final List<ProcessFlowFilter> processFlowFilters = Collections.synchronizedList(new LinkedList<>());

/** The listeners for logging (data tables). */
private final List<LoggingListener> loggingListeners = new LinkedList<>();
private final List<LoggingListener> loggingListeners = Collections.synchronizedList(new LinkedList<>());

private final List<ProcessStateListener> processStateListeners = new LinkedList<>();
private final List<ProcessStateListener> processStateListeners = Collections.synchronizedList(new LinkedList<>());

/** The macro handler can be used to replace (user defined) macro strings. */
private final MacroHandler macroHandler = new MacroHandler(this);
Expand Down Expand Up @@ -398,7 +397,10 @@ private void fireProcessStateChanged(int stateBefore, int newState) {
if (stateBefore == newState) {
return;
}
List<ProcessStateListener> listeners = new LinkedList<>(processStateListeners);
List<ProcessStateListener> listeners;
synchronized (processStateListeners) {
listeners = new LinkedList<>(processStateListeners);
}
for (ProcessStateListener listener : listeners) {
switch (newState) {
case PROCESS_STATE_PAUSED:
Expand Down Expand Up @@ -518,8 +520,10 @@ public boolean dataTableExists(final String name) {
*/
public void addDataTable(final DataTable table) {
dataTableMap.put(table.getName(), table);
for (LoggingListener listener : loggingListeners) {
listener.addDataTable(table);
synchronized (loggingListeners) {
for (LoggingListener listener : loggingListeners) {
listener.addDataTable(table);
}
}
}

Expand All @@ -537,9 +541,10 @@ public void clearDataTable(final String name) {
public void deleteDataTable(final String name) {
if (dataTableExists(name)) {
DataTable table = dataTableMap.remove(name);

for (LoggingListener listener : loggingListeners) {
listener.removeDataTable(table);
synchronized (loggingListeners) {
for (LoggingListener listener : loggingListeners) {
listener.removeDataTable(table);
}
}
}
}
Expand Down Expand Up @@ -834,14 +839,19 @@ public void removeBreakpointListener(final BreakpointListener listener) {

/** Fires the event that the process was paused. */
private void fireBreakpointEvent(final Operator operator, final IOContainer ioContainer, final int location) {
for (BreakpointListener l : breakpointListeners) {
l.breakpointReached(this, operator, ioContainer, location);
synchronized (breakpointListeners) {
for (BreakpointListener l : breakpointListeners) {
l.breakpointReached(this, operator, ioContainer, location);
}
}
}

/** Fires the event that the process was resumed. */
public void fireResumeEvent() {
LinkedList<BreakpointListener> l = new LinkedList<>(breakpointListeners);
LinkedList<BreakpointListener> l;
synchronized (breakpointListeners) {
l = new LinkedList<>(breakpointListeners);
}
for (BreakpointListener listener : l) {
listener.resume();
}
Expand Down Expand Up @@ -1109,7 +1119,7 @@ public final IOContainer run(final IOContainer input, int logVerbosity, final Ma
final boolean storeOutput) throws OperatorException {
// make sure the process flow filter is registered
ProcessFlowFilter filter = ProcessFlowFilterRegistry.INSTANCE.getProcessFlowFilter();
if (filter != null) {
if (filter != null && !processFlowFilters.contains(filter)) {
addProcessFlowFilter(filter);
}

Expand Down

0 comments on commit f747b83

Please sign in to comment.