* cleaned up folder structure

* OSGiyfied artifact names
* polished poms a little
* edited Eclipse project names to align artifact id

git-svn-id: svn+ssh://svn.synyx.de/var/svn/synyx/opensource/hera/trunk@6618 5a64d73e-33d6-4ccc-9058-23f8668ecac9
This commit is contained in:
Oliver Gierke
2009-08-05 17:15:56 +00:00
parent 0aabad48fa
commit a0b7b1c2ca
91 changed files with 450 additions and 17 deletions

View File

@@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8"?>
<chapter id="metadata">
<title>Metadata</title>
<para>For plugin architectures it is essential to capture metadata
information about plugin instances. A very core set of metadata (name,
version) also serves as identifier of a plugin and thus can be used. The
Hera metadata module provides support to capture metadata.</para>
<section id="metadata.core-concepts">
<title>Core concepts</title>
<para>The metadata module actually builds around two core interfaces,
<interfacename>PluginMetadata</interfacename> and
<interfacename>MetadataProvider</interfacename>:</para>
<example>
<title>Core concepts</title>
<programlisting language="java">public interface PluginMetadata {
String getName();
String getVersion();
}
public interface MetadataProvider {
PluginMetadata getMetadata();
}</programlisting>
</example>
<para>The <interfacename>PluginMetadata</interfacename> interface captures
the required properties to define an identifyable plugin. This means, that
implementations should ensure uniqueness through these two properties.
With <classname>SimplePluginMetadata</classname> Hera provides a Java bean
style class to capture metadata. Of course applications can and should
provide extended metadata information according to their needs. The very
narrow interface is only targeted at integrating the metadata concept with
the <classname>PluginRegistry</classname> (see <xref
linkend="core.plugin-registry" />) without bothering developers with too
much information required.</para>
<para>The <interfacename>MetadataProvider</interfacename> interface is to
be used in application plugin interfaces to indicate that they can provide
metadata. To ease plugin implementation we provide
<classname>AbstractMetadataBasedPlugin</classname> that uses the internal
metadata to implement <methodname>supports(..)</methodname> method of
<interfacename>Plugin</interfacename>. Extending this base class plugins
with metadata as selection criteria can easily be build. This way you
could store the metadata in user specific configuration files and use this
to select a distinct plugin specific to a given user.</para>
</section>
</chapter>

View File

@@ -0,0 +1,3 @@
Manifest-Version: 1.0
Class-Path:

View File

@@ -0,0 +1,67 @@
/*
* Copyright 2002-2008 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.synyx.hera.metadata;
import org.synyx.hera.core.Plugin;
/**
* Abstract base class for plugins based on {@code PluginMetadata}. Plugins
* based on this class can be selected from the {@code PluginRegistry} via an
* instance of {@code PluginMetadata}. Therefore you can regard this as a role
* model implementation of a base class for certain delimiter implmentations.
*
* @author Oliver Gierke - gierke@synyx.de
*/
public abstract class AbstractMetadataBasedPlugin implements
Plugin<PluginMetadata>, MetadataProvider {
private PluginMetadata metadata;
/**
* Creates a new instance of {@code AbstractMetadataBasedPlugin}.
*
* @param name
* @param version
*/
public AbstractMetadataBasedPlugin(String name, String version) {
this.metadata = new SimplePluginMetadata(name, version);
}
/*
* (non-Javadoc)
*
* @see com.synyx.minos.core.plugin.Plugin#supports(java.lang.Object)
*/
public boolean supports(PluginMetadata delimiter) {
return getMetadata().equals(delimiter);
}
/*
* (non-Javadoc)
*
* @see com.synyx.minos.core.plugin.MetadataProvider#getMetadata()
*/
public PluginMetadata getMetadata() {
return metadata;
}
}

View File

@@ -0,0 +1,32 @@
/*
* Copyright 2002-2008 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.synyx.hera.metadata;
/**
* Interface for plugins providing metadata information. Usually the plugins
* will implement this interface themselves.
*
* @author Oliver Gierke - gierke@synyx.de
*/
public interface MetadataProvider {
/**
* Returns the plugins metadata.
*
* @return the plugins metadata
*/
public PluginMetadata getMetadata();
}

View File

@@ -0,0 +1,41 @@
/*
* Copyright 2002-2008 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.synyx.hera.metadata;
/**
* Basic interface to define a set of metadata information for plugins.
*
* @author Oliver Gierke - gierke@synyx.de
*/
public interface PluginMetadata {
/**
* Returns a unique plugin name. Plugins return a metadata implementation
* have to ensure uniqueness of this name.
*
* @return the name of the plugin
*/
String getName();
/**
* Returns the plugin version. This allows rudimentary versioning
* possibilities.
*
* @return the version of the plugin
*/
String getVersion();
}

View File

@@ -0,0 +1,112 @@
/*
* Copyright 2002-2008 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.synyx.hera.metadata;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
/**
* Value object style implementation of {@code PluginMetadata}.
*
* @author Oliver Gierke - gierke@synyx.de
*/
public class SimplePluginMetadata implements PluginMetadata {
private String name;
private String version;
/**
* Creates a new instance of {@code SimplePluginMetadata}.
*
* @param name
* @param version
*/
public SimplePluginMetadata(String name, String version) {
this.name = name;
this.version = version;
}
/*
* (non-Javadoc)
*
* @see com.synyx.minos.core.plugin.PluginMetadata#getName()
*/
public String getName() {
return name;
}
/*
* (non-Javadoc)
*
* @see com.synyx.minos.core.plugin.PluginMetadata#getVersion()
*/
public String getVersion() {
return version;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return String.format("%s:%s", getName(), getVersion());
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (!(obj instanceof PluginMetadata)) {
return false;
}
PluginMetadata that = (PluginMetadata) obj;
boolean sameName = StringUtils.equals(this.getName(), that.getName());
boolean sameVersion =
StringUtils.equals(this.getName(), that.getName());
return sameName && sameVersion;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
return ObjectUtils.hashCode(name) + ObjectUtils.hashCode(version);
}
}