Author: cziegeler
Date: Mon Aug 6 01:44:47 2007
New Revision: 563066
URL: http://svn.apache.org/viewvc?view=rev&rev=563066
Log:
Continue refactoring to unified object model; add new xml mapper class.
Added:
felix/sandbox/cziegeler/maven-scr-plugin/src/main/java/org/apache/felix/sandbox/scrplugin/xml/ComponentDescriptorIO.java
(with props)
Modified:
felix/sandbox/cziegeler/maven-scr-plugin/src/main/java/org/apache/felix/sandbox/scrplugin/SCRDescriptorMojo.java
felix/sandbox/cziegeler/maven-scr-plugin/src/main/java/org/apache/felix/sandbox/scrplugin/om/Property.java
felix/sandbox/cziegeler/maven-scr-plugin/src/main/java/org/apache/felix/sandbox/scrplugin/om/Reference.java
Modified:
felix/sandbox/cziegeler/maven-scr-plugin/src/main/java/org/apache/felix/sandbox/scrplugin/SCRDescriptorMojo.java
URL:
http://svn.apache.org/viewvc/felix/sandbox/cziegeler/maven-scr-plugin/src/main/java/org/apache/felix/sandbox/scrplugin/SCRDescriptorMojo.java?view=diff&rev=563066&r1=563065&r2=563066
==============================================================================
---
felix/sandbox/cziegeler/maven-scr-plugin/src/main/java/org/apache/felix/sandbox/scrplugin/SCRDescriptorMojo.java
(original)
+++
felix/sandbox/cziegeler/maven-scr-plugin/src/main/java/org/apache/felix/sandbox/scrplugin/SCRDescriptorMojo.java
Mon Aug 6 01:44:47 2007
@@ -286,7 +286,7 @@
for (int i=0; fields != null && i < fields.length; i++) {
JavaTag tag = fields[i].getTagByName(SCRDescriptor.REFERENCE);
if (tag != null) {
- // this.doReference(tag, fields[i].getName(), sd);
+ this.doReference(tag, fields[i].getName(), component);
}
tag = fields[i].getTagByName(SCRDescriptor.PROPERTY);
@@ -509,12 +509,27 @@
prop.setDescription(property.getNamedParameter(SCRDescriptor.PROPERTY_DESCRIPTION));
prop.setValue(property.getNamedParameter(SCRDescriptor.PROPERTY_VALUE));
prop.setType(property.getNamedParameter(SCRDescriptor.PROPERTY_TYPE));
- //prop.setPrivateProperty(this.getBoolean(property,
- // SCRDescriptor.PROPERTY_PRIVATE, prop.isPrivateProperty()));
+ prop.setPrivateProperty(this.getBoolean(property,
+ SCRDescriptor.PROPERTY_PRIVATE, prop.isPrivateProperty()));
// set optional multivalues, cardinality might be overwritten by
setValues !!
-
//prop.setCardinality(property.getNamedParameter(SCRDescriptor.PROPERTY_CARDINALITY));
- //prop.setValues(property.getNamedParameterMap());
+ final String value =
property.getNamedParameter(SCRDescriptor.PROPERTY_CARDINALITY);
+ if (value != null) {
+ if ("-".equals(value)) {
+ // unlimited vector
+ prop.setCardinality(new Integer(Integer.MIN_VALUE));
+ } else if ("+".equals(value)) {
+ // unlimited array
+ prop.setCardinality(new Integer(Integer.MAX_VALUE));
+ } else {
+ try {
+ prop.setCardinality(Integer.valueOf(value));
+ } catch (NumberFormatException nfe) {
+ // default to scalar in case of conversion problem
+ }
+ }
+ }
+ prop.setValues(property.getNamedParameterMap());
// check options
String[] parameters = property.getParameters();
@@ -531,7 +546,7 @@
j += 2;
}
}
- //prop.setOptions(options);
+ prop.setOptions(options);
component.addProperty(prop);
}
Modified:
felix/sandbox/cziegeler/maven-scr-plugin/src/main/java/org/apache/felix/sandbox/scrplugin/om/Property.java
URL:
http://svn.apache.org/viewvc/felix/sandbox/cziegeler/maven-scr-plugin/src/main/java/org/apache/felix/sandbox/scrplugin/om/Property.java?view=diff&rev=563066&r1=563065&r2=563066
==============================================================================
---
felix/sandbox/cziegeler/maven-scr-plugin/src/main/java/org/apache/felix/sandbox/scrplugin/om/Property.java
(original)
+++
felix/sandbox/cziegeler/maven-scr-plugin/src/main/java/org/apache/felix/sandbox/scrplugin/om/Property.java
Mon Aug 6 01:44:47 2007
@@ -18,7 +18,10 @@
*/
package org.apache.felix.sandbox.scrplugin.om;
+import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import org.apache.felix.sandbox.scrplugin.tags.JavaTag;
@@ -29,13 +32,19 @@
public class Property extends AbstractObject {
protected String name;
- protected String value;
+ protected Object value;
protected String type;
protected String text;
protected String label;
protected String description;
+ protected Integer cardinality;
+
+ protected boolean privateProperty = false;
+
+ protected Map options;
+
/**
* Default constructor.
*/
@@ -58,7 +67,7 @@
this.name = name;
}
- public String getValue() {
+ public Object getValue() {
return this.value;
}
@@ -98,11 +107,56 @@
this.description = description;
}
+ public Integer getCardinality() {
+ return this.cardinality;
+ }
+
+ public void setCardinality(Integer cardinality) {
+ this.cardinality = cardinality;
+ }
+
+ public boolean isPrivateProperty() {
+ return this.privateProperty;
+ }
+
+ public void setPrivateProperty(boolean privateProperty) {
+ this.privateProperty = privateProperty;
+ }
+
+ public void setValues(Map valueMap) {
+ List values = new ArrayList();
+ for (Iterator vi = valueMap.entrySet().iterator(); vi.hasNext();) {
+ Map.Entry entry = (Map.Entry) vi.next();
+ String key = (String) entry.getKey();
+ if (key.startsWith("values")) {
+ values.add(entry.getValue());
+ }
+ }
+
+ if (!values.isEmpty()) {
+ this.value = values;
+
+ // assume array if set to scalar currently
+ if (this.cardinality == null) {
+ this.cardinality = new Integer(Integer.MAX_VALUE);
+ }
+ }
+ }
+
+ public Map getOptions() {
+ return this.options;
+ }
+
+ public void setOptions(Map options) {
+ this.options = options;
+ }
+
/**
* Validate the property.
* If errors occur a message is added to the issues list,
* warnings can be added to the warnings list.
*/
public void validate(List issues, List warnings) {
+ // might want to check name and type
}
}
Modified:
felix/sandbox/cziegeler/maven-scr-plugin/src/main/java/org/apache/felix/sandbox/scrplugin/om/Reference.java
URL:
http://svn.apache.org/viewvc/felix/sandbox/cziegeler/maven-scr-plugin/src/main/java/org/apache/felix/sandbox/scrplugin/om/Reference.java?view=diff&rev=563066&r1=563065&r2=563066
==============================================================================
---
felix/sandbox/cziegeler/maven-scr-plugin/src/main/java/org/apache/felix/sandbox/scrplugin/om/Reference.java
(original)
+++
felix/sandbox/cziegeler/maven-scr-plugin/src/main/java/org/apache/felix/sandbox/scrplugin/om/Reference.java
Mon Aug 6 01:44:47 2007
@@ -20,7 +20,11 @@
import java.util.List;
+import org.apache.felix.sandbox.scrplugin.tags.JavaClassDescription;
+import org.apache.felix.sandbox.scrplugin.tags.JavaMethod;
import org.apache.felix.sandbox.scrplugin.tags.JavaTag;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.codehaus.plexus.util.StringUtils;
/**
* <code>Reference.java</code>...
@@ -98,7 +102,99 @@
* If errors occur a message is added to the issues list,
* warnings can be added to the warnings list.
*/
- public void validate(List issues, List warnings) {
+ public void validate(List issues, List warnings)
+ throws MojoExecutionException {
+ // validate name
+ if (StringUtils.isEmpty(this.name)) {
+ issues.add(this.getMessage("Reference has no name"));
+ }
+
+ // validate interface
+ if (StringUtils.isEmpty(this.interfacename)) {
+ issues.add(this.getMessage("Missing interface name"));
+ }
+
+ // validate cardinality
+ if (this.cardinality == null) {
+ this.cardinality = "1..1";
+ } else if (!"0..1".equals(this.cardinality) &&
!"1..1".equals(this.cardinality)
+ && !"0..n".equals(this.cardinality) &&
!"1..n".equals(this.cardinality)) {
+ issues.add(this.getMessage("Invalid Cardinality specification " +
this.cardinality));
+ }
+
+ // validate policy
+ if (this.policy == null) {
+ this.policy = "static";
+ } else if (!"static".equals(this.policy) &&
!"dynamic".equals(this.policy)) {
+ issues.add(this.getMessage("Invalid Policy specification " +
this.policy));
+ }
+
+ // validate bind and unbind methods
+ JavaClassDescription javaClass = this.tag.getJavaClassDescription();
+ if (javaClass != null) {
+ this.bind = this.validateMethod(javaClass, this.bind, issues,
warnings);
+ this.unbind = this.validateMethod(javaClass, this.unbind, issues,
warnings);
+ } else {
+ issues.add(this.getMessage("Cannot find Java class to which the
reference belongs"));
+ }
+ }
+
+ protected String validateMethod(JavaClassDescription javaClass, String
methodName, List issues, List warnings)
+ throws MojoExecutionException {
+
+ JavaMethod method = this.findMethod(javaClass, methodName);
+
+ if (method == null) {
+ issues.add(this.getMessage("Missing method " + methodName + " for
reference " + this.getName()));
+ return null;
+ }
+
+ if (method.isPublic()) {
+ warnings.add(this.getMessage("Method " + method.getName() + "
should be declared protected"));
+ } else if (!method.isProtected()) {
+ issues.add(this.getMessage("Method " + method.getName() + " has
wrong qualifier, public or protected required"));
+ return null;
+ }
+
+ return method.getName();
+ }
+
+ protected JavaMethod findMethod(JavaClassDescription javaClass, String
methodName)
+ throws MojoExecutionException {
+
+ String[] sig = new String[]{ this.getInterfacename() };
+ String[] sig2 = new String[]{ "org.osgi.framework.ServiceReference" };
+
+ // service interface or ServiceReference first
+ String realMethodName = methodName;
+ JavaMethod method = javaClass.getMethodBySignature(realMethodName,
sig);
+ if (method == null) {
+ method = javaClass.getMethodBySignature(realMethodName, sig2);
+ }
+
+ // append reference name with service interface and ServiceReference
+ if (method == null) {
+ realMethodName = methodName +
Character.toUpperCase(this.name.charAt(0))
+ + this.name.substring(1);
+
+ method = javaClass.getMethodBySignature(realMethodName, sig);
+ }
+ if (method == null) {
+ method = javaClass.getMethodBySignature(realMethodName, sig2);
+ }
+
+ // append type name with service interface and ServiceReference
+ if (method == null) {
+ int lastDot = this.getInterfacename().lastIndexOf('.');
+ realMethodName = methodName
+ + this.getInterfacename().substring(lastDot + 1);
+ method = javaClass.getMethodBySignature(realMethodName, sig);
+ }
+ if (method == null) {
+ method = javaClass.getMethodBySignature(realMethodName, sig2);
+ }
+
+ return method;
}
}
Added:
felix/sandbox/cziegeler/maven-scr-plugin/src/main/java/org/apache/felix/sandbox/scrplugin/xml/ComponentDescriptorIO.java
URL:
http://svn.apache.org/viewvc/felix/sandbox/cziegeler/maven-scr-plugin/src/main/java/org/apache/felix/sandbox/scrplugin/xml/ComponentDescriptorIO.java?view=auto&rev=563066
==============================================================================
---
felix/sandbox/cziegeler/maven-scr-plugin/src/main/java/org/apache/felix/sandbox/scrplugin/xml/ComponentDescriptorIO.java
(added)
+++
felix/sandbox/cziegeler/maven-scr-plugin/src/main/java/org/apache/felix/sandbox/scrplugin/xml/ComponentDescriptorIO.java
Mon Aug 6 01:44:47 2007
@@ -0,0 +1,133 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.felix.sandbox.scrplugin.xml;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.io.Writer;
+
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.maven.plugin.MojoExecutionException;
+
+import com.thoughtworks.xstream.XStream;
+
+/**
+ * <code>ComponentDescriptorIO</code>
+ *
+ * is a helper class to read and write component descriptor files.
+ *
+ */
+public class ComponentDescriptorIO {
+
+ protected final XStream xstream;
+
+ public ComponentDescriptorIO() {
+ this.xstream = new XStream();
+ this.xstream.setMode(XStream.NO_REFERENCES);
+
+ this.xstream.alias("components",
org.apache.felix.sandbox.scrplugin.om.Components.class);
+
this.xstream.addImplicitCollection(org.apache.felix.sandbox.scrplugin.om.Components.class,
"components");
+
+ this.xstream.alias("component",
org.apache.felix.sandbox.scrplugin.om.Component.class);
+
this.xstream.useAttributeFor(org.apache.felix.sandbox.scrplugin.om.Component.class,
"name");
+
this.xstream.useAttributeFor(org.apache.felix.sandbox.scrplugin.om.Component.class,
"enabled");
+
this.xstream.useAttributeFor(org.apache.felix.sandbox.scrplugin.om.Component.class,
"immediate");
+
this.xstream.omitField(org.apache.felix.sandbox.scrplugin.om.Component.class,
"label");
+
this.xstream.omitField(org.apache.felix.sandbox.scrplugin.om.Component.class,
"description");
+
this.xstream.omitField(org.apache.felix.sandbox.scrplugin.om.Component.class,
"isAbstract");
+
this.xstream.omitField(org.apache.felix.sandbox.scrplugin.om.Component.class,
"hasMetatype");
+
this.xstream.omitField(org.apache.felix.sandbox.scrplugin.om.Component.class,
"serviceFactory");
+
+ this.xstream.alias("implementation",
org.apache.felix.sandbox.scrplugin.om.Implementation.class);
+
this.xstream.useAttributeFor(org.apache.felix.sandbox.scrplugin.om.Implementation.class,
"classname");
+
+ this.xstream.alias("property",
org.apache.felix.sandbox.scrplugin.om.Property.class);
+
this.xstream.useAttributeFor(org.apache.felix.sandbox.scrplugin.om.Property.class,
"name");
+
this.xstream.useAttributeFor(org.apache.felix.sandbox.scrplugin.om.Property.class,
"value");
+
this.xstream.omitField(org.apache.felix.sandbox.scrplugin.om.Property.class,
"label");
+
this.xstream.omitField(org.apache.felix.sandbox.scrplugin.om.Property.class,
"description");
+
this.xstream.omitField(org.apache.felix.sandbox.scrplugin.om.Property.class,
"options");
+
this.xstream.omitField(org.apache.felix.sandbox.scrplugin.om.Property.class,
"privateProperty");
+
+ this.xstream.alias("service",
org.apache.felix.sandbox.scrplugin.om.Service.class);
+
this.xstream.useAttributeFor(org.apache.felix.sandbox.scrplugin.om.Service.class,
"servicefactory");
+
+ this.xstream.alias("provide",
org.apache.felix.sandbox.scrplugin.om.Interface.class);
+
this.xstream.useAttributeFor(org.apache.felix.sandbox.scrplugin.om.Interface.class,
"interfacename");
+
+ this.xstream.alias("reference",
org.apache.felix.sandbox.scrplugin.om.Reference.class);
+
this.xstream.useAttributeFor(org.apache.felix.sandbox.scrplugin.om.Reference.class,
"name");
+
this.xstream.useAttributeFor(org.apache.felix.sandbox.scrplugin.om.Reference.class,
"interfacename");
+
this.xstream.useAttributeFor(org.apache.felix.sandbox.scrplugin.om.Reference.class,
"target");
+
this.xstream.useAttributeFor(org.apache.felix.sandbox.scrplugin.om.Reference.class,
"cardinality");
+
this.xstream.useAttributeFor(org.apache.felix.sandbox.scrplugin.om.Reference.class,
"policy");
+
this.xstream.useAttributeFor(org.apache.felix.sandbox.scrplugin.om.Reference.class,
"bind");
+
this.xstream.useAttributeFor(org.apache.felix.sandbox.scrplugin.om.Reference.class,
"unbind");
+ }
+
+ public org.apache.felix.sandbox.scrplugin.om.Components read(File file)
throws IOException, MojoExecutionException {
+ Writer buffer = new StringWriter();
+ final TransformerFactory factory = TransformerFactory.newInstance();
+ Transformer transformer;
+ try {
+ IOUtils.copy(new FileReader(file), buffer);
+ String xmlDoc = buffer.toString();
+ buffer = new StringWriter();
+ int pos = xmlDoc.indexOf("?>");
+ if ( pos > 0 ) {
+ xmlDoc = xmlDoc.substring(pos+2);
+ }
+ xmlDoc = "<components>" + xmlDoc + "</components>";
+ transformer = factory.newTransformer(new
StreamSource(this.getClass().getResourceAsStream("/org/apache/felix/sandbox/scrplugin/xml/read.xsl")));
+ transformer.setOutputProperty(OutputKeys.INDENT, "no");
+ transformer.transform(new StreamSource(new StringReader(xmlDoc)),
new StreamResult(buffer));
+ return
(org.apache.felix.sandbox.scrplugin.om.Components)this.xstream.fromXML(new
StringReader(buffer.toString()));
+ } catch (TransformerException e) {
+ throw new MojoExecutionException("Unable to read xml.", e);
+ }
+ }
+
+ public void write(File file,
org.apache.felix.sandbox.scrplugin.om.Components components)
+ throws IOException, MojoExecutionException {
+ Writer buffer = new StringWriter();
+ this.xstream.toXML(components, buffer);
+
+ final TransformerFactory factory = TransformerFactory.newInstance();
+ Transformer transformer;
+ try {
+ transformer = factory.newTransformer(new
StreamSource(this.getClass().getResourceAsStream("/org/apache/felix/sandbox/scrplugin/xml/write.xsl")));
+ transformer.setOutputProperty(OutputKeys.INDENT, "no");
+
+ transformer.transform(new StreamSource(new
StringReader(buffer.toString())), new StreamResult(new FileWriter(file)));
+ } catch (TransformerException e) {
+ throw new MojoExecutionException("Unable to write xml.", e);
+ }
+ }
+}
Propchange:
felix/sandbox/cziegeler/maven-scr-plugin/src/main/java/org/apache/felix/sandbox/scrplugin/xml/ComponentDescriptorIO.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
felix/sandbox/cziegeler/maven-scr-plugin/src/main/java/org/apache/felix/sandbox/scrplugin/xml/ComponentDescriptorIO.java
------------------------------------------------------------------------------
svn:keywords = author date id revision url