On Tuesday 06 February 2007 23:03, James Mao wrote:
> This fix should also into tools2.
> If there is bug in code gen, please fix into tools2 directly, almost all
> the code has been ported to tools2
> I'll reopen the CXF-261 to do the fix in tools2.

Re-opening CXF-261 was/is definitely the wrong thing to do.   CXF-261 
completely relates to runtime support of the the rpc/literal case.  Actually, 
it's worse than that.   It relates to the OLD runtime and isn't even 
applicable anymore.   Nowhere in the description of 261 does it say anything 
about the @WebParam annotation being wrong in this case or describe what the 
bug is in the tools.   

CXF-261 should remain closed and a new bug filed for the new tools if the new 
tools still demonstrate the behavior. 

Dan



>
> Cheers,
> James.
>
> > Author: dkulp
> > Date: Tue Feb  6 12:56:15 2007
> > New Revision: 504289
> >
> > URL: http://svn.apache.org/viewvc?view=rev&rev=504289
> > Log:
> > Testcase for CXF-261
> >
> > * CXF-261 is no longer applicable, but nothing tests it.   Added a
> > rcp/literal soap header test * That said, the code generator was broken
> > for rpc/literal with headers (headers are always doc/literal).  Fixed
> > that and added a test in testutils to check to makre sure the generated
> > code is correct.
> >
> >
> > Added:
> >    
> > incubator/cxf/trunk/testutils/src/main/java/org/apache/header_test/rpc/
> > incubator/cxf/trunk/testutils/src/main/java/org/apache/header_test/rpc/Te
> >stRPCHeaderImpl.java   (with props)
> > incubator/cxf/trunk/testutils/src/main/resources/wsdl/soapheader_rpc.wsdl
> >   (with props) Modified:
> >    
> > incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/
> >header/HeaderClientServerTest.java incubator/cxf/trunk/testutils/pom.xml
> >    
> > incubator/cxf/trunk/tools/wsdl2java/src/main/java/org/apache/cxf/tools/ws
> >dl2java/processor/internal/ParameterProcessor.java
> > incubator/cxf/trunk/tools/wsdl2java/src/main/java/org/apache/cxf/tools/ws
> >dl2java/processor/internal/ServiceProcessor.java
> >
> > Modified:
> > incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/
> >header/HeaderClientServerTest.java URL:
> > http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/te
> >st/java/org/apache/cxf/jaxws/header/HeaderClientServerTest.java?view=diff&
> >rev=504289&r1=504288&r2=504289
> > =========================================================================
> >===== ---
> > incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/
> >header/HeaderClientServerTest.java (original) +++
> > incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/
> >header/HeaderClientServerTest.java Tue Feb  6 12:56:15 2007 @@ -36,6
> > +36,10 @@
> >  import org.apache.header_test.SOAPHeaderService;
> >  import org.apache.header_test.TestHeader;
> >  import org.apache.header_test.TestHeaderImpl;
> > +import org.apache.header_test.rpc.SOAPRPCHeaderService;
> > +import org.apache.header_test.rpc.TestRPCHeader;
> > +import org.apache.header_test.rpc.TestRPCHeaderImpl;
> > +import org.apache.header_test.rpc.types.HeaderMessage;
> >  import org.apache.header_test.types.TestHeader1;
> >  import org.apache.header_test.types.TestHeader1Response;
> >  import org.apache.header_test.types.TestHeader2;
> > @@ -54,27 +58,31 @@
> >      private final QName portName = new
> > QName("http://apache.org/header_test";, "SoapHeaderPort");
> >
> > -    private TestHeader proxy;
> > -
> >      public void setUp() throws Exception {
> >          super.setUp();
> >          BusFactory.setDefaultBus(getBus());
> >
> >          Object implementor = new TestHeaderImpl();
> >          String address =
> > "http://localhost:9104/SoapHeaderContext/SoapHeaderPort";; -       
> > EndpointImpl e = (EndpointImpl) Endpoint.publish(address, implementor); +
> >        EndpointImpl e = (EndpointImpl) Endpoint.publish(address,
> > implementor); +       
> > e.getServer().getEndpoint().getInInterceptors().add(new
> > LoggingInInterceptor()); +       
> > e.getServer().getEndpoint().getOutInterceptors().add(new
> > LoggingOutInterceptor());
> >
> > +        implementor = new TestRPCHeaderImpl();
> > +        address =
> > "http://localhost:9104/SoapHeaderRPCContext/SoapHeaderRPCPort";; +       
> > e = (EndpointImpl)Endpoint.publish(address, implementor);
> > e.getServer().getEndpoint().getInInterceptors().add(new
> > LoggingInInterceptor());
> > e.getServer().getEndpoint().getOutInterceptors().add(new
> > LoggingOutInterceptor()); +
> >      }
> > -
> > +
> >      public void testInHeader() throws Exception {
> >          URL wsdl = getClass().getResource("/wsdl/soapheader.wsdl");
> >          assertNotNull(wsdl);
> >
> >          SOAPHeaderService service = new SOAPHeaderService(wsdl,
> > serviceName); assertNotNull(service);
> > -        proxy = service.getPort(portName, TestHeader.class);
> > +        TestHeader proxy = service.getPort(portName, TestHeader.class);
> >          try {
> >              TestHeader1 val = new TestHeader1();
> >              for (int idx = 0; idx < 2; idx++) {
> > @@ -93,7 +101,7 @@
> >
> >          SOAPHeaderService service = new SOAPHeaderService(wsdl,
> > serviceName); assertNotNull(service);
> > -        proxy = service.getPort(portName, TestHeader.class);
> > +        TestHeader proxy = service.getPort(portName, TestHeader.class);
> >          try {
> >              TestHeader2 in = new TestHeader2();
> >              String val = new
> > String(TestHeader2Response.class.getSimpleName()); @@ -119,7 +127,7 @@
> >
> >          SOAPHeaderService service = new SOAPHeaderService(wsdl,
> > serviceName); assertNotNull(service);
> > -        proxy = service.getPort(portName, TestHeader.class);
> > +        TestHeader proxy = service.getPort(portName, TestHeader.class);
> >
> >          try {
> >              TestHeader3 in = new TestHeader3();
> > @@ -154,7 +162,7 @@
> >
> >          SOAPHeaderService service = new SOAPHeaderService(wsdl,
> > serviceName); assertNotNull(service);
> > -        proxy = service.getPort(portName, TestHeader.class);
> > +        TestHeader proxy = service.getPort(portName, TestHeader.class);
> >          try {
> >              TestHeader5 in = new TestHeader5();
> >              String val = new String(TestHeader5.class.getSimpleName());
> > @@ -178,7 +186,7 @@
> >
> >          SOAPHeaderService service = new SOAPHeaderService(wsdl,
> > serviceName); assertNotNull(service);
> > -        proxy = service.getPort(portName, TestHeader.class);
> > +        TestHeader proxy = service.getPort(portName, TestHeader.class);
> >
> >          TestHeader6 in = new TestHeader6();
> >          String val = new String(TestHeader6.class.getSimpleName());
> > @@ -209,7 +217,7 @@
> >
> >          SOAPHeaderService service = new SOAPHeaderService(wsdl,
> > serviceName); assertNotNull(service);
> > -        proxy = service.getPort(portName, TestHeader.class);
> > +        TestHeader proxy = service.getPort(portName, TestHeader.class);
> >          try {
> >              proxy.testHeader4("cxf");
> >          } catch (Exception e) {
> > @@ -218,6 +226,56 @@
> >          }
> >      }
> >
> > +    public void testRPCInHeader() throws Exception {
> > +        URL wsdl = getClass().getResource("/wsdl/soapheader_rpc.wsdl");
> > +        assertNotNull(wsdl);
> > +
> > +        SOAPRPCHeaderService service
> > +            = new SOAPRPCHeaderService(wsdl,
> > +                new QName("http://apache.org/header_test/rpc";,
> > "SOAPRPCHeaderService")); +        assertNotNull(service);
> > +        TestRPCHeader proxy = service.getSoapRPCHeaderPort();
> > +        try {
> > +            HeaderMessage header = new HeaderMessage();
> > +            header.setHeaderVal("header");
> > +
> > +            for (int idx = 0; idx < 2; idx++) {
> > +                String returnVal = proxy.testHeader1("part", header);
> > +                assertNotNull(returnVal);
> > +                assertEquals("part/header", returnVal);
> > +            }
> > +        } catch (UndeclaredThrowableException ex) {
> > +            throw (Exception)ex.getCause();
> > +        }
> > +    }
> > +
> > +    public void testRPCInOutHeader() throws Exception {
> > +        URL wsdl = getClass().getResource("/wsdl/soapheader_rpc.wsdl");
> > +        assertNotNull(wsdl);
> > +
> > +        SOAPRPCHeaderService service
> > +            = new SOAPRPCHeaderService(wsdl,
> > +                new QName("http://apache.org/header_test/rpc";,
> > "SOAPRPCHeaderService")); +        assertNotNull(service);
> > +        TestRPCHeader proxy = service.getSoapRPCHeaderPort();
> > +        try {
> > +            HeaderMessage header = new HeaderMessage();
> > +            Holder<HeaderMessage> holder = new
> > Holder<HeaderMessage>(header); +
> > +            for (int idx = 0; idx < 2; idx++) {
> > +                holder.value.setHeaderVal("header" + idx);
> > +                String returnVal = proxy.testInOutHeader("part" + idx,
> > holder); +
> > +                assertNotNull(returnVal);
> > +                assertEquals("header" + idx, returnVal);
> > +                assertEquals("part" + idx, holder.value.getHeaderVal());
> > +            }
> > +        } catch (UndeclaredThrowableException ex) {
> > +            throw (Exception)ex.getCause();
> > +        }
> > +    }
> > +
> > +
> >      public static void main(String[] args) {
> >          junit.textui.TestRunner.run(HeaderClientServerTest.class);
> >      }
> >
> > Modified: incubator/cxf/trunk/testutils/pom.xml
> > URL:
> > http://svn.apache.org/viewvc/incubator/cxf/trunk/testutils/pom.xml?view=d
> >iff&rev=504289&r1=504288&r2=504289
> > =========================================================================
> >===== --- incubator/cxf/trunk/testutils/pom.xml (original)
> > +++ incubator/cxf/trunk/testutils/pom.xml Tue Feb  6 12:56:15 2007
> > @@ -244,6 +244,9 @@
> >                                     
> > <wsdl>${basedir}/src/main/resources/wsdl/soapheader2.wsdl</wsdl>
> > </wsdlOption>
> >                                  <wsdlOption>
> > +                                   
> > <wsdl>${basedir}/src/main/resources/wsdl/soapheader_rpc.wsdl</wsdl> +    
> >                            </wsdlOption>
> > +                                <wsdlOption>
> >                                     
> > <wsdl>${basedir}/src/main/resources/wsdl/locator.wsdl</wsdl> <extraargs>
> >                                          <extraarg>-p</extraarg>
> >
> > Added:
> > incubator/cxf/trunk/testutils/src/main/java/org/apache/header_test/rpc/Te
> >stRPCHeaderImpl.java URL:
> > http://svn.apache.org/viewvc/incubator/cxf/trunk/testutils/src/main/java/
> >org/apache/header_test/rpc/TestRPCHeaderImpl.java?view=auto&rev=504289
> > =========================================================================
> >===== ---
> > incubator/cxf/trunk/testutils/src/main/java/org/apache/header_test/rpc/Te
> >stRPCHeaderImpl.java (added) +++
> > incubator/cxf/trunk/testutils/src/main/java/org/apache/header_test/rpc/Te
> >stRPCHeaderImpl.java Tue Feb  6 12:56:15 2007 @@ -0,0 +1,48 @@
> > +/**
> > + * 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.header_test.rpc;
> > +
> > +import javax.jws.WebService;
> > +import javax.xml.ws.Holder;
> > +
> > +import org.apache.header_test.rpc.types.HeaderMessage;
> > +
> > +
> > [EMAIL PROTECTED](serviceName = "SOAPRPCHeaderService",
> > +            portName = "SoapRPCHeaderPort",
> > +            endpointInterface =
> > "org.apache.header_test.rpc.TestRPCHeader", +            targetNamespace
> > = "http://apache.org/header_test/rpc";) +
> > +public class TestRPCHeaderImpl implements TestRPCHeader {
> > +
> > +    public String testHeader1(String in, HeaderMessage inHeader) {
> > +        if (in == null || inHeader == null) {
> > +            throw new IllegalArgumentException("TestHeader1 part not
> > found."); +        }
> > +
> > +        return in + "/" + inHeader.getHeaderVal();
> > +    }
> > +
> > +    public String testInOutHeader(String in, Holder<HeaderMessage>
> > inOutHeader) { +        String tmp = inOutHeader.value.getHeaderVal();
> > +        inOutHeader.value.setHeaderVal(in);
> > +        return tmp;
> > +    }
> > +
> > +}
> >
> > Propchange:
> > incubator/cxf/trunk/testutils/src/main/java/org/apache/header_test/rpc/Te
> >stRPCHeaderImpl.java
> > -------------------------------------------------------------------------
> >----- svn:eol-style = native
> >
> > Propchange:
> > incubator/cxf/trunk/testutils/src/main/java/org/apache/header_test/rpc/Te
> >stRPCHeaderImpl.java
> > -------------------------------------------------------------------------
> >----- svn:keywords = Rev Date
> >
> > Added:
> > incubator/cxf/trunk/testutils/src/main/resources/wsdl/soapheader_rpc.wsdl
> > URL:
> > http://svn.apache.org/viewvc/incubator/cxf/trunk/testutils/src/main/resou
> >rces/wsdl/soapheader_rpc.wsdl?view=auto&rev=504289
> > =========================================================================
> >===== ---
> > incubator/cxf/trunk/testutils/src/main/resources/wsdl/soapheader_rpc.wsdl
> > (added) +++
> > incubator/cxf/trunk/testutils/src/main/resources/wsdl/soapheader_rpc.wsdl
> > Tue Feb  6 12:56:15 2007 @@ -0,0 +1,88 @@
> > +<?xml version="1.0" encoding="UTF-8"?>
> > +<!--
> > +  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.
> > +-->
> > +<wsdl:definitions xmlns="http://schemas.xmlsoap.org/wsdl/";
> > xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/";
> > xmlns:tns="http://apache.org/header_test/rpc";
> > xmlns:x1="http://apache.org/header_test/rpc/types";
> > xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/";
> > xmlns:xsd="http://www.w3.org/2001/XMLSchema";
> > targetNamespace="http://apache.org/header_test/rpc";
> > name="TestHeaderWSDL"> +    <wsdl:types>
> > +        <schema
> > targetNamespace="http://apache.org/header_test/rpc/types";
> > xmlns="http://www.w3.org/2001/XMLSchema";
> > xmlns:x1="http://apache.org/header_test/rpc/types";
> > elementFormDefault="qualified"> +            <element
> > name="headerMessage">
> > +                <complexType>
> > +               <sequence>
> > +                        <element name="headerVal" type="string"/>
> > +               </sequence>
> > +           </complexType>
> > +            </element>
> > +        </schema>
> > +    </wsdl:types>
> > +    <wsdl:message name="testHeader1Request">
> > +        <wsdl:part name="in" type="xsd:string"/>
> > +        <wsdl:part name="inHeader" element="x1:headerMessage"/>
> > +    </wsdl:message>
> > +    <wsdl:message name="testHeader1Response">
> > +        <wsdl:part name="out" type="xsd:string"/>
> > +    </wsdl:message>
> > +
> > +    <wsdl:message name="testInOutHeaderRequest">
> > +        <wsdl:part name="in" type="xsd:string"/>
> > +        <wsdl:part name="inOutHeader" element="x1:headerMessage"/>
> > +    </wsdl:message>
> > +    <wsdl:message name="testInOutHeaderResponse">
> > +        <wsdl:part name="out" type="xsd:string"/>
> > +        <wsdl:part name="inOutHeader" element="x1:headerMessage"/>
> > +    </wsdl:message>
> > +
> > +    <wsdl:portType name="TestRPCHeader">
> > +        <wsdl:operation name="testHeader1">
> > +            <wsdl:input name="testHeader1Request"
> > message="tns:testHeader1Request"/> +            <wsdl:output
> > name="testHeader1Response" message="tns:testHeader1Response"/> +       
> > </wsdl:operation>
> > +        <wsdl:operation name="testInOutHeader">
> > +            <wsdl:input name="testInOutHeaderRequest"
> > message="tns:testInOutHeaderRequest"/> +            <wsdl:output
> > name="testInOutHeaderResponse" message="tns:testInOutHeaderResponse"/> + 
> >       </wsdl:operation>
> > +    </wsdl:portType>
> > +    <wsdl:binding name="TestHeader_SOAPRPCBinding"
> > type="tns:TestRPCHeader"> +        <soap:binding style="rpc"
> > transport="http://schemas.xmlsoap.org/soap/http"/> +       
> > <wsdl:operation name="testHeader1">
> > +            <soap:operation/>
> > +            <wsdl:input name="testHeader1Request">
> > +                <soap:body message="tns:testHeader1Request" parts="in"
> > use="literal" namespace="http://apache.org/header_test"/> +              
> >  <soap:header message="tns:testHeader1Request" part="inHeader"
> > use="literal"/> +            </wsdl:input>
> > +            <wsdl:output name="testHeader1Response">
> > +                <soap:body message="tns:testHeader1Response"
> > use="literal" namespace="http://apache.org/header_test"/> +           
> > </wsdl:output>
> > +        </wsdl:operation>
> > +        <wsdl:operation name="testInOutHeader">
> > +            <soap:operation/>
> > +            <wsdl:input>
> > +                <soap:body message="tns:testInOutHeaderRequest"
> > parts="in" use="literal" namespace="http://apache.org/header_test"/> +   
> >             <soap:header message="tns:testInOutHeaderRequest"
> > part="inOutHeader" use="literal"/> +            </wsdl:input>
> > +            <wsdl:output>
> > +                <soap:body message="tns:testInOutHeaderResponse"
> > parts="out" use="literal" namespace="http://apache.org/header_test"/> +  
> >              <soap:header message="tns:testInOutHeaderRequest"
> > part="inOutHeader" use="literal"/> +            </wsdl:output>
> > +        </wsdl:operation>
> > +    </wsdl:binding>
> > +    <wsdl:service name="SOAPRPCHeaderService">
> > +        <wsdl:port name="SoapRPCHeaderPort"
> > binding="tns:TestHeader_SOAPRPCBinding"> +            <soap:address
> > location="http://localhost:9104/SoapHeaderRPCContext/SoapHeaderRPCPort"/>
> > +        </wsdl:port>
> > +    </wsdl:service>
> > +</wsdl:definitions>
> >
> > Propchange:
> > incubator/cxf/trunk/testutils/src/main/resources/wsdl/soapheader_rpc.wsdl
> > -------------------------------------------------------------------------
> >----- svn:eol-style = native
> >
> > Propchange:
> > incubator/cxf/trunk/testutils/src/main/resources/wsdl/soapheader_rpc.wsdl
> > -------------------------------------------------------------------------
> >----- svn:keywords = Rev Date
> >
> > Propchange:
> > incubator/cxf/trunk/testutils/src/main/resources/wsdl/soapheader_rpc.wsdl
> > -------------------------------------------------------------------------
> >----- svn:mime-type = text/xml
> >
> > Modified:
> > incubator/cxf/trunk/tools/wsdl2java/src/main/java/org/apache/cxf/tools/ws
> >dl2java/processor/internal/ParameterProcessor.java URL:
> > http://svn.apache.org/viewvc/incubator/cxf/trunk/tools/wsdl2java/src/main
> >/java/org/apache/cxf/tools/wsdl2java/processor/internal/ParameterProcessor
> >.java?view=diff&rev=504289&r1=504288&r2=504289
> > =========================================================================
> >===== ---
> > incubator/cxf/trunk/tools/wsdl2java/src/main/java/org/apache/cxf/tools/ws
> >dl2java/processor/internal/ParameterProcessor.java (original) +++
> > incubator/cxf/trunk/tools/wsdl2java/src/main/java/org/apache/cxf/tools/ws
> >dl2java/processor/internal/ParameterProcessor.java Tue Feb  6 12:56:15
> > 2007 @@ -129,7 +129,9 @@
> >          String targetNamespace = method.getInterface().getNamespace();
> >          String partName = null;
> >
> > -        if (method.getSoapStyle() == SOAPBinding.Style.DOCUMENT) {
> > +        if (method.getSoapStyle() == SOAPBinding.Style.DOCUMENT
> > +            || parameter.isHeader()) {
> > +            //headers are always DOCUMENT style
> >              targetNamespace = parameter.getTargetNamespace();
> >              if (parameter.getQName() != null) {
> >                  name = parameter.getQName().getLocalPart();
> > @@ -151,7 +153,8 @@
> >              webParamAnnotation.addArgument("mode", "Mode." +
> > parameter.getStyle().toString(), ""); }
> >          webParamAnnotation.addArgument("name", name);
> > -        if (method.getSoapStyle() == SOAPBinding.Style.DOCUMENT) {
> > +        if (method.getSoapStyle() == SOAPBinding.Style.DOCUMENT
> > +            || parameter.isHeader()) {
> >              webParamAnnotation.addArgument("targetNamespace",
> > targetNamespace); }
> >
> >
> > Modified:
> > incubator/cxf/trunk/tools/wsdl2java/src/main/java/org/apache/cxf/tools/ws
> >dl2java/processor/internal/ServiceProcessor.java URL:
> > http://svn.apache.org/viewvc/incubator/cxf/trunk/tools/wsdl2java/src/main
> >/java/org/apache/cxf/tools/wsdl2java/processor/internal/ServiceProcessor.j
> >ava?view=diff&rev=504289&r1=504288&r2=504289
> > =========================================================================
> >===== ---
> > incubator/cxf/trunk/tools/wsdl2java/src/main/java/org/apache/cxf/tools/ws
> >dl2java/processor/internal/ServiceProcessor.java (original) +++
> > incubator/cxf/trunk/tools/wsdl2java/src/main/java/org/apache/cxf/tools/ws
> >dl2java/processor/internal/ServiceProcessor.java Tue Feb  6 12:56:15 2007
> > @@ -300,6 +300,8 @@
> >      private void setParameterAsHeader(JavaParameter parameter) {
> >          parameter.setHeader(true);
> >          parameter.getAnnotation().addArgument("header", "true", "");
> > +        parameter.getAnnotation().addArgument("name",
> > parameter.getQName().getLocalPart()); +       
> > parameter.getAnnotation().addArgument("targetNamespace",
> > parameter.getTargetNamespace()); }
> >
> >      private void processParameter(JavaMethod jm, BindingOperation
> > operation) throws ToolException {

-- 
J. Daniel Kulp
Principal Engineer
IONA
P: 781-902-8727    C: 508-380-7194
[EMAIL PROTECTED]

Reply via email to