@@ -1,6 +1,6 @@ | |||
<?xml version="1.0"?> | |||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||
<parent> | |||
<groupId>ro.fortsoft.pf4j.demo</groupId> | |||
<artifactId>pf4j-demo-parent</artifactId> | |||
@@ -23,7 +23,7 @@ | |||
</plugin> | |||
</plugins> | |||
</build> | |||
<dependencies> | |||
<dependency> | |||
<groupId>ro.fortsoft.pf4j</groupId> | |||
@@ -32,5 +32,5 @@ | |||
<scope>provided</scope> | |||
</dependency> | |||
</dependencies> | |||
</project> |
@@ -1,11 +1,11 @@ | |||
/* | |||
* Copyright 2012 Decebal Suiu | |||
* | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. |
@@ -1,6 +1,6 @@ | |||
<!-- | |||
Describes the dist | |||
@author Decebal Suiu | |||
@version 1.0 | |||
--> |
@@ -1,93 +1,93 @@ | |||
/* | |||
* Copyright 2012 Decebal Suiu | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. | |||
*/ | |||
package ro.fortsoft.pf4j.demo; | |||
import java.util.List; | |||
import java.util.Set; | |||
import org.apache.commons.lang.StringUtils; | |||
import ro.fortsoft.pf4j.DefaultPluginManager; | |||
import ro.fortsoft.pf4j.PluginManager; | |||
import ro.fortsoft.pf4j.PluginWrapper; | |||
import ro.fortsoft.pf4j.demo.api.Greeting; | |||
/** | |||
* A boot class that start the demo. | |||
* | |||
* @author Decebal Suiu | |||
*/ | |||
public class Boot { | |||
public static void main(String[] args) { | |||
// print logo | |||
printLogo(); | |||
// create the plugin manager | |||
final PluginManager pluginManager = new DefaultPluginManager(); | |||
// load the plugins | |||
pluginManager.loadPlugins(); | |||
// enable a disabled plugin | |||
// pluginManager.enablePlugin("welcome-plugin"); | |||
// start (active/resolved) the plugins | |||
pluginManager.startPlugins(); | |||
// retrieves the extensions for Greeting extension point | |||
List<Greeting> greetings = pluginManager.getExtensions(Greeting.class); | |||
System.out.println(String.format("Found %d extensions for extension point '%s'", greetings.size(), Greeting.class.getName())); | |||
for (Greeting greeting : greetings) { | |||
System.out.println(">>> " + greeting.getGreeting()); | |||
} | |||
// print extensions from classpath (non plugin) | |||
System.out.println(String.format("Extensions added by classpath:")); | |||
Set<String> extensionClassNames = pluginManager.getExtensionClassNames(null); | |||
for (String extension : extensionClassNames) { | |||
System.out.println(" " + extension); | |||
} | |||
// print extensions for each started plugin | |||
List<PluginWrapper> startedPlugins = pluginManager.getStartedPlugins(); | |||
for (PluginWrapper plugin : startedPlugins) { | |||
String pluginId = plugin.getDescriptor().getPluginId(); | |||
System.out.println(String.format("Extensions added by plugin '%s':", pluginId)); | |||
extensionClassNames = pluginManager.getExtensionClassNames(pluginId); | |||
for (String extension : extensionClassNames) { | |||
System.out.println(" " + extension); | |||
} | |||
} | |||
// stop the plugins | |||
pluginManager.stopPlugins(); | |||
/* | |||
Runtime.getRuntime().addShutdownHook(new Thread() { | |||
@Override | |||
public void run() { | |||
pluginManager.stopPlugins(); | |||
} | |||
}); | |||
*/ | |||
} | |||
private static void printLogo() { | |||
System.out.println(StringUtils.repeat("#", 40)); | |||
System.out.println(StringUtils.center("PF4J-DEMO", 40)); | |||
System.out.println(StringUtils.repeat("#", 40)); | |||
} | |||
} | |||
/* | |||
* Copyright 2012 Decebal Suiu | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. | |||
*/ | |||
package ro.fortsoft.pf4j.demo; | |||
import java.util.List; | |||
import java.util.Set; | |||
import org.apache.commons.lang.StringUtils; | |||
import ro.fortsoft.pf4j.DefaultPluginManager; | |||
import ro.fortsoft.pf4j.PluginManager; | |||
import ro.fortsoft.pf4j.PluginWrapper; | |||
import ro.fortsoft.pf4j.demo.api.Greeting; | |||
/** | |||
* A boot class that start the demo. | |||
* | |||
* @author Decebal Suiu | |||
*/ | |||
public class Boot { | |||
public static void main(String[] args) { | |||
// print logo | |||
printLogo(); | |||
// create the plugin manager | |||
final PluginManager pluginManager = new DefaultPluginManager(); | |||
// load the plugins | |||
pluginManager.loadPlugins(); | |||
// enable a disabled plugin | |||
// pluginManager.enablePlugin("welcome-plugin"); | |||
// start (active/resolved) the plugins | |||
pluginManager.startPlugins(); | |||
// retrieves the extensions for Greeting extension point | |||
List<Greeting> greetings = pluginManager.getExtensions(Greeting.class); | |||
System.out.println(String.format("Found %d extensions for extension point '%s'", greetings.size(), Greeting.class.getName())); | |||
for (Greeting greeting : greetings) { | |||
System.out.println(">>> " + greeting.getGreeting()); | |||
} | |||
// print extensions from classpath (non plugin) | |||
System.out.println(String.format("Extensions added by classpath:")); | |||
Set<String> extensionClassNames = pluginManager.getExtensionClassNames(null); | |||
for (String extension : extensionClassNames) { | |||
System.out.println(" " + extension); | |||
} | |||
// print extensions for each started plugin | |||
List<PluginWrapper> startedPlugins = pluginManager.getStartedPlugins(); | |||
for (PluginWrapper plugin : startedPlugins) { | |||
String pluginId = plugin.getDescriptor().getPluginId(); | |||
System.out.println(String.format("Extensions added by plugin '%s':", pluginId)); | |||
extensionClassNames = pluginManager.getExtensionClassNames(pluginId); | |||
for (String extension : extensionClassNames) { | |||
System.out.println(" " + extension); | |||
} | |||
} | |||
// stop the plugins | |||
pluginManager.stopPlugins(); | |||
/* | |||
Runtime.getRuntime().addShutdownHook(new Thread() { | |||
@Override | |||
public void run() { | |||
pluginManager.stopPlugins(); | |||
} | |||
}); | |||
*/ | |||
} | |||
private static void printLogo() { | |||
System.out.println(StringUtils.repeat("#", 40)); | |||
System.out.println(StringUtils.center("PF4J-DEMO", 40)); | |||
System.out.println(StringUtils.repeat("#", 40)); | |||
} | |||
} |
@@ -3,4 +3,4 @@ | |||
# - add one plugin id on each line | |||
# - put this file in plugins folder | |||
######################################## | |||
#welcome-plugin | |||
#welcome-plugin |
@@ -3,4 +3,4 @@ | |||
# - add one plugin id on each line | |||
# - put this file in plugins folder | |||
######################################## | |||
#welcome-plugin | |||
#welcome-plugin |
@@ -1,6 +1,6 @@ | |||
<?xml version="1.0"?> | |||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||
<parent> | |||
<groupId>ro.fortsoft.pf4j.demo</groupId> | |||
<artifactId>pf4j-demo-plugins</artifactId> | |||
@@ -19,7 +19,7 @@ | |||
<plugin.version>0.0.1</plugin.version> | |||
<plugin.provider>Decebal Suiu</plugin.provider> | |||
<plugin.dependencies /> | |||
</properties> | |||
</properties> | |||
<build> | |||
<plugins> | |||
@@ -43,7 +43,7 @@ | |||
</executions> | |||
</plugin> | |||
--> | |||
<plugin> | |||
<groupId>org.apache.maven.plugins</groupId> | |||
<artifactId>maven-antrun-plugin</artifactId> | |||
@@ -63,7 +63,7 @@ | |||
</execution> | |||
</executions> | |||
</plugin> | |||
<plugin> | |||
<artifactId>maven-assembly-plugin</artifactId> | |||
<version>2.3</version> | |||
@@ -110,7 +110,7 @@ | |||
</configuration> | |||
</plugin> | |||
</plugins> | |||
</build> | |||
</build> | |||
<dependencies> | |||
<dependency> | |||
@@ -119,5 +119,5 @@ | |||
<version>2.6</version> | |||
</dependency> | |||
</dependencies> | |||
</project> |
@@ -1,6 +1,6 @@ | |||
<!-- | |||
Describes the plugin archive | |||
@author Decebal Suiu | |||
@version 1.0 | |||
--> |
@@ -1,11 +1,11 @@ | |||
/* | |||
* Copyright 2012 Decebal Suiu | |||
* | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. |
@@ -1,6 +1,6 @@ | |||
<?xml version="1.0"?> | |||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||
<parent> | |||
<groupId>ro.fortsoft.pf4j.demo</groupId> | |||
<artifactId>pf4j-demo-plugins</artifactId> | |||
@@ -19,7 +19,7 @@ | |||
<plugin.version>0.0.1</plugin.version> | |||
<plugin.provider>Decebal Suiu</plugin.provider> | |||
<plugin.dependencies /> | |||
</properties> | |||
</properties> | |||
<build> | |||
<plugins> | |||
@@ -43,7 +43,7 @@ | |||
</executions> | |||
</plugin> | |||
--> | |||
<plugin> | |||
<groupId>org.apache.maven.plugins</groupId> | |||
<artifactId>maven-antrun-plugin</artifactId> | |||
@@ -63,7 +63,7 @@ | |||
</execution> | |||
</executions> | |||
</plugin> | |||
<plugin> | |||
<artifactId>maven-assembly-plugin</artifactId> | |||
<version>2.3</version> | |||
@@ -110,6 +110,6 @@ | |||
</configuration> | |||
</plugin> | |||
</plugins> | |||
</build> | |||
</build> | |||
</project> |
@@ -1,6 +1,6 @@ | |||
<!-- | |||
Describes the plugin archive | |||
@author Decebal Suiu | |||
@version 1.0 | |||
--> |
@@ -1,11 +1,11 @@ | |||
/* | |||
* Copyright 2012 Decebal Suiu | |||
* | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. |
@@ -1,6 +1,6 @@ | |||
<?xml version="1.0"?> | |||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||
<parent> | |||
<groupId>ro.fortsoft.pf4j.demo</groupId> | |||
<artifactId>pf4j-demo-parent</artifactId> | |||
@@ -27,7 +27,7 @@ | |||
<directory>src/main/resources</directory> | |||
</resource> | |||
</resources> | |||
<plugins> | |||
<plugin> | |||
<artifactId>maven-dependency-plugin</artifactId> | |||
@@ -93,7 +93,7 @@ | |||
<artifactId>pf4j</artifactId> | |||
<version>${project.version}</version> | |||
<scope>provided</scope> | |||
</dependency> | |||
</dependency> | |||
<dependency> | |||
<groupId>ro.fortsoft.pf4j.demo</groupId> | |||
@@ -102,5 +102,5 @@ | |||
<scope>provided</scope> | |||
</dependency> | |||
</dependencies> | |||
</project> |
@@ -1,6 +1,6 @@ | |||
<?xml version="1.0"?> | |||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||
<parent> | |||
<groupId>ro.fortsoft.pf4j</groupId> | |||
<artifactId>pf4j-parent</artifactId> |
@@ -1,11 +1,11 @@ | |||
/* | |||
* Copyright 2012 Decebal Suiu | |||
* | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. |
@@ -1,96 +1,96 @@ | |||
/* | |||
* Copyright 2012 Decebal Suiu | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. | |||
*/ | |||
package ro.fortsoft.pf4j.demo; | |||
import java.util.List; | |||
import java.util.Set; | |||
import org.apache.commons.lang3.StringUtils; | |||
import ro.fortsoft.pf4j.DefaultPluginManager; | |||
import ro.fortsoft.pf4j.PluginManager; | |||
import ro.fortsoft.pf4j.PluginWrapper; | |||
import ro.fortsoft.pf4j.demo.api.Greeting; | |||
/** | |||
* A boot class that start the demo. | |||
* | |||
* @author Decebal Suiu | |||
*/ | |||
public class Boot { | |||
public static void main(String[] args) { | |||
// print logo | |||
printLogo(); | |||
// create the plugin manager | |||
final PluginManager pluginManager = new DefaultPluginManager(); | |||
// load the plugins | |||
pluginManager.loadPlugins(); | |||
// enable a disabled plugin | |||
// pluginManager.enablePlugin("welcome-plugin"); | |||
// start (active/resolved) the plugins | |||
pluginManager.startPlugins(); | |||
System.out.println("Plugindirectory: "); | |||
System.out.println("\t" + System.getProperty("pf4j.pluginsDir", "plugins") + "\n"); | |||
// retrieves the extensions for Greeting extension point | |||
List<Greeting> greetings = pluginManager.getExtensions(Greeting.class); | |||
System.out.println(String.format("Found %d extensions for extension point '%s'", greetings.size(), Greeting.class.getName())); | |||
for (Greeting greeting : greetings) { | |||
System.out.println(">>> " + greeting.getGreeting()); | |||
} | |||
// // print extensions from classpath (non plugin) | |||
// System.out.println(String.format("Extensions added by classpath:")); | |||
// Set<String> extensionClassNames = pluginManager.getExtensionClassNames(null); | |||
// for (String extension : extensionClassNames) { | |||
// System.out.println(" " + extension); | |||
// } | |||
// print extensions for each started plugin | |||
List<PluginWrapper> startedPlugins = pluginManager.getStartedPlugins(); | |||
for (PluginWrapper plugin : startedPlugins) { | |||
String pluginId = plugin.getDescriptor().getPluginId(); | |||
System.out.println(String.format("Extensions added by plugin '%s':", pluginId)); | |||
// extensionClassNames = pluginManager.getExtensionClassNames(pluginId); | |||
// for (String extension : extensionClassNames) { | |||
// System.out.println(" " + extension); | |||
// } | |||
} | |||
// stop the plugins | |||
pluginManager.stopPlugins(); | |||
/* | |||
Runtime.getRuntime().addShutdownHook(new Thread() { | |||
@Override | |||
public void run() { | |||
pluginManager.stopPlugins(); | |||
} | |||
}); | |||
*/ | |||
} | |||
private static void printLogo() { | |||
System.out.println(StringUtils.repeat("#", 40)); | |||
System.out.println(StringUtils.center("PF4J-DEMO", 40)); | |||
System.out.println(StringUtils.repeat("#", 40)); | |||
} | |||
} | |||
/* | |||
* Copyright 2012 Decebal Suiu | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. | |||
*/ | |||
package ro.fortsoft.pf4j.demo; | |||
import java.util.List; | |||
import java.util.Set; | |||
import org.apache.commons.lang3.StringUtils; | |||
import ro.fortsoft.pf4j.DefaultPluginManager; | |||
import ro.fortsoft.pf4j.PluginManager; | |||
import ro.fortsoft.pf4j.PluginWrapper; | |||
import ro.fortsoft.pf4j.demo.api.Greeting; | |||
/** | |||
* A boot class that start the demo. | |||
* | |||
* @author Decebal Suiu | |||
*/ | |||
public class Boot { | |||
public static void main(String[] args) { | |||
// print logo | |||
printLogo(); | |||
// create the plugin manager | |||
final PluginManager pluginManager = new DefaultPluginManager(); | |||
// load the plugins | |||
pluginManager.loadPlugins(); | |||
// enable a disabled plugin | |||
// pluginManager.enablePlugin("welcome-plugin"); | |||
// start (active/resolved) the plugins | |||
pluginManager.startPlugins(); | |||
System.out.println("Plugindirectory: "); | |||
System.out.println("\t" + System.getProperty("pf4j.pluginsDir", "plugins") + "\n"); | |||
// retrieves the extensions for Greeting extension point | |||
List<Greeting> greetings = pluginManager.getExtensions(Greeting.class); | |||
System.out.println(String.format("Found %d extensions for extension point '%s'", greetings.size(), Greeting.class.getName())); | |||
for (Greeting greeting : greetings) { | |||
System.out.println(">>> " + greeting.getGreeting()); | |||
} | |||
// // print extensions from classpath (non plugin) | |||
// System.out.println(String.format("Extensions added by classpath:")); | |||
// Set<String> extensionClassNames = pluginManager.getExtensionClassNames(null); | |||
// for (String extension : extensionClassNames) { | |||
// System.out.println(" " + extension); | |||
// } | |||
// print extensions for each started plugin | |||
List<PluginWrapper> startedPlugins = pluginManager.getStartedPlugins(); | |||
for (PluginWrapper plugin : startedPlugins) { | |||
String pluginId = plugin.getDescriptor().getPluginId(); | |||
System.out.println(String.format("Extensions added by plugin '%s':", pluginId)); | |||
// extensionClassNames = pluginManager.getExtensionClassNames(pluginId); | |||
// for (String extension : extensionClassNames) { | |||
// System.out.println(" " + extension); | |||
// } | |||
} | |||
// stop the plugins | |||
pluginManager.stopPlugins(); | |||
/* | |||
Runtime.getRuntime().addShutdownHook(new Thread() { | |||
@Override | |||
public void run() { | |||
pluginManager.stopPlugins(); | |||
} | |||
}); | |||
*/ | |||
} | |||
private static void printLogo() { | |||
System.out.println(StringUtils.repeat("#", 40)); | |||
System.out.println(StringUtils.center("PF4J-DEMO", 40)); | |||
System.out.println(StringUtils.repeat("#", 40)); | |||
} | |||
} |
@@ -3,4 +3,4 @@ | |||
# - add one plugin id on each line | |||
# - put this file in plugins folder | |||
######################################## | |||
#welcome-plugin | |||
#welcome-plugin |
@@ -3,4 +3,4 @@ | |||
# - add one plugin id on each line | |||
# - put this file in plugins folder | |||
######################################## | |||
#welcome-plugin | |||
#welcome-plugin |
@@ -1,11 +1,11 @@ | |||
/* | |||
* Copyright 2012 Decebal Suiu | |||
* | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. |
@@ -18,7 +18,7 @@ import java.util.List; | |||
/** | |||
* @author Decebal Suiu | |||
* @author Mário Franco | |||
* @author Mário Franco | |||
*/ | |||
public class CompoundPluginRepository implements PluginRepository { | |||
@@ -1,11 +1,11 @@ | |||
/* | |||
* Copyright 2012 Decebal Suiu | |||
* | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. | |||
@@ -14,7 +14,7 @@ package ro.fortsoft.pf4j; | |||
/** | |||
* CyclicDependencyException will be thrown if a cyclic dependency is detected. | |||
* | |||
* | |||
* @author Decebal Suiu | |||
*/ | |||
class CyclicDependencyException extends PluginException { |
@@ -1,11 +1,11 @@ | |||
/* | |||
* Copyright 2013 Decebal Suiu | |||
* | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. | |||
@@ -13,9 +13,9 @@ | |||
package ro.fortsoft.pf4j; | |||
/** | |||
* The default implementation for PluginDescriptorFinder. | |||
* The default implementation for PluginDescriptorFinder. | |||
* Now, this class it's a "link" to {@link ro.fortsoft.pf4j.ManifestPluginDescriptorFinder}. | |||
* | |||
* | |||
* @author Decebal Suiu | |||
*/ | |||
public class DefaultPluginDescriptorFinder extends ManifestPluginDescriptorFinder { | |||
@@ -23,5 +23,5 @@ public class DefaultPluginDescriptorFinder extends ManifestPluginDescriptorFinde | |||
public DefaultPluginDescriptorFinder(PluginClasspath pluginClasspath) { | |||
super(pluginClasspath); | |||
} | |||
} |
@@ -22,7 +22,7 @@ import java.util.List; | |||
/** | |||
* @author Decebal Suiu | |||
* @author Mário Franco | |||
* @author Mário Franco | |||
*/ | |||
public class DefaultPluginRepository implements PluginRepository { | |||
@@ -24,7 +24,7 @@ import ro.fortsoft.pf4j.util.FileUtils; | |||
* The default implementation for PluginStatusProvider. | |||
* | |||
* @author Decebal Suiu | |||
* @author Mário Franco | |||
* @author Mário Franco | |||
*/ | |||
public class DefaultPluginStatusProvider implements PluginStatusProvider { | |||
@@ -1,11 +1,11 @@ | |||
/* | |||
* Copyright 2012 Decebal Suiu | |||
* | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. | |||
@@ -26,7 +26,7 @@ import ro.fortsoft.pf4j.util.DirectedGraph; | |||
class DependencyResolver { | |||
private static final Logger log = LoggerFactory.getLogger(DependencyResolver.class); | |||
private List<PluginWrapper> plugins; | |||
public DependencyResolver(List<PluginWrapper> plugins) { |
@@ -1,11 +1,11 @@ | |||
/* | |||
* Copyright 2013 Decebal Suiu | |||
* | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. | |||
@@ -14,14 +14,14 @@ package ro.fortsoft.pf4j; | |||
/** | |||
* Overwrite classes directories to "target/classes" and lib directories to "target/lib". | |||
* | |||
* | |||
* @author Decebal Suiu | |||
*/ | |||
public class DevelopmentPluginClasspath extends PluginClasspath { | |||
private static final String DEVELOPMENT_CLASSES_DIRECTORY = "target/classes"; | |||
private static final String DEVELOPMENT_LIB_DIRECTORY = "target/lib"; | |||
public DevelopmentPluginClasspath() { | |||
super(); | |||
} | |||
@@ -32,5 +32,5 @@ public class DevelopmentPluginClasspath extends PluginClasspath { | |||
libDirectories.add(DEVELOPMENT_LIB_DIRECTORY); | |||
} | |||
} |
@@ -1,11 +1,11 @@ | |||
/* | |||
* Copyright 2012 Decebal Suiu | |||
* | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. | |||
@@ -28,5 +28,5 @@ import java.lang.annotation.Target; | |||
public @interface Extension { | |||
int ordinal() default 0; | |||
} |
@@ -1,11 +1,11 @@ | |||
/* | |||
* Copyright 2012 Decebal Suiu | |||
* | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. |
@@ -52,4 +52,4 @@ public class ExtensionWrapper<T> implements Comparable<ExtensionWrapper<T>> { | |||
this.extensionFactory = extensionFactory; | |||
} | |||
} | |||
} |
@@ -1,11 +1,11 @@ | |||
/* | |||
* Copyright 2013 Decebal Suiu | |||
* | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. | |||
@@ -37,9 +37,9 @@ import javax.tools.StandardLocation; | |||
public class ExtensionsIndexer extends AbstractProcessor { | |||
public static final String EXTENSIONS_RESOURCE = "META-INF/extensions.idx"; | |||
private List<TypeElement> extensions = new ArrayList<TypeElement>(); | |||
@Override | |||
public SourceVersion getSupportedSourceVersion() { | |||
return SourceVersion.latest(); | |||
@@ -49,16 +49,16 @@ public class ExtensionsIndexer extends AbstractProcessor { | |||
public Set<String> getSupportedAnnotationTypes() { | |||
Set<String> annotationTypes = new HashSet<String>(); | |||
annotationTypes.add(Extension.class.getName()); | |||
return annotationTypes; | |||
} | |||
@Override | |||
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { | |||
if (roundEnv.processingOver()) { | |||
return false; | |||
} | |||
for (Element element : roundEnv.getElementsAnnotatedWith(Extension.class)) { | |||
if (!(element instanceof TypeElement)) { | |||
continue; | |||
@@ -69,7 +69,7 @@ public class ExtensionsIndexer extends AbstractProcessor { | |||
processingEnv.getMessager().printMessage(Kind.NOTE, message); | |||
extensions.add(typeElement); | |||
} | |||
/* | |||
if (!roundEnv.processingOver()) { | |||
return false; | |||
@@ -77,17 +77,17 @@ public class ExtensionsIndexer extends AbstractProcessor { | |||
*/ | |||
write(); | |||
return false; | |||
// return true; // no further processing of this annotation type | |||
} | |||
private void write() { | |||
Set<String> entries = new HashSet<String>(); | |||
for (TypeElement typeElement : extensions) { | |||
entries.add(processingEnv.getElementUtils().getBinaryName(typeElement).toString()); | |||
} | |||
read(entries); // read old entries | |||
write(entries); // write entries | |||
} | |||
@@ -107,7 +107,7 @@ public class ExtensionsIndexer extends AbstractProcessor { | |||
processingEnv.getMessager().printMessage(Kind.ERROR, e.toString()); | |||
} | |||
} | |||
private void read(Set<String> entries) { | |||
try { | |||
FileObject file = processingEnv.getFiler().getResource(StandardLocation.CLASS_OUTPUT, "", EXTENSIONS_RESOURCE); | |||
@@ -119,17 +119,17 @@ public class ExtensionsIndexer extends AbstractProcessor { | |||
// java6 does not support reading old index files | |||
} | |||
} | |||
public static void readIndex(Reader reader, Set<String> entries) throws IOException { | |||
BufferedReader bufferedReader = new BufferedReader(reader); | |||
String line; | |||
while ((line = bufferedReader.readLine()) != null) { | |||
entries.add(line); | |||
} | |||
reader.close(); | |||
} | |||
} | |||
@@ -1,11 +1,11 @@ | |||
/* | |||
* Copyright 2012 Decebal Suiu | |||
* | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. |
@@ -1,11 +1,11 @@ | |||
/* | |||
* Copyright 2012 Decebal Suiu | |||
* | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. | |||
@@ -18,11 +18,11 @@ import java.io.File; | |||
* Find a plugin descriptor in a directory (plugin repository). | |||
* You can find in manifest file @see DefaultPluginDescriptorFinder, | |||
* xml file, properties file, java services (with ServiceLoader), etc. | |||
* | |||
* | |||
* @author Decebal Suiu | |||
*/ | |||
public interface PluginDescriptorFinder { | |||
public PluginDescriptor find(File pluginRepository) throws PluginException; | |||
} |
@@ -1,11 +1,11 @@ | |||
/* | |||
* Copyright 2012 Decebal Suiu | |||
* | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. |
@@ -1,11 +1,11 @@ | |||
/* | |||
* Copyright 2012 Decebal Suiu | |||
* | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. | |||
@@ -18,12 +18,12 @@ package ro.fortsoft.pf4j; | |||
class PluginNotFoundException extends PluginException { | |||
private static final long serialVersionUID = 1L; | |||
private String pluginId; | |||
public PluginNotFoundException(String pluginId) { | |||
super("Plugin '" + pluginId + "' not found."); | |||
this.pluginId = pluginId; | |||
} | |||
@@ -19,7 +19,7 @@ import java.util.List; | |||
* Directory whose contents are .zip files used as plugins. | |||
* | |||
* @author Decebal Suiu | |||
* @author Mário Franco | |||
* @author Mário Franco | |||
*/ | |||
public interface PluginRepository { | |||
@@ -14,7 +14,7 @@ package ro.fortsoft.pf4j; | |||
/** | |||
* @author Decebal Suiu | |||
* @author Mário Franco | |||
* @author Mário Franco | |||
*/ | |||
public interface PluginStatusProvider { | |||
@@ -1,11 +1,11 @@ | |||
/* | |||
* Copyright 2013 Decebal Suiu | |||
* | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. | |||
@@ -20,20 +20,20 @@ import java.util.NoSuchElementException; | |||
* @author Decebal Suiu | |||
*/ | |||
public enum RuntimeMode { | |||
DEVELOPMENT("development"), // development | |||
DEPLOYMENT("deployment"); // deployment | |||
DEPLOYMENT("deployment"); // deployment | |||
private final String name; | |||
private static final Map<String, RuntimeMode> map = new HashMap<String, RuntimeMode>(); | |||
static { | |||
for (RuntimeMode mode : RuntimeMode.values()) { | |||
map.put(mode.name, mode); | |||
} | |||
} | |||
private RuntimeMode(final String name) { | |||
this.name = name; | |||
} | |||
@@ -42,14 +42,14 @@ public enum RuntimeMode { | |||
public String toString() { | |||
return name; | |||
} | |||
public static RuntimeMode byName(String name) { | |||
if (map.containsKey(name)) { | |||
return map.get(name); | |||
} | |||
throw new NoSuchElementException("Cannot found PF4J runtime mode with name '" + name + | |||
throw new NoSuchElementException("Cannot found PF4J runtime mode with name '" + name + | |||
"'. Must be 'development' or 'deployment'."); | |||
} | |||
} | |||
} |
@@ -1,11 +1,11 @@ | |||
/* | |||
* Copyright 2013 Decebal Suiu | |||
* | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. |
@@ -1,171 +1,171 @@ | |||
/* | |||
* Copyright 2012 Decebal Suiu | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. | |||
*/ | |||
package ro.fortsoft.pf4j.util; | |||
import java.util.ArrayList; | |||
import java.util.Collections; | |||
import java.util.HashMap; | |||
import java.util.List; | |||
import java.util.Map; | |||
import java.util.Stack; | |||
/** | |||
* @author Decebal Suiu | |||
*/ | |||
public class DirectedGraph<V> { | |||
/** | |||
* The implementation here is basically an adjacency list, but instead | |||
* of an array of lists, a Map is used to map each vertex to its list of | |||
* adjacent vertices. | |||
*/ | |||
private Map<V, List<V>> neighbors = new HashMap<V, List<V>>(); | |||
/** | |||
* Add a vertex to the graph. Nothing happens if vertex is already in graph. | |||
*/ | |||
public void addVertex(V vertex) { | |||
if (neighbors.containsKey(vertex)) { | |||
return; | |||
} | |||
neighbors.put(vertex, new ArrayList<V>()); | |||
} | |||
/** | |||
* True if graph contains vertex. | |||
*/ | |||
public boolean containsVertex(V vertex) { | |||
return neighbors.containsKey(vertex); | |||
} | |||
/** | |||
* Add an edge to the graph; if either vertex does not exist, it's added. | |||
* This implementation allows the creation of multi-edges and self-loops. | |||
*/ | |||
public void addEdge(V from, V to) { | |||
this.addVertex(from); | |||
this.addVertex(to); | |||
neighbors.get(from).add(to); | |||
} | |||
/** | |||
* Remove an edge from the graph. Nothing happens if no such edge. | |||
* @throws IllegalArgumentException if either vertex doesn't exist. | |||
*/ | |||
public void remove(V from, V to) { | |||
if (!(this.containsVertex(from) && this.containsVertex(to))) { | |||
throw new IllegalArgumentException("Nonexistent vertex"); | |||
} | |||
neighbors.get(from).remove(to); | |||
} | |||
/** | |||
* Report (as a Map) the out-degree of each vertex. | |||
*/ | |||
public Map<V, Integer> outDegree() { | |||
Map<V, Integer> result = new HashMap<V, Integer>(); | |||
for (V vertex : neighbors.keySet()) { | |||
result.put(vertex, neighbors.get(vertex).size()); | |||
} | |||
return result; | |||
} | |||
/** | |||
* Report (as a Map) the in-degree of each vertex. | |||
*/ | |||
public Map<V,Integer> inDegree() { | |||
Map<V, Integer> result = new HashMap<V, Integer>(); | |||
for (V vertex : neighbors.keySet()) { | |||
result.put(vertex, 0); // all in-degrees are 0 | |||
} | |||
for (V from : neighbors.keySet()) { | |||
for (V to : neighbors.get(from)) { | |||
result.put(to, result.get(to) + 1); // increment in-degree | |||
} | |||
} | |||
return result; | |||
} | |||
/** | |||
* Report (as a List) the topological sort of the vertices; null for no such sort. | |||
*/ | |||
public List<V> topologicalSort() { | |||
Map<V, Integer> degree = inDegree(); | |||
// determine all vertices with zero in-degree | |||
Stack<V> zeroVertices = new Stack<V>(); // stack as good as any here | |||
for (V v : degree.keySet()) { | |||
if (degree.get(v) == 0) { | |||
zeroVertices.push(v); | |||
} | |||
} | |||
// determine the topological order | |||
List<V> result = new ArrayList<V>(); | |||
while (!zeroVertices.isEmpty()) { | |||
V vertex = zeroVertices.pop(); // choose a vertex with zero in-degree | |||
result.add(vertex); // vertex 'v' is next in topological order | |||
// "remove" vertex 'v' by updating its neighbors | |||
for (V neighbor : neighbors.get(vertex)) { | |||
degree.put(neighbor, degree.get(neighbor) - 1); | |||
// remember any vertices that now have zero in-degree | |||
if (degree.get(neighbor) == 0) { | |||
zeroVertices.push(neighbor); | |||
} | |||
} | |||
} | |||
// check that we have used the entire graph (if not, there was a cycle) | |||
if (result.size() != neighbors.size()) { | |||
return null; | |||
} | |||
return result; | |||
} | |||
/** | |||
* Report (as a List) the reverse topological sort of the vertices; null for no such sort. | |||
*/ | |||
public List<V> reverseTopologicalSort() { | |||
List<V> list = topologicalSort(); | |||
if (list == null) { | |||
return null; | |||
} | |||
Collections.reverse(list); | |||
return list; | |||
} | |||
/** | |||
* True if graph is a dag (directed acyclic graph). | |||
*/ | |||
public boolean isDag () { | |||
return topologicalSort() != null; | |||
} | |||
/** | |||
* String representation of graph. | |||
*/ | |||
@Override | |||
public String toString() { | |||
StringBuffer sb = new StringBuffer(); | |||
for (V vertex : neighbors.keySet()) { | |||
sb.append("\n " + vertex + " -> " + neighbors.get(vertex)); | |||
} | |||
return sb.toString(); | |||
} | |||
} | |||
/* | |||
* Copyright 2012 Decebal Suiu | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. | |||
*/ | |||
package ro.fortsoft.pf4j.util; | |||
import java.util.ArrayList; | |||
import java.util.Collections; | |||
import java.util.HashMap; | |||
import java.util.List; | |||
import java.util.Map; | |||
import java.util.Stack; | |||
/** | |||
* @author Decebal Suiu | |||
*/ | |||
public class DirectedGraph<V> { | |||
/** | |||
* The implementation here is basically an adjacency list, but instead | |||
* of an array of lists, a Map is used to map each vertex to its list of | |||
* adjacent vertices. | |||
*/ | |||
private Map<V, List<V>> neighbors = new HashMap<V, List<V>>(); | |||
/** | |||
* Add a vertex to the graph. Nothing happens if vertex is already in graph. | |||
*/ | |||
public void addVertex(V vertex) { | |||
if (neighbors.containsKey(vertex)) { | |||
return; | |||
} | |||
neighbors.put(vertex, new ArrayList<V>()); | |||
} | |||
/** | |||
* True if graph contains vertex. | |||
*/ | |||
public boolean containsVertex(V vertex) { | |||
return neighbors.containsKey(vertex); | |||
} | |||
/** | |||
* Add an edge to the graph; if either vertex does not exist, it's added. | |||
* This implementation allows the creation of multi-edges and self-loops. | |||
*/ | |||
public void addEdge(V from, V to) { | |||
this.addVertex(from); | |||
this.addVertex(to); | |||
neighbors.get(from).add(to); | |||
} | |||
/** | |||
* Remove an edge from the graph. Nothing happens if no such edge. | |||
* @throws IllegalArgumentException if either vertex doesn't exist. | |||
*/ | |||
public void remove(V from, V to) { | |||
if (!(this.containsVertex(from) && this.containsVertex(to))) { | |||
throw new IllegalArgumentException("Nonexistent vertex"); | |||
} | |||
neighbors.get(from).remove(to); | |||
} | |||
/** | |||
* Report (as a Map) the out-degree of each vertex. | |||
*/ | |||
public Map<V, Integer> outDegree() { | |||
Map<V, Integer> result = new HashMap<V, Integer>(); | |||
for (V vertex : neighbors.keySet()) { | |||
result.put(vertex, neighbors.get(vertex).size()); | |||
} | |||
return result; | |||
} | |||
/** | |||
* Report (as a Map) the in-degree of each vertex. | |||
*/ | |||
public Map<V,Integer> inDegree() { | |||
Map<V, Integer> result = new HashMap<V, Integer>(); | |||
for (V vertex : neighbors.keySet()) { | |||
result.put(vertex, 0); // all in-degrees are 0 | |||
} | |||
for (V from : neighbors.keySet()) { | |||
for (V to : neighbors.get(from)) { | |||
result.put(to, result.get(to) + 1); // increment in-degree | |||
} | |||
} | |||
return result; | |||
} | |||
/** | |||
* Report (as a List) the topological sort of the vertices; null for no such sort. | |||
*/ | |||
public List<V> topologicalSort() { | |||
Map<V, Integer> degree = inDegree(); | |||
// determine all vertices with zero in-degree | |||
Stack<V> zeroVertices = new Stack<V>(); // stack as good as any here | |||
for (V v : degree.keySet()) { | |||
if (degree.get(v) == 0) { | |||
zeroVertices.push(v); | |||
} | |||
} | |||
// determine the topological order | |||
List<V> result = new ArrayList<V>(); | |||
while (!zeroVertices.isEmpty()) { | |||
V vertex = zeroVertices.pop(); // choose a vertex with zero in-degree | |||
result.add(vertex); // vertex 'v' is next in topological order | |||
// "remove" vertex 'v' by updating its neighbors | |||
for (V neighbor : neighbors.get(vertex)) { | |||
degree.put(neighbor, degree.get(neighbor) - 1); | |||
// remember any vertices that now have zero in-degree | |||
if (degree.get(neighbor) == 0) { | |||
zeroVertices.push(neighbor); | |||
} | |||
} | |||
} | |||
// check that we have used the entire graph (if not, there was a cycle) | |||
if (result.size() != neighbors.size()) { | |||
return null; | |||
} | |||
return result; | |||
} | |||
/** | |||
* Report (as a List) the reverse topological sort of the vertices; null for no such sort. | |||
*/ | |||
public List<V> reverseTopologicalSort() { | |||
List<V> list = topologicalSort(); | |||
if (list == null) { | |||
return null; | |||
} | |||
Collections.reverse(list); | |||
return list; | |||
} | |||
/** | |||
* True if graph is a dag (directed acyclic graph). | |||
*/ | |||
public boolean isDag () { | |||
return topologicalSort() != null; | |||
} | |||
/** | |||
* String representation of graph. | |||
*/ | |||
@Override | |||
public String toString() { | |||
StringBuffer sb = new StringBuffer(); | |||
for (V vertex : neighbors.keySet()) { | |||
sb.append("\n " + vertex + " -> " + neighbors.get(vertex)); | |||
} | |||
return sb.toString(); | |||
} | |||
} |
@@ -1,11 +1,11 @@ | |||
/* | |||
* Copyright 2012 Decebal Suiu | |||
* | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. | |||
@@ -17,7 +17,7 @@ import java.io.FileFilter; | |||
/** | |||
* Filter accepts files that are directories. | |||
* | |||
* | |||
* @author Decebal Suiu | |||
*/ | |||
public class DirectoryFileFilter implements FileFilter { |
@@ -1,11 +1,11 @@ | |||
/* | |||
* Copyright 2012 Decebal Suiu | |||
* | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. | |||
@@ -17,7 +17,7 @@ import java.io.FileFilter; | |||
/** | |||
* Filter accepts any file ending in extension. The case of the filename is ignored. | |||
* | |||
* | |||
* @author Decebal Suiu | |||
*/ | |||
public class ExtensionFileFilter implements FileFilter { |
@@ -1,11 +1,11 @@ | |||
/* | |||
* Copyright 2013 Decebal Suiu | |||
* | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. | |||
@@ -17,7 +17,7 @@ import java.io.FileFilter; | |||
/** | |||
* Filter that only accepts hidden files. | |||
* | |||
* | |||
* @author decebal.suiu | |||
*/ | |||
public class HiddenFilter implements FileFilter { |
@@ -1,11 +1,11 @@ | |||
/* | |||
* Copyright 2012 Decebal Suiu | |||
* | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. |
@@ -1,11 +1,11 @@ | |||
/* | |||
* Copyright 2013 Decebal Suiu | |||
* | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. |
@@ -1,11 +1,11 @@ | |||
/* | |||
* Copyright 2012 Decebal Suiu | |||
* | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. |
@@ -1,11 +1,11 @@ | |||
/* | |||
* Copyright 2012 Decebal Suiu | |||
* | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. |
@@ -1,11 +1,11 @@ | |||
/* | |||
* Copyright 2012 Decebal Suiu | |||
* | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with | |||
* the License. You may obtain a copy of the License in the LICENSE file, or at: | |||
* | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* | |||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |||
* specific language governing permissions and limitations under the License. |