List of usage examples for org.jdom2 Element getAttribute
public Attribute getAttribute(final String attname)
This returns the attribute for this element with the given name and within no namespace, or null if no such attribute exists.
From source file:com.archimatetool.editor.model.compatibility.Archimate2To3Converter.java
License:Open Source License
/** * Convert "relationship" attribute name to "archimateRelationship" *//*from w w w . ja va 2 s .c o m*/ private void convertRelationshipType(Element element) { Attribute attRelationship = element.getAttribute("relationship"); if (attRelationship != null) { attRelationship.setName("archimateRelationship"); } }
From source file:com.archimatetool.editor.model.compatibility.Archimate2To3Converter.java
License:Open Source License
private Element getModelFolder(String folderType) { for (Element elementFolder : rootElement.getChildren("folder")) { Attribute attType = elementFolder.getAttribute("type"); if (attType != null && folderType.equals(attType.getValue())) { return elementFolder; }//w ww. j a v a 2 s.c om } return null; }
From source file:com.archimatetool.editor.model.compatibility.Archimate2To3Converter.java
License:Open Source License
private void setAttributeValue(Element element, String attributeName, String newValue) { if (element != null) { Attribute attribute = element.getAttribute(attributeName); if (attribute != null) { attribute.setValue(newValue); }//from www . jav a2 s .c o m } }
From source file:com.archimatetool.templates.impl.model.ArchimateTemplateManager.java
License:Open Source License
@Override protected boolean isValidTemplateFile(File file) throws IOException { if (file == null || !file.exists()) { return false; }/* w ww. ja v a2 s .c o m*/ // Ensure the template is of the right kind String xmlString = ZipUtils.extractZipEntry(file, ZIP_ENTRY_MANIFEST); if (xmlString == null) { return false; } // If the attribute "type" exists then return true if its value is "model". // If the attribute doesn't exist it was from an older version (before 2.1) try { Document doc = JDOMUtils.readXMLString(xmlString); Element root = doc.getRootElement(); Attribute attType = root.getAttribute(ITemplateXMLTags.XML_TEMPLATE_ATTRIBUTE_TYPE); if (attType != null) { return ArchimateModelTemplate.XML_TEMPLATE_ATTRIBUTE_TYPE_MODEL.equals(attType.getValue()); } } catch (JDOMException ex) { return false; } return true; }
From source file:com.ardor3d.extension.model.collada.jdom.ColladaAnimUtils.java
License:Open Source License
/** * Construct skin mesh(es) from the skin element and attach them (under a single new Node) to the given parent Node. * //from ww w . j ava2s. co m * @param ardorParentNode * Ardor3D Node to attach our skin node to. * @param instanceController * the <instance_controller> element. We'll parse the skeleton reference from here. * @param controller * the referenced <controller> element. Used for naming purposes. * @param skin * our <skin> element. */ @SuppressWarnings("unchecked") private void buildSkinMeshes(final Node ardorParentNode, final Element instanceController, final Element controller, final Element skin) { final String skinSource = skin.getAttributeValue("source"); final Element skinNodeEL = _colladaDOMUtil.findTargetWithId(skinSource); if (skinNodeEL == null || !"geometry".equals(skinNodeEL.getName())) { throw new ColladaException( "Expected a mesh for skin source with url: " + skinSource + " got instead: " + skinNodeEL, skin); } final Element geometry = skinNodeEL; final Node meshNode = _colladaMeshUtils.buildMesh(geometry); if (meshNode != null) { // Look for skeleton entries in the original <instance_controller> element final List<Element> skeletonRoots = Lists.newArrayList(); for (final Element sk : instanceController.getChildren("skeleton")) { final Element skroot = _colladaDOMUtil.findTargetWithId(sk.getText()); if (skroot != null) { // add as a possible root for when we need to locate a joint by name later. skeletonRoots.add(skroot); } else { throw new ColladaException( "Unable to find node with id: " + sk.getText() + ", referenced from skeleton " + sk, sk); } } // Read in our joints node final Element jointsEL = skin.getChild("joints"); if (jointsEL == null) { throw new ColladaException("skin found without joints.", skin); } // Pull out our joint names and bind matrices final List<String> jointNames = Lists.newArrayList(); final List<Transform> bindMatrices = Lists.newArrayList(); final List<ColladaInputPipe.ParamType> paramTypes = Lists.newArrayList(); for (final Element inputEL : jointsEL.getChildren("input")) { final ColladaInputPipe pipe = new ColladaInputPipe(_colladaDOMUtil, inputEL); final ColladaInputPipe.SourceData sd = pipe.getSourceData(); if (pipe.getType() == ColladaInputPipe.Type.JOINT) { final String[] namesData = sd.stringArray; for (int i = sd.offset; i < namesData.length; i += sd.stride) { jointNames.add(namesData[i]); paramTypes.add(sd.paramType); } } else if (pipe.getType() == ColladaInputPipe.Type.INV_BIND_MATRIX) { final float[] floatData = sd.floatArray; final FloatBuffer source = BufferUtils.createFloatBufferOnHeap(16); for (int i = sd.offset; i < floatData.length; i += sd.stride) { source.rewind(); source.put(floatData, i, 16); source.flip(); final Matrix4 mat = new Matrix4().fromFloatBuffer(source); bindMatrices.add(new Transform().fromHomogeneousMatrix(mat)); } } } // Use the skeleton information from the instance_controller to set the parent array locations on the // joints. Skeleton ourSkeleton = null; // TODO: maybe not the best way. iterate final int[] order = new int[jointNames.size()]; for (int i = 0; i < jointNames.size(); i++) { final String name = jointNames.get(i); final ParamType paramType = paramTypes.get(i); final String searcher = paramType == ParamType.idref_param ? "id" : "sid"; Element found = null; for (final Element root : skeletonRoots) { if (name.equals(root.getAttributeValue(searcher))) { found = root; } else if (paramType == ParamType.idref_param) { found = _colladaDOMUtil.findTargetWithId(name); } else { found = (Element) _colladaDOMUtil.selectSingleNode(root, ".//*[@sid='" + name + "']"); } // Last resorts (bad exporters) if (found == null) { found = _colladaDOMUtil.findTargetWithId(name); } if (found == null) { found = (Element) _colladaDOMUtil.selectSingleNode(root, ".//*[@name='" + name + "']"); } if (found != null) { break; } } if (found == null) { if (paramType == ParamType.idref_param) { found = _colladaDOMUtil.findTargetWithId(name); } else { found = (Element) _colladaDOMUtil.selectSingleNode(geometry, "/*//visual_scene//*[@sid='" + name + "']"); } // Last resorts (bad exporters) if (found == null) { found = _colladaDOMUtil.findTargetWithId(name); } if (found == null) { found = (Element) _colladaDOMUtil.selectSingleNode(geometry, "/*//visual_scene//*[@name='" + name + "']"); } if (found == null) { throw new ColladaException("Unable to find joint with " + searcher + ": " + name, skin); } } final Joint joint = _dataCache.getElementJointMapping().get(found); if (joint == null) { logger.warning("unable to parse joint for: " + found.getName() + " " + name); return; } joint.setInverseBindPose(bindMatrices.get(i)); ourSkeleton = _dataCache.getJointSkeletonMapping().get(joint); order[i] = joint.getIndex(); } // Make our skeleton pose SkeletonPose skPose = _dataCache.getSkeletonPoseMapping().get(ourSkeleton); if (skPose == null) { skPose = new SkeletonPose(ourSkeleton); _dataCache.getSkeletonPoseMapping().put(ourSkeleton, skPose); // attach any attachment points found for the skeleton's joints addAttachments(skPose); // Skeleton's default to bind position, so update the global transforms. skPose.updateTransforms(); } // Read in our vertex_weights node final Element weightsEL = skin.getChild("vertex_weights"); if (weightsEL == null) { throw new ColladaException("skin found without vertex_weights.", skin); } // Pull out our per vertex joint indices and weights final List<Short> jointIndices = Lists.newArrayList(); final List<Float> jointWeights = Lists.newArrayList(); int indOff = 0, weightOff = 0; int maxOffset = 0; for (final Element inputEL : weightsEL.getChildren("input")) { final ColladaInputPipe pipe = new ColladaInputPipe(_colladaDOMUtil, inputEL); final ColladaInputPipe.SourceData sd = pipe.getSourceData(); if (pipe.getOffset() > maxOffset) { maxOffset = pipe.getOffset(); } if (pipe.getType() == ColladaInputPipe.Type.JOINT) { indOff = pipe.getOffset(); final String[] namesData = sd.stringArray; for (int i = sd.offset; i < namesData.length; i += sd.stride) { // XXX: the Collada spec says this could be -1? final String name = namesData[i]; final int index = jointNames.indexOf(name); if (index >= 0) { jointIndices.add((short) index); } else { throw new ColladaException("Unknown joint accessed: " + name, inputEL); } } } else if (pipe.getType() == ColladaInputPipe.Type.WEIGHT) { weightOff = pipe.getOffset(); final float[] floatData = sd.floatArray; for (int i = sd.offset; i < floatData.length; i += sd.stride) { jointWeights.add(floatData[i]); } } } // Pull our values array int firstIndex = 0, count = 0; final int[] vals = _colladaDOMUtil.parseIntArray(weightsEL.getChild("v")); try { count = weightsEL.getAttribute("count").getIntValue(); } catch (final DataConversionException e) { throw new ColladaException("Unable to parse count attribute.", weightsEL); } // use the vals to fill our vert weight map final int[][] vertWeightMap = new int[count][]; int index = 0; for (final int length : _colladaDOMUtil.parseIntArray(weightsEL.getChild("vcount"))) { final int[] entry = new int[(maxOffset + 1) * length]; vertWeightMap[index++] = entry; System.arraycopy(vals, (maxOffset + 1) * firstIndex, entry, 0, entry.length); firstIndex += length; } // Create a record for the global ColladaStorage. final String storeName = getSkinStoreName(instanceController, controller); final SkinData skinDataStore = new SkinData(storeName); // add pose to store skinDataStore.setPose(skPose); // Create a base Node for our skin meshes final Node skinNode = new Node(meshNode.getName()); // copy Node render states across. copyRenderStates(meshNode, skinNode); // add node to store skinDataStore.setSkinBaseNode(skinNode); // Grab the bind_shape_matrix from skin final Element bindShapeMatrixEL = skin.getChild("bind_shape_matrix"); final Transform bindShapeMatrix = new Transform(); if (bindShapeMatrixEL != null) { final double[] array = _colladaDOMUtil.parseDoubleArray(bindShapeMatrixEL); bindShapeMatrix.fromHomogeneousMatrix(new Matrix4().fromArray(array)); } // Visit our Node and pull out any Mesh children. Turn them into SkinnedMeshes for (final Spatial spat : meshNode.getChildren()) { if (spat instanceof Mesh && ((Mesh) spat).getMeshData().getVertexCount() > 0) { final Mesh sourceMesh = (Mesh) spat; final SkinnedMesh skMesh = new SkinnedMesh(sourceMesh.getName()); skMesh.setCurrentPose(skPose); // copy material info mapping for later use final String material = _dataCache.getMeshMaterialMap().get(sourceMesh); _dataCache.getMeshMaterialMap().put(skMesh, material); // copy mesh render states across. copyRenderStates(sourceMesh, skMesh); // copy hints across skMesh.getSceneHints().set(sourceMesh.getSceneHints()); try { // Use source mesh as bind pose data in the new SkinnedMesh final MeshData bindPose = copyMeshData(sourceMesh.getMeshData()); skMesh.setBindPoseData(bindPose); // Apply our BSM if (!bindShapeMatrix.isIdentity()) { bindPose.transformVertices(bindShapeMatrix); if (bindPose.getNormalBuffer() != null) { bindPose.transformNormals(bindShapeMatrix, true); } } // TODO: This is only needed for CPU skinning... consider a way of making it optional. // Copy bind pose to mesh data to setup for CPU skinning final MeshData meshData = copyMeshData(skMesh.getBindPoseData()); meshData.getVertexCoords().setVboAccessMode(VBOAccessMode.StreamDraw); if (meshData.getNormalCoords() != null) { meshData.getNormalCoords().setVboAccessMode(VBOAccessMode.StreamDraw); } skMesh.setMeshData(meshData); } catch (final IOException e) { e.printStackTrace(); throw new ColladaException("Unable to copy skeleton bind pose data.", geometry); } // Grab the MeshVertPairs from Global for this mesh. final Collection<MeshVertPairs> vertPairsList = _dataCache.getVertMappings().get(geometry); MeshVertPairs pairsMap = null; if (vertPairsList != null) { for (final MeshVertPairs pairs : vertPairsList) { if (pairs.getMesh() == sourceMesh) { pairsMap = pairs; break; } } } if (pairsMap == null) { throw new ColladaException("Unable to locate pair map for geometry.", geometry); } // Check for a remapping, if we optimized geometry final VertMap vertMap = _dataCache.getMeshVertMap().get(sourceMesh); // Use pairs map and vertWeightMap to build our weights and joint indices. { // count number of weights used int maxWeightsPerVert = 0; int weightCount; for (final int originalIndex : pairsMap.getIndices()) { weightCount = 0; // get weights and joints at original index and add weights up to get divisor sum // we'll assume 0's for vertices with no matching weight. if (vertWeightMap.length > originalIndex) { final int[] data = vertWeightMap[originalIndex]; for (int i = 0; i < data.length; i += maxOffset + 1) { final float weight = jointWeights.get(data[i + weightOff]); if (weight != 0) { weightCount++; } } if (weightCount > maxWeightsPerVert) { maxWeightsPerVert = weightCount; } } } final int verts = skMesh.getMeshData().getVertexCount(); final FloatBuffer weightBuffer = BufferUtils.createFloatBuffer(verts * maxWeightsPerVert); final ShortBuffer jointIndexBuffer = BufferUtils .createShortBuffer(verts * maxWeightsPerVert); int j; float sum = 0; final float[] weights = new float[maxWeightsPerVert]; final short[] indices = new short[maxWeightsPerVert]; int originalIndex; for (int x = 0; x < verts; x++) { if (vertMap != null) { originalIndex = pairsMap.getIndices()[vertMap.getFirstOldIndex(x)]; } else { originalIndex = pairsMap.getIndices()[x]; } j = 0; sum = 0; // get weights and joints at original index and add weights up to get divisor sum // we'll assume 0's for vertices with no matching weight. if (vertWeightMap.length > originalIndex) { final int[] data = vertWeightMap[originalIndex]; for (int i = 0; i < data.length; i += maxOffset + 1) { final float weight = jointWeights.get(data[i + weightOff]); if (weight != 0) { weights[j] = jointWeights.get(data[i + weightOff]); indices[j] = (short) order[jointIndices.get(data[i + indOff])]; sum += weights[j++]; } } } // add extra padding as needed while (j < maxWeightsPerVert) { weights[j] = 0; indices[j++] = 0; } // add weights to weightBuffer / sum for (final float w : weights) { weightBuffer.put(sum != 0 ? w / sum : 0); } // add joint indices to jointIndexBuffer jointIndexBuffer.put(indices); } final float[] totalWeights = new float[weightBuffer.capacity()]; weightBuffer.flip(); weightBuffer.get(totalWeights); skMesh.setWeights(totalWeights); final short[] totalIndices = new short[jointIndexBuffer.capacity()]; jointIndexBuffer.flip(); jointIndexBuffer.get(totalIndices); skMesh.setJointIndices(totalIndices); skMesh.setWeightsPerVert(maxWeightsPerVert); } // add to the skinNode. skinNode.attachChild(skMesh); // Manually apply our bind pose to the skin mesh. skMesh.applyPose(); // Update the model bounding. skMesh.updateModelBound(); // add mesh to store skinDataStore.getSkins().add(skMesh); } } // add to Node ardorParentNode.attachChild(skinNode); // Add skin record to storage. _colladaStorage.getSkins().add(skinDataStore); } }
From source file:com.ardor3d.extension.model.collada.jdom.ColladaAnimUtils.java
License:Open Source License
/** * Gather up all animation channels based on what nodes they affect. * // w w w.ja v a2 s. c o m * @param channelMap * @param animationRoot * @param animationItemRoot */ @SuppressWarnings("unchecked") private void parseAnimations(final Multimap<Element, TargetChannel> channelMap, final Element animationRoot, final AnimationItem animationItemRoot) { if (animationRoot.getChild("animation") != null) { Attribute nameAttribute = animationRoot.getAttribute("name"); if (nameAttribute == null) { nameAttribute = animationRoot.getAttribute("id"); } final String name = nameAttribute != null ? nameAttribute.getValue() : "Default"; final AnimationItem animationItem = new AnimationItem(name); animationItemRoot.getChildren().add(animationItem); for (final Element animationElement : animationRoot.getChildren("animation")) { parseAnimations(channelMap, animationElement, animationItem); } } if (animationRoot.getChild("channel") != null) { if (logger.isLoggable(Level.FINE)) { logger.fine("\n-- Parsing animation channels --"); } final List<Element> channels = animationRoot.getChildren("channel"); for (final Element channel : channels) { final String source = channel.getAttributeValue("source"); final String targetString = channel.getAttributeValue("target"); if (targetString == null || targetString.isEmpty()) { return; } final Target target = processTargetString(targetString); if (logger.isLoggable(Level.FINE)) { logger.fine("channel source: " + target.toString()); } final Element targetNode = findTargetNode(target); if (targetNode == null || !_dataCache.getTransformTypes().contains(targetNode.getName())) { // TODO: pass with warning or exception or nothing? // throw new ColladaException("No target transform node found for target: " + target, target); continue; } if ("rotate".equals(targetNode.getName())) { target.accessorType = AccessorType.Vector; target.accessorIndexX = 3; } channelMap.put(targetNode.getParentElement(), new TargetChannel(target, targetNode, source, animationItemRoot)); } } }
From source file:com.ardor3d.extension.model.collada.jdom.ColladaDOMUtil.java
License:Open Source License
/** * Parse an int value in an attribute.//from www.j a v a 2 s . co m * * @param input * Element containing the attribute * @param attributeName * Attribute name to parse a value for * @return parsed integer */ public int getAttributeIntValue(final Element input, final String attributeName, final int defaultVal) { final Attribute attribute = input.getAttribute(attributeName); if (attribute != null) { try { return attribute.getIntValue(); } catch (final DataConversionException e) { logger.log(Level.WARNING, "Could not parse int value", e); } } return defaultVal; }
From source file:com.ardor3d.extension.model.collada.jdom.ColladaNodeUtils.java
License:Open Source License
private NodeType getNodeType(final Element dNode) { if (dNode.getAttribute("type") != null) { return Enum.valueOf(NodeType.class, dNode.getAttributeValue("type")); } else {// ww w . j ava 2 s . c o m return NodeType.NODE; } }
From source file:com.ardor3d.extension.model.collada.jdom.plugin.GoogleEarthPlugin.java
License:Open Source License
@Override public boolean processExtra(final Element extra, final Object[] params) { if (params.length > 0 && params[0] instanceof Mesh) { final Mesh mesh = (Mesh) params[0]; // should have a child: <technique profile="GOOGLEEARTH"> final Element technique = extra.getChild("technique"); if (technique != null) { final Attribute profile = technique.getAttribute("profile"); if (profile != null && "GOOGLEEARTH".equalsIgnoreCase(profile.getValue())) { for (final Element child : technique.getChildren()) { // disable back face culling if it's been enabled. if ("double_sided".equalsIgnoreCase(child.getName()) && "1".equals(child.getTextTrim())) { final CullState cs = new CullState(); cs.setEnabled(false); mesh.setRenderState(cs); }/* w ww .j ava 2 s.co m*/ } return true; } } } return false; }
From source file:com.aurum.whitehole.ObjectDB.java
License:Open Source License
public static void init() { fallback = true;/*from www . ja v a 2s. c o m*/ timestamp = 0; categories = new LinkedHashMap(); objects = new LinkedHashMap(); File odbfile = new File("objectdb.xml"); if (!(odbfile.exists() && odbfile.isFile())) return; try { Element root = new SAXBuilder().build(odbfile).getRootElement(); timestamp = root.getAttribute("timestamp").getLongValue(); List<Element> catelems = root.getChild("categories").getChildren("category"); for (Element catelem : catelems) categories.put(catelem.getAttribute("id").getIntValue(), catelem.getText()); List<Element> objelems = root.getChildren("object"); for (Element objelem : objelems) { Object entry = new Object(); entry.ID = objelem.getAttributeValue("id"); entry.name = objelem.getChildText("name"); entry.category = objelem.getChild("category").getAttribute("id").getIntValue(); entry.type = objelem.getChild("preferredfile").getAttributeValue("name"); entry.notes = objelem.getChildText("notes"); Element flags = objelem.getChild("flags"); entry.games = flags.getAttribute("games").getIntValue(); entry.known = flags.getAttribute("known").getIntValue(); entry.complete = flags.getAttribute("complete").getIntValue(); if (entry.notes.isEmpty() || entry.notes.equals("")) entry.notes = "(No description found for this objects.)"; if (entry.type.isEmpty() || entry.notes.equals("")) entry.type = "Unknown"; entry.files = new ArrayList(); String files = objelem.getChildText("files"); for (String file : files.split("\n")) { entry.files.add(file); } List<Element> fields = objelem.getChildren("field"); entry.fields = new HashMap(fields.size()); if (!fields.isEmpty()) { for (Element field : fields) { Object.Field fielddata = new Object.Field(); fielddata.ID = field.getAttribute("id").getIntValue(); fielddata.type = field.getAttributeValue("type"); fielddata.name = field.getAttributeValue("name"); fielddata.values = field.getAttributeValue("values"); fielddata.notes = field.getAttributeValue("notes"); entry.fields.put(fielddata.ID, fielddata); } } objects.put(entry.ID, entry); } } catch (IOException | JDOMException ex) { timestamp = 0; return; } fallback = false; }