/******************************************************************************* * Copyright (c) 2009 MATERNA Information & Communications. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html. For further * project-related information visit http://www.ws4d.org. The most recent * version of the JMEDS framework can be obtained from * http://sourceforge.net/projects/ws4d-javame. ******************************************************************************/ package org.ws4d.java.communication.DPWS2006; import org.ws4d.java.communication.CommunicationUtil; import org.ws4d.java.communication.DPWS2009.DefaultConstantsHelper2009; import org.ws4d.java.configuration.DPWSProperties; import org.ws4d.java.constants.ConstantsHelper; import org.ws4d.java.constants.DPWSConstants; import org.ws4d.java.constants.DPWSConstants2006; import org.ws4d.java.constants.DPWSMessageConstants; import org.ws4d.java.constants.WSAConstants2006; import org.ws4d.java.constants.WSDConstants2006; import org.ws4d.java.constants.WXFConstants; import org.ws4d.java.io.xml.ElementHandlerRegistry; import org.ws4d.java.message.FaultMessage; import org.ws4d.java.message.Message; import org.ws4d.java.message.SOAPHeader; import org.ws4d.java.message.discovery.ByeMessage; import org.ws4d.java.message.discovery.HelloMessage; import org.ws4d.java.message.discovery.ProbeMatch; import org.ws4d.java.message.discovery.ProbeMatchesMessage; import org.ws4d.java.message.discovery.ProbeMessage; import org.ws4d.java.message.discovery.ResolveMatchesMessage; import org.ws4d.java.message.discovery.ResolveMessage; import org.ws4d.java.message.eventing.SubscribeMessage; import org.ws4d.java.message.metadata.GetMessage; import org.ws4d.java.message.metadata.GetMetadataMessage; import org.ws4d.java.message.metadata.GetMetadataResponseMessage; import org.ws4d.java.message.metadata.GetResponseMessage; import org.ws4d.java.structures.Iterator; import org.ws4d.java.types.AttributedURI; import org.ws4d.java.types.DiscoveryData; import org.ws4d.java.types.EndpointReference; import org.ws4d.java.types.QNameSet; import org.ws4d.java.types.ServiceId; import org.ws4d.java.util.Log; public class DefaultDPWSCommunicatonUtil implements CommunicationUtil { private static DefaultDPWSCommunicatonUtil instance = null; public ConstantsHelper getHelper(int versionInfo) { ConstantsHelper helper = null; if (versionInfo == -1) { versionInfo = DPWSProperties.DEFAULT_DPWS_VERSION; } switch (versionInfo) { case DPWSConstants.DPWS_VERSION2009: helper = new DefaultConstantsHelper2009(); break; case DPWSConstants2006.DPWS_VERSION2006: helper = new DefaultConstantsHelper2006(); break; } return helper; } public static synchronized DefaultDPWSCommunicatonUtil getInstance() { if (instance == null) { // Register the Handler for DPWS 2006 ServiceID Element ElementHandlerRegistry.getRegistry().registerElementHandler(ServiceId.QNAME, new ServiceId()); instance = new DefaultDPWSCommunicatonUtil(); } return instance; } /** * This method change the namespace and some attributes according to the * version given. */ public Message changeOutgoingMessage(int version, Message message) { switch (message.getType()) { case DPWSMessageConstants.HELLO_MESSAGE: return changeOutgoingMessage(version, (HelloMessage) message); case DPWSMessageConstants.BYE_MESSAGE: return changeOutgoingMessage(version, (ByeMessage) message); case DPWSMessageConstants.PROBE_MESSAGE: return changeOutgoingMessage(version, (ProbeMessage) message); case DPWSMessageConstants.PROBE_MATCHES_MESSAGE: return changeOutgoingMessage(version, (ProbeMatchesMessage) message); case DPWSMessageConstants.RESOLVE_MESSAGE: return changeOutgoingMessage(version, (ResolveMessage) message); case DPWSMessageConstants.RESOLVE_MATCHES_MESSAGE: return changeOutgoingMessage(version, (ResolveMatchesMessage) message); case DPWSMessageConstants.GET_MESSAGE: return changeOutgoingMessage(version, (GetMessage) message); case DPWSMessageConstants.GET_RESPONSE_MESSAGE: return changeOutgoingMessage(version, (GetResponseMessage) message); case DPWSMessageConstants.GET_METADATA_MESSAGE: return changeOutgoingMessage(version, (GetMetadataMessage) message); case DPWSMessageConstants.GET_METADATA_RESPONSE_MESSAGE: return changeOutgoingMessage(version, (GetMetadataResponseMessage) message); case DPWSMessageConstants.SUBSCRIBE_MESSAGE: return changeOutgoingMessage(version, (SubscribeMessage) message); case DPWSMessageConstants.FAULT_MESSAGE: return changeOutgoingMessage(version, (FaultMessage) message); } // message does not match any message type? :) return message; } private Message changeOutgoingMessage(int version, HelloMessage hello) { if (DPWSConstants2006.DPWS_VERSION2006 == version) { // Change wsa:Action hello.getHeader().setAction(new AttributedURI(WSDConstants2006.WSD_ACTION_HELLO)); // Change wsa:To if (hello.getHeader().getTo() != null) { hello.getHeader().setTo(new AttributedURI(WSDConstants2006.WSD_TO)); } changeTypesTo2006(hello.getTypes()); } else if (DPWSConstants.DPWS_VERSION2009 == version) { changeTypesTo2009(hello.getTypes()); } return hello; } private Message changeOutgoingMessage(int version, ByeMessage bye) { if (DPWSConstants2006.DPWS_VERSION2006 == version) { // Change wsa:Action bye.getHeader().setAction(new AttributedURI(WSDConstants2006.WSD_ACTION_BYE)); // Change wsa:To if (bye.getHeader().getTo() != null) { bye.getHeader().setTo(new AttributedURI(WSDConstants2006.WSD_TO)); } changeTypesTo2006(bye.getTypes()); } else if (DPWSConstants.DPWS_VERSION2009 == version) { changeTypesTo2009(bye.getTypes()); } return bye; } private Message changeOutgoingMessage(int version, ProbeMessage probe) { if (DPWSConstants2006.DPWS_VERSION2006 == version) { // Change wsa:Action probe.getHeader().setAction(new AttributedURI(WSDConstants2006.WSD_ACTION_PROBE)); // Change wsa:To probe.getHeader().setTo(new AttributedURI(WSDConstants2006.WSD_TO)); } return probe; } private Message changeOutgoingMessage(int version, ProbeMatchesMessage probeMatches) { if (DPWSConstants2006.DPWS_VERSION2006 == version) { // Change wsa:Action probeMatches.getHeader().setAction(new AttributedURI(WSDConstants2006.WSD_ACTION_PROBEMATCHES)); // Change wsa:To if (probeMatches.getHeader().getTo() != null) { probeMatches.getHeader().setTo(new AttributedURI(WSAConstants2006.WSA_ANONYMOUS)); } // Change DPWS Devicetype QN if (probeMatches.getProbeMatchCount() > 0) { Iterator it = probeMatches.getProbeMatches().iterator(); while (it.hasNext()) { ProbeMatch probeMatch = (ProbeMatch) it.next(); changeTypesTo2006(probeMatch.getTypes()); } } } else if (DPWSConstants.DPWS_VERSION2009 == version) { if (probeMatches.getProbeMatchCount() > 0) { Iterator it = probeMatches.getProbeMatches().iterator(); while (it.hasNext()) { ProbeMatch probeMatch = (ProbeMatch) it.next(); changeTypesTo2009(probeMatch.getTypes()); } } } return probeMatches; } private Message changeOutgoingMessage(int version, ResolveMessage resolve) { if (DPWSConstants2006.DPWS_VERSION2006 == version) { // Change wsa:Action resolve.getHeader().setAction(new AttributedURI(WSDConstants2006.WSD_ACTION_RESOLVE)); // Change wsa:To resolve.getHeader().setTo(new AttributedURI(WSDConstants2006.WSD_TO)); } return resolve; } private Message changeOutgoingMessage(int version, ResolveMatchesMessage resolveMatches) { if (DPWSConstants2006.DPWS_VERSION2006 == version) { // Change wsa:Action resolveMatches.getHeader().setAction(new AttributedURI(WSDConstants2006.WSD_ACTION_RESOLVEMATCHES)); // Change wsa:To if (resolveMatches.getHeader().getTo() != null) { resolveMatches.getHeader().setTo(new AttributedURI(WSAConstants2006.WSA_ANONYMOUS)); } // Change DPWS Devicetype QN if(resolveMatches.getResolveMatch()!= null){ changeTypesTo2006(resolveMatches.getResolveMatch().getTypes()); } } else if (DPWSConstants.DPWS_VERSION2009 == version) { if(resolveMatches.getResolveMatch()!= null){ changeTypesTo2009(resolveMatches.getResolveMatch().getTypes()); } } return resolveMatches; } private Message changeOutgoingMessage(int version, GetMessage get) { if (DPWSConstants2006.DPWS_VERSION2006 == version) { // Set wsa:ReplyTo get.getHeader().setReplyTo(new EndpointReference(WSAConstants2006.WSA_ANONYMOUS)); // get.getHeader().setMessageId(new // AttributedURI(IDGenerator.getUUIDasURI())); } return get; } private Message changeOutgoingMessage(int version, GetResponseMessage getResponse) { if (DPWSConstants2006.DPWS_VERSION2006 == version) { // Change wsa:To if (getResponse.getHeader().getTo() != null) { getResponse.getHeader().setTo(new AttributedURI(WSAConstants2006.WSA_ANONYMOUS)); } // getResponse.getHeader().setMessageId(new // AttributedURI(IDGenerator.getUUIDasURI())); changeTypesTo2006(getResponse.getHost().getTypes()); getResponse.getHost().addUnknownElement(ServiceId.QNAME, DPWSConstants2006.DPWS_DEVICE_SERVICEID); } else if (DPWSConstants.DPWS_VERSION2009 == version) { changeTypesTo2009(getResponse.getHost().getTypes()); } return getResponse; } public Message changeOutgoingMessage(int version, GetMetadataMessage getMetadata) { if (DPWSConstants2006.DPWS_VERSION2006 == version) { GetMessage get = new GetMessage(getMetadata.getHeader().getCommunicationManagerID()); copyOutgoingHeader(get.getHeader(), getMetadata); get.setProtocolInfo(getMetadata.getProtocolInfo()); copyOutgoingInheritAttributes(get, getMetadata); // Change wsa:Action get.getHeader().setAction(new AttributedURI(WXFConstants.WXF_ACTION_GET)); // Set wsa:ReplyTo get.getHeader().setReplyTo(new EndpointReference(WSAConstants2006.WSA_ANONYMOUS)); return get; } return getMetadata; } private Message changeOutgoingMessage(int version, GetMetadataResponseMessage getMetadataResponse) { if (DPWSConstants2006.DPWS_VERSION2006 == version) { // Change wsa:Action getMetadataResponse.getHeader().setAction(new AttributedURI(WXFConstants.WXF_ACTION_GETRESPONSE)); } return getMetadataResponse; } private Message changeOutgoingMessage(int version, SubscribeMessage subscribe) { if (DPWSConstants2006.DPWS_VERSION2006 == version) { // Change wse:filter-->dialect subscribe.getFilter().setDialect(DPWSConstants2006.DPWS_URI_FILTER_EVENTING_ACTION); } return subscribe; } private Message changeOutgoingMessage(int version, FaultMessage fault) { if (DPWSConstants2006.DPWS_VERSION2006 == version) { fault.getHeader().setAction(new AttributedURI(DefaultConstantsHelper2006.getInstance().getWSAActionAddressingFault())); fault.setSubcode(DefaultConstantsHelper2006.getInstance().getWSAFaultMessageAddressingHeaderRequired()); } return fault; } /** * This method creates a copy of the given message an returns the copy. * * @param message ,the given message * @return ,the copy of the given message */ public Message copyOutgoingMessage(Message message) { if (message instanceof HelloMessage) { return copyOutgoingMessage((HelloMessage) message); } else if (message instanceof ByeMessage) { return copyOutgoingMessage((ByeMessage) message); } else if (message instanceof ProbeMessage) { return copyOutgoingMessage((ProbeMessage) message); } else if (message instanceof ResolveMessage) { return copyOutgoingMessage((ResolveMessage) message); } else if (message instanceof GetMessage) { return copyOutgoingMessage((GetMessage) message); } if (Log.isWarn()) { Log.warn("CopyOutgoingMessage(...) does not support messages of type " + message.getClass().getName()); } return message; } private DiscoveryData copyDiscoveryData(DiscoveryData original) { QNameSet types = new QNameSet(original.getTypes()); DiscoveryData d = new DiscoveryData(original); d.setTypes(types); return d; } private Message copyOutgoingMessage(HelloMessage original) { // generate new Hello Message within the DiscoveryData of the original HelloMessage hello = new HelloMessage(copyDiscoveryData(original.getDiscoveryData()), original.getHeader().getCommunicationManagerID()); // copying Header copyOutgoingHeader(hello.getHeader(), original); // copying inherited attributs copyOutgoingInheritAttributes(hello, original); return hello; } private Message copyOutgoingMessage(ByeMessage original) { // generate new Hello Message within the DiscoveryData of the original ByeMessage bye = new ByeMessage(copyDiscoveryData(original.getDiscoveryData()), original.getHeader().getCommunicationManagerID()); // copying Header copyOutgoingHeader(bye.getHeader(), original); // copying inherited attributs copyOutgoingInheritAttributes(bye, original); return bye; } private Message copyOutgoingMessage(ProbeMessage original) { // generate new Probe Message ProbeMessage probe = new ProbeMessage(original.getHeader().getCommunicationManagerID()); // copying Header copyOutgoingHeader(probe.getHeader(), original); // copy Probespecific attributs probe.setTypes(original.getTypes()); probe.setScopes(original.getScopes()); probe.setDirected(original.isDirected()); // copying inherited attributs copyOutgoingInheritAttributes(probe, original); return probe; } private Message copyOutgoingMessage(ResolveMessage original) { // generate new Resolve Message ResolveMessage resolve = new ResolveMessage(original.getHeader().getCommunicationManagerID()); // copying Header copyOutgoingHeader(resolve.getHeader(), original); // copy Resolvespecific attributs resolve.setEndpointReference(original.getEndpointReference()); // copying inherited attributs copyOutgoingInheritAttributes(resolve, original); return resolve; } private Message copyOutgoingMessage(GetMessage original) { // generate new Resolve Message GetMessage get = new GetMessage(original.getHeader().getCommunicationManagerID()); // copying Header copyOutgoingHeader(get.getHeader(), original); // necessary for DPWS 2006 get.getHeader().setReplyTo(new EndpointReference(WSAConstants2006.WSA_ANONYMOUS)); // copying inherited attributs copyOutgoingInheritAttributes(get, original); return get; } /** * This method copies all header attributs to the new header. * * @param header * @param original */ private void copyOutgoingHeader(SOAPHeader header, Message original) { // copying Headerattributs header.setAction(new AttributedURI(original.getAction().toString())); header.setMessageId(original.getMessageId()); AttributedURI tmp = original.getRelatesTo(); if (tmp != null) { header.setRelatesTo(new AttributedURI(tmp.toString())); } EndpointReference epr = original.getReplyTo(); if (epr != null) { header.setReplyTo(new EndpointReference(epr.getAddress())); } tmp = original.getTo(); if (tmp != null) { header.setTo(new AttributedURI(original.getTo().toString())); } header.setAppSequence(original.getAppSequence()); header.setReferenceParameters(original.getHeader().getReferenceParameters()); header.setSignature(original.getHeader().getSignature()); header.setValidated(original.getHeader().isValidated()); } /** * This method copies the inherit attributs of every Message (attributs * extends Message.java) * * @param copy * @param original */ private void copyOutgoingInheritAttributes(Message copy, Message original) { // Change inherited Attributes (from class MESSAGE) copy.setInbound(original.isInbound()); copy.setTargetXAddressInfo(original.getTargetXAddressInfo()); copy.setSecure(original.isSecure()); copy.setCertificate(original.getCertificate()); copy.setPrivateKey(original.getPrivateKey()); } public void changeIncomingProbe(ProbeMessage probeMessage) { changeTypesTo2009(probeMessage.getTypes()); } /** * Change the QName:DeviceType of an incoming DPWS 2006 Message to DPWS 2009 * * @param types */ private void changeTypesTo2009(QNameSet types) { // DPWS 2006 Device Type is included if (types.contains(DPWSConstants2006.DPWS_QN_DEVICETYPE) && !types.contains(DPWSConstants.DPWS_QN_DEVICETYPE)) { // Must be changed to DPWS 2009 Device Type types.remove(DPWSConstants2006.DPWS_QN_DEVICETYPE); types.add(DPWSConstants.DPWS_QN_DEVICETYPE); } } /** * Change the QName:DeviceType of an outgoing DPWS 2009 Message to DPWS 2006 * * @param types */ private void changeTypesTo2006(QNameSet types) { // DPWS 2009 Device Type is included if (types != null && types.contains(DPWSConstants.DPWS_QN_DEVICETYPE) && !types.contains(DPWSConstants2006.DPWS_QN_DEVICETYPE)) { // Must be changed to DPWS 2006 Device Type types.remove(DPWSConstants.DPWS_QN_DEVICETYPE); types.add(DPWSConstants2006.DPWS_QN_DEVICETYPE); } } }