source: FCSSimpleEndpoint/trunk/src/main/java/eu/clarin/sru/server/fcs/ResourceInfoWriter.java @ 5485

Last change on this file since 5485 was 5485, checked in by margaretha@ids-mannheim.de, 10 years ago

Enabled x-cmd-resource-info

  • Property svn:eol-style set to native
File size: 5.9 KB
Line 
1package eu.clarin.sru.server.fcs;
2
3import java.util.List;
4import java.util.Map;
5
6import javax.xml.XMLConstants;
7import javax.xml.stream.XMLStreamException;
8import javax.xml.stream.XMLStreamWriter;
9
10public class ResourceInfoWriter {
11
12        public static final String FCS_RESOURCE_INFO_NS =
13            "http://clarin.eu/fcs/endpoint-description";
14   
15        public static void writeFullResourceInfo(XMLStreamWriter writer,
16            String prefix, List<ResourceInfo> resourceInfoList)
17            throws XMLStreamException {
18               
19        if (resourceInfoList == null) {
20            throw new NullPointerException("resourceInfoList == null");
21        }
22        if (!resourceInfoList.isEmpty()) {
23            final boolean defaultNS = ((prefix == null) || prefix.isEmpty());
24            if (defaultNS) {
25                writer.setDefaultNamespace(FCS_RESOURCE_INFO_NS);
26            } else {
27                writer.setPrefix(prefix, FCS_RESOURCE_INFO_NS);
28            }
29            writer.writeStartElement(FCS_RESOURCE_INFO_NS, "Resources");
30            if (defaultNS) {
31                writer.writeDefaultNamespace(FCS_RESOURCE_INFO_NS);
32            } else {
33                writer.writeNamespace(prefix, FCS_RESOURCE_INFO_NS);
34            }
35            for (ResourceInfo resourceInfo : resourceInfoList) {
36                doWriteResourceInfo(writer, prefix, resourceInfo, false, true);
37            }
38            writer.writeEndElement(); // "ResourceCollection" element
39        }
40    }
41
42
43        public static void writeResourceInfo(XMLStreamWriter writer, String prefix,
44            ResourceInfo resourceInfo) throws XMLStreamException {       
45        doWriteResourceInfo(writer, prefix, resourceInfo, true, false);
46    }
47
48
49        private static void doWriteResourceInfo(XMLStreamWriter writer,
50            String prefix, ResourceInfo resourceInfo, boolean writeNS,
51            boolean recursive) throws XMLStreamException {
52               
53                if (writer == null) {
54            throw new NullPointerException("writer == null");
55        }               
56                if (resourceInfo == null) {
57            throw new NullPointerException("resourceInfo == null");
58        }
59               
60        final boolean defaultNS = ((prefix == null) || prefix.isEmpty());
61        if (writeNS) {
62            if (defaultNS) {
63                writer.setDefaultNamespace(FCS_RESOURCE_INFO_NS);
64            } else {
65                writer.setPrefix(prefix, FCS_RESOURCE_INFO_NS);
66            }
67        }
68        writer.writeStartElement(FCS_RESOURCE_INFO_NS, "Resource");
69        if (writeNS) {
70            if (defaultNS) {
71                writer.writeDefaultNamespace(FCS_RESOURCE_INFO_NS);
72            } else {
73                writer.writeNamespace(prefix, FCS_RESOURCE_INFO_NS);
74            }
75        }
76        if (recursive) {
77            /*
78             * HACK: only output @pid for recursive (= explain) requests.
79             * This should be revisited, if we decide to go for the explain
80             * style enumeration of resources.
81             */
82            writer.writeAttribute("pid", resourceInfo.getPid());
83        }
84        if (resourceInfo.hasSubResources()) {
85            writer.writeAttribute("hasSubResources", "true");
86        }
87
88        final Map<String, String> title = resourceInfo.getTitle();
89        for (Map.Entry<String, String> i : title.entrySet()) {
90            writer.setPrefix(XMLConstants.XML_NS_PREFIX,
91                    XMLConstants.XML_NS_URI);
92            writer.writeStartElement(FCS_RESOURCE_INFO_NS, "Title");
93            writer.writeAttribute(XMLConstants.XML_NS_URI, "lang", i.getKey());
94            writer.writeCharacters(i.getValue());
95            writer.writeEndElement(); // "title" element
96        }
97
98        final Map<String, String> description = resourceInfo.getDescription();
99        if (description != null) {
100            for (Map.Entry<String, String> i : description.entrySet()) {
101                writer.writeStartElement(FCS_RESOURCE_INFO_NS, "Description");
102                writer.writeAttribute(XMLConstants.XML_NS_URI, "lang",
103                        i.getKey());
104                writer.writeCharacters(i.getValue());
105                writer.writeEndElement(); // "Description" element
106            }
107        }
108
109        final String landingPageURI = resourceInfo.getLandingPageURI();
110        if (landingPageURI != null) {
111            writer.writeStartElement(FCS_RESOURCE_INFO_NS, "LandingPageURI");
112            writer.writeCharacters(landingPageURI);
113            writer.writeEndElement(); // "LandingPageURI" element
114        }
115
116        final List<String> languages = resourceInfo.getLanguages();
117        writer.writeStartElement(FCS_RESOURCE_INFO_NS, "Languages");
118        for (String i : languages) {
119            writer.writeStartElement(FCS_RESOURCE_INFO_NS, "Language");
120            writer.writeCharacters(i);
121            writer.writeEndElement(); // "Language" element
122
123        }
124        writer.writeEndElement(); // "Languages" element
125       
126        if (!defaultNS && prefix.equals(EndpointDescriptionWriter.PREFIX)){
127                final List<String> availableDataViews = resourceInfo.getAvailableDataViews();
128                writer.writeStartElement(FCS_RESOURCE_INFO_NS, "AvailableDataViews");
129               
130                StringBuilder sb = new StringBuilder();
131                for (int i = 0; i < availableDataViews.size(); i++) {
132                    sb.append(availableDataViews.get(i));
133                    sb.append(" ");
134                }       
135                writer.writeAttribute("ref", sb.toString().trim());
136               
137                writer.writeEndElement(); // "AvailableDataViews" element
138        }
139       
140        if (recursive && resourceInfo.hasSubResources()) {
141            writer.writeStartElement(FCS_RESOURCE_INFO_NS,
142                    "ResourceInfoCollection");
143            for (ResourceInfo r : resourceInfo.getSubResources()) {
144                doWriteResourceInfo(writer, prefix, r, writeNS, recursive);
145            }
146            writer.writeEndElement(); // "ResourceCollection" element
147        }
148        writer.writeEndElement(); // "ResourceInfo" element
149    }   
150}
Note: See TracBrowser for help on using the repository browser.