Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id CDF22200C58 for ; Sun, 2 Apr 2017 01:58:08 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id CCA34160BA1; Sat, 1 Apr 2017 23:58:08 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id A6286160BA0 for ; Sun, 2 Apr 2017 01:58:06 +0200 (CEST) Received: (qmail 48756 invoked by uid 500); 1 Apr 2017 23:58:05 -0000 Mailing-List: contact commits-help@juneau.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@juneau.incubator.apache.org Delivered-To: mailing list commits@juneau.incubator.apache.org Received: (qmail 48747 invoked by uid 99); 1 Apr 2017 23:58:05 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd4-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 01 Apr 2017 23:58:05 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd4-us-west.apache.org (ASF Mail Server at spamd4-us-west.apache.org) with ESMTP id 51E59C0158 for ; Sat, 1 Apr 2017 23:58:05 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd4-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: -4.222 X-Spam-Level: X-Spam-Status: No, score=-4.222 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, RCVD_IN_DNSWL_HI=-5, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RP_MATCHES_RCVD=-0.001, SPF_PASS=-0.001] autolearn=disabled Received: from mx1-lw-eu.apache.org ([10.40.0.8]) by localhost (spamd4-us-west.apache.org [10.40.0.11]) (amavisd-new, port 10024) with ESMTP id Su69wySRS4qY for ; Sat, 1 Apr 2017 23:57:55 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-lw-eu.apache.org (ASF Mail Server at mx1-lw-eu.apache.org) with SMTP id E23AF60D1C for ; Sat, 1 Apr 2017 23:57:50 +0000 (UTC) Received: (qmail 48213 invoked by uid 99); 1 Apr 2017 23:57:50 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 01 Apr 2017 23:57:50 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id E2365F16CB; Sat, 1 Apr 2017 23:57:49 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: jamesbognar@apache.org To: commits@juneau.incubator.apache.org Date: Sat, 01 Apr 2017 23:58:04 -0000 Message-Id: <8e6a625625ce406c82600b211c4a5e2c@git.apache.org> In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [16/51] [partial] incubator-juneau-website git commit: Javadoc updates. archived-at: Sat, 01 Apr 2017 23:58:09 -0000 http://git-wip-us.apache.org/repos/asf/incubator-juneau-website/blob/5aed2f48/content/site/apidocs/src-html/org/apache/juneau/jena/RdfParser.html ---------------------------------------------------------------------- diff --git a/content/site/apidocs/src-html/org/apache/juneau/jena/RdfParser.html b/content/site/apidocs/src-html/org/apache/juneau/jena/RdfParser.html index 675f202..9d7976b 100644 --- a/content/site/apidocs/src-html/org/apache/juneau/jena/RdfParser.html +++ b/content/site/apidocs/src-html/org/apache/juneau/jena/RdfParser.html @@ -177,314 +177,315 @@ 169 // Special case where we're parsing a loose collection of resources. 170 if (s.isLooseCollections() && type.isCollectionOrArray()) { 171 Collection c = null; -172 if (type.isArray()) +172 if (type.isArray() || type.isArgs()) 173 c = new ArrayList(); 174 else 175 c = (type.canCreateNewInstance(session.getOuter()) ? (Collection<?>)type.newInstance(session.getOuter()) : new ObjectList(session)); -176 for (Resource resource : roots) -177 c.add(parseAnything(s, type.getElementType(), resource, session.getOuter(), null)); -178 -179 if (type.isArray()) -180 return (T)session.toArray(type, c); -181 return (T)c; -182 } -183 -184 if (roots.isEmpty()) -185 return null; -186 if (roots.size() > 1) -187 throw new ParseException(session, "Too many root nodes found in model: {0}", roots.size()); -188 Resource resource = roots.get(0); -189 -190 return parseAnything(s, type, resource, session.getOuter(), null); -191 } -192 -193 /* -194 * Finds the roots in the model using either the "root" property to identify it, -195 * or by resorting to scanning the model for all nodes with no incoming predicates. -196 */ -197 private static List<Resource> getRoots(RdfParserSession session, Model m) { -198 List<Resource> l = new LinkedList<Resource>(); -199 -200 // First try to find the root using the "http://www.apache.org/juneau/root" property. -201 Property root = m.createProperty(session.getJuneauNsUri(), RDF_juneauNs_ROOT); -202 for (ResIterator i = m.listResourcesWithProperty(root); i.hasNext();) -203 l.add(i.next()); -204 -205 if (! l.isEmpty()) -206 return l; -207 -208 // Otherwise, we need to find all resources that aren't objects. -209 // We want to explicitly ignore statements where the subject -210 // and object are the same node. -211 Set<RDFNode> objects = new HashSet<RDFNode>(); -212 for (StmtIterator i = m.listStatements(); i.hasNext();) { -213 Statement st = i.next(); -214 RDFNode subject = st.getSubject(); -215 RDFNode object = st.getObject(); -216 if (object.isResource() && ! object.equals(subject)) -217 objects.add(object); -218 } -219 for (ResIterator i = m.listSubjects(); i.hasNext();) { -220 Resource r = i.next(); -221 if (! objects.contains(r)) -222 l.add(r); -223 } -224 return l; -225 } -226 -227 private <T> BeanMap<T> parseIntoBeanMap(RdfParserSession session, Resource r2, BeanMap<T> m) throws Exception { -228 BeanMeta<T> bm = m.getMeta(); -229 RdfBeanMeta rbm = bm.getExtendedMeta(RdfBeanMeta.class); -230 if (rbm.hasBeanUri() && r2.getURI() != null) -231 rbm.getBeanUriProperty().set(m, r2.getURI()); -232 for (StmtIterator i = r2.listProperties(); i.hasNext();) { -233 Statement st = i.next(); -234 Property p = st.getPredicate(); -235 String key = session.decodeString(p.getLocalName()); -236 BeanPropertyMeta pMeta = m.getPropertyMeta(key); -237 session.setCurrentProperty(pMeta); -238 if (pMeta != null) { -239 RDFNode o = st.getObject(); -240 ClassMeta<?> cm = pMeta.getClassMeta(); -241 if (cm.isCollectionOrArray() && isMultiValuedCollections(session, pMeta)) { -242 ClassMeta<?> et = cm.getElementType(); -243 Object value = parseAnything(session, et, o, m.getBean(false), pMeta); -244 setName(et, value, key); -245 pMeta.add(m, value); -246 } else { -247 Object value = parseAnything(session, cm, o, m.getBean(false), pMeta); -248 setName(cm, value, key); -249 pMeta.set(m, value); -250 } -251 } else if (! (p.equals(session.getRootProperty()) || p.equals(session.getTypeProperty()))) { -252 onUnknownProperty(session, key, m, -1, -1); -253 } -254 session.setCurrentProperty(null); -255 } -256 return m; -257 } -258 -259 private static boolean isMultiValuedCollections(RdfParserSession session, BeanPropertyMeta pMeta) { -260 if (pMeta != null && pMeta.getExtendedMeta(RdfBeanPropertyMeta.class).getCollectionFormat() != RdfCollectionFormat.DEFAULT) -261 return pMeta.getExtendedMeta(RdfBeanPropertyMeta.class).getCollectionFormat() == RdfCollectionFormat.MULTI_VALUED; -262 return session.getCollectionFormat() == RdfCollectionFormat.MULTI_VALUED; -263 } -264 -265 @SuppressWarnings({ "unchecked", "rawtypes" }) -266 private <T> T parseAnything(RdfParserSession session, ClassMeta<T> eType, RDFNode n, Object outer, BeanPropertyMeta pMeta) throws Exception { -267 -268 if (eType == null) -269 eType = (ClassMeta<T>)object(); -270 PojoSwap<T,Object> transform = (PojoSwap<T,Object>)eType.getPojoSwap(); -271 ClassMeta<?> sType = eType.getSerializedClassMeta(); -272 session.setCurrentClass(sType); -273 -274 if (! sType.canCreateNewInstance(outer)) { -275 if (n.isResource()) { -276 Statement st = n.asResource().getProperty(session.getTypeProperty()); -277 if (st != null) { -278 String c = st.getLiteral().getString(); -279 ClassMeta tcm = session.getClassMeta(c, pMeta, eType); -280 if (tcm != null) -281 sType = eType = tcm; -282 } -283 } -284 } -285 -286 Object o = null; -287 if (n.isResource() && n.asResource().getURI() != null && n.asResource().getURI().equals(RDF_NIL)) { -288 // Do nothing. Leave o == null. -289 } else if (sType.isObject()) { -290 if (n.isLiteral()) { -291 o = n.asLiteral().getValue(); -292 if (o instanceof String) { -293 o = session.decodeString(o); -294 } -295 } -296 else if (n.isResource()) { -297 Resource r = n.asResource(); -298 if (session.wasAlreadyProcessed(r)) -299 o = r.getURI(); -300 else if (r.getProperty(session.getValueProperty()) != null) { -301 o = parseAnything(session, object(), n.asResource().getProperty(session.getValueProperty()).getObject(), outer, null); -302 } else if (isSeq(session, r)) { -303 o = new ObjectList(session); -304 parseIntoCollection(session, r.as(Seq.class), (Collection)o, sType.getElementType(), pMeta); -305 } else if (isBag(session, r)) { -306 o = new ObjectList(session); -307 parseIntoCollection(session, r.as(Bag.class), (Collection)o, sType.getElementType(), pMeta); -308 } else if (r.canAs(RDFList.class)) { -309 o = new ObjectList(session); -310 parseIntoCollection(session, r.as(RDFList.class), (Collection)o, sType.getElementType(), pMeta); -311 } else { -312 // If it has a URI and no child properties, we interpret this as an -313 // external resource, and convert it to just a URL. -314 String uri = r.getURI(); -315 if (uri != null && ! r.listProperties().hasNext()) { -316 o = r.getURI(); -317 } else { -318 ObjectMap m2 = new ObjectMap(session); -319 parseIntoMap(session, r, m2, null, null, pMeta); -320 o = session.cast(m2, pMeta, eType); -321 } -322 } -323 } else { -324 throw new ParseException(session, "Unrecognized node type ''{0}'' for object", n); -325 } -326 } else if (sType.isBoolean()) { -327 o = session.convertToType(getValue(session, n, outer), boolean.class); -328 } else if (sType.isCharSequence()) { -329 o = session.decodeString(getValue(session, n, outer)); -330 } else if (sType.isChar()) { -331 o = session.decodeString(getValue(session, n, outer)).charAt(0); -332 } else if (sType.isNumber()) { -333 o = parseNumber(getValue(session, n, outer).toString(), (Class<? extends Number>)sType.getInnerClass()); -334 } else if (sType.isMap()) { -335 Resource r = n.asResource(); -336 if (session.wasAlreadyProcessed(r)) -337 return null; -338 Map m = (sType.canCreateNewInstance(outer) ? (Map)sType.newInstance(outer) : new ObjectMap(session)); -339 o = parseIntoMap(session, r, m, eType.getKeyType(), eType.getValueType(), pMeta); -340 } else if (sType.isCollectionOrArray()) { -341 if (sType.isArray()) -342 o = new ArrayList(); -343 else -344 o = (sType.canCreateNewInstance(outer) ? (Collection<?>)sType.newInstance(outer) : new ObjectList(session)); -345 Resource r = n.asResource(); -346 if (session.wasAlreadyProcessed(r)) -347 return null; -348 if (isSeq(session, r)) { -349 parseIntoCollection(session, r.as(Seq.class), (Collection)o, sType.getElementType(), pMeta); -350 } else if (isBag(session, r)) { -351 parseIntoCollection(session, r.as(Bag.class), (Collection)o, sType.getElementType(), pMeta); -352 } else if (r.canAs(RDFList.class)) { -353 parseIntoCollection(session, r.as(RDFList.class), (Collection)o, sType.getElementType(), pMeta); -354 } else { -355 throw new ParseException("Unrecognized node type ''{0}'' for collection", n); -356 } -357 if (sType.isArray()) -358 o = session.toArray(sType, (Collection)o); -359 } else if (sType.canCreateNewBean(outer)) { -360 Resource r = n.asResource(); -361 if (session.wasAlreadyProcessed(r)) -362 return null; -363 BeanMap<?> bm = session.newBeanMap(outer, sType.getInnerClass()); -364 o = parseIntoBeanMap(session, r, bm).getBean(); -365 } else if (sType.isUri() && n.isResource()) { -366 o = sType.newInstanceFromString(outer, session.decodeString(n.asResource().getURI())); -367 } else if (sType.canCreateNewInstanceFromString(outer)) { -368 o = sType.newInstanceFromString(outer, session.decodeString(getValue(session, n, outer))); -369 } else if (sType.canCreateNewInstanceFromNumber(outer)) { -370 o = sType.newInstanceFromNumber(session, outer, parseNumber(getValue(session, n, outer).toString(), sType.getNewInstanceFromNumberClass())); -371 } else if (n.isResource()) { -372 Resource r = n.asResource(); -373 Map m = new ObjectMap(session); -374 parseIntoMap(session, r, m, sType.getKeyType(), sType.getValueType(), pMeta); -375 if (m.containsKey(session.getBeanTypePropertyName())) -376 o = session.cast((ObjectMap)m, pMeta, eType); -377 else -378 throw new ParseException(session, "Class ''{0}'' could not be instantiated. Reason: ''{1}''", sType.getInnerClass().getName(), sType.getNotABeanReason()); -379 } else { -380 throw new ParseException("Class ''{0}'' could not be instantiated. Reason: ''{1}''", sType.getInnerClass().getName(), sType.getNotABeanReason()); -381 } -382 -383 if (transform != null && o != null) -384 o = transform.unswap(session, o, eType); -385 -386 if (outer != null) -387 setParent(eType, o, outer); -388 -389 return (T)o; -390 } -391 -392 private static boolean isSeq(RdfParserSession session, RDFNode n) { -393 if (n.isResource()) { -394 Statement st = n.asResource().getProperty(session.getRdfTypeProperty()); -395 if (st != null) -396 return RDF_SEQ.equals(st.getResource().getURI()); -397 } -398 return false; -399 } -400 -401 private static boolean isBag(RdfParserSession session, RDFNode n) { -402 if (n.isResource()) { -403 Statement st = n.asResource().getProperty(session.getRdfTypeProperty()); -404 if (st != null) -405 return RDF_BAG.equals(st.getResource().getURI()); -406 } -407 return false; -408 } -409 -410 private Object getValue(RdfParserSession session, RDFNode n, Object outer) throws Exception { -411 if (n.isLiteral()) -412 return n.asLiteral().getValue(); -413 if (n.isResource()) { -414 Statement st = n.asResource().getProperty(session.getValueProperty()); -415 if (st != null) { -416 n = st.getObject(); -417 if (n.isLiteral()) -418 return n.asLiteral().getValue(); -419 return parseAnything(session, object(), st.getObject(), outer, null); -420 } -421 } -422 throw new ParseException(session, "Unknown value type for node ''{0}''", n); -423 } -424 -425 private <K,V> Map<K,V> parseIntoMap(RdfParserSession session, Resource r, Map<K,V> m, ClassMeta<K> keyType, ClassMeta<V> valueType, BeanPropertyMeta pMeta) throws Exception { -426 // Add URI as "uri" to generic maps. -427 if (r.getURI() != null) { -428 K uri = convertAttrToType(session, m, "uri", keyType); -429 V value = convertAttrToType(session, m, r.getURI(), valueType); -430 m.put(uri, value); -431 } -432 for (StmtIterator i = r.listProperties(); i.hasNext();) { -433 Statement st = i.next(); -434 Property p = st.getPredicate(); -435 String key = p.getLocalName(); -436 if (! (key.equals("root") && p.getURI().equals(session.getJuneauNsUri()))) { -437 key = session.decodeString(key); -438 RDFNode o = st.getObject(); -439 K key2 = convertAttrToType(session, m, key, keyType); -440 V value = parseAnything(session, valueType, o, m, pMeta); -441 setName(valueType, value, key); -442 m.put(key2, value); -443 } -444 -445 } -446 return m; -447 } -448 -449 private <E> Collection<E> parseIntoCollection(RdfParserSession session, Container c, Collection<E> l, ClassMeta<E> et, BeanPropertyMeta pMeta) throws Exception { -450 for (NodeIterator ni = c.iterator(); ni.hasNext();) { -451 E e = parseAnything(session, et, ni.next(), l, pMeta); -452 l.add(e); -453 } -454 return l; -455 } -456 -457 private <E> Collection<E> parseIntoCollection(RdfParserSession session, RDFList list, Collection<E> l, ClassMeta<E> et, BeanPropertyMeta pMeta) throws Exception { -458 for (ExtendedIterator<RDFNode> ni = list.iterator(); ni.hasNext();) { -459 E e = parseAnything(session, et, ni.next(), l, pMeta); -460 l.add(e); -461 } -462 return l; -463 } -464 -465 @Override /* Parser */ -466 protected Object[] doParseArgs(ParserSession session, ClassMeta<?>[] argTypes) throws Exception { -467 throw new UnsupportedOperationException("Parser '"+getClass().getName()+"' does not support this method."); -468 } -469 -470 -471 //-------------------------------------------------------------------------------- -472 // Entry point methods -473 //-------------------------------------------------------------------------------- -474 -475 @Override /* Parser */ -476 public RdfParserSession createSession(Object input, ObjectMap op, Method javaMethod, Object outer, Locale locale, TimeZone timeZone, MediaType mediaType) { -477 return new RdfParserSession(ctx, op, input, javaMethod, outer, locale, timeZone, mediaType); -478 } -479} +176 +177 int argIndex = 0; +178 for (Resource resource : roots) +179 c.add(parseAnything(s, type.isArgs() ? type.getArg(argIndex++) : type.getElementType(), resource, session.getOuter(), null)); +180 +181 if (type.isArray() || type.isArgs()) +182 return (T)session.toArray(type, c); +183 return (T)c; +184 } +185 +186 if (roots.isEmpty()) +187 return null; +188 if (roots.size() > 1) +189 throw new ParseException(session, "Too many root nodes found in model: {0}", roots.size()); +190 Resource resource = roots.get(0); +191 +192 return parseAnything(s, type, resource, session.getOuter(), null); +193 } +194 +195 /* +196 * Finds the roots in the model using either the "root" property to identify it, +197 * or by resorting to scanning the model for all nodes with no incoming predicates. +198 */ +199 private static List<Resource> getRoots(RdfParserSession session, Model m) { +200 List<Resource> l = new LinkedList<Resource>(); +201 +202 // First try to find the root using the "http://www.apache.org/juneau/root" property. +203 Property root = m.createProperty(session.getJuneauNsUri(), RDF_juneauNs_ROOT); +204 for (ResIterator i = m.listResourcesWithProperty(root); i.hasNext();) +205 l.add(i.next()); +206 +207 if (! l.isEmpty()) +208 return l; +209 +210 // Otherwise, we need to find all resources that aren't objects. +211 // We want to explicitly ignore statements where the subject +212 // and object are the same node. +213 Set<RDFNode> objects = new HashSet<RDFNode>(); +214 for (StmtIterator i = m.listStatements(); i.hasNext();) { +215 Statement st = i.next(); +216 RDFNode subject = st.getSubject(); +217 RDFNode object = st.getObject(); +218 if (object.isResource() && ! object.equals(subject)) +219 objects.add(object); +220 } +221 for (ResIterator i = m.listSubjects(); i.hasNext();) { +222 Resource r = i.next(); +223 if (! objects.contains(r)) +224 l.add(r); +225 } +226 return l; +227 } +228 +229 private <T> BeanMap<T> parseIntoBeanMap(RdfParserSession session, Resource r2, BeanMap<T> m) throws Exception { +230 BeanMeta<T> bm = m.getMeta(); +231 RdfBeanMeta rbm = bm.getExtendedMeta(RdfBeanMeta.class); +232 if (rbm.hasBeanUri() && r2.getURI() != null) +233 rbm.getBeanUriProperty().set(m, r2.getURI()); +234 for (StmtIterator i = r2.listProperties(); i.hasNext();) { +235 Statement st = i.next(); +236 Property p = st.getPredicate(); +237 String key = session.decodeString(p.getLocalName()); +238 BeanPropertyMeta pMeta = m.getPropertyMeta(key); +239 session.setCurrentProperty(pMeta); +240 if (pMeta != null) { +241 RDFNode o = st.getObject(); +242 ClassMeta<?> cm = pMeta.getClassMeta(); +243 if (cm.isCollectionOrArray() && isMultiValuedCollections(session, pMeta)) { +244 ClassMeta<?> et = cm.getElementType(); +245 Object value = parseAnything(session, et, o, m.getBean(false), pMeta); +246 setName(et, value, key); +247 pMeta.add(m, value); +248 } else { +249 Object value = parseAnything(session, cm, o, m.getBean(false), pMeta); +250 setName(cm, value, key); +251 pMeta.set(m, value); +252 } +253 } else if (! (p.equals(session.getRootProperty()) || p.equals(session.getTypeProperty()))) { +254 onUnknownProperty(session, key, m, -1, -1); +255 } +256 session.setCurrentProperty(null); +257 } +258 return m; +259 } +260 +261 private static boolean isMultiValuedCollections(RdfParserSession session, BeanPropertyMeta pMeta) { +262 if (pMeta != null && pMeta.getExtendedMeta(RdfBeanPropertyMeta.class).getCollectionFormat() != RdfCollectionFormat.DEFAULT) +263 return pMeta.getExtendedMeta(RdfBeanPropertyMeta.class).getCollectionFormat() == RdfCollectionFormat.MULTI_VALUED; +264 return session.getCollectionFormat() == RdfCollectionFormat.MULTI_VALUED; +265 } +266 +267 @SuppressWarnings({ "unchecked", "rawtypes" }) +268 private <T> T parseAnything(RdfParserSession session, ClassMeta<T> eType, RDFNode n, Object outer, BeanPropertyMeta pMeta) throws Exception { +269 +270 if (eType == null) +271 eType = (ClassMeta<T>)object(); +272 PojoSwap<T,Object> transform = (PojoSwap<T,Object>)eType.getPojoSwap(); +273 ClassMeta<?> sType = eType.getSerializedClassMeta(); +274 session.setCurrentClass(sType); +275 +276 if (! sType.canCreateNewInstance(outer)) { +277 if (n.isResource()) { +278 Statement st = n.asResource().getProperty(session.getTypeProperty()); +279 if (st != null) { +280 String c = st.getLiteral().getString(); +281 ClassMeta tcm = session.getClassMeta(c, pMeta, eType); +282 if (tcm != null) +283 sType = eType = tcm; +284 } +285 } +286 } +287 +288 Object o = null; +289 if (n.isResource() && n.asResource().getURI() != null && n.asResource().getURI().equals(RDF_NIL)) { +290 // Do nothing. Leave o == null. +291 } else if (sType.isObject()) { +292 if (n.isLiteral()) { +293 o = n.asLiteral().getValue(); +294 if (o instanceof String) { +295 o = session.decodeString(o); +296 } +297 } +298 else if (n.isResource()) { +299 Resource r = n.asResource(); +300 if (session.wasAlreadyProcessed(r)) +301 o = r.getURI(); +302 else if (r.getProperty(session.getValueProperty()) != null) { +303 o = parseAnything(session, object(), n.asResource().getProperty(session.getValueProperty()).getObject(), outer, null); +304 } else if (isSeq(session, r)) { +305 o = new ObjectList(session); +306 parseIntoCollection(session, r.as(Seq.class), (Collection)o, sType, pMeta); +307 } else if (isBag(session, r)) { +308 o = new ObjectList(session); +309 parseIntoCollection(session, r.as(Bag.class), (Collection)o, sType, pMeta); +310 } else if (r.canAs(RDFList.class)) { +311 o = new ObjectList(session); +312 parseIntoCollection(session, r.as(RDFList.class), (Collection)o, sType, pMeta); +313 } else { +314 // If it has a URI and no child properties, we interpret this as an +315 // external resource, and convert it to just a URL. +316 String uri = r.getURI(); +317 if (uri != null && ! r.listProperties().hasNext()) { +318 o = r.getURI(); +319 } else { +320 ObjectMap m2 = new ObjectMap(session); +321 parseIntoMap(session, r, m2, null, null, pMeta); +322 o = session.cast(m2, pMeta, eType); +323 } +324 } +325 } else { +326 throw new ParseException(session, "Unrecognized node type ''{0}'' for object", n); +327 } +328 } else if (sType.isBoolean()) { +329 o = session.convertToType(getValue(session, n, outer), boolean.class); +330 } else if (sType.isCharSequence()) { +331 o = session.decodeString(getValue(session, n, outer)); +332 } else if (sType.isChar()) { +333 o = session.decodeString(getValue(session, n, outer)).charAt(0); +334 } else if (sType.isNumber()) { +335 o = parseNumber(getValue(session, n, outer).toString(), (Class<? extends Number>)sType.getInnerClass()); +336 } else if (sType.isMap()) { +337 Resource r = n.asResource(); +338 if (session.wasAlreadyProcessed(r)) +339 return null; +340 Map m = (sType.canCreateNewInstance(outer) ? (Map)sType.newInstance(outer) : new ObjectMap(session)); +341 o = parseIntoMap(session, r, m, eType.getKeyType(), eType.getValueType(), pMeta); +342 } else if (sType.isCollectionOrArray() || sType.isArgs()) { +343 if (sType.isArray() || sType.isArgs()) +344 o = new ArrayList(); +345 else +346 o = (sType.canCreateNewInstance(outer) ? (Collection<?>)sType.newInstance(outer) : new ObjectList(session)); +347 Resource r = n.asResource(); +348 if (session.wasAlreadyProcessed(r)) +349 return null; +350 if (isSeq(session, r)) { +351 parseIntoCollection(session, r.as(Seq.class), (Collection)o, sType, pMeta); +352 } else if (isBag(session, r)) { +353 parseIntoCollection(session, r.as(Bag.class), (Collection)o, sType, pMeta); +354 } else if (r.canAs(RDFList.class)) { +355 parseIntoCollection(session, r.as(RDFList.class), (Collection)o, sType, pMeta); +356 } else { +357 throw new ParseException("Unrecognized node type ''{0}'' for collection", n); +358 } +359 if (sType.isArray() || sType.isArgs()) +360 o = session.toArray(sType, (Collection)o); +361 } else if (sType.canCreateNewBean(outer)) { +362 Resource r = n.asResource(); +363 if (session.wasAlreadyProcessed(r)) +364 return null; +365 BeanMap<?> bm = session.newBeanMap(outer, sType.getInnerClass()); +366 o = parseIntoBeanMap(session, r, bm).getBean(); +367 } else if (sType.isUri() && n.isResource()) { +368 o = sType.newInstanceFromString(outer, session.decodeString(n.asResource().getURI())); +369 } else if (sType.canCreateNewInstanceFromString(outer)) { +370 o = sType.newInstanceFromString(outer, session.decodeString(getValue(session, n, outer))); +371 } else if (sType.canCreateNewInstanceFromNumber(outer)) { +372 o = sType.newInstanceFromNumber(session, outer, parseNumber(getValue(session, n, outer).toString(), sType.getNewInstanceFromNumberClass())); +373 } else if (n.isResource()) { +374 Resource r = n.asResource(); +375 Map m = new ObjectMap(session); +376 parseIntoMap(session, r, m, sType.getKeyType(), sType.getValueType(), pMeta); +377 if (m.containsKey(session.getBeanTypePropertyName())) +378 o = session.cast((ObjectMap)m, pMeta, eType); +379 else +380 throw new ParseException(session, "Class ''{0}'' could not be instantiated. Reason: ''{1}''", sType.getInnerClass().getName(), sType.getNotABeanReason()); +381 } else { +382 throw new ParseException("Class ''{0}'' could not be instantiated. Reason: ''{1}''", sType.getInnerClass().getName(), sType.getNotABeanReason()); +383 } +384 +385 if (transform != null && o != null) +386 o = transform.unswap(session, o, eType); +387 +388 if (outer != null) +389 setParent(eType, o, outer); +390 +391 return (T)o; +392 } +393 +394 private static boolean isSeq(RdfParserSession session, RDFNode n) { +395 if (n.isResource()) { +396 Statement st = n.asResource().getProperty(session.getRdfTypeProperty()); +397 if (st != null) +398 return RDF_SEQ.equals(st.getResource().getURI()); +399 } +400 return false; +401 } +402 +403 private static boolean isBag(RdfParserSession session, RDFNode n) { +404 if (n.isResource()) { +405 Statement st = n.asResource().getProperty(session.getRdfTypeProperty()); +406 if (st != null) +407 return RDF_BAG.equals(st.getResource().getURI()); +408 } +409 return false; +410 } +411 +412 private Object getValue(RdfParserSession session, RDFNode n, Object outer) throws Exception { +413 if (n.isLiteral()) +414 return n.asLiteral().getValue(); +415 if (n.isResource()) { +416 Statement st = n.asResource().getProperty(session.getValueProperty()); +417 if (st != null) { +418 n = st.getObject(); +419 if (n.isLiteral()) +420 return n.asLiteral().getValue(); +421 return parseAnything(session, object(), st.getObject(), outer, null); +422 } +423 } +424 throw new ParseException(session, "Unknown value type for node ''{0}''", n); +425 } +426 +427 private <K,V> Map<K,V> parseIntoMap(RdfParserSession session, Resource r, Map<K,V> m, ClassMeta<K> keyType, ClassMeta<V> valueType, BeanPropertyMeta pMeta) throws Exception { +428 // Add URI as "uri" to generic maps. +429 if (r.getURI() != null) { +430 K uri = convertAttrToType(session, m, "uri", keyType); +431 V value = convertAttrToType(session, m, r.getURI(), valueType); +432 m.put(uri, value); +433 } +434 for (StmtIterator i = r.listProperties(); i.hasNext();) { +435 Statement st = i.next(); +436 Property p = st.getPredicate(); +437 String key = p.getLocalName(); +438 if (! (key.equals("root") && p.getURI().equals(session.getJuneauNsUri()))) { +439 key = session.decodeString(key); +440 RDFNode o = st.getObject(); +441 K key2 = convertAttrToType(session, m, key, keyType); +442 V value = parseAnything(session, valueType, o, m, pMeta); +443 setName(valueType, value, key); +444 m.put(key2, value); +445 } +446 +447 } +448 return m; +449 } +450 +451 @SuppressWarnings("unchecked") +452 private <E> Collection<E> parseIntoCollection(RdfParserSession session, Container c, Collection<E> l, ClassMeta<?> type, BeanPropertyMeta pMeta) throws Exception { +453 int argIndex = 0; +454 for (NodeIterator ni = c.iterator(); ni.hasNext();) { +455 E e = (E)parseAnything(session, type.isArgs() ? type.getArg(argIndex++) : type.getElementType(), ni.next(), l, pMeta); +456 l.add(e); +457 } +458 return l; +459 } +460 +461 @SuppressWarnings("unchecked") +462 private <E> Collection<E> parseIntoCollection(RdfParserSession session, RDFList list, Collection<E> l, ClassMeta<?> type, BeanPropertyMeta pMeta) throws Exception { +463 int argIndex = 0; +464 for (ExtendedIterator<RDFNode> ni = list.iterator(); ni.hasNext();) { +465 E e = (E)parseAnything(session, type.isArgs() ? type.getArg(argIndex++) : type.getElementType(), ni.next(), l, pMeta); +466 l.add(e); +467 } +468 return l; +469 } +470 +471 +472 //-------------------------------------------------------------------------------- +473 // Entry point methods +474 //-------------------------------------------------------------------------------- +475 +476 @Override /* Parser */ +477 public RdfParserSession createSession(Object input, ObjectMap op, Method javaMethod, Object outer, Locale locale, TimeZone timeZone, MediaType mediaType) { +478 return new RdfParserSession(ctx, op, input, javaMethod, outer, locale, timeZone, mediaType); +479 } +480}