Commit e8a4ec1f authored by Damien Fournier's avatar Damien Fournier
Browse files

* Use Eclipse STP SCA tools 2.0.0 M6

* Fix dangling reference issue for frascati-osgi.ecore
TODO : Fix conflict between osgi and fractal implementation (same meta object id)
parent b6cc5b19
Assembly Factory 0.6
--------------------
* Update SCA model from Eclipse STP project (build 200903161143)
* Use SCA model from Eclipse STP project version 2.0.0 M6
* Use Tinfi 0.6-SNAPSHOT
* Domain support
......
......@@ -375,19 +375,19 @@
<dependency>
<groupId>org.eclipse.stp</groupId>
<artifactId>sca</artifactId>
<version>1.1.1</version>
<version>${sca.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.stp.sca.domainmodel</groupId>
<artifactId>frascati</artifactId>
<version>1.1.1</version>
<version>${sca.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.stp.sca.domainmodel</groupId>
<artifactId>tuscany</artifactId>
<version>1.1.1</version>
<version>${sca.version}</version>
</dependency>
<!-- SCA Model extension for OSGI Support with frascati -->
......@@ -480,8 +480,13 @@
<!-- =========== -->
<properties>
<!-- Eclipse EMF Artifacts version -->
<emf.version>2.4.1</emf.version>
<!-- Spring Artifacts version -->
<spring.version>2.5.5</spring.version>
<!-- Eclipse STP/SCA Tools Artifacts version -->
<sca.version>2.0.0</sca.version>
<!-- OSGI Model Extension Artifact version -->
<osgi.model.version>0.6-SNAPSHOT</osgi.model.version>
</properties>
......
<?xml version="1.0" encoding="UTF-8"?><project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.eclipse.stp</groupId>
<artifactId>sca</artifactId>
<version>2.0.0</version>
</project>
<?xml version="1.0" encoding="UTF-8"?><project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.eclipse.stp.sca.domainmodel</groupId>
<artifactId>frascati</artifactId>
<version>2.0.0
</version>
</project>
<?xml version="1.0" encoding="UTF-8"?><project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.eclipse.stp.sca.domainmodel</groupId>
<artifactId>tuscany</artifactId>
<version>2.0.0</version>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="output" path="target/classes"/>
</classpath>
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>org.ow2.frascati.model.osgi</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.maven.ide.eclipse.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.ManifestBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.SchemaBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.maven.ide.eclipse.maven2Nature</nature>
<nature>org.eclipse.pde.PluginNature</nature>
</natures>
</projectDescription>
#Mon May 25 10:36:10 CEST 2009
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
org.eclipse.jdt.core.compiler.compliance=1.5
org.eclipse.jdt.core.compiler.source=1.5
#Mon May 25 10:36:10 CEST 2009
activeProfiles=
eclipse.preferences.version=1
fullBuildGoals=process-test-resources
includeModules=false
resolveWorkspaceProjects=true
resourceFilterGoals=process-resources resources\:testResources
version=1
......@@ -2,16 +2,32 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.ow2.frascati.model.osgi;singleton:=true
Bundle-Version: 1.0.0
Bundle-Version: 0.6.0.qualifier
Bundle-ClassPath: .
Bundle-Vendor: %providerName
Bundle-Localization: plugin
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Export-Package: org.ow2.frascati.model.osgi,
org.ow2.frascati.model.osgi.impl,
org.ow2.frascati.model.osgi.util
Export-Package: org.ow2.frascati.model.osgi;uses:="org.eclipse.emf.ecore.util,org.eclipse.emf.ecore,org.eclipse.stp.sca",
org.ow2.frascati.model.osgi.impl;
uses:="org.eclipse.emf.ecore.util,
org.eclipse.emf.ecore,
org.ow2.frascati.model.osgi,
org.eclipse.emf.common.notify,
org.eclipse.emf.ecore.impl,
org.eclipse.stp.sca.impl",
org.ow2.frascati.model.osgi.util;
uses:="org.eclipse.emf.ecore.xmi.impl,
org.eclipse.emf.ecore.resource,
org.eclipse.emf.common.util,
org.ow2.frascati.model.osgi,
org.eclipse.emf.ecore.xmi.util,
org.eclipse.emf.ecore.resource.impl,
org.eclipse.emf.common.notify,
org.eclipse.emf.ecore,
org.eclipse.emf.common.notify.impl,
org.eclipse.stp.sca"
Require-Bundle: org.eclipse.core.runtime,
org.eclipse.emf.ecore;visibility:=reexport,
org.eclipse.emf.ecore.xmi;visibility:=reexport,
org.eclipse.stp.sca;visibility:=reexport
org.eclipse.stp.sca
Bundle-ActivationPolicy: lazy
<?xml version="1.0" encoding="UTF-8"?>
<ecore:EPackage xmi:version="2.0"
xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="osgi"
nsURI="http://frascati.ow2.org/osgi" nsPrefix="osgi">
<eClassifiers xsi:type="ecore:EClass" name="DocumentRoot" eSuperTypes="../../org.eclipse.stp.sca/model/sca.ecore#//DocumentRoot">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="name" value=""/>
<details key="kind" value="mixed"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EReference" name="implementationOsgi" upperBound="-2"
eType="#//OsgiImplementation">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="element"/>
<details key="name" value="implementation.osgi"/>
<details key="namespace" value="##targetNamespace"/>
<details key="affiliation" value="http://www.osoa.org/xmlns/sca/1.0#implementation"/>
</eAnnotations>
</eStructuralFeatures>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="OsgiImplementation" eSuperTypes="../../org.eclipse.stp.sca/model/sca.ecore#//Implementation">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="name" value="OsgiImplementation"/>
<details key="kind" value="elementOnly"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="bundle" lowerBound="1"
eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="anyAttribute" upperBound="-1"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="attributeWildcard"/>
<details key="wildcards" value="##any"/>
<details key="name" value=":3"/>
<details key="processing" value="lax"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="group" upperBound="-1"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="group"/>
<details key="name" value="group:sca:osgiimplementation"/>
</eAnnotations>
</eStructuralFeatures>
</eClassifiers>
</ecore:EPackage>
<?xml version="1.0" encoding="UTF-8"?>
<ecore:EPackage xmi:version="2.0"
xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="osgi"
nsURI="http://frascati.ow2.org/osgi" nsPrefix="osgi">
<eClassifiers xsi:type="ecore:EClass" name="DocumentRoot" eSuperTypes="../../org.eclipse.stp.sca/model/sca.ecore#//DocumentRoot">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="name" value=""/>
<details key="kind" value="mixed"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EReference" name="implementationOsgi" upperBound="-2"
eType="#//OsgiImplementation" volatile="true" transient="true" derived="true"
containment="true" resolveProxies="false">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="element"/>
<details key="name" value="implementation.osgi"/>
<details key="namespace" value="##targetNamespace"/>
<details key="affiliation" value="http://www.osoa.org/xmlns/sca/1.0#implementation"/>
</eAnnotations>
</eStructuralFeatures>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="OsgiImplementation" eSuperTypes="../../org.eclipse.stp.sca/model/sca.ecore#//Implementation">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="name" value="OsgiImplementation"/>
<details key="kind" value="elementOnly"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="bundle" lowerBound="1"
eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="anyAttribute" upperBound="-1"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="attributeWildcard"/>
<details key="wildcards" value="##any"/>
<details key="name" value=":3"/>
<details key="processing" value="lax"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="group" upperBound="-1"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="group"/>
<details key="name" value="group:sca:osgiimplementation"/>
</eAnnotations>
</eStructuralFeatures>
</eClassifiers>
</ecore:EPackage>
......@@ -13,14 +13,14 @@
<extension point="org.eclipse.emf.ecore.generated_package">
<package
uri="http://frascati.ow2.org/osgi"
class="osgi.OsgiPackage"
class="org.ow2.frascati.model.osgi.OsgiPackage"
genModel="model/frascati-osgi.genmodel"/>
</extension>
<extension point="org.eclipse.emf.ecore.extension_parser">
<parser
type="osgi"
class="osgi.util.OsgiResourceFactoryImpl"/>
class="org.ow2.frascati.model.osgi.util.OsgiResourceFactoryImpl"/>
</extension>
</plugin>
......@@ -26,7 +26,7 @@
<parent>
<groupId>org.ow2.frascati.model</groupId>
<artifactId>parent</artifactId>
<artifactId>parent</artifactId>
<version>0.6-SNAPSHOT</version>
</parent>
......@@ -95,19 +95,19 @@
<dependency>
<groupId>org.eclipse.emf</groupId>
<artifactId>ecore</artifactId>
<version>2.4.1</version>
<version>${emf.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.emf</groupId>
<artifactId>ecore-xmi</artifactId>
<version>2.4.1</version>
<version>${emf.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.emf</groupId>
<artifactId>common</artifactId>
<version>2.4.1</version>
<version>${emf.version}</version>
</dependency>
<!-- STP SCA model located into the private repository. -->
......@@ -115,23 +115,34 @@
<dependency>
<groupId>org.eclipse.stp</groupId>
<artifactId>sca</artifactId>
<version>1.1.1</version>
<version>${sca.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.stp.sca.domainmodel</groupId>
<artifactId>frascati</artifactId>
<version>1.1.1</version>
<version>${sca.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.stp.sca.domainmodel</groupId>
<artifactId>tuscany</artifactId>
<version>1.1.1</version>
<version>${sca.version}</version>
</dependency>
</dependencies>
<!-- =========== -->
<!-- Properties -->
<!-- =========== -->
<properties>
<!-- Eclipse STP/SCA Tools Artifacts version -->
<sca.version>2.0.0</sca.version>
<!-- Eclipse EMF Artifacts version -->
<emf.version>2.4.1</emf.version>
</properties>
<!-- ============= -->
<!-- Repositories -->
<!-- ============= -->
......
......@@ -25,27 +25,27 @@ package org.ow2.frascati.model.osgi;
*/
public interface DocumentRoot extends org.eclipse.stp.sca.DocumentRoot {
/**
* Returns the value of the '<em><b>Implementation Osgi</b></em>' reference.
* Returns the value of the '<em><b>Implementation Osgi</b></em>' containment reference.
* <!-- begin-user-doc -->
* <p>
* If the meaning of the '<em>Implementation Osgi</em>' reference isn't clear,
* there really should be more of a description here...
* </p>
* <!-- end-user-doc -->
* @return the value of the '<em>Implementation Osgi</em>' reference.
* @return the value of the '<em>Implementation Osgi</em>' containment reference.
* @see #setImplementationOsgi(OsgiImplementation)
* @see org.ow2.frascati.model.osgi.OsgiPackage#getDocumentRoot_ImplementationOsgi()
* @model upper="-2"
* @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
* extendedMetaData="kind='element' name='implementation.osgi' namespace='##targetNamespace' affiliation='http://www.osoa.org/xmlns/sca/1.0#implementation'"
* @generated
*/
OsgiImplementation getImplementationOsgi();
/**
* Sets the value of the '{@link org.ow2.frascati.model.osgi.DocumentRoot#getImplementationOsgi <em>Implementation Osgi</em>}' reference.
* Sets the value of the '{@link org.ow2.frascati.model.osgi.DocumentRoot#getImplementationOsgi <em>Implementation Osgi</em>}' containment reference.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @param value the new value of the '<em>Implementation Osgi</em>' reference.
* @param value the new value of the '<em>Implementation Osgi</em>' containment reference.
* @see #getImplementationOsgi()
* @generated
*/
......
......@@ -495,7 +495,7 @@ public interface OsgiPackage extends EPackage {
int DOCUMENT_ROOT__ANYEXTENSION = ScaPackage.DOCUMENT_ROOT__ANYEXTENSION;
/**
* The feature id for the '<em><b>Implementation Osgi</b></em>' reference.
* The feature id for the '<em><b>Implementation Osgi</b></em>' containment reference.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
......@@ -588,10 +588,10 @@ public interface OsgiPackage extends EPackage {
EClass getDocumentRoot();
/**
* Returns the meta object for the reference '{@link org.ow2.frascati.model.osgi.DocumentRoot#getImplementationOsgi <em>Implementation Osgi</em>}'.
* Returns the meta object for the containment reference '{@link org.ow2.frascati.model.osgi.DocumentRoot#getImplementationOsgi <em>Implementation Osgi</em>}'.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @return the meta object for the reference '<em>Implementation Osgi</em>'.
* @return the meta object for the containment reference '<em>Implementation Osgi</em>'.
* @see org.ow2.frascati.model.osgi.DocumentRoot#getImplementationOsgi()
* @see #getDocumentRoot()
* @generated
......@@ -674,7 +674,7 @@ public interface OsgiPackage extends EPackage {
EClass DOCUMENT_ROOT = eINSTANCE.getDocumentRoot();
/**
* The meta object literal for the '<em><b>Implementation Osgi</b></em>' reference feature.
* The meta object literal for the '<em><b>Implementation Osgi</b></em>' containment reference feature.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
......
......@@ -8,9 +8,11 @@ package org.ow2.frascati.model.osgi.impl;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.NotificationChain;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.util.FeatureMap;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.ow2.frascati.model.osgi.DocumentRoot;
......@@ -31,16 +33,6 @@ import org.ow2.frascati.model.osgi.OsgiPackage;
* @generated
*/
public class DocumentRootImpl extends org.eclipse.stp.sca.impl.DocumentRootImpl implements DocumentRoot {
/**
* The cached value of the '{@link #getImplementationOsgi() <em>Implementation Osgi</em>}' reference.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getImplementationOsgi()
* @generated
* @ordered
*/
protected OsgiImplementation implementationOsgi;
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
......@@ -66,15 +58,7 @@ public class DocumentRootImpl extends org.eclipse.stp.sca.impl.DocumentRootImpl
* @generated
*/
public OsgiImplementation getImplementationOsgi() {
if (implementationOsgi != null && implementationOsgi.eIsProxy()) {
InternalEObject oldImplementationOsgi = (InternalEObject)implementationOsgi;
implementationOsgi = (OsgiImplementation)eResolveProxy(oldImplementationOsgi);
if (implementationOsgi != oldImplementationOsgi) {
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.RESOLVE, OsgiPackage.DOCUMENT_ROOT__IMPLEMENTATION_OSGI, oldImplementationOsgi, implementationOsgi));
}
}
return implementationOsgi;
return (OsgiImplementation)getMixed().get(OsgiPackage.Literals.DOCUMENT_ROOT__IMPLEMENTATION_OSGI, true);
}
/**
......@@ -82,8 +66,8 @@ public class DocumentRootImpl extends org.eclipse.stp.sca.impl.DocumentRootImpl
* <!-- end-user-doc -->
* @generated
*/
public OsgiImplementation basicGetImplementationOsgi() {
return implementationOsgi;
public NotificationChain basicSetImplementationOsgi(OsgiImplementation newImplementationOsgi, NotificationChain msgs) {
return ((FeatureMap.Internal)getMixed()).basicAdd(OsgiPackage.Literals.DOCUMENT_ROOT__IMPLEMENTATION_OSGI, newImplementationOsgi, msgs);
}
/**
......@@ -92,10 +76,21 @@ public class DocumentRootImpl extends org.eclipse.stp.sca.impl.DocumentRootImpl
* @generated
*/
public void setImplementationOsgi(OsgiImplementation newImplementationOsgi) {
OsgiImplementation oldImplementationOsgi = implementationOsgi;
implementationOsgi = newImplementationOsgi;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, OsgiPackage.DOCUMENT_ROOT__IMPLEMENTATION_OSGI, oldImplementationOsgi, implementationOsgi));
((FeatureMap.Internal)getMixed()).set(OsgiPackage.Literals.DOCUMENT_ROOT__IMPLEMENTATION_OSGI, newImplementationOsgi);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
switch (featureID) {
case OsgiPackage.DOCUMENT_ROOT__IMPLEMENTATION_OSGI:
return basicSetImplementationOsgi(null, msgs);
}
return super.eInverseRemove(otherEnd, featureID, msgs);
}
/**
......@@ -107,8 +102,7 @@ public class DocumentRootImpl extends org.eclipse.stp.sca.impl.DocumentRootImpl
public Object eGet(int featureID, boolean resolve, boolean coreType) {
switch (featureID) {
case OsgiPackage.DOCUMENT_ROOT__IMPLEMENTATION_OSGI:
if (resolve) return getImplementationOsgi();
return basicGetImplementationOsgi();
return getImplementationOsgi();
}
return super.eGet(featureID, resolve, coreType);
}
......@@ -152,7 +146,7 @@ public class DocumentRootImpl extends org.eclipse.stp.sca.impl.DocumentRootImpl
public boolean eIsSet(int featureID) {
switch (featureID) {
case OsgiPackage.DOCUMENT_ROOT__IMPLEMENTATION_OSGI:
return implementationOsgi != null;
return getImplementationOsgi() != null;
}
return super.eIsSet(featureID);
}
......
......@@ -249,7 +249,7 @@ public class OsgiPackageImpl extends EPackageImpl implements OsgiPackage {
// Initialize classes and features; add operations and parameters
initEClass(documentRootEClass, DocumentRoot.class, "DocumentRoot", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
initEReference(getDocumentRoot_ImplementationOsgi(), this.getOsgiImplementation(), null, "implementationOsgi", null, 0, -2, null, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
initEReference(getDocumentRoot_ImplementationOsgi(), this.getOsgiImplementation(), null, "implementationOsgi", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
initEClass(osgiImplementationEClass, OsgiImplementation.class, "OsgiImplementation", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
initEAttribute(getOsgiImplementation_Bundle(), theXMLTypePackage.getString(), "bundle", null, 1, 1, OsgiImplementation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment